Source code for pyNastran.op2.tables.oes_stressStrain.real.oes_objects

from __future__ import (nested_scopes, generators, division, absolute_import,
                        print_function, unicode_literals)
from six import string_types
import numpy as np
from pyNastran.op2.result_objects.op2_objects import BaseElement
from pyNastran.op2.op2_interface.write_utils import set_table3_field

SORT2_TABLE_NAME_MAP = {
    'OES2' : 'OES1',
    'OES2C' : 'OES1C',
    'OESATO2' : 'OESATO1',
    'OESCRM2' : 'OESCRM1',
    'OESNO2' : 'OESNO1',
    'OESPSD2' : 'OESPSD1',
    'OESRMS2' : 'OESRMS1',

    'OSTR2' : 'OSTR1',
    'OSTR2C' : 'OSTR1C',
    'OSTRATO2' : 'OSTRATO1',
    'OSTRCRM2' : 'OSTRCRM1',
    'OSTRNO2' : 'OSTRNO1',
    'OSTRPSD2' : 'OSTRPSD1',
    'OSTRRMS2' : 'OSTRRMS1',
    'OESVM2' : 'OESVM1',
    'OSTRVM2' : 'OSTRVM1',
    'OESNL2' : 'OESNL1',
}

[docs]class OES_Object(BaseElement): def __init__(self, data_code, isubcase, apply_data_code=True): self.element_type = None self.element_name = None self.nonlinear_factor = np.nan self._times = None BaseElement.__init__(self, data_code, isubcase, apply_data_code=apply_data_code) #self.log.debug("starting OES...element_name=%-6s isubcase=%s" % (self.element_name, self.isubcase)) #print self.data_code
[docs] def finalize(self): """it's required that the object be in SORT1""" self.set_as_sort1()
[docs] def set_as_sort1(self): """the data is in SORT1, but the flags are wrong""" if self.is_sort1: return self.table_name = SORT2_TABLE_NAME_MAP[self.table_name] self.sort_bits[1] = 0 # sort1 self.sort_method = 1 assert self.is_sort1 is True, self.is_sort1
@property def is_curvature(self): if self.is_stress: curvature_flag = False else: # strain only curvature_flag = True if self.stress_bits[2] == 0 else False if self.s_code in [10, 11, 20, 27]: assert curvature_flag, curvature_flag return True assert not curvature_flag, curvature_flag return False @property def is_fiber_distance(self): return not self.is_curvature @property def is_von_mises(self): return not self.is_max_shear @property def is_max_shear(self): return True if self.stress_bits[4] == 0 else False def _get_headers(self): raise NotImplementedError('overwrite this') @property def is_stress(self): raise NotImplementedError('overwrite this') def _write_table_3(self, op2, op2_ascii, new_result, itable, itime): #, itable=-3, itime=0): import inspect from struct import pack frame = inspect.currentframe() call_frame = inspect.getouterframes(frame, 2) op2_ascii.write('%s.write_table_3: %s\n' % (self.__class__.__name__, call_frame[1][3])) #if itable == -3: #print('*writing itable=%s' % itable) if new_result and itable != -3: header = [ 4, 146, 4, ] else: header = [ 4, itable, 4, 4, 1, 4, 4, 0, 4, 4, 146, 4, ] op2.write(pack(b'%ii' % len(header), *header)) op2_ascii.write('table_3_header = %s\n' % header) #op2.write(pack('12i', *header)) #else: #print('***writing itable=%s' % itable) #op2.write(pack('3i', *[ ##4, itable, 4, ##4, 1, 4, ##4, 0, 4, #4, 146, 4, #])) approach_code = self.approach_code table_code = self.table_code isubcase = self.isubcase element_type = self.element_type #[ #'aCode', 'tCode', 'element_type', 'isubcase', #'???', '???', '???', 'load_set' #'format_code', 'num_wide', 's_code', '???', #'???', '???', '???', '???', #'???', '???', '???', '???', #'???', '???', '???', '???', #'???', 'Title', 'subtitle', 'label'] #random_code = self.random_code format_code = self.format_code s_code = self.s_code num_wide = self.num_wide acoustic_flag = 0 thermal = 0 title = b'%-128s' % self.title.encode('ascii') subtitle = b'%-128s' % self.subtitle.encode('ascii') label = b'%-128s' % self.label.encode('ascii') ftable3 = b'50i 128s 128s 128s' oCode = 0 ftable3 = b'i' * 50 + b'128s 128s 128s' field6 = 0 field7 = 0 if self.analysis_code == 1: field5 = self.lsdvmns[itime] elif self.analysis_code == 2: field5 = self.modes[itime] field6 = self.eigns[itime] field7 = self.cycles[itime] assert isinstance(field6, float), type(field6) assert isinstance(field7, float), type(field7) ftable3 = set_table3_field(ftable3, 6, b'f') # field 6 ftable3 = set_table3_field(ftable3, 7, b'f') # field 7 #elif self.analysis_code == 3: #field5 = self.freqs[itime] elif self.analysis_code == 5: field5 = self.freqs[itime] ftable3 = set_table3_field(ftable3, 5, b'f') # field 5 elif self.analysis_code == 6: field5 = self.dts[itime] ftable3 = set_table3_field(ftable3, 5, b'f') # field 5 elif self.analysis_code == 7: # pre-buckling field5 = self.lsdvmns[itime] # load set number elif self.analysis_code == 8: # post-buckling field5 = self.lsdvmns[itime] # load set number #if hasattr(self, 'eigns'): if hasattr(self, 'eigens'): field6 = self.eigns[itime] elif hasattr(self, 'eigrs'): field6 = self.eigrs[itime] else: # pragma: no cover print(self.get_stats()) raise NotImplementedError('cant find eigns or eigrs on analysis_code=8') ftable3 = set_table3_field(ftable3, 6, b'f') # field 6 elif self.analysis_code == 9: # complex eigenvalues field5 = self.modes[itime] if hasattr(self, 'eigns'): field6 = self.eigns[itime] elif hasattr(self, 'eigrs'): field6 = self.eigrs[itime] else: # pragma: no cover print(self.get_stats()) raise NotImplementedError('cant find eigns or eigrs on analysis_code=9') ftable3 = set_table3_field(ftable3, 6, b'f') # field 6 field7 = self.eigis[itime] ftable3 = set_table3_field(ftable3, 7, b'f') # field 7 elif self.analysis_code == 10: # nonlinear statics field5 = self.lftsfqs[itime] ftable3 = set_table3_field(ftable3, 5, b'f') # field 5; load step elif self.analysis_code == 11: # old geometric nonlinear statics field5 = self.lsdvmns[itime] # load set number else: raise NotImplementedError(self.analysis_code) table3 = [ approach_code, table_code, element_type, isubcase, field5, field6, field7, self.load_set, format_code, num_wide, s_code, acoustic_flag, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, thermal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, title, subtitle, label, ] assert table3[22] == thermal n = 0 for v in table3: if isinstance(v, (int, float)): n += 4 elif isinstance(v, string_types): n += len(v) else: #print('write_table_3', v) n += len(v) assert n == 584, n data = [584] + table3 + [584] fmt = b'i' + ftable3 + b'i' #print(fmt) #print(data) #f.write(pack(fascii, '%s header 3c' % self.table_name, fmt, data)) op2_ascii.write('%s header 3c = %s\n' % (self.table_name, data)) op2.write(pack(fmt, *data))
[docs]class StressObject(OES_Object): def __init__(self, data_code, isubcase): OES_Object.__init__(self, data_code, isubcase) assert self.is_stress, self.code_information() assert not self.is_strain, self.code_information()
[docs] def update_dt(self, data_code, dt): self.data_code = data_code self.apply_data_code() #assert dt >= 0. self.element_name = self.data_code['element_name'] if dt is not None: #print("updating stress...%s=%s element_name=%s" % # (self.data_code['name'], dt, self.element_name)) self.dt = dt self.add_new_transient(dt)
@property def is_strain(self): class_name = self.__class__.__name__ assert self.stress_bits[1] == self.stress_bits[3], 'class_name=%s scode=%s stress_bits=%s' % (class_name, self.s_code, self.stress_bits) assert self.stress_bits[1] == 0, 'class_name=%s scode=%s stress_bits=%s' % (class_name, self.s_code, self.stress_bits) return False @property def is_stress(self): class_name = self.__class__.__name__ assert self.stress_bits[1] == self.stress_bits[3], 'class_name=%s scode=%s stress_bits=%s' % (class_name, self.s_code, self.stress_bits) assert self.stress_bits[1] == 0, 'class_name=%s scode=%s stress_bits=%s' % (class_name, self.s_code, self.stress_bits) return True
[docs]class StrainObject(OES_Object): def __init__(self, data_code, isubcase): OES_Object.__init__(self, data_code, isubcase) assert self.is_strain, self.code_information() assert not self.is_stress, self.code_information()
[docs] def update_dt(self, data_code, dt): self.data_code = data_code self.apply_data_code() self.element_name = self.data_code['element_name'] if dt is not None: #print("updating strain...%s=%s element_name=%s" % # (self.data_code['name'], dt, self.element_name)) self.dt = dt self.add_new_transient(dt)
@property def is_strain(self): class_name = self.__class__.__name__ assert self.stress_bits[1] == self.stress_bits[3], 'class_name=%s scode=%s stress_bits=%s; table_name=%r' % (class_name, self.s_code, self.stress_bits, self.table_name) assert self.stress_bits[1] == 1, 'class_name=%s scode=%s stress_bits=%s; table_name=%r' % (class_name, self.s_code, self.stress_bits, self.table_name) return True @property def is_stress(self): class_name = self.__class__.__name__ assert self.stress_bits[1] == self.stress_bits[3], 'class_name=%s scode=%s stress_bits=%s; table_name=%r' % (class_name, self.s_code, self.stress_bits, self.table_name) assert self.stress_bits[1] == 1, 'class_name=%s is_stress=False scode=%s stress_bits=%s; element_type=%s element_name=%s; table_name=%r' % (class_name, self.s_code, self.stress_bits, self.element_type, self.element_name, self.table_name) return False