""" 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]} ")