Source code for pyNastran.op2.tables.oee_energy.onr

#pylint: disable=C0326,C0301,C0103
from six.moves import range
from struct import Struct, unpack

from pyNastran.op2.tables.oee_energy.oee_objects import RealStrainEnergy
from pyNastran.op2.op2_common import OP2Common

[docs]class ONR(OP2Common): def __init__(self): OP2Common.__init__(self) self.words = None self.num_wide = None def _read_onr1_3(self, data): """ reads ONRGY1 subtable 3 """ self.words = [ 'aCode', 'tCode', 'eTotal', 'isubcase', '???', '???', '???', 'load_set' 'format_code', 'num_wide', 'cvalres', '???', 'setID', '???', '???', '???', '???', '???', '???', '???', '???', '???', '???', '???', '???', 'Title', 'subtitle', 'label'] #aCode = self.get_block_int_entry(data, 1) ## total energy of all elements in isubcase/mode self.eTotal = self.parse_approach_code(data) element_name, = unpack(b'8s', data[24:32]) #print("element_name = %s" %(element_name)) try: element_name = element_name.decode('utf-8').strip() # element name except UnicodeDecodeError: print("element_name = ", str(element_name)) raise #print("element_name = %s" %(element_name)) if element_name.isalpha(): self.data_code['element_name'] = element_name #: Load set or zero self.load_set = self.add_data_parameter(data, 'load_set', 'i', 8, False) #: format code self.format_code = self.add_data_parameter(data, 'format_code', 'i', 9, False) #: number of words per entry in record #: .. note:: is this needed for this table ??? self.num_wide = self.add_data_parameter(data, 'num_wide', 'i', 10, False) ## C self.cvalres = self.add_data_parameter(data, 'cvalres', 'i', 11, False) #: Set identification number Number self.setID = self.add_data_parameter(data, 'setID', 'i', 13, False) #: Natural eigenvalue - real part self.eigenReal = self.add_data_parameter(data, 'eigenReal', 'i', 14, False) #: Natural eigenvalue - imaginary part self.eigenImag = self.add_data_parameter(data, 'eigenImag', 'i', 15, False) self.add_data_parameter(data, 'freq', 'f', 16, False) ## Natural frequency #: Total positive energy self.etotpos = self.add_data_parameter(data, 'etotpos', 'f', 18) #: Total negative energy self.etotneg = self.add_data_parameter(data, 'etotneg', 'f', 19, False) if not self.is_sort1(): raise NotImplementedError('sort2...') #self.print_block(data) # on if self.analysis_code == 1: # statics / displacement / heat flux #del self.data_code['nonlinear_factor'] self.lsdvmn = self.add_data_parameter(data, 'lsdvmn', 'i', 5, False) self.dataNames = self.apply_data_code_value('dataNames', ['lsdvmn']) self.setNullNonlinearFactor() elif self.analysis_code == 2: # real eigenvalues self.mode = self.add_data_parameter(data, 'mode', 'i', 5) ## mode number self.dataNames = self.apply_data_code_value('dataNames', ['mode']) #print "mode(5)=%s eigr(6)=%s mode_cycle(7)=%s" %(self.mode,self.eigr,self.mode_cycle) #elif self.analysis_code==3: # differential stiffness #self.lsdvmn = self.get_values(data,'i',5) ## load set number #self.data_code['lsdvmn'] = self.lsdvmn #elif self.analysis_code==4: # differential stiffness #self.lsdvmn = self.get_values(data,'i',5) ## load set number elif self.analysis_code == 5: # frequency self.freq2 = self.add_data_parameter(data, 'freq2', 'f', 5) ## frequency self.dataNames = self.apply_data_code_value('dataNames', ['freq2']) elif self.analysis_code == 6: # transient self.time = self.add_data_parameter(data, 'time', 'f', 5) ## time step self.dataNames = self.apply_data_code_value('dataNames', ['time']) #elif self.analysis_code==7: # pre-buckling #self.dataNames = self.apply_data_code_value('dataNames',['lsdvmn']) elif self.analysis_code == 8: # post-buckling self.mode = self.add_data_parameter(data, 'mode', 'i', 5) ## mode number self.dataNames = self.apply_data_code_value('dataNames', ['mode']) elif self.analysis_code == 9: # complex eigenvalues self.mode = self.add_data_parameter(data, 'mode', 'i', 5) ## mode number self.dataNames = self.apply_data_code_value('dataNames', ['mode']) elif self.analysis_code == 10: # nonlinear statics self.loadFactor = self.add_data_parameter(data, 'loadFactor', 'f', 5) ## load factor self.dataNames = self.apply_data_code_value('dataNames', ['loadFactor']) #elif self.analysis_code==11: # old geometric nonlinear statics #self.dataNames = self.apply_data_code_value('dataNames',['lsdvmn']) elif self.analysis_code == 12: # contran ? (may appear as aCode=6) --> straight from DMAP...grrr... self.time = self.add_data_parameter(data, 'time', 'f', 5) ## time step self.dataNames = self.apply_data_code_value('dataNames', ['time']) else: raise RuntimeError('invalid analysis_code...analysis_code=%s' % self.analysis_code) if self.debug: self.binary_debug.write(' approach_code = %r\n' % self.approach_code) self.binary_debug.write(' tCode = %r\n' % self.tCode) self.binary_debug.write(' isubcase = %r\n' % self.isubcase) self._read_title(data) self._write_debug_bits() def _read_onr1_4(self, data): """ reads ONRGY1 subtable 4 """ if self.read_mode == 1: return len(data) if self.table_code == 18: # element strain energy assert self.table_name in [b'ONRGY1'], 'table_name=%s table_code=%s' % (self.table_name, self.table_code) n = self._read_element_strain_energy(data) else: raise NotImplementedError(self.table_code) return n def _read_element_strain_energy(self, data): """ table_code = 19 """ dt = self.nonlinear_factor n = 0 result_name = 'strain_energy' if self.read_mode == 1: return len(data) self._results._found_result(result_name) if self.num_wide == 4: self.create_transient_object(self.strain_energy, RealStrainEnergy) s = Struct(b'i3f') ntotal = 16 nnodes = len(data) // ntotal for i in range(nnodes): edata = data[n:n+ntotal] out = s.unpack(edata) (eid_device, energy, percent, density) = out eid = (eid_device - self.device_code) // 10 #print "eType=%s" % (eType) data_in = [eid, energy, percent, density] #print "%s" % (self.get_element_type(self.element_type)), data_in self.obj.add(dt, data_in) n += ntotal elif self.num_wide == 5: self.create_transient_object(self.strain_energy, RealStrainEnergy) # why is this not different? ntotal = 20 s = Struct(b'8s3f') nnodes = len(data) // ntotal for i in range(nnodes): edata = data[n:n+20] out = s.unpack(edata) (word, energy, percent, density) = out #print "out = ",out word = word.strip() #print "eType=%s" % (eType) data_in = [word, energy, percent, density] #print "%s" %(self.get_element_type(self.element_type)), data_in #eid = self.obj.add_new_eid(out) self.obj.add(dt, data_in) n += ntotal elif self.num_wide == 6: ## TODO: figure this out... self.create_transient_object(self.strain_energy, RealStrainEnergy) # TODO: why is this not different? ntotal = 24 s = Struct(b'i8s3f') nnodes = len(data) // ntotal for i in range(nnodes): edata = data[n:n+24] out = s.unpack(edata) (word, energy, percent, density) = out # TODO: this has to be wrong... #print "out = ",out word = word.strip() #print "eType=%s" % (eType) data_in = [word, energy, percent, density] #print "%s" %(self.get_element_type(self.element_type)), data_in #eid = self.obj.add_new_eid(out) self.obj.add(dt, data_in) n += ntotal else: raise NotImplementedError('num_wide = %s' % self.num_wide) return n