pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oee.py
Go to the documentation of this file.
00001 ## GNU Lesser General Public License
00002 ## 
00003 ## Program pyNastran - a python interface to NASTRAN files
00004 ## Copyright (C) 2011-2012  Steven Doyle, Al Danial
00005 ## 
00006 ## Authors and copyright holders of pyNastran
00007 ## Steven Doyle <mesheb82@gmail.com>
00008 ## Al Danial    <al.danial@gmail.com>
00009 ## 
00010 ## This file is part of pyNastran.
00011 ## 
00012 ## pyNastran is free software: you can redistribute it and/or modify
00013 ## it under the terms of the GNU Lesser General Public License as published by
00014 ## the Free Software Foundation, either version 3 of the License, or
00015 ## (at your option) any later version.
00016 ## 
00017 ## pyNastran is distributed in the hope that it will be useful,
00018 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 ## GNU General Public License for more details.
00021 ## 
00022 ## You should have received a copy of the GNU Lesser General Public License
00023 ## along with pyNastran.  If not, see <http://www.gnu.org/licenses/>.
00024 ## 
00025 
00026 from __future__ import division, print_function
00027 import sys
00028 from struct import unpack
00029 
00030 # pyNastran
00031 from .oee_objects import StrainEnergyObject
00032 
00033 class OEE(object):
00034     """Table of energy"""
00035 
00036     def readTable_OEE(self):
00037         table3 = self.readTable_OEE_3
00038         table4Data = self.readOEE_Data
00039         self.readResultsTable(table3,table4Data)
00040         self.deleteAttributes_OEE()
00041 
00042     def deleteAttributes_OEE(self): # no thermal
00043         params = ['lsdvm','mode','eigr','freq','dt','lftsfq','formatCode','numWide']
00044         self.deleteAttributes(params)
00045     
00046     def readTable_OEE_3(self,iTable): # iTable=-3
00047         bufferWords = self.getMarker()
00048         if self.makeOp2Debug:
00049             self.op2Debug.write('bufferWords=%s\n' %(str(bufferWords)))
00050         #print "2-bufferWords = ",bufferWords,bufferWords*4,'\n'
00051 
00052         data = self.getData(4)
00053         bufferSize, = unpack(b'i',data)
00054         data = self.getData(4*50)
00055         #print self.printBlock(data)
00056 
00057         aCode = self.getBlockIntEntry(data, 1)
00058         self.eTotal = self.parseApproachCode(data) # total energy of all elements in iSubcase/mode
00059         #print(self.printSection(100))
00060         elementName, = unpack(b'8s',data[24:32])
00061         #print("elementName = %s" %(elementName))
00062         elementName = elementName.strip() ## element name
00063         #print("elementName = %s" %(elementName))
00064         if elementName.isalpha():
00065             self.dataCode['elementName'] = elementName
00066 
00067         self.addDataParameter(data,'loadSet',   'i',8, False)  ## Load set or zero
00068         self.addDataParameter(data,'formatCode','i',9, False)  ## format code
00069         self.addDataParameter(data,'numWide',   'i',10,False)  ## number of words per entry in record; @note is this needed for this table ???
00070         self.addDataParameter(data,'cvalres',   'i',11,False)  ## C
00071         self.addDataParameter(data,'setID',     'i',13,False)  ## Set identification number Number
00072         self.addDataParameter(data,'eigenReal', 'i',14,False)  ## Natural eigenvalue - real part
00073         self.addDataParameter(data,'eigenImag', 'i',15,False)  ## Natural eigenvalue - imaginary part
00074         self.addDataParameter(data,'freq',      'f',16,False)  ## Natural frequency
00075         self.addDataParameter(data,'etotpos',   'f',18)        ## Total positive energy
00076         self.addDataParameter(data,'etotneg',   'f',19,False)  ## Total negative energy
00077 
00078         if not self.isSort1():
00079             raise NotImplementedError('sort2...')
00080 
00081         #self.printBlock(data) # on
00082         if self.analysisCode==1:   # statics / displacement / heat flux
00083             #del self.dataCode['nonlinearFactor']
00084             self.applyDataCodeValue('dataNames',['lsdvmn'])
00085             self.setNullNonlinearFactor()
00086         elif self.analysisCode==2: # real eigenvalues
00087             self.addDataParameter(data,'mode','i',5)   ## mode number
00088             self.applyDataCodeValue('dataNames',['mode'])
00089             #print "mode(5)=%s eigr(6)=%s modeCycle(7)=%s" %(self.mode,self.eigr,self.modeCycle)
00090         #elif self.analysisCode==3: # differential stiffness
00091             #self.lsdvmn = self.getValues(data,'i',5) ## load set number
00092             #self.dataCode['lsdvmn'] = self.lsdvmn
00093         #elif self.analysisCode==4: # differential stiffness
00094             #self.lsdvmn = self.getValues(data,'i',5) ## load set number
00095         elif self.analysisCode==5:   # frequency
00096             self.addDataParameter(data,'freq2','f',5)   ## frequency
00097             self.applyDataCodeValue('dataNames',['freq2'])
00098         elif self.analysisCode==6: # transient
00099             self.addDataParameter(data,'time','f',5)   ## time step
00100             self.applyDataCodeValue('dataNames',['time'])
00101         #elif self.analysisCode==7: # pre-buckling
00102             #self.applyDataCodeValue('dataNames',['lsdvmn'])
00103         elif self.analysisCode==8: # post-buckling
00104             self.addDataParameter(data,'mode','i',5)   ## mode number
00105             self.applyDataCodeValue('dataNames',['mode'])
00106         elif self.analysisCode==9: # complex eigenvalues
00107             self.addDataParameter(data,'mode','i',5)   ## mode number
00108             self.applyDataCodeValue('dataNames',['mode'])
00109         elif self.analysisCode==10: # nonlinear statics
00110             self.addDataParameter(data,'loadFactor','f',5)   ## load factor
00111             self.applyDataCodeValue('dataNames',['loadFactor'])
00112         #elif self.analysisCode==11: # old geometric nonlinear statics
00113             #self.applyDataCodeValue('dataNames',['lsdvmn'])
00114         elif self.analysisCode==12: # contran ? (may appear as aCode=6)  --> straight from DMAP...grrr...
00115             self.addDataParameter(data,'time','f',5)   ## time step
00116             self.applyDataCodeValue('dataNames',['time'])
00117         else:
00118             raise RuntimeError('invalid analysisCode...analysisCode=%s' %(self.analysisCode))
00119         ###
00120         
00121         #print "*iSubcase=%s elementName=|%s|"%(self.iSubcase,self.elementName)
00122         #print "analysisCode=%s tableCode=%s" %(self.analysisCode,self.tableCode)
00123         #print self.codeInformation()
00124 
00125         if not self.isSort1():
00126             raise NotImplementedError('sort2...')
00127 
00128         #self.printBlock(data)
00129         self.readTitle()
00130 
00131     def readOEE_Data(self):
00132         #print "self.analysisCode=%s tableCode(1)=%s" %(self.analysisCode,self.tableCode)
00133         #tfsCode = [self.tableCode,self.formatCode,self.sortCode]
00134         
00135         if self.tableCode==18:
00136             assert self.tableName in ['ONRGY1','ONRGY2'],'tableName=%s tableCode=%s' %(self.tableName,self.tableCode)
00137             self.readStrainEnergy_table18()
00138         else:
00139             self.NotImplementedOrSkip('bad approach/table/format/sortCode=%s on %s-OEE table' %(self.atfsCode,self.tableName))
00140         ###
00141         #print str(self.obj)
00142 
00143     def readStrainEnergy_table18(self): # real ???
00144         self.createTransientObject(self.strainEnergy,StrainEnergyObject)
00145         if self.numWide==4:
00146             self.handleResultsBuffer3(self.OEE_Strain4,resultName='strainEnergy')
00147         elif self.numWide==5:
00148             self.handleResultsBuffer3(self.OEE_Strain5,resultName='strainEnergy')
00149         else:   
00150             self.NotImplementedOrSkip()
00151         #self.readMappedScalarsOut(debug=False) # handles dtMap, not correct...
00152 
00153     def OEE_Strain4(self):
00154         #deviceCode = self.deviceCode
00155         dt = self.nonlinearFactor
00156 
00157         (format1,extract) = self.getOUG_FormatStart()  ## @todo change to OEE
00158         format1 += 'fff'
00159         format1 = bytes(format1)
00160         
00161         while len(self.data)>=16: # 4*4
00162             eData     = self.data[0:16]
00163             self.data = self.data[16: ]
00164             #print "len(data) = ",len(eData)
00165 
00166             out = unpack(format1, eData)
00167             (eid,energy,percent,density) = out
00168             eid2  = extract(eid,dt)
00169             #print "eType=%s" %(eType)
00170             
00171             dataIn = [eid2,energy,percent,density]
00172             #print "%s" %(self.ElementType(self.elementType)),dataIn
00173             #eid = self.obj.addNewEid(out)
00174             self.obj.add(dt,dataIn)
00175             #print "len(data) = ",len(self.data)
00176         ###
00177         #print self.strainEnergy
00178 
00179     def OEE_Strain5(self):
00180         #deviceCode = self.deviceCode
00181         dt = self.nonlinearFactor
00182 
00183         #(format1,extract) = self.getOUG_FormatStart()  ## @todo change to OEE
00184         format1 = b'8s3f'
00185 
00186         while len(self.data)>=16: # 5*4
00187             eData     = self.data[0:20]
00188             self.data = self.data[20: ]
00189             #print "len(data) = ",len(eData)
00190 
00191             out = unpack(format1, eData)
00192             (word,energy,percent,density) = out
00193             #print "out = ",out
00194             word = word.strip()
00195             #print "eType=%s" %(eType)
00196             
00197             dataIn = [word,energy,percent,density]
00198             #print "%s" %(self.ElementType(self.elementType)),dataIn
00199             #eid = self.obj.addNewEid(out)
00200             self.obj.add(dt,dataIn)
00201             #print "len(data) = ",len(self.data)
00202         ###
00203         #print self.strainEnergy
 All Classes Namespaces Files Functions Variables