from __future__ import (nested_scopes, generators, division, absolute_import,
print_function, unicode_literals)
from six import iteritems
from pyNastran.op2.resultObjects.op2_Objects import ScalarObject
from pyNastran.f06.f06_formatting import writeFloats13E, writeImagFloats13E, get_key0
[docs]class ComplexRodForce(ScalarObject): # 1-ROD, 3-TUBE, 10-CONROD
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.axialForce = {}
self.torque = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def add_new_transient(self, dt):
self.dt = dt
self.axialForce[dt] = {}
self.torque[dt] = {}
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.torque)
time0 = get_key0(self.torque)
nelements = len(self.torque[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.torque)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' axialForce, torque\n')
return msg
[docs] def add(self, dt, data):
[eid, axialForce, torque] = data
#self.eType[eid] = eType
self.axialForce[eid] = axialForce
self.torque[eid] = torque
[docs] def add_sort1(self, dt, data):
[eid, axialForce, torque] = data
if dt not in self.axialForce:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.axialForce[dt][eid] = axialForce
self.torque[dt][eid] = torque
[docs] def addSort2(self, eid, data):
[dt, axialForce, torque] = data
if dt not in self.axialForce:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.axialForce[dt][eid] = axialForce
self.torque[dt][eid] = torque
[docs]class ComplexCBeamForce(ScalarObject): # 2-CBEAM
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.bendingMoment = {}
self.shear = {}
self.axial = {}
self.totalTorque = {}
self.warpingTorque = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add_new_element = self.addNewElementSort1
self.add = self.add_sort1
else:
assert dt is not None
self.add_new_element = self.addNewElementSort2
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.shear)
time0 = get_key0(self.shear)
nelements = len(self.shear[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.shear)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' bendingMoment, shear, axial, totalTorque, '
'warpingTorque\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.bendingMoment[dt] = {}
self.shear[dt] = {}
self.axial[dt] = {}
self.totalTorque[dt] = {}
self.warpingTorque[dt] = {}
[docs] def add_new_element(self, dt, data):
[eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
#print "CBEAM addnew",data
#self.eType[eid] = eType
self.bendingMoment[eid] = {sd: [bm1, bm2]}
self.shear[eid] = {sd: [ts1, ts2]}
self.axial[eid] = {sd: af}
self.totalTorque[eid] = {sd: ttrq}
self.warpingTorque[eid] = {sd: wtrq}
[docs] def add(self, dt, data):
[eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
#print "CBEAM add ",data
#self.eType[eid] = eType
self.bendingMoment[eid][sd] = [bm1, bm2]
self.shear[eid][sd] = [ts1, ts2]
self.axial[eid][sd] = af
self.totalTorque[eid][sd] = ttrq
self.warpingTorque[eid][sd] = wtrq
[docs] def addNewElementSort1(self, dt, data):
[eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
self._fillNewObject(
dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq)
[docs] def add_sort1(self, dt, data):
[eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
self._fillObject(dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq)
[docs] def addNewElementSort2(self, eid, data):
[dt, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
self._fillNewObject(
dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq)
[docs] def addSort2(self, eid, data):
[dt, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq] = data
self._fillObject(dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq)
def _fillObject(self, dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq):
#if dt not in self.axial:
#self.add_new_transient(dt)
#self.eType[eid] = eType
self.bendingMoment[dt][eid][sd] = [bm1, bm2]
self.shear[dt][eid][sd] = [ts1, ts2]
self.axial[dt][eid][sd] = af
self.totalTorque[dt][eid][sd] = ttrq
self.warpingTorque[dt][eid][sd] = wtrq
def _fillNewObject(self, dt, eid, nid, sd, bm1, bm2, ts1, ts2, af, ttrq, wtrq):
if dt not in self.axial:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.bendingMoment[dt][eid] = {sd: [bm1, bm2]}
self.shear[dt][eid] = {sd: [ts1, ts2]}
self.axial[dt][eid] = {sd: af}
self.totalTorque[dt][eid] = {sd: ttrq}
self.warpingTorque[dt][eid] = {sd: wtrq}
[docs]class ComplexCShearForce(ScalarObject): # 4-CSHEAR
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.force41 = {}
self.force14 = {}
self.force21 = {}
self.force12 = {}
self.force32 = {}
self.force23 = {}
self.force43 = {}
self.force34 = {}
self.kickForce1 = {}
self.kickForce2 = {}
self.kickForce3 = {}
self.kickForce4 = {}
self.shear12 = {}
self.shear23 = {}
self.shear34 = {}
self.shear41 = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.shear12)
time0 = get_key0(self.shear12)
nelements = len(self.shear12[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.shear12)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' force41, force14, force21, force12, force32, force23, '
' force 43, force34, kickForce1, kickForce2, kickForce3, '
' kickForce4, shear12, shear23, shear34, shear41\n')
return msg
[docs] def add_new_transient(self, dt):
self.force41[dt] = {}
self.force14[dt] = {}
self.force21[dt] = {}
self.force12[dt] = {}
self.force32[dt] = {}
self.force23[dt] = {}
self.force43[dt] = {}
self.force34[dt] = {}
self.kickForce1[dt] = {}
self.kickForce2[dt] = {}
self.kickForce3[dt] = {}
self.kickForce4[dt] = {}
self.shear12[dt] = {}
self.shear23[dt] = {}
self.shear34[dt] = {}
self.shear41[dt] = {}
[docs] def add(self, dt, data):
[eid, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41] = data
#self.eType[eid] = eType
self.force41[eid] = f41
self.force14[eid] = f14
self.force21[eid] = f21
self.force12[eid] = f12
self.force32[eid] = f32
self.force23[eid] = f23
self.force43[eid] = f43
self.force34[eid] = f34
self.kickForce1[eid] = kf1
self.kickForce2[eid] = kf2
self.kickForce3[eid] = kf3
self.kickForce4[eid] = kf4
self.shear12[eid] = s12
self.shear23[eid] = s23
self.shear34[eid] = s34
self.shear41[eid] = s41
[docs] def add_sort1(self, dt, data):
[eid, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41] = data
self._fillObject(dt, eid, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41)
[docs] def addSort2(self, eid, data):
[dt, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41] = data
self._fillObject(dt, eid, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41)
def _fillObject(self, dt, eid, f41, f21, f12, f32, f23, f43, f34, f14,
kf1, s12, kf2, s23, kf3, s34, kf4, s41):
if dt not in self.force41:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force41[dt][eid] = f41
self.force14[dt][eid] = f14
self.force21[dt][eid] = f21
self.force12[dt][eid] = f12
self.force32[dt][eid] = f32
self.force23[dt][eid] = f23
self.force43[dt][eid] = f43
self.force34[dt][eid] = f34
self.kickForce1[dt][eid] = kf1
self.kickForce2[dt][eid] = kf2
self.kickForce3[dt][eid] = kf3
self.kickForce4[dt][eid] = kf4
self.shear12[dt][eid] = s12
self.shear23[dt][eid] = s23
self.shear34[dt][eid] = s34
self.shear41[dt][eid] = s41
[docs]class ComplexSpringForce(ScalarObject): # 11-CELAS1,12-CELAS2,13-CELAS3, 14-CELAS4
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.force = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.force)
time0 = get_key0(self.force)
nelements = len(self.force[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.force)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' force\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.force[dt] = {}
[docs] def add(self, dt, data):
[eid, force] = data
#self.eType[eid] = eType
self.force[eid] = force
[docs] def add_sort1(self, dt, data):
[eid, force] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = force
[docs] def addSort2(self, eid, data):
[dt, force] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = force
[docs] 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)
msg = header + [' C O M P L E X F O R C E S I N S C A L A R S P R I N G S ( C E L A S 4 )\n',
' (REAL/IMAGINARY)\n',
' \n',
' FREQUENCY FORCE FREQUENCY FORCE\n']
#packs = []
forces = []
elements = []
line = ' '
for eid, force in sorted(self.force.items()):
elements.append(eid)
forces.append(force)
#pack.append(eid)
#pack.append(f)
line += '%-13s %-13s / %-13s ' % (eid, force.real, force.imag)
if len(forces) == 3:
msg.append(line.rstrip() + '\n')
if forces:
msg.append(line.rstrip() + '\n')
msg.append(page_stamp % page_num)
f.write(''.join(msg))
return page_num
def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
words = [' C O M P L E X F O R C E S I N S C A L A R S P R I N G S ( C E L A S 4 )\n',
' (REAL/IMAGINARY)\n',
' \n',
' ELEMENT ELEMENT\n',
' ID. FORCE ID. FORCE\n']
msg = []
for dt, Force in sorted(self.force.items()):
header[1] = ' %s = %10.4E\n' % (self.data_code['name'], dt)
msg += header + words
#packs = []
forces = []
elements = []
line = ''
for eid, force in sorted(Force.items()):
elements.append(eid)
forces.append(force)
#pack.append(eid)
#pack.append(f)
([forceReal, forceImag], is_all_zeros) = writeFloats13E([force.real, force.imag])
line += ' %13s %-13s / %-13s' % (eid, forceReal, forceImag)
if len(forces) == 2:
msg.append(line.rstrip() + '\n')
line = ''
forces = []
if forces:
msg.append(line.rstrip() + '\n')
msg.append(page_stamp % page_num)
f.write(''.join(msg))
msg = ['']
page_num += 1
return page_num - 1
[docs]class ComplexDamperForce(ScalarObject): # 20-CDAMP1,21-CDAMP2,22-CDAMP3,23-CDAMP4
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.force = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.force)
time0 = get_key0(self.force)
nelements = len(self.force[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.force)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' force\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.force[dt] = {}
[docs] def add(self, dt, data):
[eid, force] = data
#self.eType[eid] = eType
self.force[eid] = force
[docs] def add_sort1(self, dt, data):
[eid, force] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = force
[docs] def addSort2(self, eid, data):
[dt, force] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = force
[docs]class ComplexViscForce(ScalarObject): # 24-CVISC
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.axialForce = {}
self.torque = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.torque)
time0 = get_key0(self.torque)
nelements = len(self.torque[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.torque)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' axialForce, torque\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.axialForce[dt] = {}
self.torque[dt] = {}
[docs] def add(self, dt, data):
[eid, axialForce, torque] = data
#self.eType[eid] = eType
self.axialForce[eid] = axialForce
self.torque[eid] = torque
[docs] def add_sort1(self, dt, data):
[eid, axialForce, torque] = data
if dt not in self.axialForce:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.axialForce[dt][eid] = axialForce
self.torque[dt][eid] = torque
[docs] def addSort2(self, eid, data):
[dt, axialForce, torque] = data
if dt not in self.axialForce:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.axialForce[dt][eid] = axialForce
self.torque[dt][eid] = torque
[docs]class ComplexPlateForce(ScalarObject): # 33-CQUAD4, 74-CTRIA3
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.mx = {}
self.my = {}
self.mxy = {}
self.bmx = {}
self.bmy = {}
self.bmxy = {}
self.tx = {}
self.ty = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.add_sort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.mx)
time0 = get_key0(self.mx)
nelements = len(self.mx[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.mx)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' mx, my, mxy, bmx, bmy, bmxy, tx, ty\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.mx[dt] = {}
self.my[dt] = {}
self.mxy[dt] = {}
self.bmx[dt] = {}
self.bmy[dt] = {}
self.bmxy[dt] = {}
self.tx[dt] = {}
self.ty[dt] = {}
[docs] def add(self, dt, eid, mx, my, mxy, bmx, bmy, bmxy, tx, ty):
#self.eType[eid] = eType
self.mx[eid] = mx
self.my[eid] = my
self.mxy[eid] = mxy
self.bmx[eid] = bmx
self.bmy[eid] = bmy
self.bmxy[eid] = bmxy
self.tx[eid] = tx
self.ty[eid] = ty
[docs] def add_sort1(self, dt, eid, mx, my, mxy, bmx, bmy, bmxy, tx, ty):
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.mx[dt][eid] = mx
self.my[dt][eid] = my
self.mxy[dt][eid] = mxy
self.bmx[dt][eid] = bmx
self.bmy[dt][eid] = bmy
self.bmxy[dt][eid] = bmxy
self.tx[dt][eid] = tx
self.ty[dt][eid] = ty
[docs] def add_sort2(self, eid, dt, mx, my, mxy, bmx, bmy, bmxy, tx, ty):
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.mx[dt][eid] = mx
self.my[dt][eid] = my
self.mxy[dt][eid] = mxy
self.bmx[dt][eid] = bmx
self.bmy[dt][eid] = bmy
self.bmxy[dt][eid] = bmxy
self.tx[dt][eid] = tx
self.ty[dt][eid] = ty
[docs]class ComplexPlate2Force(ScalarObject): # 64-CQUAD8, 75-CTRIA6, 82-CQUADR
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.term = {}
self.ngrids = {}
self.mx = {}
self.my = {}
self.mxy = {}
self.bmx = {}
self.bmy = {}
self.bmxy = {}
self.tx = {}
self.ty = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add_new_element = self.addNewElementSort1
self.add = self.add_sort1
else:
assert dt is not None
self.add_new_element = self.addNewElementSort2
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.mx)
time0 = get_key0(self.mx)
nelements = len(self.mx[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.mx)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' term, ngrids, mx, my, mxy, bmx, bmy, bmxy, tx, ty\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.mx[dt] = {}
self.my[dt] = {}
self.mxy[dt] = {}
self.bmx[dt] = {}
self.bmy[dt] = {}
self.bmxy[dt] = {}
self.tx[dt] = {}
self.ty[dt] = {}
[docs] def add_new_element(self, eid, dt, data):
#print "eid = ",eid
[term, nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
#self.eType[eid] = eType
self.term[eid] = term
self.ngrids[eid] = nid
self.mx[eid] = [mx]
self.my[eid] = [my]
self.mxy[eid] = [mxy]
self.bmx[eid] = [bmx]
self.bmy[eid] = [bmy]
self.bmxy[eid] = [bmxy]
self.tx[eid] = [tx]
self.ty[eid] = [ty]
[docs] def add(self, eid, dt, data):
[nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
#self.eType[eid] = eType
#print "mx = ",self.mx,mx
self.mx[eid].append(mx)
self.my[eid].append(my)
self.mxy[eid].append(mxy)
self.bmx[eid].append(bmx)
self.bmy[eid].append(bmy)
self.bmxy[eid].append(bmxy)
self.tx[eid].append(tx)
self.ty[eid].append(ty)
[docs] def addNewElementSort1(self, eid, dt, data):
[term, nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.term[eid] = term
self.ngrids[eid] = nid
self.mx[dt][eid] = [mx]
self.my[dt][eid] = [my]
self.mxy[dt][eid] = [mxy]
self.bmx[dt][eid] = [bmx]
self.bmy[dt][eid] = [bmy]
self.bmxy[dt][eid] = [bmxy]
self.tx[dt][eid] = [tx]
self.ty[dt][eid] = [ty]
[docs] def add_sort1(self, eid, dt, data):
[nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.mx[dt][eid].append(mx)
self.my[dt][eid].append(my)
self.mxy[dt][eid].append(mxy)
self.bmx[dt][eid].append(bmx)
self.bmy[dt][eid].append(bmy)
self.bmxy[dt][eid].append(bmxy)
self.tx[dt][eid].append(tx)
self.ty[dt][eid].append(ty)
[docs] def addNewElementSort2(self, dt, eid, data):
[term, nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.term[eid] = term
self.ngrids[eid] = nid
self.mx[dt][eid] = [mx]
self.my[dt][eid] = [my]
self.mxy[dt][eid] = [mxy]
self.bmx[dt][eid] = [bmx]
self.bmy[dt][eid] = [bmy]
self.bmxy[dt][eid] = [bmxy]
self.tx[dt][eid] = [tx]
self.ty[dt][eid] = [ty]
[docs] def addSort2(self, dt, eid, data):
[nid, mx, my, mxy, bmx, bmy, bmxy, tx, ty] = data
if dt not in self.mx:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.mx[dt][eid].append(mx)
self.my[dt][eid].append(my)
self.mxy[dt][eid].append(mxy)
self.bmx[dt][eid].append(bmx)
self.bmy[dt][eid].append(bmy)
self.bmxy[dt][eid].append(bmxy)
self.tx[dt][eid].append(tx)
self.ty[dt][eid].append(ty)
[docs] 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)
f.write('%s write_f06 not implemented...\n' % self.__class__.__name__)
#raise NotImplementedError()
#words = [' A C C E L E R A T I O N V E C T O R\n',
# ' \n',
# ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n']
#words += self.getTableMarker()
#return self._writeF06Block(words, header, page_stamp, page_num, f)
def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
f.write('%s _write_f06_transient not implemented...\n' % self.__class__.__name__)
return page_num
#raise NotImplementedError()
[docs]class ComplexCBarForce(ScalarObject): # 34-CBAR
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.bendingMomentA = {}
self.bendingMomentB = {}
self.shear = {}
self.axial = {}
self.torque = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.torque)
time0 = get_key0(self.torque)
nelements = len(self.torque[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.torque)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' bendingMomentA, bendingMomentB, shes, axial, torque\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.bendingMomentA[dt] = {}
self.bendingMomentB[dt] = {}
self.shear[dt] = {}
self.axial[dt] = {}
self.torque[dt] = {}
[docs] def add(self, dt, data):
[eid, bm1a, bm2a, bm1b, bm2b, ts1, ts2, af, trq] = data
#self.eType[eid] = eType
self.bendingMomentA[eid] = [bm1a, bm2a]
self.bendingMomentB[eid] = [bm1b, bm2b]
self.shear[eid] = [ts1, ts2]
self.axial[eid] = af
self.torque[eid] = trq
[docs] def add_sort1(self, dt, data):
[eid, bm1a, bm2a, bm1b, bm2b, ts1, ts2, af, trq] = data
if dt not in self.axial:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.bendingMomentA[dt][eid] = [bm1a, bm2a]
self.bendingMomentB[dt][eid] = [bm1b, bm2b]
self.shear[dt][eid] = [ts1, ts2]
self.axial[dt][eid] = af
self.torque[dt][eid] = trq
[docs] def addSort2(self, eid, data):
[dt, bm1a, bm2a, bm1b, bm2b, ts1, ts2, af, trq] = data
if dt not in self.axial:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.bendingMomentA[dt][eid] = [bm1a, bm2a]
self.bendingMomentB[dt][eid] = [bm1b, bm2b]
self.shear[dt][eid] = [ts1, ts2]
self.axial[dt][eid] = af
self.torque[dt][eid] = trq
def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
words = [' C O M P L E X F O R C E S I N B A R E L E M E N T S ( C B A R )\n',
' (REAL/IMAGINARY)\n',
'0 ELEMENT BEND-MOMENT END-A BEND-MOMENT END-B - SHEAR - AXIAL\n',
' ID. PLANE 1 PLANE 2 PLANE 1 PLANE 2 PLANE 1 PLANE 2 FORCE TORQUE\n']
msg = []
for dt, bendA in sorted(iteritems(self.bendingMomentA)):
header[1] = ' %s = %10.4E\n' % (self.data_code['name'], dt)
msg += header + words
for eid in sorted(bendA):
bm1a, bm2a = self.bendingMomentA[dt][eid]
bm1b, bm2b = self.bendingMomentB[dt][eid]
ts1, ts2 = self.shear[dt][eid]
af = self.axial[dt][eid]
trq = self.torque[dt][eid]
(vals2, is_all_zeros) = writeImagFloats13E([bm1a, bm2a, bm1b, bm2b, ts1, ts2, af, trq], is_mag_phase)
[bm1ar, bm2ar, bm1br, bm2br, ts1r, ts2r, afr, trqr,
bm1ai, bm2ai, bm1bi, bm2bi, ts1i, ts2i, afi, trqi] = vals2
msg.append(' %8i %-13s %-13s %-13s %-13s %-13s %-13s %-13s %s\n' % (eid, bm1ar, bm2ar, bm1br, bm2br, ts1r, ts2r, afr, trqr))
msg.append(' %8s %-13s %-13s %-13s %-13s %-13s %-13s %-13s %s\n' % ('', bm1ai, bm2ai, bm1bi, bm2bi, ts1i, ts2i, afi, trqi))
msg.append(page_stamp % page_num)
f.write(''.join(msg))
msg = ['']
page_num += 1
return page_num - 1
[docs] 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)
msg = header + [' C O M P L E X F O R C E S I N B A R E L E M E N T S ( C B A R )\n',
' (REAL/IMAGINARY)\n',
'0 ELEMENT BEND-MOMENT END-A BEND-MOMENT END-B - SHEAR - AXIAL\n',
' ID. PLANE 1 PLANE 2 PLANE 1 PLANE 2 PLANE 1 PLANE 2 FORCE TORQUE\n']
for eid in sorted(self.bendingMomentA):
bm1a, bm2a = self.bendingMomentA[eid]
bm1b, bm2b = self.bendingMomentB[eid]
ts1, ts2 = self.shear[eid]
af = self.axial[eid]
trq = self.torque[eid]
(vals2, is_all_zeros) = writeImagFloats13E([bm1a, bm2a, bm1b, bm2b, ts1, ts2, af, trq], is_mag_phase)
[bm1ar, bm2ar, bm1br, bm2br, ts1r, ts2r, afr, trqr,
bm1ai, bm2ai, bm1bi, bm2bi, ts1i, ts2i, afi, trqi] = vals2
msg.append(' %8i %-13s %-13s %-13s %-13s %-13s %-13s %-13s %s\n' % (eid, bm1ar, bm2ar, bm1br, bm2br, ts1r, ts2r, afr, trqr))
msg.append(' %8s %-13s %-13s %-13s %-13s %-13s %-13s %-13s %s\n' % ('', bm1ai, bm2ai, bm1bi, bm2bi, ts1i, ts2i, afi, trqi))
msg.append(page_stamp % page_num)
f.write(''.join(msg))
return page_num
[docs]class ComplexBendForce(ScalarObject): # 69-CBEND
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.nodeIDs = {}
self.bendingMoment1 = {}
self.bendingMoment2 = {}
self.shearPlane1 = {}
self.shearPlane2 = {}
self.axial = {}
self.torque = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.torque)
time0 = get_key0(self.torque)
nelements = len(self.torque[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.torque)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' nodeIDs, bendingMoment1, bendingMoment2, '
'shearPlate1, shearPlate2, axial, torque\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.bendingMoment1[dt] = {}
self.bendingMoment2[dt] = {}
self.shearPlane1[dt] = {}
self.shearPlane2[dt] = {}
self.axial[dt] = {}
self.torque[dt] = {}
[docs] def add(self, dt, data):
[eid, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB] = data
#self.eType[eid] = eType
self.nodeIDs[eid] = [nidA, nidB]
self.bendingMoment1[eid] = [bm1A, bm1B]
self.bendingMoment2[eid] = [bm2A, bm2B]
self.shearPlane1[eid] = [sp1A, sp1B]
self.shearPlane2[eid] = [sp2A, sp2B]
self.axial[eid] = [axialA, axialB]
self.torque[eid] = [torqueA, torqueB]
[docs] def add_sort1(self, dt, data):
[eid, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB] = data
self._fillObject(
dt, eid, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB)
[docs] def addSort2(self, eid, data):
[dt, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB] = data
self._fillObject(
dt, eid, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB)
def _fillObject(
self, dt, eid, nidA, bm1A, bm2A, sp1A, sp2A, axialA, torqueA,
nidB, bm1B, bm2B, sp1B, sp2B, axialB, torqueB):
if dt not in self.axial:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.nodeIDs[eid] = [nidA, nidB]
self.bendingMoment1[dt][eid] = [bm1A, bm1B]
self.bendingMoment2[dt][eid] = [bm2A, bm2B]
self.shearPlane1[dt][eid] = [sp1A, sp1B]
self.shearPlane2[dt][eid] = [sp2A, sp2B]
self.axial[dt][eid] = [axialA, axialB]
self.torque[dt][eid] = [torqueA, torqueB]
[docs]class ComplexPentaPressureForce(ScalarObject): # 76-CHEXA_PR,77-PENTA_PR,78-TETRA_PR
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.acceleration = {}
self.velocity = {}
self.pressure = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.acceleration)
time0 = get_key0(self.acceleration)
nelements = len(self.acceleration[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.acceleration)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' acceleration, velocity, pressure\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.acceleration[dt] = {}
self.velocity[dt] = {}
self.pressure[dt] = {}
[docs] def add(self, dt, data):
[eid, eName, ax, ay, az, vx, vy, vz, pressure] = data
#self.eType[eid] = eType
self.acceleration[eid] = [ax, ay, az]
self.velocity[eid] = [vx, vy, vz]
self.pressure[eid] = pressure
[docs] def add_sort1(self, dt, data):
[eid, eName, ax, ay, az, vx, vy, vz, pressure] = data
if dt not in self.acceleration:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.acceleration[dt][eid] = [ax, ay, az]
self.velocity[dt][eid] = [vx, vy, vz]
self.pressure[dt][eid] = pressure
[docs] def addSort2(self, eid, data):
[dt, eName, ax, ay, az, vx, vy, vz, pressure] = data
if dt not in self.acceleration:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.acceleration[dt][eid] = [ax, ay, az]
self.velocity[dt][eid] = [vx, vy, vz]
self.pressure[dt][eid] = pressure
[docs]class ComplexCBushForce(ScalarObject): # 102-CBUSH
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.force = {}
self.moment = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.force)
time0 = get_key0(self.force)
nelements = len(self.force[time0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self.force)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' force, moment\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.force[dt] = {}
self.moment[dt] = {}
[docs] def add(self, dt, data):
[eid, fx, fy, fz, mx, my, mz] = data
#self.eType[eid] = eType
self.force[eid] = [fx, fy, fz]
self.moment[eid] = [mx, my, mz]
[docs] def add_sort1(self, dt, data):
[eid, fx, fy, fz, mx, my, mz] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = [fx, fy, fz]
self.moment[dt][eid] = [mx, my, mz]
[docs] def addSort2(self, eid, data):
[dt, fx, fy, fz, mx, my, mz] = data
if dt not in self.force:
self.add_new_transient(dt)
#self.eType[eid] = eType
self.force[dt][eid] = [fx, fy, fz]
self.moment[dt][eid] = [mx, my, mz]
[docs]class ComplexForce_VU(ScalarObject): # 191-VUBEAM
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.parent = {}
self.coord = {}
self.icord = {}
self.forceX = {}
self.shearY = {}
self.shearZ = {}
self.torsion = {}
self.bendingY = {}
self.bendingZ = {}
# TODO if dt=None, handle SORT1 case
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
nelements = len(self.coord)
if self.dt is not None: # transient
ntimes = len(self.forceX)
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' parent, coord, icord, forceX, shearY, shearZ, torsion, '
'bendingY, bendingZ\n')
return msg
[docs] def add_new_transient(self, dt):
self.dt = dt
self.forceX[dt] = {}
self.shearY[dt] = {}
self.shearZ[dt] = {}
self.torsion[dt] = {}
self.bendingY[dt] = {}
self.bendingZ[dt] = {}
[docs] def add(self, nNodes, dt, data):
[eid, parent, coord, icord, forces] = data
self.parent[eid] = parent
self.coord[eid] = coord
self.icord[eid] = icord
#self.eType[eid] = eType
self.forceX[eid] = {}
self.shearY[eid] = {}
self.shearZ[eid] = {}
self.torsion[eid] = {}
self.bendingY[eid] = {}
self.bendingZ[eid] = {}
for force in forces:
[nid, posit, forceX, shearY, shearZ, torsion,
bendingY, bendingZ] = force
self.forceX[eid][nid] = forceX
self.shearY[eid][nid] = shearY
self.shearZ[eid][nid] = shearZ
self.torsion[eid][nid] = torsion
self.bendingY[eid][nid] = bendingY
self.bendingZ[eid][nid] = bendingZ
[docs] def add_sort1(self, nNodes, dt, data):
[eid, parent, coord, icord, forces] = data
if dt not in self.forceX:
self.add_new_transient(dt)
self.parent[eid] = parent
self.coord[eid] = coord
self.icord[eid] = icord
#self.eType[eid] = eType
self.forceX[dt][eid] = {}
self.shearY[dt][eid] = {}
self.shearZ[dt][eid] = {}
self.torsion[dt][eid] = {}
self.bendingY[dt][eid] = {}
self.bendingZ[dt][eid] = {}
for force in forces:
[nid, posit, forceX, shearY, shearZ, torsion,
bendingY, bendingZ] = force
self.forceX[dt][eid][nid] = forceX
self.shearY[dt][eid][nid] = shearY
self.shearZ[dt][eid][nid] = shearZ
self.torsion[dt][eid][nid] = torsion
self.bendingY[dt][eid][nid] = bendingY
self.bendingZ[dt][eid][nid] = bendingZ
[docs] def addSort2(self, nNodes, eid, data):
[dt, parent, coord, icord, forces] = data
if dt not in self.forceX:
self.add_new_transient(dt)
self.parent[eid] = parent
self.coord[eid] = coord
self.icord[eid] = icord
#self.eType[eid] = eType
self.forceX[dt][eid] = {}
self.shearY[dt][eid] = {}
self.shearZ[dt][eid] = {}
self.torsion[dt][eid] = {}
self.bendingY[dt][eid] = {}
self.bendingZ[dt][eid] = {}
for force in forces:
[nid, posit, forceX, shearY, shearZ, torsion,
bendingY, bendingZ] = force
self.forceX[dt][eid][nid] = forceX
self.shearY[dt][eid][nid] = shearY
self.shearZ[dt][eid][nid] = shearZ
self.torsion[dt][eid][nid] = torsion
self.bendingY[dt][eid][nid] = bendingY
self.bendingZ[dt][eid][nid] = bendingZ
[docs]class ComplexForce_VU_2D(ScalarObject): # 189-VUQUAD,190-VUTRIA
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
#self.eType = {}
self.parent = {}
self.coord = {}
self.icord = {}
self.theta = {}
self.membraneX = {}
self.membraneY = {}
self.membraneXY = {}
self.bendingX = {}
self.bendingY = {}
self.bendingXY = {}
self.shearYZ = {}
self.shearXZ = {}
# TODO if dt=None, handle SORT1 case
self.dt = dt
if is_sort1:
if dt is not None:
self.add = self.add_sort1
else:
assert dt is not None
self.add = self.addSort2
[docs] def get_stats(self):
msg = self.get_data_code()
nelements = len(self.coord)
if self.dt is not None: # transient
ntimes = len(self.membraneX)
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' parent, coord, icord, theta, membraneX, membraneY, '
'membraneXY, bendingX, bendingY, bendingXY, '
'shearYZ, shearXZ\n')
return msg
[docs] def add_new_transient(self, dt):
self.membraneX[dt] = {}
self.membraneY[dt] = {}
self.membraneXY[dt] = {}
self.bendingX[dt] = {}
self.bendingY[dt] = {}
self.bendingXY[dt] = {}
self.shearYZ[dt] = {}
self.shearXZ[dt] = {}
[docs] def add(self, nNodes, dt, data):
[eid, parent, coord, icord, theta, forces] = data
self.parent[eid] = parent
self.coord[eid] = coord
self.icord[eid] = icord
self.theta[eid] = theta
#self.eType[eid] = eType
self.membraneX[eid] = {}
self.membraneY[eid] = {}
self.membraneXY[eid] = {}
self.bendingX[eid] = {}
self.bendingY[eid] = {}
self.bendingXY[eid] = {}
self.shearYZ[eid] = {}
self.shearXZ[eid] = {}
for force in forces:
[nid, membraneX, membraneY, membraneXY, bendingX,
bendingY, bendingXY, shearYZ, shearXZ] = force
self.membraneX[eid][nid] = membraneX
self.membraneY[eid][nid] = membraneY
self.membraneXY[eid][nid] = membraneXY
self.bendingX[eid][nid] = bendingX
self.bendingY[eid][nid] = bendingY
self.bendingXY[eid][nid] = bendingXY
self.shearYZ[eid][nid] = shearYZ
self.shearXZ[eid][nid] = shearXZ
[docs] def add_sort1(self, nNodes, dt, data):
[eid, parent, coord, icord, theta, forces] = data
self._fillObject(dt, eid, parent, coord, icord, theta, forces)
[docs] def addSort2(self, nNodes, eid, data):
[dt, parent, coord, icord, theta, forces] = data
self._fillObject(dt, eid, parent, coord, icord, theta, forces)
def _fillObject(self, dt, eid, parent, coord, icord, theta, forces):
if dt not in self.membraneX:
self.add_new_transient(dt)
self.parent[eid] = parent
self.coord[eid] = coord
self.icord[eid] = icord
self.theta[eid] = theta
#self.eType[eid] = eType
self.membraneX[dt][eid] = {}
self.membraneY[dt][eid] = {}
self.membraneXY[dt][eid] = {}
self.bendingX[dt][eid] = {}
self.bendingY[dt][eid] = {}
self.bendingXY[dt][eid] = {}
self.shearYZ[dt][eid] = {}
self.shearXZ[dt][eid] = {}
for force in forces:
[nid, membraneX, membraneY, membraneXY, bendingX,
bendingY, bendingXY, shearYZ, shearXZ] = force
self.membraneX[dt][eid][nid] = membraneX
self.membraneY[dt][eid][nid] = membraneY
self.membraneXY[dt][eid][nid] = membraneXY
self.bendingX[dt][eid][nid] = bendingX
self.bendingY[dt][eid][nid] = bendingY
self.bendingXY[dt][eid][nid] = bendingXY
self.shearYZ[dt][eid][nid] = shearYZ
self.shearXZ[dt][eid][nid] = shearXZ