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 00026 from __future__ import division, print_function 00027 import sys 00028 00029 from .oes_objects import stressObject, strainObject 00030 00031 00032 class TriaxStressObject(stressObject): 00033 """ 00034 # formatCode=1 sortCode=0 stressCode=0 00035 S T R E S S E S I N T R I A X 6 E L E M E N T S 00036 ELEMENT GRID ID STRESSES IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES 00037 ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR 00038 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00039 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00040 """ 00041 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00042 stressObject.__init__(self,dataCode,iSubcase) 00043 self.eType = 'CTRIAX6' 00044 00045 self.code = [self.formatCode,self.sortCode,self.sCode] 00046 self.radial = {} 00047 self.azimuthal = {} 00048 self.axial = {} 00049 self.shear = {} 00050 self.omax = {} 00051 self.oms = {} 00052 self.ovm = {} 00053 00054 self.dt = dt 00055 if isSort1: 00056 if dt is not None: 00057 self.add = self.addSort1 00058 self.addNewEid = self.addNewEidSort1 00059 ### 00060 else: 00061 assert dt is not None 00062 self.add = self.addSort2 00063 self.addNewEid = self.addNewEidSort2 00064 ### 00065 00066 00067 def addF06Data(self,data,transient): 00068 raise Exception('Not Implemented') 00069 if transient is None: 00070 for line in data: 00071 (eid,axial,MSa,torsion,MSt) = line 00072 if MSa==None: MSa = 0. 00073 if MSt==None: MSt = 0. 00074 self.axial[eid] = axial 00075 self.MS_axial[eid] = MSa 00076 self.torsion[eid] = torsion 00077 self.MS_torsion[eid] = MSt 00078 ### 00079 return 00080 00081 (dtName,dt) = transient 00082 self.dataCode['name'] = dtName 00083 if dt not in self.s1: 00084 self.updateDt(self.dataCode,dt) 00085 self.isTransient = True 00086 00087 for line in data: 00088 (eid,axial,MSa,torsion,MSt) = line 00089 if MSa==None: MSa = 0. 00090 if MSt==None: MSt = 0. 00091 self.axial[dt][eid] = axial 00092 self.MS_axial[dt][eid] = MSa 00093 self.torsion[dt][eid] = torsion 00094 self.MS_torsion[dt][eid] = MSt 00095 ### 00096 00097 #def getLength_format1_sort0(self): 00098 #return (20,'iffff') 00099 00100 def deleteTransient(self,dt): 00101 del self.radial[dt] 00102 del self.azimuthal[dt] 00103 del self.axial[dt] 00104 del self.shear[dt] 00105 del self.omax[dt] 00106 del self.oms[dt] 00107 del self.ovm[dt] 00108 00109 def getTransients(self): 00110 k = self.axial.keys() 00111 k.sort() 00112 return k 00113 00114 def addNewTransient(self,dt): 00115 """ 00116 initializes the transient variables 00117 """ 00118 self.radial[dt] = {} 00119 self.azimuthal[dt] = {} 00120 self.axial[dt] = {} 00121 self.shear[dt] = {} 00122 self.omax[dt] = {} 00123 self.oms[dt] = {} 00124 self.ovm[dt] = {} 00125 00126 def addNewEid(self,dt,eid,nid,rs,azs,As,ss,maxp,tmax,octs): 00127 #print "**?eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00128 self.radial[eid] = {nid: rs} 00129 self.azimuthal[eid] = {nid: azs} 00130 self.axial[eid] = {nid: As} 00131 self.shear[eid] = {nid: ss} 00132 self.omax[eid] = {nid: maxp} 00133 self.oms[eid] = {nid: tmax} 00134 self.ovm[eid] = {nid: octs} 00135 00136 def add(self,dt,eid,nid,rs,azs,As,ss,maxp,tmax,octs): 00137 #print "***eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00138 self.radial[eid][nid] = rs 00139 self.azimuthal[eid][nid] = azs 00140 self.axial[eid][nid] = As 00141 self.shear[eid][nid] = ss 00142 self.omax[eid][nid] = maxp 00143 self.oms[eid][nid] = tmax 00144 self.ovm[eid][nid] = octs 00145 00146 def addNewEidSort1(self,dt,eid,nid,rs,azs,As,ss,maxp,tmax,octs): 00147 #assert isinstance(eid,int) 00148 #assert eid >= 0 00149 #print "* eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00150 if dt not in self.radial: 00151 self.addNewTransient(dt) 00152 self.radial[dt][eid] = {nid: rs} 00153 self.azimuthal[dt][eid] = {nid: azs} 00154 self.axial[dt][eid] = {nid: As} 00155 self.shear[dt][eid] = {nid: ss} 00156 self.omax[dt][eid] = {nid: maxp} 00157 self.oms[dt][eid] = {nid: tmax} 00158 self.ovm[dt][eid] = {nid: octs} 00159 00160 def addSort1(self,dt,eid,nid,rs,azs,As,ss,maxp,tmax,octs): 00161 #print "***eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00162 self.radial[dt][eid][nid] = rs 00163 self.azimuthal[dt][eid][nid] = azs 00164 self.axial[dt][eid][nid] = As 00165 self.shear[dt][eid][nid] = ss 00166 self.omax[dt][eid][nid] = maxp 00167 self.oms[dt][eid][nid] = tmax 00168 self.ovm[dt][eid][nid] = octs 00169 00170 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00171 if self.nonlinearFactor is not None: 00172 return self.writeF06Transient(header,pageStamp,pageNum,f) 00173 00174 msg = header+[' S T R E S S E S I N T R I A X 6 E L E M E N T S\n', 00175 ' ELEMENT GRID ID STRESSES IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES \n', 00176 ' ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR\n',] 00177 #' 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00178 #' 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00179 00180 #out = [] 00181 for eid,radial in sorted(self.radial.iteritems()): 00182 for nid in sorted(radial): 00183 rad = self.radial[eid][nid] 00184 azimuth = self.azimuthal[eid][nid] 00185 axial = self.axial[eid][nid] 00186 shear = self.shear[eid][nid] 00187 omax = self.omax[eid][nid] 00188 oms = self.oms[eid][nid] 00189 ovm = self.ovm[eid][nid] 00190 if nid==0: 00191 Eid=eid 00192 else: 00193 Eid='' 00194 ([rad,azimuth,axial,shear,omax,oms,ovm],isAllZeros) = self.writeFloats13E([rad,azimuth,axial,shear,omax,oms,ovm]) 00195 msg.append(' %8s %8s %s %s %s %s %s %s %-s\n' %(Eid,nid,radial,azimuth,axial,shear,omax,oms,ovm.rstrip())) 00196 ### 00197 msg.append('\n') 00198 ### 00199 00200 msg.append(pageStamp+str(pageNum)+'\n') 00201 if f is not None: 00202 f.write(''.join(msg)) 00203 msg = [''] 00204 return(''.join(msg),pageNum) 00205 00206 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00207 words = [' S T R E S S E S I N T R I A X 6 E L E M E N T S\n', 00208 ' ELEMENT GRID ID STRESSES IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES \n', 00209 ' ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR\n',] 00210 #' 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00211 #' 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00212 00213 msg = [] 00214 for dt,Radial in sorted(self.radial.iteritems()): 00215 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00216 msg += header+words 00217 for eid,radial in sorted(Radial.iteritems()): 00218 for nid in sorted(radial): 00219 rad = self.radial[dt][eid][nid] 00220 azimuth = self.azimuthal[dt][eid][nid] 00221 axial = self.axial[dt][eid][nid] 00222 shear = self.shear[dt][eid][nid] 00223 omax = self.omax[dt][eid][nid] 00224 oms = self.oms[dt][eid][nid] 00225 ovm = self.ovm[dt][eid][nid] 00226 if nid==0: 00227 Eid=eid 00228 else: 00229 Eid='' 00230 ([rad,azimuth,axial,shear,omax,oms,ovm],isAllZeros) = self.writeFloats13E([rad,azimuth,axial,shear,omax,oms,ovm]) 00231 msg.append(' %8s %8s %s %s %s %s %s %s %-s\n' %(Eid,nid,rad,azimuth,axial,shear,omax,oms,ovm.rstrip())) 00232 ### 00233 msg.append('\n') 00234 ### 00235 00236 msg.append(pageStamp+str(pageNum)+'\n') 00237 if f is not None: 00238 f.write(''.join(msg)) 00239 msg = [''] 00240 pageNum+=1 00241 return(''.join(msg),pageNum-1) 00242 00243 def __repr__(self): 00244 return self.writeF06(['',''],'PAGE ',1)[0] 00245 if self.nonlinearFactor is not None: 00246 pass 00247 00248 class TriaxStrainObject(strainObject): 00249 """ 00250 # formatCode=1 sortCode=0 stressCode=0 00251 S T R A I N S I N T R I A X 6 E L E M E N T S 00252 ELEMENT GRID ID STRAINS IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES 00253 ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR 00254 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00255 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00256 """ 00257 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00258 strainObject.__init__(self,dataCode,iSubcase) 00259 self.eType = 'CTRIAX6' 00260 00261 self.code = [self.formatCode,self.sortCode,self.sCode] 00262 self.radial = {} 00263 self.azimuthal = {} 00264 self.axial = {} 00265 self.shear = {} 00266 self.emax = {} 00267 self.ems = {} 00268 self.evm = {} 00269 00270 self.dt = dt 00271 if isSort1: 00272 if dt is not None: 00273 self.add = self.addSort1 00274 self.addNewEid = self.addNewEidSort1 00275 ### 00276 else: 00277 assert dt is not None 00278 self.add = self.addSort2 00279 self.addNewEid = self.addNewEidSort2 00280 ### 00281 00282 00283 def addF06Data(self,data,transient): 00284 raise Exception('Not Implemented') 00285 00286 #def getLength_format1_sort0(self): 00287 #return (20,'iffff') 00288 00289 def deleteTransient(self,dt): 00290 del self.radial[dt] 00291 del self.azimuthal[dt] 00292 del self.axial[dt] 00293 del self.shear[dt] 00294 del self.emax[dt] 00295 del self.ems[dt] 00296 del self.evm[dt] 00297 00298 def getTransients(self): 00299 k = self.axial.keys() 00300 k.sort() 00301 return k 00302 00303 def addNewTransient(self,dt): 00304 """ 00305 initializes the transient variables 00306 """ 00307 self.radial[dt] = {} 00308 self.azimuthal[dt] = {} 00309 self.axial[dt] = {} 00310 self.shear[dt] = {} 00311 self.emax[dt] = {} 00312 self.ems[dt] = {} 00313 self.evm[dt] = {} 00314 00315 def addNewEid(self,dt,eid,nid,rs,azs,As,ss,maxp,tmax,octs): 00316 #print "**?eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00317 self.radial[eid] = {nid: rs} 00318 self.azimuthal[eid] = {nid: azs} 00319 self.axial[eid] = {nid: As} 00320 self.shear[eid] = {nid: ss} 00321 self.emax[eid] = {nid: maxp} 00322 self.ems[eid] = {nid: emax} 00323 self.evm[eid] = {nid: ects} 00324 00325 def add(self,dt,eid,nid,rs,azs,As,ss,maxp,emax,ects): 00326 #print "***eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00327 self.radial[eid][nid] = rs 00328 self.azimuthal[eid][nid] = azs 00329 self.axial[eid][nid] = As 00330 self.shear[eid][nid] = ss 00331 self.emax[eid][nid] = maxp 00332 self.ems[eid][nid] = emax 00333 self.evm[eid][nid] = ects 00334 00335 def addNewEidSort1(self,dt,eid,nid,rs,azs,As,ss,maxp,emax,ects): 00336 #assert isinstance(eid,int) 00337 #assert eid >= 0 00338 #print "* eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00339 self.radial[dt][eid] = {nid: rs} 00340 self.azimuthal[dt][eid] = {nid: azs} 00341 self.axial[dt][eid] = {nid: As} 00342 self.shear[dt][eid] = {nid: ss} 00343 self.emax[dt][eid] = {nid: maxp} 00344 self.ems[dt][eid] = {nid: emax} 00345 self.evm[dt][eid] = {nid: ects} 00346 00347 def addSort1(self,dt,eid,nid,rs,azs,As,ss,maxp,emax,ects): 00348 #print "***eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" %(eid,nid,rs,azs,As,ss,maxp,tmax,octs) 00349 self.radial[dt][eid][nid] = rs 00350 self.azimuthal[dt][eid][nid] = azs 00351 self.axial[dt][eid][nid] = As 00352 self.shear[dt][eid][nid] = ss 00353 self.emax[dt][eid][nid] = maxp 00354 self.ems[dt][eid][nid] = emax 00355 self.evm[dt][eid][nid] = ects 00356 00357 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00358 if self.nonlinearFactor is not None: 00359 return self.writeF06Transient(header,pageStamp,pageNum,f) 00360 00361 msg = header+[' S T R A I N S I N T R I A X 6 E L E M E N T S\n', 00362 ' ELEMENT GRID ID STRAINS IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES \n', 00363 ' ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR\n',] 00364 #' 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00365 #' 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00366 00367 #out = [] 00368 for eid,radial in sorted(self.radial.iteritems()): 00369 for nid in sorted(radial): 00370 rad = self.radial[eid][nid] 00371 azimuth = self.azimuthal[eid][nid] 00372 axial = self.axial[eid][nid] 00373 shear = self.shear[eid][nid] 00374 emax = self.emax[eid][nid] 00375 ems = self.ems[eid][nid] 00376 evm = self.evm[eid][nid] 00377 if nid==0: 00378 Eid=eid 00379 else: 00380 Eid='' 00381 ([rad,azimuth,axial,shear,emax,ems,evm],isAllZeros) = self.writeFloats13E([rad,azimuth,axial,shear,emax,ems,evm]) 00382 msg.append(' %8s %8s %s %s %s %s %s %s %-s\n' %(Eid,nid,radial,azimuth,axial,shear,emax,ems,evm.rstrip())) 00383 ### 00384 msg.append('\n') 00385 ### 00386 00387 msg.append(pageStamp+str(pageNum)+'\n') 00388 if f is not None: 00389 f.write(''.join(msg)) 00390 msg = [''] 00391 return(''.join(msg),pageNum) 00392 00393 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00394 words = [' S T R A I N S I N T R I A X 6 E L E M E N T S\n', 00395 ' ELEMENT GRID ID STRAINS IN MATERIAL COORD SYSTEM MAX MAG MAX VON MISES \n', 00396 ' ID RADIAL AZIMUTHAL AXIAL SHEAR PRINCIPAL SHEAR\n',] 00397 #' 5351 0 -9.726205E+02 -1.678908E+03 -1.452340E+03 -1.325111E+02 -1.678908E+03 3.702285E+02 6.654553E+02 00398 #' 4389 -9.867789E+02 -1.624276E+03 -1.388424E+03 -9.212539E+01 -1.624276E+03 3.288099E+02 5.806334E+02 00399 00400 msg = [] 00401 for dt,Radial in sorted(self.radial.iteritems()): 00402 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00403 msg += header+words 00404 for eid,radial in sorted(Radial.iteritems()): 00405 for nid in sorted(radial): 00406 rad = self.radial[dt][eid][nid] 00407 azimuth = self.azimuthal[dt][eid][nid] 00408 axial = self.axial[dt][eid][nid] 00409 shear = self.shear[dt][eid][nid] 00410 emax = self.emax[dt][eid][nid] 00411 ems = self.ems[dt][eid][nid] 00412 evm = self.evm[dt][eid][nid] 00413 if nid==0: 00414 Eid=eid 00415 else: 00416 Eid='' 00417 ([rad,azimuth,axial,shear,emax,ems,evm],isAllZeros) = self.writeFloats13E([rad,azimuth,axial,shear,emax,ems,evm]) 00418 msg.append(' %8s %8s %s %s %s %s %s %s %-s\n' %(Eid,nid,rad,azimuth,axial,shear,emax,ems,evm.rstrip())) 00419 ### 00420 msg.append('\n') 00421 ### 00422 00423 msg.append(pageStamp+str(pageNum)+'\n') 00424 if f is not None: 00425 f.write(''.join(msg)) 00426 msg = [''] 00427 pageNum+=1 00428 return(''.join(msg),pageNum-1) 00429 00430 def __repr__(self): 00431 return self.writeF06(['',''],'PAGE ',1)[0] 00432 if self.nonlinearFactor is not None: 00433 pass