pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
ogs_surfaceStresses.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 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---'
 All Classes Namespaces Files Functions Variables