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 import sys 00026 from struct import unpack 00027 00028 from pyNastran.op2.tables.oqg_constraintForces.oqg_spcForces import( 00029 SPCForcesObject,ComplexSPCForcesObject) 00030 from pyNastran.op2.tables.oqg_constraintForces.oqg_mpcForces import( 00031 MPCForcesObject,ComplexMPCForcesObject) 00032 00033 #from pyNastran.op2.tables.oug.oug_Objects import ( 00034 #temperatureObject,displacementObject, # analysisCode=1, sortCode=0 00035 #fluxObject, # analysisCode=1, sortCode=3 00036 #nonlinearTemperatureObject, # analysisCode=10,sortCode=0 00037 #) 00038 00039 #from pyNastran.op2.tables.oug.oug_eigenvectors import ( 00040 #eigenVectorObject, # analysisCode=2, sortCode=0 formatCode tableCode=7 00041 #complexEigenVectorObject, # analysis =5, sortCode=1 formatCode=1 tableCode=7 00042 #realEigenVectorObject, # analysisCode=9, sortCode=1 formatCode=1 tableCode=7 00043 #) 00044 00045 class OQG(object): 00046 """Table of spc/mpc forces/momenets""" 00047 00048 def readTable_OQG(self): 00049 table3 = self.readTable_OQG_3 00050 table4Data = self.readOQG_Data 00051 self.readResultsTable(table3,table4Data) 00052 self.deleteAttributes_OQG() 00053 00054 def deleteAttributes_OQG(self): 00055 #print self.obj 00056 params = ['lsdvm','mode','eigr','modeCycle','freq','dt','lftsfq','thermal','rCode','fCode','numWide','acousticFlag','thermal'] 00057 self.deleteAttributes(params) 00058 00059 def readTable_OQG_3(self,iTable): # iTable=-3 00060 bufferWords = self.getMarker() 00061 if self.makeOp2Debug: 00062 self.op2Debug.write('bufferWords=%s\n' %(str(bufferWords))) 00063 #print "2-bufferWords = ",bufferWords,bufferWords*4,'\n' 00064 00065 data = self.getData(4) 00066 bufferSize, = unpack('i',data) 00067 data = self.getData(4*50) 00068 #print self.printBlock(data) 00069 00070 (three) = self.parseApproachCode(data) 00071 00072 self.addDataParameter(data,'randomCode', 'i',8,False) ## random code 00073 self.addDataParameter(data,'formatCode', 'i',9,False) ## format code 00074 self.addDataParameter(data,'numWide', 'i',10,False) ## number of words per entry in record; @note is this needed for this table ??? 00075 self.addDataParameter(data,'acousticFlag','f',13,False) ## acoustic pressure flag 00076 self.addDataParameter(data,'thermal', 'i',23,False) ## thermal flag; 1 for heat ransfer, 0 otherwise 00077 00078 if not self.isSort1(): 00079 raise NotImplementedError('sort2...') 00080 #assert self.isThermal()==False,self.thermal 00081 00082 #self.printBlock(data) # on 00083 ## assuming tCode=1 00084 if self.analysisCode==1: # statics / displacement / heat flux 00085 self.addDataParameter(data,'lsdvmn', 'i',5,False) ## load set number 00086 self.applyDataCodeValue('dataNames',['lsdvmn']) 00087 self.setNullNonlinearFactor() 00088 elif self.analysisCode==2: # real eigenvalues 00089 self.addDataParameter(data,'mode', 'i',5) ## mode number 00090 self.addDataParameter(data,'eigr', 'f',6,False) ## real eigenvalue 00091 self.addDataParameter(data,'modeCycle','f',7,False) ## mode or cycle @todo confused on the type - F1??? 00092 self.applyDataCodeValue('dataNames',['mode','eigr','modeCycle']) 00093 #elif self.analysisCode==3: # differential stiffness 00094 #self.lsdvmn = self.getValues(data,'i',5) ## load set number 00095 #self.dataCode['lsdvmn'] = self.lsdvmn 00096 #elif self.analysisCode==4: # differential stiffness 00097 #self.lsdvmn = self.getValues(data,'i',5) ## load set number 00098 elif self.analysisCode==5: # frequency 00099 self.addDataParameter(data,'freq','f',5) ## frequency 00100 self.applyDataCodeValue('dataNames',['freq']) 00101 elif self.analysisCode==6: # transient 00102 self.addDataParameter(data,'dt','f',5) ## time step 00103 self.applyDataCodeValue('dataNames',['dt']) 00104 elif self.analysisCode==7: # pre-buckling 00105 self.addDataParameter(data,'lsdvmn', 'i',5) ## load set number 00106 self.applyDataCodeValue('dataNames',['lsdvmn']) 00107 elif self.analysisCode==8: # post-buckling 00108 self.addDataParameter(data,'lsdvmn', 'i',5) ## load set number 00109 self.addDataParameter(data,'eigr', 'f',6,False) ## real eigenvalue 00110 self.applyDataCodeValue('dataNames',['lsdvmn','eigr']) 00111 elif self.analysisCode==9: # complex eigenvalues 00112 self.addDataParameter(data,'mode','i',5) ## mode number 00113 self.addDataParameter(data,'eigr','f',6,False) ## real eigenvalue 00114 self.addDataParameter(data,'eigi','f',7,False) ## imaginary eigenvalue 00115 self.applyDataCodeValue('dataNames',['mode','eigr','eigi']) 00116 elif self.analysisCode==10: # nonlinear statics 00117 self.addDataParameter(data,'lftsfq','f',5) ## load step 00118 self.applyDataCodeValue('dataNames',['lftsfq']) 00119 elif self.analysisCode==11: # old geometric nonlinear statics 00120 self.addDataParameter(data,'lsdvmn', 'i',5) ## load set number 00121 self.applyDataCodeValue('dataNames',['lsdvmn']) 00122 elif self.analysisCode==12: # contran ? (may appear as aCode=6) --> straight from DMAP...grrr... 00123 self.addDataParameter(data,'lsdvmn', 'i',5) ## load set number 00124 self.applyDataCodeValue('dataNames',['lsdvmn']) 00125 else: 00126 raise RuntimeError('invalid analysisCode...analysisCode=%s' %(self.analysisCode)) 00127 # tCode=2 00128 #if self.analysisCode==2: # sort2 00129 # self.lsdvmn = self.getValues(data,'i',5) 00130 00131 #print "*iSubcase=%s"%(self.iSubcase) 00132 #print "analysisCode=%s tableCode=%s thermal=%s" %(self.analysisCode,self.tableCode,self.thermal) 00133 #print self.codeInformation() 00134 00135 if not self.isSort1(): 00136 raise NotImplementedError('sort2...') 00137 00138 #self.printBlock(data) 00139 self.readTitle() 00140 00141 00142 def readOQG_Data(self): 00143 #tfsCode = [self.tableCode,self.formatCode,self.sortCode] 00144 00145 #print "self.analysisCode=%s tableCode(1)=%s thermal(23)=%g" %(self.analysisCode,self.tableCode,self.thermal) 00146 assert self.thermal in [0,1,8],self.codeInformation() 00147 00148 if self.tableCode==3: # SPC Forces 00149 assert self.tableName in ['OQG1','OQGV1','OQP1'],'tableName=%s tableCode=%s' %(self.tableName,self.tableCode) 00150 self.readOQG_Data_table3() 00151 elif self.tableCode==39: # MPC Forces 00152 assert self.tableName in ['OQMG1'],'tableName=%s tableCode=%s' %(self.tableName,self.tableCode) 00153 self.readOQG_Data_table3() 00154 else: 00155 self.NotImplementedOrSkip('bad analysis/table/format/sortCode=%s' %(self.atfsCode)) 00156 ### 00157 #print self.obj 00158 00159 def readOQG_Data_table3(self): # SPC Forces 00160 #isSort1 = self.isSort1() 00161 #print(self.codeInformation()) 00162 magPhase = self.isMagnitudePhase() 00163 if magPhase or self.numWide==14: # real/imaginary or mag/phase 00164 if self.thermal==0: 00165 resultName = 'spcForces' 00166 self.createTransientObject(self.spcForces, ComplexSPCForcesObject) # complex 00167 self.handleResultsBuffer3(self.OUG_ComplexTable,resultName) 00168 else: 00169 self.NotImplementedOrSkip() 00170 elif self.numWide==8: # real/random 00171 if self.thermal==0: 00172 resultName = 'spcForces' 00173 self.createTransientObject(self.spcForces,SPCForcesObject) # real 00174 self.handleResultsBuffer3(self.OUG_RealTable,resultName) 00175 else: 00176 self.NotImplementedOrSkip() 00177 else: 00178 self.NotImplementedOrSkip('only numWide=8 or 14 is allowed numWide=%s' %(self.numWide)) 00179 ### 00180 #if self.thermal not in [0,1]: 00181 #print self.obj 00182 #raise RuntimeError('check the printout for thermal...') 00183 00184 def readOQG_Data_table39(self): # MPC Forces 00185 #isSort1 = self.isSort1() 00186 if self.numWide == 8: # real/random 00187 if self.thermal == 0: 00188 resultName = 'mpcForces' 00189 self.createTransientObject(self.mpcForces,MPCForcesObject) # real 00190 self.handleResultsBuffer3(self.OUG_RealTable,resultName) 00191 else: 00192 self.NotImplementedOrSkip() 00193 elif self.numWide==14: # real/imaginary or mag/phase 00194 if self.thermal==0: 00195 resultName = 'mpcForces' 00196 self.createTransientObject(self.mpcForces,ComplexMPCForcesObject) # complex 00197 self.handleResultsBuffer3(self.OUG_ComplexTable,resultName) 00198 else: 00199 self.NotImplementedOrSkip() 00200 else: 00201 self.NotImplementedOrSkip('only numWide=8 or 14 is allowed numWide=%s' %(self.numWide)) 00202 ### 00203