Source code for pyNastran.op2.tables.oes_stressStrain.complex.oes_rods

from __future__ import (nested_scopes, generators, division, absolute_import,
                        print_function, unicode_literals)
from six import iteritems
from six.moves import range
from pyNastran.op2.tables.oes_stressStrain.real.oes_objects import StressObject, StrainObject
from pyNastran.f06.f06_formatting import writeImagFloats13E, get_key0

[docs]class ComplexRodDamper(StressObject): def __init__(self, data_code, is_sort1, isubcase, dt): StressObject.__init__(self, data_code, isubcase) self.eType = 'CBUSH' self.code = [self.format_code, self.sort_code, self.s_code] self.axial = {} self.torsion = {}
[docs]class ComplexRodStress(StressObject): def __init__(self, data_code, is_sort1, isubcase, dt): StressObject.__init__(self, data_code, isubcase) self.eType = 'CROD' self.code = [self.format_code, self.sort_code, self.s_code] self.axial = {} self.torsion = {} self.dt = dt if is_sort1: if dt is not None: #self.add = self.add_sort1 self.add_new_eid = self.add_new_eid_sort1 else: assert dt is not None #self.add = self.addSort2 self.add_new_eid = self.add_new_eid_sort2
[docs] def getLength(self): return (20, '4f')
[docs] def add_f06_data(self, data, transient): if transient is None: for line in data: (eid, axial, torsion) = line self.axial[eid] = axial self.torsion[eid] = torsion return (dtName, dt) = transient self.dt = dt self.data_code['name'] = dtName if dt not in self.axial: self.update_dt(self.data_code, dt) for line in data: (eid, axial, torsion) = line self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
[docs] def delete_transient(self, dt): del self.axial[dt] del self.torsion[dt]
[docs] def get_transients(self): k = self.axial.keys() k.sort() return k
[docs] def add_new_transient(self, dt): """ initializes the transient variables """ self.dt = dt self.axial[dt] = {} self.torsion[dt] = {}
[docs] def add_new_eid(self, dt, eid, axial, torsion): #print "Rod Stress add..." #(axial, torsion) = out assert isinstance(eid, int) self.axial[eid] = axial self.torsion[eid] = torsion
[docs] def add_new_eid_sort1(self, dt, eid, axial, torsion): if dt not in self.axial: self.add_new_transient(dt) self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
[docs] def add_new_eid_sort2(self, eid, dt, axial, torsion): if dt not in self.axial: self.add_new_transient(dt) self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
def _write_f06(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False): if self.nonlinear_factor is not None: return self._write_f06_transient(header, page_stamp, page_num, f, is_mag_phase) raise RuntimeError('this should never happen') def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False): if self.element_type == 1: element_header = ' C O M P L E X S T R E S S E S I N R O D E L E M E N T S ( C R O D )\n' elif self.element_type == 3: element_header = ' C O M P L E X S T R E S S E S I N R O D E L E M E N T S ( C T U B E )\n' elif self.element_type == 10: element_header = ' C O M P L E X S T R E S S E S I N R O D E L E M E N T S ( C O N R O D )\n' else: raise NotImplementedError('element_name=%r element_type=%s' % (self.element_name, self.element_type)) if is_mag_phase: mag_phase = ' (MAG/PHASE)\n' # not tested else: mag_phase = ' (REAL/IMAGINARY)\n' words = [element_header, mag_phase, ' \n', ' ELEMENT AXIAL TORQUE\n', ' ID. FORCE\n',] #' 1 -2.459512E+05 / 3.377728E+04 0.0 / 0.0\n',] msg = [] for dt, axials in sorted(iteritems(self.axial)): dtLine = '%14s = %12.5E\n' % (self.data_code['name'], dt) header[2] = dtLine msg += header + words out = [] for eid in sorted(axials): axial = self.axial[dt][eid] torsion = self.torsion[dt][eid] ([axialr, torsionr, axiali, torsioni], is_all_zeros) = writeImagFloats13E([axial, torsion], is_mag_phase) f.write(' %8i %-13s / %-13s %-13s / %s\n' % (eid, axialr, axiali, torsionr, torsioni)) msg.append(page_stamp % page_num) f.write(''.join(msg)) page_num += 1 return page_num - 1
[docs]class ComplexRodStrain(StrainObject): def __init__(self, data_code, is_sort1, isubcase, dt): StrainObject.__init__(self, data_code, isubcase) self.eType = 'CROD' # {} # 'CROD/CONROD/CTUBE' self.code = [self.format_code, self.sort_code, self.s_code] self.axial = {} self.torsion = {} self.dt = dt if is_sort1: if dt is not None: #self.add = self.add_sort1 self.add_new_eid = self.add_new_eid_sort1 else: assert dt is not None #self.add = self.addSort2 self.add_new_eid = self.add_new_eid_sort2
[docs] def add_f06_data(self, data, transient): if transient is None: for line in data: (eid, axial, torsion) = line self.axial[eid] = axial self.torsion[eid] = torsion return (dtName, dt) = transient self.dt = dt self.data_code['name'] = dtName if dt not in self.axial: self.update_dt(self.data_code, dt) for line in data: (eid, axial, torsion) = line self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
[docs] def delete_transient(self, dt): del self.axial[dt] del self.torsion[dt]
[docs] def get_transients(self): k = self.axial.keys() k.sort() return k
[docs] def add_new_transient(self, dt): """ initializes the transient variables """ self.dt = dt self.axial[self.dt] = {} self.torsion[self.dt] = {}
[docs] def add_new_eid(self, dt, eid, axial, torsion): #(axial, torsion) = out assert eid >= 0 #self.eType = self.eType self.axial[eid] = axial self.torsion[eid] = torsion
[docs] def add_new_eid_sort1(self, dt, eid, axial, torsion): #(axial, torsion) = out assert eid >= 0 #self.eType[eid] = self.element_type if dt not in self.axial: self.add_new_transient(dt) self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
[docs] def add_new_eid_sort2(self, eid, dt, out): (axial, torsion) = out assert eid >= 0 #self.eType[eid] = self.element_type if dt not in self.axial: self.add_new_transient(dt) self.axial[dt][eid] = axial self.torsion[dt][eid] = torsion
def _write_f06(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False): if self.dt is not None: return self._write_f06_transient(header, page_stamp, page_num, f, is_mag_phase) raise RuntimeError('this should never happen') def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False): if self.element_type == 1: element_header = ' C O M P L E X S T R A I N S I N R O D E L E M E N T S ( C R O D )\n' elif self.element_type == 3: element_header = ' C O M P L E X S T R A I N S I N R O D E L E M E N T S ( C T U B E )\n' elif self.element_type == 10: element_header = ' C O M P L E X S T R A I N S I N R O D E L E M E N T S ( C O N R O D )\n' else: raise NotImplementedError('element_name=%r element_type=%s' % (self.element_name, self.element_type)) if is_mag_phase: mag_phase = ' (MAG/PHASE)\n' # not tested else: mag_phase = ' (REAL/IMAGINARY)\n' words = [element_header, mag_phase, ' \n', ' ELEMENT AXIAL TORQUE\n', ' ID. FORCE\n', ' 1 -2.459512E+05 / 3.377728E+04 0.0 / 0.0\n',] words = [' S T R A I N S I N R O D E L E M E N T S ( C R O D )\n', ' ELEMENT AXIAL SAFETY TORSIONAL SAFETY ELEMENT AXIAL SAFETY TORSIONAL SAFETY\n', ' ID. STRAIN MARGIN STRAIN MARGIN ID. STRAIN MARGIN STRAIN MARGIN\n'] msg = [] for dt, axials in sorted(iteritems(self.axial)): dtLine = '%14s = %12.5E\n' % (self.data_code['name'], dt) header[2] = dtLine msg += header + words out = [] for eid in sorted(axials): axial = self.axial[dt][eid] torsion = self.torsion[dt][eid] ([axialr, torsionr, axiali, torsioni], is_all_zeros) = writeImagFloats13E([axial, torsion], is_mag_phase) f.write(' %8i %-13s / %-13s %-13s / %s\n' % (eid, axialr, axiali, torsionr, torsioni)) msg.append(page_stamp % page_num) page_num += 1 f.write(''.join(msg)) return page_num - 1