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 pyNastran.op2.resultObjects.op2_Objects import scalarObject 00026 00027 class GridPointStressesObject(scalarObject): 00028 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00029 scalarObject.__init__(self,dataCode,iSubcase) 00030 self.nx = {} 00031 self.ny = {} 00032 self.txy = {} 00033 self.angle = {} 00034 self.majorP = {} 00035 self.minorP = {} 00036 self.tmax = {} 00037 self.ovm = {} 00038 00039 self.elemName = {} 00040 self.eids = {} 00041 00042 self.dt = dt 00043 if isSort1: 00044 if dt is not None: 00045 self.add = self.addSort1 00046 ### 00047 else: 00048 assert dt is not None 00049 self.add = self.addSort2 00050 ### 00051 00052 def addNewTransient(self,dt): # eKey 00053 """initializes the transient variables""" 00054 self.nx[dt] = {} 00055 self.ny[dt] = {} 00056 self.txy[dt] = {} 00057 self.angle[dt] = {} 00058 self.majorP[dt] = {} 00059 self.minorP[dt] = {} 00060 self.tmax[dt] = {} 00061 self.ovm[dt] = {} 00062 00063 self.elemName = {} 00064 self.eids = {} 00065 00066 def add(self,dt,eKey,eid,elemName,nx,ny,txy,angle,majorP,minorP,tmax,ovm): 00067 if eKey not in self.nx: 00068 self.eids[eKey] = [] 00069 self.elemName[eKey] = [] 00070 self.nx[eKey] = [] 00071 self.ny[eKey] = [] 00072 self.txy[eKey] = [] 00073 self.angle[eKey] = [] 00074 self.majorP[eKey] = [] 00075 self.minorP[eKey] = [] 00076 self.tmax[eKey] = [] 00077 self.ovm[eKey] = [] 00078 self.nx[eKey].append(nx) 00079 self.ny[eKey].append(ny) 00080 self.txy[eKey].append(txy) 00081 self.angle[eKey].append(angle) 00082 self.majorP[eKey].append(majorP) 00083 self.minorP[eKey].append(minorP) 00084 self.tmax[eKey].append(tmax) 00085 self.ovm[eKey].append(ovm) 00086 00087 self.elemName[eKey].append(elemName) 00088 self.eids[eKey].append(eid) 00089 00090 def addSort1(self,dt,eKey,eid,elemName,nx,ny,txy,angle,majorP,minorP,tmax,ovm): 00091 if dt not in self.nx: 00092 self.addNewTransient(dt) 00093 00094 #print "%s=%s eKey=%s eid=%s elemName=%s f1=%s" %(self.dataCode['name'],dt,eKey,eid,elemName,f1) 00095 if eKey not in self.nx[dt]: 00096 self.eids[eKey] = [] 00097 self.elemName[eKey] = [] 00098 self.nx[dt][eKey] = [] 00099 self.ny[dt][eKey] = [] 00100 self.txy[dt][eKey] = [] 00101 self.angle[dt][eKey] = [] 00102 self.majorP[dt][eKey] = [] 00103 self.minorP[dt][eKey] = [] 00104 self.tmax[dt][eKey] = [] 00105 self.ovm[dt][eKey] = [] 00106 self.eids[eKey].append(eid) 00107 self.elemName[eKey].append(elemName) 00108 00109 self.nx[dt][eKey].append(nx) 00110 self.ny[dt][eKey].append(ny) 00111 self.txy[dt][eKey].append(txy) 00112 self.angle[dt][eKey].append(angle) 00113 self.majorP[dt][eKey].append(majorP) 00114 self.minorP[dt][eKey].append(minorP) 00115 self.tmax[dt][eKey].append(tmax) 00116 self.ovm[dt][eKey].append(ovm) 00117 00118 def deleteTransient(self,dt): 00119 del self.nx[dt] 00120 del self.ny[dt] 00121 del self.txy[dt] 00122 del self.angle[dt] 00123 del self.majorP[dt] 00124 del self.minorP[dt] 00125 del self.tmax[dt] 00126 del self.ovm[dt] 00127 00128 def getTransients(self): 00129 k = self.nx.keys() 00130 k.sort() 00131 return k 00132 00133 #def cleanupObj(self): 00134 #k = self.elemName.keys() 00135 #self.elemName = self.elemName[k[0]] 00136 #self.eids = self.eids[k[0]] 00137 00138 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00139 if self.nonlinearFactor is not None: 00140 return self.writeF06Transient(header,pageStamp,pageNum,f) 00141 00142 msg = header+[' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n', 00143 '0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n', 00144 ' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n', 00145 ' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n'] 00146 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00147 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00148 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00149 for eKey,nxs in sorted(self.nx.iteritems()): 00150 eKey2 = eKey 00151 zero = '0' 00152 for iLoad,nx in enumerate(nxs): 00153 ny = self.ny[eKey][iLoad] 00154 txy = self.txy[eKey][iLoad] 00155 angle = self.angle[eKey][iLoad] 00156 majorP = self.majorP[eKey][iLoad] 00157 minorP = self.minorP[eKey][iLoad] 00158 tmax = self.tmax[eKey][iLoad] 00159 ovm = self.ovm[eKey][iLoad] 00160 00161 (elemName) = self.elemName[eKey][iLoad] 00162 eid = self.eids[eKey][iLoad] 00163 vals = [nx,ny,txy,majorP,minorP,tmax,ovm] 00164 (vals2,isAllZeros) = self.writeFloats10E(vals) 00165 [nx,ny,txy,majorP,minorP,tmax,ovm] = vals2 00166 if eid==0: 00167 eid = zero 00168 msg.append('%s%8s %8s %4s %s %s %s %7.4f %s %s %s %-s\n' %(zero,eKey2,eid,elemName,nx,ny,txy,angle,majorP,minorP,tmax,ovm.rstrip())) 00169 zero = ' ' 00170 eKey2 = ' ' 00171 ### 00172 ### 00173 msg.append(pageStamp+str(pageNum)+'\n') 00174 if f is not None: 00175 f.write(''.join(msg)) 00176 msg = [''] 00177 return (''.join(msg),pageNum) 00178 00179 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00180 return 'GridPointStressesObject writeF06 is not implemented...',pageNum 00181 #raise NotImplementedError() 00182 msg = header+[' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n', 00183 '0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n', 00184 ' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n', 00185 ' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n'] 00186 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00187 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00188 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00189 for dt,Forces in sorted(self.forces.iteritems()): 00190 for eKey,force in sorted(Forces.iteritems()): 00191 zero = '0' 00192 for iLoad,f in enumerate(force): 00193 (f1,f2,f3) = f 00194 (m1,m2,m3) = self.moments[dt][eKey][iLoad] 00195 (elemName) = self.elemName[eKey][iLoad] 00196 eid = self.eids[eKey][iLoad] 00197 00198 vals = [f1,f2,f3,m1,m2,m3] 00199 (vals2,isAllZeros) = self.writeFloats13E(vals) 00200 [f1,f2,f3,m1,m2,m3] = vals2 00201 if eid==0: 00202 eid='' 00203 00204 msg.append('%s %8s %10s %8s %s %s %s %s %s %-s\n' %(zero,eKey,eid,elemName,f1,f2,f3,m1,m2,m3)) 00205 zero=' ' 00206 ### 00207 ### 00208 msg.append(pageStamp+str(pageNum)+'\n') 00209 if f is not None: 00210 f.write(''.join(msg)) 00211 msg = [''] 00212 pageNum+=1 00213 return (''.join(msg),pageNum-1) 00214 00215 def __repr__(self): 00216 return self.writeF06([],'PAGE ',1)[0] 00217 #return '---gridPointStressesObject---' 00218 00219 class GridPointStressesVolumeObject(scalarObject): 00220 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00221 scalarObject.__init__(self,dataCode,iSubcase) 00222 self.nx = {} 00223 self.ny = {} 00224 self.nz = {} 00225 self.txy = {} 00226 self.tyz = {} 00227 self.txz = {} 00228 self.pressure = {} 00229 self.ovm = {} 00230 00231 self.elemName = {} 00232 self.eids = {} 00233 00234 self.dt = dt 00235 if isSort1: 00236 if dt is not None: 00237 self.add = self.addSort1 00238 ### 00239 else: 00240 assert dt is not None 00241 self.add = self.addSort2 00242 ### 00243 00244 def addNewTransient(self,dt): # eKey 00245 """initializes the transient variables""" 00246 self.nx[dt] = {} 00247 self.ny[dt] = {} 00248 self.nz[dt] = {} 00249 self.txy[dt] = {} 00250 self.tyz[dt] = {} 00251 self.txz[dt] = {} 00252 self.pressure[dt] = {} 00253 self.ovm[dt] = {} 00254 00255 self.elemName = {} 00256 self.eids = {} 00257 00258 def add(self,dt,eKey,nx,ny,nz,txy,tyz,txz,pressure,ovm): 00259 if eKey not in self.nx: 00260 #self.eids[eKey] = [] 00261 #self.elemName[eKey] = [] 00262 self.nx[eKey] = [] 00263 self.ny[eKey] = [] 00264 self.nz[eKey] = [] 00265 self.txy[eKey] = [] 00266 self.tyz[eKey] = [] 00267 self.txz[eKey] = [] 00268 self.pressure[eKey] = [] 00269 self.ovm[eKey] = [] 00270 self.nx[eKey].append(nx) 00271 self.ny[eKey].append(ny) 00272 self.nz[eKey].append(nz) 00273 self.txy[eKey].append(txy) 00274 self.tyz[eKey].append(tyz) 00275 self.txz[eKey].append(txz) 00276 self.pressure[eKey].append(pressure) 00277 self.ovm[eKey].append(ovm) 00278 00279 #self.elemName[eKey].append(elemName) 00280 #self.eids[eKey].append(eid) 00281 00282 def addSort1(self,dt,eKey,nx,ny,nz,txy,tyz,txz,pressure,ovm): 00283 if dt not in self.nx: 00284 self.addNewTransient(dt) 00285 00286 #print "%s=%s eKey=%s eid=%s elemName=%s f1=%s" %(self.dataCode['name'],dt,eKey,eid,elemName,f1) 00287 if eKey not in self.nx[dt]: 00288 #self.eids[eKey] = [] 00289 #self.elemName[eKey] = [] 00290 self.nx[dt][eKey] = [] 00291 self.ny[dt][eKey] = [] 00292 self.nz[dt][eKey] = [] 00293 self.txy[dt][eKey] = [] 00294 self.tyz[dt][eKey] = [] 00295 self.txz[dt][eKey] = [] 00296 self.pressure[eKey] = [] 00297 self.ovm[dt][eKey] = [] 00298 self.eids[eKey].append(eid) 00299 #self.elemName[eKey].append(elemName) 00300 00301 self.nx[dt][eKey].append(nx) 00302 self.ny[dt][eKey].append(ny) 00303 self.nz[dt][eKey].append(nz) 00304 self.txy[dt][eKey].append(txy) 00305 self.tyz[dt][eKey].append(tyz) 00306 self.txz[dt][eKey].append(txz) 00307 self.pressure[dt][eKey].append(pressure) 00308 self.ovm[dt][eKey].append(ovm) 00309 00310 def deleteTransient(self,dt): 00311 del self.nx[dt] 00312 del self.ny[dt] 00313 del self.nz[dt] 00314 del self.txy[dt] 00315 del self.tyz[dt] 00316 del self.txz[dt] 00317 del self.pressure[dt] 00318 del self.ovm[dt] 00319 00320 def getTransients(self): 00321 k = self.nx.keys() 00322 k.sort() 00323 return k 00324 00325 #def cleanupObj(self): 00326 #k = self.elemName.keys() 00327 #self.elemName = self.elemName[k[0]] 00328 #self.eids = self.eids[k[0]] 00329 00330 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00331 return 'GridPointStressesVolumeObject writeF06 is not implemented...',pageNum 00332 #raise NotImplementedError() 00333 if self.nonlinearFactor is not None: 00334 return self.writeF06Transient(header,pageStamp,pageNum,f) 00335 00336 msg = header+[' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n', 00337 '0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n', 00338 ' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n', 00339 ' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n'] 00340 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00341 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00342 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00343 for eKey,nxs in sorted(self.nx.iteritems()): 00344 eKey2 = eKey 00345 zero = '0' 00346 for iLoad,nx in enumerate(nxs): 00347 ny = self.ny[eKey][iLoad] 00348 nz = self.nz[eKey][iLoad] 00349 txy = self.txy[eKey][iLoad] 00350 tyz = self.tyz[eKey][iLoad] 00351 txz = self.txz[eKey][iLoad] 00352 pressure = self.pressure[eKey][iLoad] 00353 ovm = self.ovm[eKey][iLoad] 00354 00355 #(elemName) = self.elemName[eKey][iLoad] 00356 #eid = self.eids[eKey][iLoad] 00357 vals = [nx,ny,nz,txy,tyz,txz,pressure,ovm] 00358 (vals2,isAllZeros) = self.writeFloats10E(vals) 00359 [nx,ny,nz,txy,tyz,txz,pressure,ovm] = vals2 00360 msg.append('%s%8s %s %s %s %s %s %s %s %-s\n' %(zero,eKey,nx,ny,nz,txy,tyz,txz,pressure,ovm.rstrip())) 00361 zero = ' ' 00362 eKey2 = ' ' 00363 ### 00364 ### 00365 msg.append(pageStamp+str(pageNum)+'\n') 00366 if f is not None: 00367 f.write(''.join(msg)) 00368 msg = [''] 00369 return (''.join(msg),pageNum) 00370 00371 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00372 return 'GridPointStressesVolumeObject writeF06Transient is not implemented...',pageNum 00373 #raise NotImplementedError() 00374 msg = header+[' S T R E S S E S A T G R I D P O I N T S - - S U R F A C E 5\n', 00375 '0 SURFACE X-AXIS X NORMAL(Z-AXIS) Z REFERENCE COORDINATE SYSTEM FOR SURFACE DEFINITION CID 0\n', 00376 ' GRID ELEMENT STRESSES IN SURFACE SYSTEM PRINCIPAL STRESSES MAX \n', 00377 ' ID ID FIBRE NORMAL-X NORMAL-Y SHEAR-XY ANGLE MAJOR MINOR SHEAR VON MISES\n'] 00378 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00379 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00380 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00381 for dt,Forces in sorted(self.forces.iteritems()): 00382 for eKey,force in sorted(Forces.iteritems()): 00383 zero = '0' 00384 for iLoad,f in enumerate(force): 00385 (f1,f2,f3) = f 00386 (m1,m2,m3) = self.moments[dt][eKey][iLoad] 00387 (elemName) = self.elemName[eKey][iLoad] 00388 eid = self.eids[eKey][iLoad] 00389 00390 vals = [f1,f2,f3,m1,m2,m3] 00391 (vals2,isAllZeros) = self.writeFloats13E(vals) 00392 [f1,f2,f3,m1,m2,m3] = vals2 00393 if eid==0: 00394 eid='' 00395 00396 msg.append('%s %8s %10s %8s %s %s %s %s %s %-s\n' %(zero,eKey,eid,elemName,f1,f2,f3,m1,m2,m3)) 00397 zero=' ' 00398 ### 00399 ### 00400 msg.append(pageStamp+str(pageNum)+'\n') 00401 if f is not None: 00402 f.write(''.join(msg)) 00403 msg = [''] 00404 pageNum+=1 00405 return (''.join(msg),pageNum-1) 00406 00407 def __repr__(self): 00408 return self.writeF06([],'PAGE ',1)[0] 00409 #return '---gridPointStressesVolumeObject---'