from __future__ import (nested_scopes, generators, division, absolute_import,
print_function, unicode_literals)
from six import iteritems
from six.moves import zip
from pyNastran.op2.tables.oes_stressStrain.real.oes_objects import StressObject, StrainObject
from pyNastran.f06.f06_formatting import writeFloats13E
[docs]class RealCelasStress(StressObject):
"""
::
S T R E S S E S I N S C A L A R S P R I N G S ( C E L A S 2 )
TIME STRESS TIME STRESS TIME STRESS TIME STRESS
0.0 0.0 5.000000E-02 0.0 1.000000E-01 0.0 1.500000E-01 0.0
2.000000E-01 0.0 2.500000E-01 0.0 3.000000E-01 0.0 3.500000E-01 0.0
"""
def __init__(self, data_code, is_sort1, isubcase, dt):
StressObject.__init__(self, data_code, isubcase)
self.eType = {}
self.element_name = self.data_code['element_name']
self.code = [self.format_code, self.sort_code, self.s_code]
self.stress = {}
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 is_real(self):
return True
[docs] def is_complex(self):
return False
[docs] def get_stats(self):
nelements = len(self.eType)
msg = self.get_data_code()
eTypes = list(set(self.eType.values()))
if self.dt is not None: # transient
ntimes = len(self.stress)
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(' eType, stress\n')
msg.append(' eTypes = %s\n' %(', '.join(eTypes)))
return msg
[docs] def getLength(self):
return (8, 'f')
[docs] def delete_transient(self, dt):
del self.stress[dt]
[docs] def get_transients(self):
k = self.stress.keys()
k.sort()
return k
[docs] def add_new_transient(self, dt):
"""initializes the transient variables"""
self.element_name = self.data_code['element_name']
self.dt = dt
self.stress[dt] = {}
[docs] def add_new_eid(self, dt, eid, out):
(stress,) = out
self.eType[eid] = self.element_name
self.stress[eid] = stress
[docs] def add_new_eid_sort1(self, dt, eid, out):
if dt not in self.stress:
self.add_new_transient(dt)
(stress,) = out
self.eType[eid] = self.element_name
self.stress[dt][eid] = stress
[docs] def add_new_eid_sort2(self, eid, dt, out):
if dt not in self.stress:
self.add_new_transient(dt)
(stress,) = out
self.eType[eid] = self.element_name
self.stress[dt][eid] = stress
[docs] def add_f06_data(self, data, transient):
if transient is not None:
dt = transient[1]
assert not isinstance(dt, list)
if dt not in self.stress:
self.stress[dt] = {}
for datai in data:
(eid, stressi) = datai
self.stress[dt][eid] = stressi
return
for datai in data:
(eid, stressi) = datai
self.stress[eid] = stressi
[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 I N S C A L A R S P R I N G S ( C E L A S 2 )\n',
' ELEMENT STRESS ELEMENT STRESS ELEMENT STRESS ELEMENT STRESS\n',
' ID. ID. ID. ID.\n',
]
f.write(''.join(msg))
_write_f06_springs(f, self.stress)
#_write_f06_springs_transient(f, self.stress)
f.write(page_stamp % page_num)
return page_num
def _write_f06_springs_transient(f, stress, header, words, name):
for dt, datai in sorted(iteritems(data)):
header[1] = ' %s = %10.4E\n' % (name, dt)
msg += header + words
f.write(''.join(msg))
eids = []
stresses = []
for eid, stress in sorted(iteritems(datai)):
eids.append(eid)
stresses.append(stress)
if len(stresses) == 4:
stresses, is_all_zeros = writeFloats13E(stresses)
f.write(' %10i %13s %10i %13s %10i %13s %10i %13s\n' % (
eids[0], stresses[0],
eids[1], stresses[1],
eids[2], stresses[2],
eids[3], stresses[3]))
eids = []
stresses = []
if stresses:
line = ' '
stresses, is_all_zeros = writeFloats13E(stresses)
for eid, stress in zip(eids, stresses):
line += '%10i %13s ' % (eid, stress)
f.write(line.rstrip() + '\n')
msg.append(page_stamp % page_num)
f.write(''.join(msg))
msg = ['']
page_num += 1
return page_num - 1
def _write_f06_springs(f, data):
eids = []
stresses = []
for eid, stress in sorted(iteritems(data)):
eids.append(eid)
stresses.append(stress)
if len(stresses) == 4:
stresses, is_all_zeros = writeFloats13E(stresses)
f.write(' %10i %13s %10i %13s %10i %13s %10i %13s\n' % (
eids[0], stresses[0],
eids[1], stresses[1],
eids[2], stresses[2],
eids[3], stresses[3]))
eids = []
stresses = []
if stresses:
line = ' '
stresses, is_all_zeros = writeFloats13E(stresses)
for eid, stress in zip(eids, stresses):
line += '%10i %13s ' % (eid, stress)
f.write(line.rstrip() + '\n')
[docs]class RealCelasStrain(StrainObject):
def __init__(self, data_code, is_sort1, isubcase, dt):
StrainObject.__init__(self, data_code, isubcase)
self.eType = {}
self.element_name = self.data_code['element_name']
self.code = [self.format_code, self.sort_code, self.s_code]
self.isTransient = False
self.strain = {}
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 get_stats(self):
nelements = len(self.eType)
eTypes = list(set(self.eType.values()))
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.stress)
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(' eType, strain\n')
msg.append(' eTypes = %s\n' %(', '.join(eTypes)))
return msg
[docs] def getLength(self):
return (8, 'f')
[docs] def delete_transient(self, dt):
del self.strain[dt]
[docs] def get_transients(self):
k = self.strain.keys()
k.sort()
return k
[docs] def add_f06_data(self, data, transient):
if transient is not None:
dt = transient[1]
if dt not in self.strain:
self.strain[dt] = {}
for datai in data:
(eid, straini) = datai
self.strain[dt][eid] = straini
return
for datai in data:
(eid, straini) = datai
self.strain[eid] = straini
[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 A I N S I N S C A L A R S P R I N G S ( C E L A S 2 )\n',
' ELEMENT STRAIN ELEMENT STRAIN ELEMENT STRAIN ELEMENT STRAIN\n',
' ID. ID. ID. ID.\n',
]
f.write(''.join(msg))
_write_f06_springs(f, self.strain)
f.write(page_stamp % page_num)
return page_num
[docs] def add_new_transient(self, dt):
"""
initializes the transient variables
"""
self.strain[dt] = {}
[docs] def add_new_eid(self, dt, eid, out):
(strain,) = out
assert eid >= 0
self.eType[eid] = self.element_name
self.strain[eid] = strain
[docs] def add_new_eid_sort1(self, dt, eid, out):
(strain,) = out
assert eid >= 0
self.eType[eid] = self.element_type
self.strain[dt][eid] = strain
[docs]class NonlinearSpringStress(StressObject):
"""
"""
def __init__(self, data_code, is_sort1, isubcase, dt):
StressObject.__init__(self, data_code, isubcase)
self.eType = {}
self.element_name = self.data_code['element_name']
self.code = [self.format_code, self.sort_code, self.s_code]
self.force = {}
self.stress = {}
self.dt = dt
if is_sort1:
if dt is not None:
self.add_new_eid = self.add_new_eid_sort1
else:
assert dt is not None
self.add_new_eid = self.add_new_eid_sort2
[docs] def get_stats(self):
nelements = len(self.eType)
eTypes = list(set(self.eType.values()))
msg = self.get_data_code()
if self.dt is not None: # transient
ntimes = len(self.stress)
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(' eType, force, stress\n')
msg.append(' eTypes = %s\n' %(', '.join(eTypes)))
return msg
[docs] def delete_transient(self, dt):
del self.force[dt]
del self.stress[dt]
[docs] def get_transients(self):
k = self.stress.keys()
k.sort()
return k
[docs] def add_new_transient(self, dt):
"""initializes the transient variables"""
self.dt = dt
self.force[dt] = {}
self.stress[dt] = {}
[docs] def add_new_eid(self, eType, dt, eid, force, stress):
self.eType[eid] = eType
self.force[eid] = force
self.stress[eid] = stress
[docs] def add_new_eid_sort1(self, eType, dt, eid, force, stress):
if dt not in self.stress:
self.add_new_transient(dt)
self.eType[eid] = eType
self.force[dt][eid] = force
self.stress[dt][eid] = stress
[docs] def add_new_eid_sort2(self, eType, eid, dt, force, stress):
if dt not in self.stress:
self.add_new_transient(dt)
self.eType[eid] = eType
self.force[dt][eid] = force
self.stress[dt][eid] = stress