74 lines
1.9 KiB
Python
74 lines
1.9 KiB
Python
|
|
"""
|
||
|
|
Extract element forces from CBAR in Z direction from OP2
|
||
|
|
Auto-generated by Atomizer Phase 3 - pyNastran Research Agent
|
||
|
|
|
||
|
|
Pattern: cbar_force
|
||
|
|
Element Type: CBAR
|
||
|
|
Result Type: force
|
||
|
|
API: model.cbar_force[subcase]
|
||
|
|
"""
|
||
|
|
|
||
|
|
from pathlib import Path
|
||
|
|
from typing import Dict, Any
|
||
|
|
import numpy as np
|
||
|
|
from pyNastran.op2.op2 import OP2
|
||
|
|
|
||
|
|
|
||
|
|
def extract_cbar_force(op2_file: Path, subcase: int = 1, direction: str = 'Z'):
|
||
|
|
"""
|
||
|
|
Extract forces from CBAR elements.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
op2_file: Path to OP2 file
|
||
|
|
subcase: Subcase ID
|
||
|
|
direction: Force direction ('X', 'Y', 'Z', 'axial', 'torque')
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Dict with force statistics
|
||
|
|
"""
|
||
|
|
from pyNastran.op2.op2 import OP2
|
||
|
|
import numpy as np
|
||
|
|
|
||
|
|
model = OP2()
|
||
|
|
model.read_op2(str(op2_file))
|
||
|
|
|
||
|
|
if not hasattr(model, 'cbar_force'):
|
||
|
|
raise ValueError("No CBAR force results in OP2")
|
||
|
|
|
||
|
|
force = model.cbar_force[subcase]
|
||
|
|
itime = 0
|
||
|
|
|
||
|
|
# CBAR force data structure:
|
||
|
|
# [bending_moment_a1, bending_moment_a2,
|
||
|
|
# bending_moment_b1, bending_moment_b2,
|
||
|
|
# shear1, shear2, axial, torque]
|
||
|
|
|
||
|
|
direction_map = {
|
||
|
|
'shear1': 4,
|
||
|
|
'shear2': 5,
|
||
|
|
'axial': 6,
|
||
|
|
'Z': 6, # Commonly axial is Z direction
|
||
|
|
'torque': 7
|
||
|
|
}
|
||
|
|
|
||
|
|
col_idx = direction_map.get(direction, direction_map.get(direction.lower(), 6))
|
||
|
|
forces = force.data[itime, :, col_idx]
|
||
|
|
|
||
|
|
return {
|
||
|
|
f'max_{direction}_force': float(np.max(np.abs(forces))),
|
||
|
|
f'avg_{direction}_force': float(np.mean(np.abs(forces))),
|
||
|
|
f'min_{direction}_force': float(np.min(np.abs(forces))),
|
||
|
|
'forces_array': forces.tolist()
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
# Example usage
|
||
|
|
import sys
|
||
|
|
if len(sys.argv) > 1:
|
||
|
|
op2_file = Path(sys.argv[1])
|
||
|
|
result = extract_cbar_force(op2_file)
|
||
|
|
print(f"Extraction result: {result}")
|
||
|
|
else:
|
||
|
|
print("Usage: python {sys.argv[0]} <op2_file>")
|