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 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