This guide explains how to extract and organize finite element analysis results in OpenBrIM using ParamML expressions. After running FEA analyses, results must be queried and organized for design checks, reports, and code compliance verification.
Key Concepts:
Result Functions: ParamML functions that query analysis results (stress(), force(), forcePos(), forceNeg(), etc.)
Limit State Organization: Structuring results by AASHTO limit states (Strength, Service, Fatigue, Extreme Event)
Envelope Results: Combined max/min results across multiple load cases
Concurrent Forces: Extracting all force components when one component governs
Multi-Station Extraction: Using map() to extract results at multiple locations efficiently
Core Result Extraction Functions
1. Force Extraction Functions
force(elementPath, loadCase, component, station?)
Extracts a specific force component from analysis results.
Parameters:
elementPath (String): Full path to the FE element (use fullname() for dynamic paths)
loadCase (String): Load case or combination name
component (String): Force component ('Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz')
station (Number, optional): Station location along element
Returns: Number - Force value in the specified component
Example:
forcePos(component, elementPath, loadCase, station?)
Extracts the maximum (positive) value for a specific force component.
Parameters:
component (String): Force component ('Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz')
elementPath (String): Full path to the FE element
loadCase (String): Load case or combination name
station (Number, optional): Station location
Returns: Number - Maximum (positive) force value
Example:
Related: forceNeg(), forceFxPosConc(), forceFyPosConc(), forceFzPosConc(), forceMxPosConc(), forceMyPosConc(), forceMzPosConc()
forceNeg(component, elementPath, loadCase, station?)
Extracts the minimum (negative) value for a specific force component.
Parameters:
component (String): Force component ('Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz')
elementPath (String): Full path to the FE element
loadCase (String): Load case or combination name
station (Number, optional): Station location
Returns: Number - Minimum (negative) force value
Example:
Related: forcePos(), forceFxNegConc(), forceFyNegConc(), forceFzNegConc(), forceMxNegConc(), forceMyNegConc(), forceMzNegConc()
Concurrent Force Functions
These functions extract ALL force components when a specific component reaches its maximum/minimum value.
Function Pattern:
forceFxPosConc(loadCase, element, station, concElement, concStation) - All forces when Fx is maximum positive
forceFxNegConc(loadCase, element, station, concElement, concStation) - All forces when Fx is maximum negative
Similar functions for: Fy, Fz, Mx, My, Mz
Parameters:
loadCase (String): Load case or combination name
element (String): Element path for the component being maximized
station (Number): Station for the component being maximized
concElement (String): Element path for concurrent forces extraction
concStation (Number): Station for concurrent forces extraction
Returns: Array [Fx, Fy, Fz, Mx, My, Mz] - All force components at the concurrent location when the primary component governs
Example:
Use Cases:
Design checks requiring concurrent forces (e.g., P-M interaction)
Extracting shear when moment governs
Combined stress calculations
2. Stress Extraction Functions
stress(loadCase, element, station?)
Extracts stress components from analysis results.
Parameters:
loadCase (String): Load case or combination name
element (String): Element path or identifier
station (Number, optional): Station location
Returns: Array [σxx, σyy, σzz, τxy, τyz, τzx] - Stress tensor components
Example:
Note: Stress results depend on element type and location (integration points, nodes, etc.)
3. Displacement Extraction Functions
disp(node, loadCase, component)
Extracts nodal displacement for a specific component.
Parameters:
node (String): Node name or path
loadCase (String): Load case or combination name
component (String): Displacement component ('Tx', 'Ty', 'Tz', 'Rx', 'Ry', 'Rz')
Returns: Number - Displacement value
Example:
Related: dispX(), dispY(), dispZ() - Component-specific functions
Result Organization Patterns
1. Multi-Station Extraction
Use map() to extract results at multiple stations efficiently.
Pattern:
Nested Pattern - Multiple Load Cases at Multiple Stations:
2. Limit State Organization
AASHTO LRFD limit states should be organized hierarchically.
Structure:
3. Unfactored Results Pattern
Extract results from individual load cases grouped by limit state.
Example:
Result Structure:
4. Factored Results Pattern
Extract results from factored load combinations (max and min envelopes).
Example:
5. Governing Results Pattern
Extract the absolute min/max across multiple load combinations.
Example:
Sorting Pattern for Concurrent Forces:
6. Concurrent Force Extraction Pattern
Extract all force components when one component governs.
Pattern:
Result Structure:
Where Fx is the governing (max or min) value, and Fy, Fz, Mx, My, Mz are concurrent values.
Complete Extraction Object Example
Stress Extraction Object
Force Extraction Object
Advanced Patterns
1. Conditional Result Extraction
Use guards to extract only required limit states:
2. NULL Handling
Always check for NULL before extracting:
3. Using atstation() with Result Functions
Evaluate station-dependent results at specific locations:
4. Result Data Structure Indexing
Access specific components from result arrays:
Use StaticParams for repeated extractions:
Cache commonly used results:
2. Organize by Hierarchy
3. Document Result Structures
Use comments to clarify complex nested structures:
4. Error Checking
Check for NULL results before using:
5. Unit Consistency
Ensure consistent units in result extraction:
Common Pitfalls
1. Incorrect Element Paths
Problem: Element path doesn't match FEA model
2. Missing CoreCombName
Problem: Load case names don't include combination suffix
3. Index Errors in Nested Maps
Problem: Using wrong index variable in nested maps
4. Concurrent Force Confusion
Problem: Using wrong concurrent location
OpenBrIM FEA result extraction uses ParamML functions to query analysis outputs and organize them for design checks:
Core Functions:
force(), forcePos(), forceNeg() - Force/moment extraction
forceFxPosConc(), forceMyNegConc(), etc. - Concurrent force extraction
stress() - Stress component extraction
disp(), dispX(), dispY(), dispZ() - Displacement extraction
Organization Patterns:
Multi-station extraction using map()
Hierarchical limit state organization (Unfactored, Factored, Governing, Envelope)
Conditional extraction with guards
NULL handling for missing load cases
Best Practices:
Use fullname() for dynamic element paths
Cache results to avoid redundant extractions
Use StaticParams in repeats for performance
Document complex result structures
Check for NULL before extraction
Maintain unit consistency
Common Use Cases:
Stress/force extraction at design stations
Concurrent forces for interaction checks
Envelope results across multiple load combinations
Limit state compliance verification
Governing results for design reports
By following these patterns, AI agents can efficiently extract and organize FEA results for bridge design code checks and documentation.