pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oee_objects.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 from math import isnan
00029 
00030 from pyNastran.op2.resultObjects.op2_Objects import scalarObject
00031 from pyNastran.op2.op2Errors import InvalidGridID_Error
00032 
00033 class StrainEnergyObject(scalarObject):
00034     """
00035                                E L E M E N T   S T R A I N   E N E R G I E S
00036  
00037     ELEMENT-TYPE = QUAD4      * TOTAL ENERGY OF ALL ELEMENTS IN PROBLEM     =   9.817708E+08
00038     SUBCASE               1   * TOTAL ENERGY OF ALL ELEMENTS IN SET       1 =   4.192036E+08
00039  
00040        ELEMENT-ID   STRAIN-ENERGY  PERCENT OF TOTAL  STRAIN-ENERGY-DENSITY
00041                12   2.291087E+07        2.3336            2.291087E+02
00042                13   1.582968E+07        1.6124            1.055312E+02
00043                14   6.576075E+07        6.6982            3.288037E+02
00044     """
00045     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00046         scalarObject.__init__(self,dataCode,iSubcase)
00047         self.energy  = {}
00048         self.percent = {}
00049         self.density = {}
00050         #print self.dataCode
00051         #print "numWide = %s %s"  %(self.dataCode['numWide'],type(self.dataCode['numWide']))
00052 
00053         self.dt = dt
00054         if isSort1:
00055             if dt is not None:
00056                 self.add = self.addSort1
00057             ###
00058         else:
00059             assert dt is not None
00060             self.add = self.addSort2
00061         ###
00062 
00063     def updateDt(self,dataCode,dt):
00064         """
00065         this method is called if the object
00066         already exits and a new time step is found
00067         """
00068         self.dataCode = dataCode
00069         self.applyDataCode()
00070         #assert dt>=0.
00071         self.log.debug("updating %s...%s=%s  iSubcase=%s" %(self.name,self.name,dt,self.iSubcase))
00072         #print "dataCode = ",self.dataCode
00073         if dt is not None:
00074             self.dt = dt
00075             self.addNewTransient(dt)
00076         ###
00077         self.updateNumWide()
00078 
00079     def deleteTransient(self,dt):
00080         del self.energy[dt]
00081         del self.percent[dt]
00082         del self.density[dt]
00083 
00084     def getTransients(self):
00085         k = self.energy.keys()
00086         k.sort()
00087         return k
00088 
00089     def addNewTransient(self,dt):
00090         """
00091         initializes the transient variables
00092         """
00093         self.energy[dt]  = {}
00094         self.percent[dt] = {}
00095         self.density[dt] = {}
00096         
00097     def add(self,dt,out):
00098         #print "add4"
00099         (eid,energy,percent,density) = out
00100         #print "energyGridIDs = %s" %(self.energy.keys())
00101         #assert grid not in self.energy,'grid=%s out=%s' %(grid,out)
00102         if isinstance(eid, int) and eid <= 0:
00103             raise InvalidGridID_Error('eid=%s' %(eid))
00104         self.energy[eid]  = energy
00105         self.percent[eid] = percent
00106         self.density[eid] = density
00107 
00108     def addSort1(self,dt,out):
00109         if dt not in self.energy:
00110             self.addNewTransient(dt)
00111 
00112         (eid,energy,percent,density) = out
00113         #print str(self)
00114         #assert grid not in self.energy[dt],'grid=%s dt=%s energy=%s percent=%s density=%s' %(grid,dt,energy,percent,density)
00115         if eid<=0:
00116             raise InvalidGridID_Error('eid=%s' %(eid))
00117 
00118         self.energy[dt][eid]  = energy
00119         #print "self.energy = ",self.energy
00120         self.percent[dt][eid] = percent
00121         self.density[dt][eid] = density
00122     
00123     def __reprTransient__(self):
00124         msg  = '---Transient Strain Energy Object---\n'
00125         for dt,Energy in sorted(self.energy.iteritems()):
00126             msg += "%s = %s\n" %(self.dataCode['name'],dt)
00127             msg += "%-10s %-14s% -14s% -14s\n" %('EID','Energy','PercentTotal','Density')
00128             #print "dt=%s Energy=%s" %(dt,Energy)
00129             for eid,energy in sorted(Energy.iteritems()):
00130                 percent = self.percent[dt][eid]
00131                 density = self.density[dt][eid]
00132                 if isnan(density):
00133                     density2 = '%-14s\n' %('-----')
00134                 else:
00135                     density2 = '%-14g\n' %(density)
00136                 
00137                 #print "eid = ",eid
00138                 #print "energy = ",energy
00139                 #print "percent = ",percent
00140                 #print "density = ",density
00141                 #print "density2 = ",density2
00142                 #sys.stdout.flush()
00143                 msg += "%-10s %-14g %-14g %s" %(eid,energy,percent,density2)
00144             ###
00145         ###
00146         return msg
00147 
00148     def __repr__(self):
00149         if self.nonlinearFactor is not None:
00150             return self.__reprTransient__()
00151 
00152         msg  = '---Strain Energy Object---\n'
00153         msg += "%-10s %-14s% -14s% -14s\n" %('EID','Energy','PercentTotal','Density')
00154         for eid,energy in sorted(self.energy.iteritems()):
00155             percent = self.percent[eid]
00156             density = self.density[eid]
00157             if isnan(density):
00158                 density2 = '%-14s\n' %('-----')
00159             else:
00160                 density2 = '%-14g\n' %(density)
00161             msg += "%-10s %-14g %-14g %s" %(eid,energy,percent,density2)
00162         return msg
 All Classes Namespaces Files Functions Variables