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 pyNastran.op2.resultObjects.tableObject import TableObject,ComplexTableObject 00027 00028 00029 class ForceVectorObject(TableObject): # tableCode=12, sortCode=0, thermal=0 00030 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00031 TableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00032 00033 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00034 name = 'forceVector' 00035 if self.nonlinearFactor is None: 00036 return self._writeMatlab(name,iSubcase,f) 00037 else: 00038 return self._writeMatlabTransient(name,iSubcase,f) 00039 00040 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00041 if self.nonlinearFactor is not None: 00042 return self.writeF06Transient(header,pageStamp,pageNum,f) 00043 00044 msg = header+[' N O N - L I N E A R - F O R C E V E C T O R\n' 00045 ' \n', 00046 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00047 for nodeID,translation in sorted(self.translations.iteritems()): 00048 rotation = self.rotations[nodeID] 00049 gridType = self.gridTypes[nodeID] 00050 00051 (dx,dy,dz) = translation 00052 (rx,ry,rz) = rotation 00053 vals = [dx,dy,dz,rx,ry,rz] 00054 (vals2,isAllZeros) = self.writeFloats13E(vals) 00055 if not isAllZeros: 00056 [dx,dy,dz,rx,ry,rz] = vals2 00057 msg.append('%14i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip())) 00058 ### 00059 ### 00060 msg.append(pageStamp+str(pageNum)+'\n') 00061 if f is not None: 00062 f.write(''.join(msg)) 00063 msg = [''] 00064 return (''.join(msg),pageNum) 00065 00066 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00067 msg = [] 00068 words = [' N O N - L I N E A R - F O R C E V E C T O R\n' 00069 ' \n', 00070 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00071 00072 for dt,translations in sorted(self.translations.iteritems()): 00073 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00074 msg += header+words 00075 for nodeID,translation in sorted(translations.iteritems()): 00076 rotation = self.rotations[dt][nodeID] 00077 gridType = self.gridTypes[nodeID] 00078 00079 (dx,dy,dz) = translation 00080 (rx,ry,rz) = rotation 00081 00082 vals = [dx,dy,dz,rx,ry,rz] 00083 (vals2,isAllZeros) = self.writeFloats13E(vals) 00084 if not isAllZeros: 00085 [dx,dy,dz,rx,ry,rz] = vals2 00086 msg.append('%14i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip())) 00087 ### 00088 ### 00089 msg.append(pageStamp+str(pageNum)+'\n') 00090 if f is not None: 00091 f.write(''.join(msg)) 00092 msg = [''] 00093 pageNum+=1 00094 return (''.join(msg),pageNum-1) 00095 00096 def __reprTransient__(self): 00097 msg = '---TRANSIENT FORCE VECTOR---\n' 00098 #msg += '%s = %g\n' %(self.dataCode['name'],self.dt) 00099 msg += self.writeHeader() 00100 00101 for dt,translations in sorted(self.translations.iteritems()): 00102 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00103 for nodeID,translation in sorted(translations.iteritems()): 00104 rotation = self.rotations[dt][nodeID] 00105 gridType = self.gridTypes[nodeID] 00106 (dx,dy,dz) = translation 00107 (rx,ry,rz) = rotation 00108 00109 msg += '%-10i %8s ' %(nodeID,gridType) 00110 vals = [dx,dy,dz,rx,ry,rz] 00111 for val in vals: 00112 if abs(val)<1e-6: 00113 msg += '%10s ' %(0) 00114 else: 00115 msg += '%10.3e ' %(val) 00116 ### 00117 msg += '\n' 00118 ### 00119 return msg 00120 00121 def __repr__(self): 00122 if self.nonlinearFactor is not None: 00123 return self.__reprTransient__() 00124 00125 msg = '---FORCE VECTOR---\n' 00126 msg += self.writeHeader() 00127 00128 for nodeID,translation in sorted(self.translations.iteritems()): 00129 rotation = self.rotations[nodeID] 00130 gridType = self.gridTypes[nodeID] 00131 00132 (dx,dy,dz) = translation 00133 (rx,ry,rz) = rotation 00134 00135 msg += '%-10i %-8s ' %(nodeID,gridType) 00136 vals = [dx,dy,dz,rx,ry,rz] 00137 for val in vals: 00138 if abs(val)<1e-6: 00139 msg += '%10s ' %(0) 00140 else: 00141 msg += '%10.3e ' %(val) 00142 ### 00143 msg += '\n' 00144 return msg 00145 00146 def __reprTransient__(self): 00147 return self.writeF06Transient(['',''],'PAGE ',1)[0] 00148 00149 class ComplexForceVectorObject(ComplexTableObject): # tableCode=12, approachCode=??? 00150 def __init__(self,dataCode,isSort1,iSubcase,dt): 00151 ComplexTableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00152 00153 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00154 name = 'forceVector' 00155 if self.nonlinearFactor is None: 00156 return self._writeMatlab(name,iSubcase,f,isMagPhase) 00157 else: 00158 return self._writeMatlabTransient(name,iSubcase,f,isMagPhase) 00159 00160 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00161 if self.nonlinearFactor is not None: 00162 return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase=False) 00163 msg = header+[' C O M P L E X FORCE V E C T O R\n', 00164 ' (REAL/IMAGINARY)\n', 00165 ' \n', 00166 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00167 for nodeID,translation in sorted(self.translations.iteritems()): 00168 rotation = self.rotations[nodeID] 00169 gridType = self.gridTypes[nodeID] 00170 00171 (dx,dy,dz) = translation 00172 dxr=dx.real; dyr=dy.real; dzr=dz.real; 00173 dxi=dx.imag; dyi=dy.imag; dzi=dz.imag 00174 00175 (rx,ry,rz) = rotation 00176 rxr=rx.real; ryr=ry.real; rzr=rz.real 00177 rxi=rx.imag; ryi=ry.imag; rzi=rz.imag 00178 00179 vals = [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi] 00180 (vals2,isAllZeros) = self.writeFloats13E(vals) 00181 [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi] = vals2 00182 msg.append('0 %12i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dxr,dyr,dzr,rxr,ryr,rzr.rstrip())) 00183 msg.append(' %12s %6s %13s %13s %13s %13s %13s %-s\n' %('','', dxi,dyi,dzi,rxi,ryi,rzi.rstrip())) 00184 ### 00185 msg.append(pageStamp+str(pageNum)+'\n') 00186 if f is not None: 00187 f.write(''.join(msg)) 00188 msg = [''] 00189 return (''.join(msg),pageNum) 00190 00191 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00192 words = [' C O M P L E X F O R C E V E C T O R\n', 00193 ' (REAL/IMAGINARY)\n', 00194 ' \n', 00195 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00196 msg = [] 00197 for dt,translations in sorted(self.translations.iteritems()): 00198 header[2] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00199 msg += header+words 00200 for nodeID,translation in sorted(translations.iteritems()): 00201 rotation = self.rotations[dt][nodeID] 00202 gridType = self.gridTypes[nodeID] 00203 00204 (dx,dy,dz) = translation 00205 dxr=dx.real; dyr=dy.real; dzr=dz.real; 00206 dxi=dx.imag; dyi=dy.imag; dzi=dz.imag 00207 00208 (rx,ry,rz) = rotation 00209 rxr=rx.real; ryr=ry.real; rzr=rz.real 00210 rxi=rx.imag; ryi=ry.imag; rzi=rz.imag 00211 00212 vals = [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi] 00213 (vals2,isAllZeros) = self.writeFloats13E(vals) 00214 [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi] = vals2 00215 msg.append('0 %12i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dxr,dyr,dzr,rxr,ryr,rzr.rstrip())) 00216 msg.append(' %12s %6s %13s %13s %13s %13s %13s %-s\n' %('','', dxi,dyi,dzi,rxi,ryi,rzi.rstrip())) 00217 ### 00218 msg.append(pageStamp+str(pageNum)+'\n') 00219 if f is not None: 00220 f.write(''.join(msg)) 00221 msg = [''] 00222 pageNum+=1 00223 return (''.join(msg),pageNum-1) 00224 00225 def __repr__(self): 00226 return self.writeF06(['','',''],'PAGE ',1)[0] 00227 00228 msg = '---COMPLEX FORCE VECTOR---\n' 00229 #if self.dt is not None: 00230 # msg += '%s = %g\n' %(self.dataCode['name'],self.dt) 00231 headers = ['DxReal','DxImag','DyReal','DyImag','DzReal','DyImag','RxReal','RxImag','RyReal','RyImag','RzReal','RzImag'] 00232 msg += '%-10s ' %('nodeID') 00233 for header in headers: 00234 msg += '%10s ' %(header) 00235 msg += '\n' 00236 00237 for freq,translations in sorted(self.translations.iteritems()): 00238 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00239 00240 for nodeID,translation in sorted(translations.iteritems()): 00241 rotation = self.rotations[freq][nodeID] 00242 00243 msg += '%-10i ' %(nodeID) 00244 vals = translation+rotation 00245 for val in vals: 00246 if abs(val)<1e-6: 00247 msg += '%10s ' %(0) 00248 else: 00249 msg += '%10.3e ' %(val) 00250 ### 00251 msg += '\n' 00252 ### 00253 return msg