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 numpy import array 00027 from pyNastran.op2.resultObjects.op2_Objects import baseScalarObject 00028 #from pyNastran.op2.resultObjects.op2_Objects import scalarObject,array 00029 00030 class RealEigenvalues(baseScalarObject): 00031 def __init__(self,iSubcase): 00032 #self.modeNumber = [] 00033 baseScalarObject.__init__(self) 00034 self.iSubcase = iSubcase 00035 self.extractionOrder = {} 00036 self.eigenvalues = {} 00037 self.radians = {} 00038 self.cycles = {} 00039 self.generalizedMass = {} 00040 self.generalizedStiffness = {} 00041 00042 def isReal(self): 00043 return True 00044 def isComplex(self): 00045 return False 00046 00047 def addF06Line(self,data): 00048 (modeNum,extractOrder,eigenvalue,radian,cycle,genM,genK) = data 00049 self.extractionOrder[modeNum] = extractOrder 00050 self.eigenvalues[modeNum] = eigenvalue 00051 self.radians[modeNum] = radian 00052 self.cycles[modeNum] = cycle 00053 self.generalizedMass[modeNum] = genM 00054 self.generalizedStiffness[modeNum] = genK 00055 00056 def addF06Data(self,data): 00057 for line in data: 00058 self.addF06Line(line) 00059 00060 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00061 iModesMsg = 'fem.eigenvalues(%i).iModes = [' %(iSubcase) 00062 modesMsg = 'fem.eigenvalues(%i).modes = [' %(iSubcase) 00063 orderMsg = 'fem.eigenvalues(%i).order = [' %(iSubcase) 00064 omegaMsg = 'fem.eigenvalues(%i).radians = [' %(iSubcase) 00065 cyclesMsg = 'fem.eigenvalues(%i).cycles = [' %(iSubcase) 00066 massMsg = 'fem.eigenvalues(%i).mass = [' %(iSubcase) 00067 stiffMsg = 'fem.eigenvalues(%i).stiffness = [' %(iSubcase) 00068 00069 for (iMode,order) in sorted(self.extractionOrder.iteritems()): 00070 iModesMsg += '%s,' %(iMode) 00071 orderMsg += '%s,' %(order) 00072 modesMsg += '%s,' %(self.eigenvalues[iMode]) 00073 omegaMsg += '%s,' %(self.radians[iMode]) 00074 cyclesMsg += '%s,' %(self.cycles[iMode]) 00075 massMsg += '%s,' %(self.generalizedMass[iMode]) 00076 stiffMsg += '%s,' %(self.generalizedStiffness[iMode]) 00077 f.write(iModesMsg+'];\n') 00078 f.write(orderMsg+'];\n') 00079 f.write(modesMsg+'];\n') 00080 f.write(omegaMsg+'];\n') 00081 f.write(cyclesMsg+'];\n') 00082 f.write(massMsg+'];\n') 00083 f.write(stiffMsg+'];\n') 00084 00085 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00086 msg = header+[' R E A L E I G E N V A L U E S\n', 00087 ' MODE EXTRACTION EIGENVALUE RADIANS CYCLES GENERALIZED GENERALIZED\n', 00088 ' NO. ORDER MASS STIFFNESS\n'] 00089 for (iMode,order) in sorted(self.extractionOrder.iteritems()): 00090 eigen = self.eigenvalues[iMode] 00091 omega = self.radians[iMode] 00092 freq = self.cycles[iMode] 00093 mass = self.generalizedMass[iMode] 00094 stiff = self.generalizedStiffness[iMode] 00095 ([eigen,omega,freq,mass,stiff],isAllZeros) = self.writeFloats13E([eigen,omega,freq,mass,stiff]) 00096 msg.append(' %8s %8s %13s %13s %13s %13s %13s\n'%(iMode,order,eigen,omega,freq,mass,stiff)) 00097 ### 00098 msg.append(pageStamp+str(pageNum)+'\n') 00099 return (''.join(msg),pageNum) 00100 00101 def __repr__(self): 00102 msg = '%-7s %15s %15s %10s %10s %10s %15s\n' %('ModeNum','ExtractionOrder','Eigenvalue','Radians','Cycles','GenMass','GenStiffness') 00103 for modeNum,extractOrder in sorted(self.extractionOrder.iteritems()): 00104 eigenvalue = self.eigenvalues[modeNum] 00105 radian = self.radians[modeNum] 00106 cycle = self.cycles[modeNum] 00107 genM = self.generalizedMass[modeNum] 00108 genK = self.generalizedStiffness[modeNum] 00109 msg += '%-7s %15s %15s %10s %10s %10s %15s\n' %(modeNum,extractOrder,eigenvalue,radian,cycle,genM,genK) 00110 return msg 00111 00112 class ComplexEigenvalues(baseScalarObject): 00113 def __init__(self,iSubcase): 00114 baseScalarObject.__init__(self) 00115 #self.rootNumber = [] 00116 self.iSubcase = iSubcase 00117 self.extractionOrder = {} 00118 self.eigenvalues = {} 00119 self.cycles = {} 00120 self.damping = {} 00121 00122 def isReal(self): 00123 return False 00124 def isComplex(self): 00125 return True 00126 00127 def addF06Line(self,data): 00128 (rootNum,extractOrder,eigr,eigi,cycle,damping) = data 00129 self.extractionOrder[rootNum] = extractOrder 00130 self.eigenvalues[rootNum] = array([eigr,eigi]) 00131 self.cycles[rootNum] = cycle 00132 self.damping[rootNum] = damping 00133 00134 def addF06Data(self,data): 00135 for line in data: 00136 self.addF06Line(line) 00137 00138 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): # not proper msg start 00139 msg = header+[' C O M P L E X E I G E N V A L U E S\n', 00140 ' MODE EXTRACTION EIGENVALUE CYCLES DAMPING\n', 00141 ' NO. ORDER\n'] 00142 #raise NotImplementedError() 00143 for (iMode,order) in sorted(self.extractionOrder.iteritems()): 00144 eigen = self.eigenvalues[iMode] 00145 freq = self.cycles[iMode] 00146 damping = self.damping[iMode] 00147 ([eigen,freq,damping],isAllZeros) = self.writeFloats13E([eigen,freq,damping]) 00148 msg.append(' %8s %8s %13s %13s %13s %13s %13s\n'%(iMode,order,eigen,freq,damping)) 00149 ### 00150 msg.append(pageStamp+str(pageNum)+'\n') 00151 return (''.join(msg),pageNum) 00152 00153 def __repr__(self): 00154 msg = '%-7s %15s %15s %10s %10s %10s\n' %('RootNum','ExtractionOrder','Eigenvalue','','Cycles','Damping') 00155 msg += '%-7s %15s %15s %10s\n' %('','','Real','Imaginary') 00156 for rootNum,extractOrder in sorted(self.extractionOrder.iteritems()): 00157 eigenvalue = self.eigenvalues[rootNum] 00158 cycle = self.cycles[rootNum] 00159 damping = self.damping[rootNum] 00160 msg += '%-7s %15s %15s %10s %10s %10s\n' %(rootNum,extractOrder,eigenvalue[0],eigenvalue[1],cycle,damping) 00161 return msg