Source code for pyNastran.op2.tables.oes_stressStrain.oesnlxr
import sys
from struct import unpack
from pyNastran.op2.tables.oes_stressStrain.real.elementsStressStrain import RealElementsStressStrain
[docs]class OESNLXR(RealElementsStressStrain): ##todo real or complex?? see r767
"""Table of stresses/strains"""
[docs] def readTable_OESNLXR(self):
table3 = self.readTable_OESNLXR_3
table4Data = self.readTable_OES_4_Data
self.readResultsTable(
table3, table4Data, flag=1) # flag=1 defines old style
self.deleteAttributes_OES()
[docs] def deleteAttributes_OESNLXR(self):
params = ['sCode', 'elementType', 'obj', 'markerStart', 'loadSet', 'formatCode', 'sCode', 'thermal',
'lsdvmn', 'mode', 'eign', 'modeCycle', 'freq', 'mode', 'eigr', 'eigi', 'dt']
self.deleteAttributes(params)
[docs] def readTable_OESNLXR_3(self, iTable):
#print "*iTable3 = ",iTable
#if 0:
#markers = self.readMarkers([0,2])
#print "markers=%s" %(markers)
#block = self.readBlock()
#print "block = ",block
#markers = self.readMarkers([-1,7])
#print "markers=%s" %(markers)
#print self.printSection(200)
bufferWords = self.getBufferWords()
data = self.getData(4)
bufferSize, = unpack('i', data)
if self.makeOp2Debug:
self.op2Debug.write('bufferSize=|%s|\n' % (str(bufferSize)))
data = self.getData(4 * 50)
#self.printBlock(data)
if self.makeOp2Debug:
self.op2Debug.write('block3header\n')
self.parseApproachCode(data) # 3
## element type
self.addDataParameter(data, 'elementType', 'i', 3, False)
## load set ID
self.addDataParameter(data, 'loadSet', 'i', 8, False)
## format code
self.addDataParameter(data, 'formatCode', 'i', 9, False)
## number of words per entry in record
## @note is this needed for this table ???
self.addDataParameter(data, 'numWide', 'i', 10, False)
## stress/strain codes
self.addDataParameter(data, 'sCode', 'i', 11, False)
## thermal flag; 1 for heat ransfer, 0 otherwise
self.addDataParameter(data, 'thermal', 'i', 23, False)
#print "loadset=%s formatCode=%s numWordsEntry=%s sCode=%s" %(self.loadSet,self.formatCode,self.numWide,self.sCode)
#print "thermal(23)=%s elementType(3)=%s" %(self.thermal,self.elementType)
## assuming tCode=1
if self.analysisCode == 1: # statics / displacement / heat flux
## load set number
self.addDataParameter(data, 'lsdvmn', 'i', 5, False)
elif self.analysisCode == 2: # real eigenvalues
## mode number
self.addDataParameter(data, 'mode', 'i', 5)
## real eigenvalue
self.addDataParameter(data, 'eign', 'f', 6, False)
## mode or cycle
## @todo confused on the type - F1???
self.addDataParameter(data, 'modeCycle', 'f', 7, False)
#elif self.analysisCode==3: # differential stiffness
# ## load set number
# self.lsdvmn = self.getValues(data,'i',5)
#elif self.analysisCode==4: # differential stiffness
# self.lsdvmn = self.getValues(data,'i',5) ## load set number
elif self.analysisCode == 5: # frequency
## frequency
self.addDataParameter(data, 'freq', 'f', 5)
elif self.analysisCode == 6: # transient
## time step
self.addDataParameter(data, 'dt', 'f', 5)
#print "DT(5)=%s" %(self.dt)
elif self.analysisCode == 7: # pre-buckling
## load set
self.addDataParameter(data, 'lsdvmn', 'i', 5)
#print "LSDVMN(5)=%s" %(self.lsdvmn)
elif self.analysisCode == 8: # post-buckling
## mode number
self.addDataParameter(data, 'lsdvmn', 'i', 5)
## real eigenvalue
self.addDataParameter(data, 'eigr', 'f', 6, False)
#print "LSDVMN(5)=%s EIGR(6)=%s" %(self.lsdvmn,self.eigr)
elif self.analysisCode == 9: # complex eigenvalues
## mode number
self.addDataParameter(data, 'mode', 'i', 5)
## real eigenvalue
self.addDataParameter(data, 'eigr', 'f', 6, False)
## imaginary eigenvalue
self.addDataParameter(data, 'eigi', 'f', 7, False)
#print "mode(5)=%s eigr(6)=%s eigi(7)=%s" %(self.mode,self.eigr,self.eigi)
elif self.analysisCode == 10: # nonlinear statics
## load step
self.addDataParameter(data, 'lftsfq', 'f', 5)
#print "LFTSFQ(5) = %s" %(self.lftsfq)
elif self.analysisCode == 11: # old geometric nonlinear statics
## load set number
self.addDataParameter(data, 'lsdvmn', 'i', 5)
#print "LSDVMN(5)=%s" %(self.lsdvmn)
elif self.analysisCode == 12: # contran ? (may appear as aCode=6) --> straight from DMAP...grrr...
## Time step ??? --> straight from DMAP
self.addDataParameter(data, 'dt', 'f', 5)
else:
raise RuntimeError('Invalid Analysis Code: analysisCode=%s' % (self.analysisCode))
###
# tCode=2
#if self.analysisCode==2: # sort2
# self.lsdvmn = self.getValues(data,'i',5)
self.readTitle()
#print "n4 = ",self.n
[docs] def readTable_OESNLXR_4_Data(self, iTable):
isTable4Done = False
isBlockDone = False
#print self.printSection(100)
data = self.getData(16)
#print self.printBlock(data) # on
#print "16 block..."
#self.printBlock(data)
#self.printBlock(data)
bufferWords, = unpack('i', data[4:8])
#print "bufferWords = ",bufferWords
if self.makeOp2Debug:
self.op2Debug.write('bufferWords=|%s|\n' % (str(bufferWords)))
#print "*********************"
#bufferWords = self.getMarker() # 87 - buffer
#print "OES4 bufferWords = ",bufferWords,bufferWords*4
#self.verifyBufferSize(bufferWords)
isBlockDone = not(bufferWords)
#print "self.firstPass = ",self.firstPass
## table -4 is done, restarting table -3
if self.isBufferDone: # table is done when the buffer is done
isTable4Done = True
#print "exitA"
return isTable4Done, isBlockDone
if bufferWords == 0:
#print "bufferWords 0 - done with Table4"
isTable4Done = True
#isBlockDone = True
self.printSection(40)
#print "exitB"
return isTable4Done, isBlockDone
self.readOESNLXR_ElementTable()
return isTable4Done, isBlockDone
[docs] def readOESNLXR_ElementTable(self):
#print "**self.readElementTable"
#print "*elementType = ",self.elementType
#print "op2.tell=%s n=%s" %(self.op2.tell(),self.n)
self.rewind(4)
self.data = self.readBlock() # 348
#print "len(self.data) = ",len(self.data)
if self.makeOp2Debug:
self.op2Debug.write('reading big data block\n')
#print self.printBlock(self.data)
#msg = 'elementType=%s -> %s' %(self.elementType,self.ElementType(self.elementType))
tfsCode = [self.tableCode, self.formatCode, self.sortCode]
self.parseStressCode()
if not self.isValidSubcase(): # lets the user skip a certain subcase
self.log.debug("***skipping table=%s iSubcase=%s" %
(self.tableName, self.iSubcase))
self.skipOES_Element()
elif self.thermal == 0:
# Stress / Strain
self.dataCode['elementName'] = self.ElementType(self.elementType)
if tfsCode == [5, 1, 0]:
self.readOESNLXR_Data_format1_sort0()
else:
raise RuntimeError('invalid atfsCode=%s' % (self.atfsCode))
self.skipOES_Element()
pass
else:
raise RuntimeError('invalid thermal option...')
###
#print self.obj
[docs] def readOESNLXR_Data_format1_sort0(self):
raise NotImplementedError('code this...')
#msg = 'OES elementType=%-3s -> %-6s\n' %(self.elementType,self.ElementType(self.elementType))
msg = ''
if self.elementType in [1, 3, 10]: # crod/ctube/conrod
self.makeOES_Object(self.rodStress, rodStressObject,
self.rodStrain, rodStrainObject)
self.basicElement()
elif self.elementType == 2: # cbeam
#print " found cbeam_2"
self.dataCode['elementName'] = 'CBEAM'
self.makeOES_Object(self.beamStress, beamStressObject,
self.beamStrain, beamStrainObject)
self.CBEAM_2()
elif self.elementType in [4]: # cshear
#print " found crod_1"
self.dataCode['elementName'] = 'CSHEAR'
self.makeOES_Object(self.shearStress, shearStressObject,
self.shearStrain, shearStrainObject)
self.basicElement()
elif self.elementType in [11, 12, 13]: # celas1/celas2/celas3
self.makeOES_Object(self.celasStress, celasStressObject,
self.celasStrain, celasStrainObject)
self.basicElement()
elif self.elementType == 34: # cbar
#print " found cbar_34"
self.dataCode['elementName'] = 'CBAR'
self.makeOES_Object(self.barStress, barStressObject,
self.barStrain, barStrainObject)
self.CBAR_34()
elif self.elementType == 33: # cquad4_33
#print " found cquad_33"
self.dataCode['elementName'] = 'CQUAD4'
self.makeOES_Object(self.plateStress, plateStressObject,
self.plateStrain, plateStrainObject)
self.CQUAD4_33()
elif self.elementType == 74: # ctria
#print " found ctria_74"
self.dataCode['elementName'] = 'CTRIA3'
self.makeOES_Object(self.plateStress, plateStressObject,
self.plateStrain, plateStrainObject)
self.CTRIA3_74() # ctria3
elif self.elementType in [64, 144, 70, 75]: # cquad8/cquad4/ctriar/ctria6
#print " found cquad_144"
if self.elementType == 64:
self.dataCode['elementName'] = 'CQUAD8'
elif self.elementType == 144:
self.dataCode['elementName'] = 'CQUAD4'
elif self.elementType == 70:
self.dataCode['elementName'] = 'CTRIAR'
elif self.elementType == 75:
self.dataCode['elementName'] = 'CTRIA6'
else:
raise NotImplementedError(self.elementType)
self.makeOES_Object(self.plateStress, plateStressObject,
self.plateStrain, plateStrainObject)
self.CQUAD4_144()
elif self.elementType in [39, 67, 68]: # ctetra/chexa/cpenta
#print " found ctetra_39 / hexa_67 / cpenta_68"
self.makeOES_Object(self.solidStress, solidStressObject,
self.solidStrain, solidStrainObject)
self.CSOLID_67()
elif self.elementType in [85]: # ctetra/chexa/cpenta (91,93)
#print " found ctetra_85 / hexa_93 / cpenta_91"
self.makeOES_Object(self.solidStress, solidStressObject,
self.solidStrain, solidStrainObject)
self.CSOLID_85()
elif self.elementType in [89, 92]: # RODNL
#print " found RODNL_89"
self.makeOES_Object(self.rodStress, nonlinearRodObject,
self.rodStrain, nonlinearRodObject)
self.RODNL_89_92()
#elif self.elementType in [91]: # CPENTANL
# #print "hexa_93"
# self.CPENTANL_91()
#elif self.elementType in [93]: # CHEXANL
# #print "hexa_93"
# self.CHEXANL_93()
elif self.elementType in [95, 96, 97, 98]: # CQUAD4, CQUAD8, CTRIA3, CTRIA6 (composite)
#print " found a 95/96/97 or 98!"
self.eid2 = None # stores the previous elementID
self.makeOES_Object(
self.compositePlateStress, compositePlateStressObject,
self.compositePlateStrain, compositePlateStrainObject)
self.CQUAD4_95()
del self.eid2
elif self.elementType in [94]: # CBEAM (nonlinear)
print " found a 94!"
#self.eid2 = None # stores the previous elementID
self.makeOES_Object(self.beamStress, beamStressObject,
self.beamStrain, beamStrainObject)
self.CBEAM_94()
#sys.exit('stoping at end of CBEAM_94')
#del self.eid2
elif self.elementType in [139]: # QUAD4FD
#print " found QUAD4FD_139"
self.makeOES_Object(self.plateStress, nonlinearQuadObject,
self.plateStrain, nonlinearQuadObject)
self.QUAD4FD_139()
else:
#self.printBlock(self.data[0:100])
self.skipOES_Element()
msg = 'OES format1_sort0 elementType=%-3s -> %s is not supported - fname=%s\n' % (self.elementType, self.ElementType(self.elementType), self.op2FileName)
self.log.debug(msg)
#msg = 'OES format1_sort0 elementType=%-3s -> %s is not supported' %(self.elementType,self.ElementType(self.elementType))
#raise RuntimeError(msg)
self.skippedCardsFile.write(msg)
###