Source code for pyNastran.f06.tables.oef

from six.moves import zip
from pyNastran.op2.tables.oef_forces.oef_forceObjects import RealPlateBilinearForce, RealRodForce # RealPlateForce

[docs]class OEF(object): def __init__(self): pass
[docs] def _temperature_gradients_and_fluxes(self): (subcase_name, isubcase, transient, dt, analysis_code, is_sort1) = self._read_f06_subcase_header() headers = self.skip(2) #print "headers = %s" % (headers) data = self._read_gradient_fluxes_table() return if isubcase in self.temperatureGrad: self.temperatureGrad[isubcase].addData(data) else: self.temperatureGrad[isubcase] = TemperatureGradientObject(isubcase, data) self.iSubcases.append(isubcase)
[docs] def _read_gradient_fluxes_table(self): data = [] Format = [int, str, float, float, float, float, float, float] while 1: line = self.infile.readline()[1:].rstrip('\r\n ') self.i += 1 if 'PAGE' in line: return data sline = [line[0:15], line[15:24].strip(), line[24:44], line[44:61], line[61:78], line[78:95], line[95:112], line[112:129]] sline = self._parse_line_gradients_fluxes(sline, Format) data.append(sline) return data
[docs] def _parse_line_gradients_fluxes(self, sline, Format): out = [] for entry, iFormat in zip(sline, Format): if entry.strip() is '': out.append(0.0) else: #print "sline=|%r|\n entry=|%r| format=%r" % (sline, entry, iFormat) entry2 = iFormat(entry) out.append(entry2) return out
[docs] def _forces_in_crod_elements(self): self._forces_in_rod_elements('CROD', 1, 'crod_force')
[docs] def _forces_in_ctube_elements(self): self._forces_in_rod_elements('CTUBE', 3, 'ctube_force')
[docs] def _forces_in_conrod_elements(self): self._forces_in_rod_elements('CONROD', 10, 'conrod_force')
[docs] def _forces_in_rod_elements(self, element_name, element_type, result_name): """ # 1-CROD # 3-CTUBE # 10-CONROD :: F O R C E S I N R O D E L E M E N T S ( C R O D ) ELEMENT AXIAL ELEMENT AXIAL ID. FORCE TORQUE ID. FORCE TORQUE 1 -7.007184E+02 0.0 2 -4.900904E+04 0.0 3 -7.141140E+04 0.0 """ slot = getattr(self, result_name) #print(self.stored_lines) (subcase_name, isubcase, transient, dt, analysis_code, is_sort1) = self._read_f06_subcase_header() headers = self.skip(3) lines = [] while 1: line = self.infile.readline().rstrip(' \n\r') self.i += 1 if 'PAGE' in line: break lines.append(line) self.fatal_check(line) data = [] for line in lines: eid, axial, torque = line[1:15], line[15:35], line[35:41] try: eid = int(eid) axial = float(axial) torque = float(torque) except ValueError: raise ValueError('line=%r' % line) data.append([eid, axial, torque]) if line[41:].strip(): eid, axial, torque = line[41:75], line[75:95], line[95:101] try: eid = int(eid) axial = float(axial) torque = float(torque) except ValueError: raise ValueError('line=%r' % line[35:]) data.append([eid, axial, torque]) #if line[101:]: #asdf data_code = { 'analysis_code': analysis_code, 'device_code': 1, 'sort_code': 0, 'sort_bits': [0, 0, 0], 'table_name': 'OEF1X', # probably wrong 'table_code': 5, # wrong 'num_wide': 3, 'format_code': 1, 'element_name': element_name, 'element_type': element_type, 'nonlinear_factor': dt, 'dataNames':['lsdvmn'], 'lsdvmn': 1, } is_sort1 = True #ngrids = 4 #print('isubcase =', isubcase) if isubcase not in slot: assert 'nonlinear_factor' in data_code slot[isubcase] = RealRodForce(data_code, is_sort1, isubcase, transient) slot[isubcase].add_f06_data(data, transient) self.iSubcases.append(isubcase)
[docs] def _forces_in_cquad4s_bilinear(self): """ :: F O R C E S I N Q U A D R I L A T E R A L E L E M E N T S ( Q U A D 4 ) OPTION = BILIN ELEMENT - MEMBRANE FORCES - - BENDING MOMENTS - - TRANSVERSE SHEAR FORCES - ID GRID-ID FX FY FXY MX MY MXY QX QY 1 CEN/4 0.0 0.0 0.0 -7.371223E+01 -4.023861E+02 -2.679984E+01 1.315875E+01 -7.356985E+01 1 0.0 0.0 0.0 -1.043592E+02 -3.888291E+02 -2.698050E+01 1.315875E+01 -7.356985E+01 2 0.0 0.0 0.0 -1.036512E+02 -4.152917E+02 -2.731157E+01 1.315875E+01 -7.356985E+01 8 0.0 0.0 0.0 -4.306526E+01 -4.159432E+02 -2.661917E+01 1.315875E+01 -7.356985E+01 7 0.0 0.0 0.0 -4.377329E+01 -3.894806E+02 -2.628810E+01 1.315875E+01 -7.356985E+01 element_type = 33 b/c not bilinear """ # composite element_name = 'CQUAD4' element_type = 144 # was listed as 95; has to be 144...i think... #print(self.stored_lines) (subcase_name, isubcase, transient, dt, analysis_code, is_sort1) = self._read_f06_subcase_header() headers = self.skip(3) lines = [] while 1: line = self.infile.readline().rstrip('\n\r') self.i += 1 if 'PAGE' in line: break lines.append(line) self.fatal_check(line) data = [] for line in lines: eid, grid, fx, fy, fxy, mx, my, mxy, qx, qy = line[1:15], line[15:20], line[20:35], line[35:49], line[49:63], line[63:77], line[77:91], line[91:105], line[105:119], line[119:140] eid = eid.strip() grid = grid.strip() if eid: eid = int(eid) if 'C' not in grid: grid = int(grid) fx = float(fx) fy = float(fy) fxy = float(fxy) mx = float(mx) my = float(my) mxy = float(mxy) qx = float(qx) qy = float(qy) data.append([eid, grid, fx, fy, fxy, mx, my, mxy, qx, qy]) data_code = {'analysis_code': analysis_code, 'device_code': 1, 'sort_code': 0, 'sort_bits': [0, 0, 0], 'table_name': 'OEF1X', # probably wrong 'table_code': 5, # wrong 'num_wide': 10, 'format_code': 1, 'element_name': element_name, 'element_type': element_type, 'nonlinear_factor': dt, 'dataNames':['lsdvmn'], 'lsdvmn': 1, } is_sort1 = True ngrids = 4 #result_name = 'cquad4_composite_plate_force' #slot = self.cquad4_composite_plate_force result_name = 'cquad4_force' slot = self.cquad4_force if isubcase not in slot: assert 'nonlinear_factor' in data_code slot[isubcase] = RealPlateBilinearForce(data_code, is_sort1, isubcase, transient) slot[isubcase].add_f06_data(transient, data, element_name, ngrids) self.iSubcases.append(isubcase)