pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oes_triax.py
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables