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 class ShearStressObject(stressObject): 00032 """ 00033 # formatCode=1 sortCode=0 stressCode=0 00034 S T R E S S E S I N S H E A R P A N E L S ( C S H E A R ) 00035 ELEMENT MAX AVG SAFETY ELEMENT MAX AVG SAFETY 00036 ID. SHEAR SHEAR MARGIN ID. SHEAR SHEAR MARGIN 00037 328 1.721350E+03 1.570314E+03 7.2E+01 00038 """ 00039 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00040 stressObject.__init__(self,dataCode,iSubcase) 00041 self.eType = 'CSHEAR' 00042 00043 self.code = [self.formatCode,self.sortCode,self.sCode] 00044 self.maxShear = {} 00045 self.avgShear = {} 00046 self.margin = {} 00047 00048 self.getLength = self.getLength 00049 self.isImaginary = False 00050 #if dt is not None: 00051 # self.addNewTransient = self.addNewTransient 00052 # self.addNewEid = self.addNewEidTransient 00053 #else: 00054 # self.addNewEid = self.addNewEid 00055 ### 00056 00057 self.dt = dt 00058 if isSort1: 00059 if dt is not None: 00060 self.add = self.addSort1 00061 self.addNewEid = self.addNewEidSort1 00062 ### 00063 else: 00064 assert dt is not None 00065 self.add = self.addSort2 00066 self.addNewEid = self.addNewEidSort2 00067 ### 00068 00069 def getLength(self): 00070 return (16,'fff') 00071 00072 def deleteTransient(self,dt): 00073 del self.maxShear[dt] 00074 del self.avgShear[dt] 00075 del self.margin[dt] 00076 00077 def getTransients(self): 00078 k = self.maxShear.keys() 00079 k.sort() 00080 return k 00081 00082 def addNewTransient(self,dt): 00083 """ 00084 initializes the transient variables 00085 """ 00086 self.dt = dt 00087 self.maxShear[dt] = {} 00088 self.avgShear[dt] = {} 00089 self.margin[dt] = {} 00090 00091 def addNewEid(self,dt,eid,out): 00092 #print "Rod Stress add..." 00093 (maxShear,avgShear,margin) = out 00094 assert isinstance(eid,int) 00095 self.maxShear = {} 00096 self.avgShear = {} 00097 self.margin = {} 00098 self.maxShear[eid] = maxShear 00099 self.avgShear[eid] = avgShear 00100 self.margin[eid] = margin 00101 00102 def addNewEidSort1(self,dt,eid,out): 00103 (maxShear,avgShear,margin) = out 00104 if dt not in self.maxShear: 00105 self.addNewTransient(dt) 00106 assert isinstance(eid,int) 00107 assert eid >= 0 00108 self.maxShear[dt][eid] = maxShear 00109 self.avgShear[dt][eid] = avgShear 00110 self.margin[dt][eid] = margin 00111 00112 def addNewEidSort1(self,eid,dt,out): 00113 (maxShear,avgShear,margin) = out 00114 if dt not in self.maxShear: 00115 self.addNewTransient(dt) 00116 assert isinstance(eid,int) 00117 assert eid >= 0 00118 self.maxShear[dt][eid] = maxShear 00119 self.avgShear[dt][eid] = avgShear 00120 self.margin[dt][eid] = margin 00121 00122 def __reprTransient__(self): 00123 msg = '---TRANSIENT CSHEAR STRESSES---\n' 00124 msg += '%-6s %6s ' %('EID','eType') 00125 headers = ['maxShear','avgShear','Margin'] 00126 for header in headers: 00127 msg += '%10s ' %(header) 00128 msg += '\n' 00129 00130 for dt,maxShears in sorted(self.maxShear.iteritems()): 00131 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00132 for eid in sorted(maxShears): 00133 maxShear = self.maxShear[dt][eid] 00134 avgShear = self.avgShear[dt][eid] 00135 margin = self.margin[dt][eid] 00136 msg += '%-6i %6s ' %(eid,self.eType) 00137 vals = [maxShear,avgShear,margin] 00138 for val in vals: 00139 if abs(val)<1e-6: 00140 msg += '%10s ' %('0') 00141 else: 00142 msg += '%10i ' %(val) 00143 ### 00144 msg += '\n' 00145 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00146 ### 00147 return msg 00148 00149 def __repr__(self): 00150 if self.dt is not None: 00151 return self.__reprTransient__() 00152 00153 msg = '---CSHEAR STRESSES---\n' 00154 msg += '%-6s %6s ' %('EID','eType') 00155 headers = ['maxShear','avgShear','margin'] 00156 for header in headers: 00157 msg += '%10s ' %(header) 00158 msg += '\n' 00159 #print "self.code = ",self.code 00160 for eid in sorted(self.maxShear): 00161 #print self.__dict__.keys() 00162 maxShear = self.maxShear[eid] 00163 avgShear = self.avgShear[eid] 00164 margin = self.margin[eid] 00165 msg += '%-6i %6s ' %(eid,self.eType) 00166 vals = [maxShear,avgShear,margin] 00167 for val in vals: 00168 if abs(val)<1e-6: 00169 msg += '%10s ' %('0') 00170 else: 00171 msg += '%10i ' %(val) 00172 ### 00173 msg += '\n' 00174 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00175 return msg 00176 00177 class ShearStrainObject(strainObject): 00178 """ 00179 """ 00180 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00181 strainObject.__init__(self,dataCode,iSubcase) 00182 self.eType = 'CSHEAR' 00183 raise Exception('not supported...CSHEAR strain') 00184 self.code = [self.formatCode,self.sortCode,self.sCode] 00185 self.maxShear = {} 00186 self.avgShear = {} 00187 self.margin = {} 00188 00189 self.dt = dt 00190 if isSort1: 00191 if dt is not None: 00192 self.add = self.addSort1 00193 self.addNewEid = self.addNewEidSort1 00194 ### 00195 else: 00196 assert dt is not None 00197 self.add = self.addSort2 00198 self.addNewEid = self.addNewEidSort2 00199 ### 00200 00201 def getLength(self): 00202 return (16,'fff') 00203 00204 def deleteTransient(self,dt): 00205 del self.maxShear[dt] 00206 del self.avgShear[dt] 00207 del self.margin[dt] 00208 00209 def getTransients(self): 00210 k = self.maxShear.keys() 00211 k.sort() 00212 return k 00213 00214 def addNewTransient(self,dt): 00215 """ 00216 initializes the transient variables 00217 @note make sure you set self.dt first 00218 """ 00219 self.dt = dt 00220 self.maxShear[dt] = {} 00221 self.avgShear[dt] = {} 00222 self.margin[dt] = {} 00223 00224 def addNewEid(self,dt,eid,out): 00225 (axial,SMa,torsion,SMt) = out 00226 #print "Rod Strain add..." 00227 assert eid >= 0 00228 #self.eType = self.eType 00229 self.maxShearl[eid] = axial 00230 self.avgShear[eid] = SMa 00231 self.margin[eid] = torsion 00232 00233 def addNewEidSort1(self,dt,eid,out): 00234 (maxShear,avgShear,margin) = out 00235 if dt not in self.maxShear: 00236 self.addNewTransient(dt) 00237 assert eid >= 0 00238 00239 #self.eType[eid] = self.elementType 00240 self.maxShear[dt][eid] = maxShear 00241 self.avgShear[dt][eid] = avgShear 00242 self.margin[dt][eid] = margin 00243 00244 def addNewEidSort2(self,eid,dt,out): 00245 (maxShear,avgShear,margin) = out 00246 if dt not in self.maxShear: 00247 self.addNewTransient(dt) 00248 assert eid >= 0 00249 00250 #self.eType[eid] = self.elementType 00251 self.maxShear[dt][eid] = maxShear 00252 self.avgShear[dt][eid] = avgShear 00253 self.margin[dt][eid] = margin 00254 00255 def __reprTransient__(self): 00256 msg = '---TRANSIENT CSHEAR STRAINS---\n' 00257 msg += '%-6s %6s ' %('EID','eType') 00258 headers = ['maxShear','avgShear','Margin'] 00259 for header in headers: 00260 msg += '%10s ' %(header) 00261 msg += '\n' 00262 00263 for dt,maxShears in sorted(self.maxShear.iteritems()): 00264 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00265 for eid in sorted(maxShears): 00266 maxShear = self.maxShear[dt][eid] 00267 avgShear = self.avgShear[dt][eid] 00268 margin = self.margin[dt][eid] 00269 msg += '%-6i %6s ' %(eid,self.eType) 00270 vals = [maxShear,avgShear,margin] 00271 for val in vals: 00272 if abs(val)<1e-6: 00273 msg += '%10s ' %('0') 00274 else: 00275 msg += '%10g ' %(val) 00276 ### 00277 msg += '\n' 00278 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00279 ### 00280 return msg 00281 00282 def __repr__(self): 00283 if self.dt is not None: 00284 return self.__reprTransient__() 00285 00286 msg = '---CSHEAR STRAINS---\n' 00287 msg += '%-6s %6s ' %('EID','eType') 00288 headers = ['maxShear','avgShear','margin'] 00289 for header in headers: 00290 msg += '%10s ' %(header) 00291 msg += '\n' 00292 00293 #print "self.code = ",self.code 00294 for eid in sorted(self.maxShear): 00295 #print self.__dict__.keys() 00296 maxShear = self.maxShear[eid] 00297 avgShear = self.avgShear[eid] 00298 margin = self.margin[eid] 00299 msg += '%-6i %6s ' %(eid,self.eType) 00300 vals = [maxShear,avgShear,margin] 00301 00302 for val in vals: 00303 if abs(val)<1e-7: 00304 msg += '%8s ' %('0') 00305 else: 00306 msg += '%8.3g ' %(val) 00307 ### 00308 msg += '\n' 00309 return msg