pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oqg.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 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 
 All Classes Namespaces Files Functions Variables