from six import iteritems
from numpy import zeros
from pyNastran.op2.resultObjects.op2_Objects import ScalarObject
from pyNastran.f06.f06_formatting import writeFloats13E, writeFloats10E, writeFloats8p4F, get_key0
[docs]class GridPointStressesArray(ScalarObject):
"""
msg = header + [' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n',
'0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n',
' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n',
' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n']
#'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0'
#' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0'
#' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0'
"""
def __init__(self, data_code, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
self.ntotal = 0
self.ntimes = 0
[docs] def build(self):
self.grid_element = zeros((self.ntotal, 2), dtype='int32')
#oxx, oyy, txy, angle, major, minor, ovm
self.data = zeros((self.ntimes, self.ntotal, 7), dtype='float32')
[docs] def add_sort1(self, dt, eKey, eid, elemName, nx, ny, txy, angle, majorP, minorP, tmax, ovm):
self.times[self.itime] = dt
self.grid_element[self.ntotal, :] = [eKey, eid]
self.data[self.itime, self.ntotal, :] = [nx, ny, txy, angle, majorP, minorP, tmax, ovm]
[docs] def get_stats(self):
msg = self.get_data_code()
if self.nonlinear_factor is not None: # transient
ntimes = len(self.nx)
times0 = get_key0(self.nx)
nelements = len(self. nx[times0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self. nx)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' nx, ny, txy, angle, majorP, minorP, tmax, ovm\n')
return msg
[docs]class GridPointStresses(ScalarObject):
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
self.nx = {}
self.ny = {}
self.txy = {}
self.angle = {}
self.majorP = {}
self.minorP = {}
self.tmax = {}
self.ovm = {}
self.elemName = {}
self.eids = {}
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.nonlinear_factor is not None: # transient
ntimes = len(self.nx)
times0 = get_key0(self.nx)
nelements = len(self. nx[times0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self. nx)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' nx, ny, txy, angle, majorP, minorP, tmax, ovm\n')
return msg
[docs] def add_new_transient(self, dt): # eKey
"""initializes the transient variables"""
self.nx[dt] = {}
self.ny[dt] = {}
self.txy[dt] = {}
self.angle[dt] = {}
self.majorP[dt] = {}
self.minorP[dt] = {}
self.tmax[dt] = {}
self.ovm[dt] = {}
self.elemName = {}
self.eids = {}
[docs] def add(self, dt, eKey, eid, elemName, nx, ny, txy, angle, majorP, minorP, tmax, ovm):
if eKey not in self.nx:
self.eids[eKey] = []
self.elemName[eKey] = []
self.nx[eKey] = []
self.ny[eKey] = []
self.txy[eKey] = []
self.angle[eKey] = []
self.majorP[eKey] = []
self.minorP[eKey] = []
self.tmax[eKey] = []
self.ovm[eKey] = []
self.nx[eKey].append(nx)
self.ny[eKey].append(ny)
self.txy[eKey].append(txy)
self.angle[eKey].append(angle)
self.majorP[eKey].append(majorP)
self.minorP[eKey].append(minorP)
self.tmax[eKey].append(tmax)
self.ovm[eKey].append(ovm)
self.elemName[eKey].append(elemName)
self.eids[eKey].append(eid)
[docs] def add_sort1(self, dt, eKey, eid, elemName, nx, ny, txy, angle, majorP, minorP, tmax, ovm):
if dt not in self.nx:
self.add_new_transient(dt)
#print "%s=%s eKey=%s eid=%s elemName=%s f1=%s" %(self.data_code['name'],dt,eKey,eid,elemName,f1)
if eKey not in self.nx[dt]:
self.eids[eKey] = []
self.elemName[eKey] = []
self.nx[dt][eKey] = []
self.ny[dt][eKey] = []
self.txy[dt][eKey] = []
self.angle[dt][eKey] = []
self.majorP[dt][eKey] = []
self.minorP[dt][eKey] = []
self.tmax[dt][eKey] = []
self.ovm[dt][eKey] = []
self.eids[eKey].append(eid)
self.elemName[eKey].append(elemName)
self.nx[dt][eKey].append(nx)
self.ny[dt][eKey].append(ny)
self.txy[dt][eKey].append(txy)
self.angle[dt][eKey].append(angle)
self.majorP[dt][eKey].append(majorP)
self.minorP[dt][eKey].append(minorP)
self.tmax[dt][eKey].append(tmax)
self.ovm[dt][eKey].append(ovm)
[docs] def delete_transient(self, dt):
del self.nx[dt]
del self.ny[dt]
del self.txy[dt]
del self.angle[dt]
del self.majorP[dt]
del self.minorP[dt]
del self.tmax[dt]
del self.ovm[dt]
[docs] def get_transients(self):
k = self.nx.keys()
k.sort()
return k
#def cleanupObj(self):
#k = self.elemName.keys()
#self.elemName = self.elemName[k[0]]
#self.eids = self.eids[k[0]]
[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)
msg = header + [' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n',
'0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n',
' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n',
' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n']
#'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0'
#' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0'
#' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0'
for eKey, nxs in sorted(iteritems(self.nx)):
eKey2 = eKey
zero = '0'
for iLoad, nx in enumerate(nxs):
ny = self.ny[eKey][iLoad]
txy = self.txy[eKey][iLoad]
angle = self.angle[eKey][iLoad]
majorP = self.majorP[eKey][iLoad]
minorP = self.minorP[eKey][iLoad]
tmax = self.tmax[eKey][iLoad]
ovm = self.ovm[eKey][iLoad]
(elemName) = self.elemName[eKey][iLoad]
eid = self.eids[eKey][iLoad]
vals = [nx, ny, txy, majorP, minorP, tmax, ovm]
(vals2, is_all_zeros) = writeFloats10E(vals)
[nx, ny, txy, majorP, minorP, tmax, ovm] = vals2
if eid == 0:
eid = zero
angle, isAllZero = writeFloats8p4F([angle])
anglei = angle[0]
msg.append('%s%8s %8s %4s %s %s %s %8s %10s %10s %10s %s\n' % (zero, eKey2, eid, elemName, nx, ny, txy, anglei, majorP, minorP, tmax, ovm))
zero = ' '
eKey2 = ' '
msg.append(page_stamp % page_num)
f.write(''.join(msg))
return page_num
[docs] def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
f.write('GridPointStressesObject write_f06 is not implemented...\n')
return page_num
#raise NotImplementedError()
msg = header + [' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n',
'0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n',
' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n',
' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n']
#'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0'
#' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0'
#' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0'
for dt, Forces in sorted(iteritems(self.forces)):
for eKey, force in sorted(iteritems(Forces)):
zero = '0'
for iLoad, f in enumerate(force):
(f1, f2, f3) = f
(m1, m2, m3) = self.moments[dt][eKey][iLoad]
(elemName) = self.elemName[eKey][iLoad]
eid = self.eids[eKey][iLoad]
vals = [f1, f2, f3, m1, m2, m3]
(vals2, is_all_zeros) = writeFloats13E(vals)
[f1, f2, f3, m1, m2, m3] = vals2
if eid == 0:
eid = ''
msg.append('%s %8s %10s %8s %10s %10s %10s %10s %10s %s\n' % (zero, eKey, eid, elemName, f1, f2, f3, m1, m2, m3))
zero = ' '
msg.append(page_stamp % page_num)
f.write(''.join(msg))
msg = ['']
page_num += 1
return page_num - 1
[docs]class GridPointStressesVolume(ScalarObject):
def __init__(self, data_code, is_sort1, isubcase, dt):
ScalarObject.__init__(self, data_code, isubcase)
self.nx = {}
self.ny = {}
self.nz = {}
self.txy = {}
self.tyz = {}
self.txz = {}
self.pressure = {}
self.ovm = {}
self.elemName = {}
self.eids = {}
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.nonlinear_factor is not None: # transient
ntimes = len(self.nx)
times0 = get_key0(self.nx)
nelements = len(self. nx[times0])
msg.append(' type=%s ntimes=%s nelements=%s\n'
% (self.__class__.__name__, ntimes, nelements))
else:
nelements = len(self. nx)
msg.append(' type=%s nelements=%s\n' % (self.__class__.__name__,
nelements))
msg.append(' nx, ny, nz, txy, tyz, txz, pressure, ovm\n')
return msg
[docs] def add_new_transient(self, dt): # eKey
"""initializes the transient variables"""
self.nx[dt] = {}
self.ny[dt] = {}
self.nz[dt] = {}
self.txy[dt] = {}
self.tyz[dt] = {}
self.txz[dt] = {}
self.pressure[dt] = {}
self.ovm[dt] = {}
self.elemName = {}
self.eids = {}
[docs] def add(self, dt, eKey, nx, ny, nz, txy, tyz, txz, pressure, ovm):
if eKey not in self.nx:
#self.eids[eKey] = []
#self.elemName[eKey] = []
self.nx[eKey] = []
self.ny[eKey] = []
self.nz[eKey] = []
self.txy[eKey] = []
self.tyz[eKey] = []
self.txz[eKey] = []
self.pressure[eKey] = []
self.ovm[eKey] = []
self.nx[eKey].append(nx)
self.ny[eKey].append(ny)
self.nz[eKey].append(nz)
self.txy[eKey].append(txy)
self.tyz[eKey].append(tyz)
self.txz[eKey].append(txz)
self.pressure[eKey].append(pressure)
self.ovm[eKey].append(ovm)
#self.elemName[eKey].append(elemName)
#self.eids[eKey].append(eid)
[docs] def add_sort1(self, dt, eKey, nx, ny, nz, txy, tyz, txz, pressure, ovm):
if dt not in self.nx:
self.add_new_transient(dt)
#print "%s=%s eKey=%s eid=%s elemName=%s f1=%s" %(self.data_code['name'],dt,eKey,eid,elemName,f1)
if eKey not in self.nx[dt]:
#self.eids[eKey] = []
#self.elemName[eKey] = []
self.nx[dt][eKey] = []
self.ny[dt][eKey] = []
self.nz[dt][eKey] = []
self.txy[dt][eKey] = []
self.tyz[dt][eKey] = []
self.txz[dt][eKey] = []
self.pressure[eKey] = []
self.ovm[dt][eKey] = []
self.eids[eKey].append(eid)
#self.elemName[eKey].append(elemName)
self.nx[dt][eKey].append(nx)
self.ny[dt][eKey].append(ny)
self.nz[dt][eKey].append(nz)
self.txy[dt][eKey].append(txy)
self.tyz[dt][eKey].append(tyz)
self.txz[dt][eKey].append(txz)
self.pressure[dt][eKey].append(pressure)
self.ovm[dt][eKey].append(ovm)
[docs] def delete_transient(self, dt):
del self.nx[dt]
del self.ny[dt]
del self.nz[dt]
del self.txy[dt]
del self.tyz[dt]
del self.txz[dt]
del self.pressure[dt]
del self.ovm[dt]
[docs] def get_transients(self):
k = self.nx.keys()
k.sort()
return k
#def cleanupObj(self):
#k = self.elemName.keys()
#self.elemName = self.elemName[k[0]]
#self.eids = self.eids[k[0]]
[docs] def write_f06(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
f.write('GridPointStressesVolumeObject write_f06 is not implemented...\n')
return page_num
#raise NotImplementedError()
if self.nonlinear_factor is not None:
return self._write_f06_transient(header, page_stamp, page_num, f)
msg = header + [' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n',
'0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n',
' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n',
' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n']
#'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0'
#' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0'
#' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0'
for eKey, nxs in sorted(iteritems(self.nx)):
eKey2 = eKey
zero = '0'
for iLoad, nx in enumerate(nxs):
ny = self.ny[eKey][iLoad]
nz = self.nz[eKey][iLoad]
txy = self.txy[eKey][iLoad]
tyz = self.tyz[eKey][iLoad]
txz = self.txz[eKey][iLoad]
pressure = self.pressure[eKey][iLoad]
ovm = self.ovm[eKey][iLoad]
#(elemName) = self.elemName[eKey][iLoad]
#eid = self.eids[eKey][iLoad]
vals = [nx, ny, nz, txy, tyz, txz, pressure, ovm]
(vals2, is_all_zeros) = writeFloats10E(vals)
[nx, ny, nz, txy, tyz, txz, pressure, ovm] = vals2
msg.append('%s%8s %s %s %s %s %s %s %s %-s\n' % (zero, eKey, nx, ny, nz, txy, tyz, txz, pressure, ovm.rstrip()))
zero = ' '
eKey2 = ' '
msg.append(page_stamp % page_num)
f.write(''.join(msg))
return page_num
[docs] def _write_f06_transient(self, header, page_stamp, page_num=1, f=None, is_mag_phase=False):
f.write('GridPointStressesVolume _write_f06_transient is not implemented...\n')
return page_num
#raise NotImplementedError()
msg = header + [' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n',
'0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n',
' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n',
' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n']
#'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0'
#' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0'
#' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0'
for dt, Forces in sorted(iteritems(self.forces)):
for eKey, force in sorted(iteritems(Forces)):
zero = '0'
for iLoad, f in enumerate(force):
(f1, f2, f3) = f
(m1, m2, m3) = self.moments[dt][eKey][iLoad]
(elemName) = self.elemName[eKey][iLoad]
eid = self.eids[eKey][iLoad]
vals = [f1, f2, f3, m1, m2, m3]
(vals2, is_all_zeros) = writeFloats13E(vals)
[f1, f2, f3, m1, m2, m3] = vals2
if eid == 0:
eid = ''
msg.append('%s %8s %10s %8s %s %s %s %s %s %-s\n' % (zero, eKey, eid, elemName, f1, f2, f3, m1, m2, m3))
zero = ' '
msg.append(page_stamp % page_num)
f.write(''.join(msg))
msg = ['']
page_num += 1
return page_num - 1