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 #from numpy import array 00026 from pyNastran.op2.resultObjects.tableObject import TableObject,ComplexTableObject 00027 00028 class MPCForcesObject(TableObject): 00029 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00030 TableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00031 00032 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00033 name = 'mpcForces' 00034 if self.nonlinearFactor is None: 00035 return self._writeMatlab(name,iSubcase,f) 00036 else: 00037 return self._writeMatlabTransient(name,iSubcase,f) 00038 00039 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00040 if self.nonlinearFactor is not None: 00041 return self.writeF06Transient(header,pageStamp,pageNum) 00042 msg = header+[' F O R C E S O F M U L T I - P O I N T C O N S T R A I N T\n', 00043 ' \n', 00044 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00045 for nodeID,translation in sorted(self.translations.iteritems()): 00046 rotation = self.rotations[nodeID] 00047 gridType = self.gridTypes[nodeID] 00048 00049 (dx,dy,dz) = translation 00050 (rx,ry,rz) = rotation 00051 vals = [dx,dy,dz,rx,ry,rz] 00052 (vals2,isAllZeros) = self.writeFloats13E(vals) 00053 if not isAllZeros: 00054 [dx,dy,dz,rx,ry,rz] = vals2 00055 msg.append('%14i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip())) 00056 ### 00057 ### 00058 msg.append(pageStamp+str(pageNum)+'\n') 00059 if f is not None: 00060 f.write(''.join(msg)) 00061 msg = [''] 00062 return (''.join(msg),pageNum) 00063 00064 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00065 words = [' F O R C E S O F M U L T I - P O I N T C O N S T R A I N T\n', 00066 ' \n', 00067 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00068 msg = [] 00069 for dt,translations in sorted(self.translations.iteritems()): 00070 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00071 msg += header+words 00072 for nodeID,translation in sorted(translations.iteritems()): 00073 rotation = self.rotations[dt][nodeID] 00074 gridType = self.gridTypes[nodeID] 00075 00076 (dx,dy,dz) = translation 00077 (rx,ry,rz) = rotation 00078 vals = [dx,dy,dz,rx,ry,rz] 00079 (vals2,isAllZeros) = self.writeFloats13E(vals) 00080 if not isAllZeros: 00081 [dx,dy,dz,rx,ry,rz] = vals2 00082 msg.append('%14i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip())) 00083 ### 00084 ### 00085 msg.append(pageStamp+str(pageNum)+'\n') 00086 if f is not None: 00087 f.write(''.join(msg)) 00088 msg = [''] 00089 pageNum+=1 00090 return (''.join(msg),pageNum-1) 00091 00092 def __reprTransient__(self): 00093 msg = '---MPC FORCES---\n' 00094 if self.nonlinearFactor is not None: 00095 msg += 'dt = %g\n' %(self.dt) 00096 00097 headers = ['T1','T2','T3','R1','R2','R3'] 00098 msg += '%-8s ' %('GRID') 00099 for header in headers: 00100 msg += '%10s ' %(header) 00101 msg += '\n' 00102 00103 for dt,translations in sorted(self.translations.iteritems()): 00104 msg += 'dt = %s' %(dt) 00105 for nodeID,translation in sorted(translations.iteritems()): 00106 rotation = self.rotations[dt][nodeID] 00107 (Fx,Fy,Fz) = translation 00108 (Mx,My,Mz) = rotation 00109 00110 msg += '%-8i ' %(nodeID) 00111 vals = [Fx,Fy,Fz,Mx,My,Mx] 00112 for val in vals: 00113 if abs(val)<1e-6: 00114 msg += '%10s ' %(0) 00115 else: 00116 msg += '%10.2f ' %(val) 00117 ### 00118 msg += '\n' 00119 ### 00120 return msg 00121 00122 def __repr__(self): 00123 if self.nonlinearFactor is not None: 00124 return self.__reprTransient__() 00125 00126 msg = '---MPC FORCES---\n' 00127 if self.dt is not None: 00128 msg += 'dt = %g\n' %(self.dt) 00129 00130 headers = ['T1','T2','T3','R1','R2','R3'] 00131 msg += '%-8s ' %('GRID') 00132 for header in headers: 00133 msg += '%10s ' %(header) 00134 msg += '\n' 00135 00136 for nodeID,translation in sorted(self.translations.iteritems()): 00137 rotation = self.rotations[nodeID] 00138 (Fx,Fy,Fz) = translation 00139 (Mx,My,Mz) = rotation 00140 00141 msg += '%-8i ' %(nodeID) 00142 vals = [Fx,Fy,Fz,Mx,My,Mx] 00143 for val in vals: 00144 if abs(val)<1e-6: 00145 msg += '%10s ' %(0) 00146 else: 00147 msg += '%10.2f ' %(val) 00148 ### 00149 msg += '\n' 00150 return msg 00151 00152 class ComplexMPCForcesObject(ComplexTableObject): 00153 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00154 ComplexTableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00155 00156 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00157 name = 'mpcForces' 00158 if self.nonlinearFactor is None: 00159 return self._writeMatlab(name,iSubcase,f,isMagPhase) 00160 else: 00161 return self._writeMatlabTransient(name,iSubcase,f,isMagPhase) 00162 00163 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00164 if self.nonlinearFactor is not None: 00165 return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase) 00166 msg = header+[' F O R C E S O F M U L T I - P O I N T C O N S T R A I N T\n', 00167 ' \n', 00168 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00169 raise RuntimeError('is this valid...') 00170 for nodeID,translation in sorted(self.translations.iteritems()): 00171 rotation = self.rotations[nodeID] 00172 gridType = self.gridTypes[nodeID] 00173 00174 (dx,dy,dz) = translation 00175 #dxr=dx.real; dyr=dy.real; dzr=dz.real; 00176 #dxi=dx.imag; dyi=dy.imag; dzi=dz.imag 00177 00178 (rx,ry,rz) = rotation 00179 #rxr=rx.real; ryr=ry.real; rzr=rz.real 00180 #rxi=rx.imag; ryi=ry.imag; rzi=rz.imag 00181 00182 #vals = [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi] 00183 vals = list(translation)+list(rotation) 00184 (vals2,isAllZeros) = self.writeFloats13E(vals) 00185 if not isAllZeros: 00186 [dx,dy,dz,rx,ry,rz] = vals2 00187 msg.append('%14i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip())) 00188 ### 00189 msg.append(pageStamp+str(pageNum)+'\n') 00190 if f is not None: 00191 f.write(''.join(msg)) 00192 msg = [''] 00193 return (''.join(msg),pageNum) 00194 00195 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00196 words = [' C O M P L E X F O R C E S O F M U L T I P O I N T C O N S T R A I N T\n', 00197 ' (REAL/IMAGINARY)\n', 00198 ' \n', 00199 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00200 msg = [] 00201 for dt,translations in sorted(self.translations.iteritems()): 00202 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00203 msg+= header+words 00204 for nodeID,translation in sorted(translations.iteritems()): 00205 rotation = self.rotations[dt][nodeID] 00206 gridType = self.gridTypes[nodeID] 00207 00208 (dx,dy,dz) = translation 00209 (rx,ry,rz) = rotation 00210 00211 vals = [dx,dy,dz,rx,ry,rz] 00212 (vals2,isAllZeros) = self.writeImagFloats13E(vals,isMagPhase) 00213 if not isAllZeros: 00214 [v1r,v2r,v3r,v4r,v5r,v6r, v1i,v2i,v3i,v4i,v5i,v6i] = vals2 00215 msg.append('0%13i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,v1r,v2r,v3r,v4r,v5r,v6r.rstrip())) 00216 msg.append(' %13i %6s %13s %13s %13s %13s %13s %-s\n' %(nodeID,gridType,v1i,v2i,v3i,v4i,v5i,v6i.rstrip())) 00217 ### 00218 ### 00219 msg.append(pageStamp+str(pageNum)+'\n') 00220 if f is not None: 00221 f.write(''.join(msg)) 00222 msg = [''] 00223 pageNum+=1 00224 return (''.join(msg),pageNum-1) 00225 00226 def __reprTransient__(self): 00227 msg = '---COMPLEX MPC FORCES---\n' 00228 if self.nonlinearFactor is not None: 00229 msg += 'dt = %g\n' %(self.dt) 00230 00231 raise RuntimeError('is this valid...') 00232 headers = ['T1','T2','T3','R1','R2','R3'] 00233 msg += '%-8s ' %('GRID') 00234 for header in headers: 00235 msg += '%10s ' %(header) 00236 msg += '\n' 00237 00238 for dt,translations in sorted(self.translations.iteritems()): 00239 msg += 'dt = %s' %(dt) 00240 for nodeID,translation in sorted(translations.iteritems()): 00241 rotation = self.rotations[dt][nodeID] 00242 msg += '%-8i ' %(nodeID) 00243 vals = translation+rotation 00244 for val in vals: 00245 if abs(val)<1e-6: 00246 msg += '%10s ' %(0) 00247 else: 00248 msg += '%10.2f ' %(val) 00249 ### 00250 msg += '\n' 00251 ### 00252 return msg 00253 00254 def __repr__(self): 00255 if self.nonlinearFactor is not None: 00256 return self.__reprTransient__() 00257 00258 msg = '---COMPLEX MPC FORCES---\n' 00259 if self.dt is not None: 00260 msg += 'dt = %g\n' %(self.dt) 00261 00262 raise RuntimeError('is this valid...') 00263 headers = ['T1','T2','T3','R1','R2','R3'] 00264 msg += '%-8s ' %('GRID') 00265 for header in headers: 00266 msg += '%10s ' %(header) 00267 msg += '\n' 00268 00269 for nodeID,translation in sorted(self.translations.iteritems()): 00270 rotation = self.rotations[nodeID] 00271 (Fx,Fy,Fz) = translation 00272 (Mx,My,Mz) = rotation 00273 00274 msg += '%-8i ' %(nodeID) 00275 vals = [Fx,Fy,Fz,Mx,My,Mx] 00276 for val in vals: 00277 if abs(val)<1e-6: 00278 msg += '%10s ' %(0) 00279 else: 00280 msg += '%10.2f ' %(val) 00281 ### 00282 msg += '\n' 00283 return msg 00284