pyNastran
0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
|
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