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 ..real.oes_objects import stressObject,strainObject 00030 00031 00032 class ComplexRodDamperObject(stressObject): 00033 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00034 stressObject.__init__(self,dataCode,iSubcase) 00035 self.eType = 'CBUSH' 00036 00037 self.code = [self.formatCode,self.sortCode,self.sCode] 00038 self.axial = {} 00039 self.torsion = {} 00040 00041 00042 class ComplexRodStressObject(stressObject): 00043 """ 00044 """ 00045 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00046 stressObject.__init__(self,dataCode,iSubcase) 00047 self.eType = 'CROD' 00048 00049 self.code = [self.formatCode,self.sortCode,self.sCode] 00050 self.axial = {} 00051 self.torsion = {} 00052 00053 self.dt = dt 00054 if isSort1: 00055 if dt is not None: 00056 #self.add = self.addSort1 00057 self.addNewEid = self.addNewEidSort1 00058 ### 00059 else: 00060 assert dt is not None 00061 #self.add = self.addSort2 00062 self.addNewEid = self.addNewEidSort2 00063 ### 00064 00065 def getLength(self): 00066 return (20,'ffff') 00067 00068 def addF06Data(self,data,transient): 00069 if transient is None: 00070 for line in data: 00071 (eid,axial,torsion) = line 00072 self.axial[eid] = axial 00073 self.torsion[eid] = torsion 00074 ### 00075 return 00076 00077 (dtName,dt) = transient 00078 self.dt = dt 00079 self.dataCode['name'] = dtName 00080 if dt not in self.s1: 00081 self.updateDt(self.dataCode,dt) 00082 00083 for line in data: 00084 (eid,axial,torsion) = line 00085 self.axial[dt][eid] = axial 00086 self.torsion[dt][eid] = torsion 00087 ### 00088 00089 def deleteTransient(self,dt): 00090 del self.axial[dt] 00091 del self.torsion[dt] 00092 00093 def getTransients(self): 00094 k = self.axial.keys() 00095 k.sort() 00096 return k 00097 00098 def addNewTransient(self,dt): 00099 """ 00100 initializes the transient variables 00101 """ 00102 self.dt = dt 00103 self.axial[dt] = {} 00104 self.torsion[dt] = {} 00105 00106 def addNewEid(self,dt,eid,out): 00107 #print "Rod Stress add..." 00108 (axial,torsion) = out 00109 assert isinstance(eid,int) 00110 self.axial[eid] = axial 00111 self.torsion[eid] = torsion 00112 00113 def addNewEidSort1(self,dt,eid,out): 00114 (axial,torsion) = out 00115 00116 if dt not in self.axial: 00117 self.addNewTransient(dt) 00118 self.axial[dt][eid] = axial 00119 self.torsion[dt][eid] = torsion 00120 00121 def addNewEidSort2(self,eid,dt,out): 00122 (axial,torsion) = out 00123 00124 if dt not in self.axial: 00125 self.addNewTransient(dt) 00126 self.axial[dt][eid] = axial 00127 self.torsion[dt][eid] = torsion 00128 00129 def __reprTransient__(self): 00130 msg = '---ROD STRESSES---\n' 00131 msg += '%-6s %6s ' %('EID','eType') 00132 headers = ['axial','torsion','MS_axial','MS_torsion'] 00133 for header in headers: 00134 msg += '%10s ' %(header) 00135 msg += '\n' 00136 00137 for dt,axial in sorted(self.axial.iteritems()): 00138 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00139 for eid in sorted(axial): 00140 axial = self.axial[dt][eid] 00141 torsion = self.torsion[dt][eid] 00142 msg += '%-6i %6s ' %(eid,self.eType) 00143 vals = [axial,torsion] 00144 for val in vals: 00145 if abs(val)<1e-6: 00146 msg += '%10s ' %('0') 00147 else: 00148 msg += '%10i ' %(val) 00149 ### 00150 msg += '\n' 00151 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00152 ### 00153 return msg 00154 00155 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00156 return 'ComplexRodStress writeF06 not implemented...',pageNum 00157 raise NotImplementedError() 00158 if self.nonlinearFactor is not None: 00159 return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase) 00160 00161 msg = header+[' S T R E S S E S I N R O D E L E M E N T S ( C R O D )\n', 00162 ' ELEMENT AXIAL SAFETY TORSIONAL SAFETY ELEMENT AXIAL SAFETY TORSIONAL SAFETY\n', 00163 ' ID. STRESS MARGIN STRESS MARGIN ID. STRESS MARGIN STRESS MARGIN\n'] 00164 out = [] 00165 for eid in sorted(self.axial): 00166 axial = self.axial[eid] 00167 torsion = self.torsion[eid] 00168 (vals2,isAllZeros) = self.writeFloatsImag13E([axial,torsion]) 00169 (axial,torsion) = vals2 00170 out.append([eid,axial,torsion]) 00171 00172 nOut = len(out) 00173 nWrite = nOut 00174 if nOut%2==1: 00175 nWrite = nOut-1 00176 for i in xrange(0,nWrite,2): 00177 #print i,out[i:] 00178 outLine = ' %8i %13s %10.4E %13s %10.4E %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[i]+out[i+1])) 00179 msg.append(outLine) 00180 00181 if nOut%2==1: 00182 outLine = ' %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[-1])) 00183 msg.append(outLine) 00184 msg.append(pageStamp+str(pageNum)+'\n') 00185 return(''.join(msg),pageNum) 00186 00187 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00188 return 'ComplexRodStress writeF06Transient not implemented...',pageNum 00189 raise NotImplementedError() 00190 words = [' S T R E S S E S I N R O D E L E M E N T S ( C R O D )\n', 00191 ' ELEMENT AXIAL SAFETY TORSIONAL SAFETY ELEMENT AXIAL SAFETY TORSIONAL SAFETY\n', 00192 ' ID. STRESS MARGIN STRESS MARGIN ID. STRESS MARGIN STRESS MARGIN\n'] 00193 msg = [] 00194 for dt,axials in sorted(self.axial.iteritems()): 00195 dtLine = '%14s = %12.5E\n'%(self.dataCode['name'],dt) 00196 header[2] = dtLine 00197 msg += header+words 00198 out = [] 00199 for eid in sorted(axials): 00200 axial = self.axial[dt][eid] 00201 torsion = self.torsion[dt][eid] 00202 00203 (vals2,isAllZeros) = self.writeFloatsImag13E([axial,torsion]) 00204 (axial,torsion) = vals2 00205 out.append([eid,axial,MSa,torsion,MSt]) 00206 00207 nOut = len(out) 00208 nWrite = nOut 00209 if nOut%2==1: 00210 nWrite = nOut-1 00211 for i in xrange(0,nWrite,2): 00212 outLine = ' %8i %13s %10.4E %13s %10.4E %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[i]+out[i+1])) 00213 msg.append(outLine) 00214 00215 if nOut%2==1: 00216 outLine = ' %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[-1])) 00217 msg.append(outLine) 00218 msg.append(pageStamp+str(pageNum)+'\n') 00219 pageNum+=1 00220 return(''.join(msg),pageNum-1) 00221 00222 def __repr__(self): 00223 if self.nonlinearFactor is not None: 00224 return self.__reprTransient__() 00225 00226 #print 'axial = ',self.axial 00227 msg = '---ROD STRESSES---\n' 00228 msg += '%-6s %6s ' %('EID','eType') 00229 headers = ['axial','torsion','MS_axial','MS_torsion'] 00230 for header in headers: 00231 msg += '%10s ' %(header) 00232 msg += '\n' 00233 #print "self.code = ",self.code 00234 for eid in sorted(self.axial): 00235 #print self.__dict__.keys() 00236 axial = self.axial[eid] 00237 torsion = self.torsion[eid] 00238 msg += '%-6i %6s ' %(eid,self.eType) 00239 vals = [axial,torsion] 00240 for val in vals: 00241 if abs(val)<1e-6: 00242 msg += '%10s ' %('0') 00243 else: 00244 msg += '%10i ' %(val) 00245 ### 00246 msg += '\n' 00247 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00248 return msg 00249 00250 class ComplexRodStrainObject(strainObject): 00251 """ 00252 """ 00253 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00254 strainObject.__init__(self,dataCode,iSubcase) 00255 self.eType = 'CROD' #{} # 'CROD/CONROD/CTUBE' 00256 00257 self.code = [self.formatCode,self.sortCode,self.sCode] 00258 00259 self.axial = {} 00260 self.torsion = {} 00261 00262 self.dt = dt 00263 if isSort1: 00264 if dt is not None: 00265 #self.add = self.addSort1 00266 self.addNewEid = self.addNewEidSort1 00267 ### 00268 else: 00269 assert dt is not None 00270 #self.add = self.addSort2 00271 self.addNewEid = self.addNewEidSort2 00272 ### 00273 00274 def addF06Data(self,data,transient): 00275 if transient is None: 00276 for line in data: 00277 (eid,axial,torsion) = line 00278 self.axial[eid] = axial 00279 self.torsion[eid] = torsion 00280 ### 00281 return 00282 00283 (dtName,dt) = transient 00284 self.dt = dt 00285 self.dataCode['name'] = dtName 00286 if dt not in self.s1: 00287 self.updateDt(self.dataCode,dt) 00288 00289 for line in data: 00290 (eid,axial,torsion) = line 00291 self.axial[dt][eid] = axial 00292 self.torsion[dt][eid] = torsion 00293 ### 00294 00295 def deleteTransient(self,dt): 00296 del self.axial[dt] 00297 del self.torsion[dt] 00298 00299 def getTransients(self): 00300 k = self.axial.keys() 00301 k.sort() 00302 return k 00303 00304 def addNewTransient(self,dt): 00305 """ 00306 initializes the transient variables 00307 """ 00308 self.dt = dt 00309 self.axial[self.dt] = {} 00310 self.torsion[self.dt] = {} 00311 00312 def addNewEid(self,dt,eid,out): 00313 (axial,torsion) = out 00314 assert eid >= 0 00315 #self.eType = self.eType 00316 self.axial[eid] = axial 00317 self.torsion[eid] = torsion 00318 00319 def addNewEidSort1(self,dt,eid,out): 00320 (axial,torsion) = out 00321 assert eid >= 0 00322 #self.eType[eid] = self.elementType 00323 if dt not in self.axial: 00324 self.addNewTransient(dt) 00325 self.axial[dt][eid] = axial 00326 self.torsion[dt][eid] = torsion 00327 00328 def addNewEidSort2(self,eid,dt,out): 00329 (axial,torsion) = out 00330 assert eid >= 0 00331 #self.eType[eid] = self.elementType 00332 if dt not in self.axial: 00333 self.addNewTransient(dt) 00334 self.axial[dt][eid] = axial 00335 self.torsion[dt][eid] = torsion 00336 00337 def __reprTransient__(self): 00338 msg = '---ROD STRAINS---\n' 00339 msg += '%-6s %6s ' %('EID','eType') 00340 headers = ['axial','torsion'] 00341 for header in headers: 00342 msg += '%10s ' %(header) 00343 msg += '\n' 00344 00345 for dt,axial in sorted(self.axial.iteritems()): 00346 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00347 for eid in sorted(axial): 00348 axial = self.axial[dt][eid] 00349 torsion = self.torsion[dt][eid] 00350 msg += '%-6i %6s ' %(eid,self.eType) 00351 vals = [axial,torsion] 00352 for val in vals: 00353 if abs(val)<1e-6: 00354 msg += '%10s ' %('0') 00355 else: 00356 msg += '%10g ' %(val) 00357 ### 00358 msg += '\n' 00359 #msg += "eid=%-4s eType=%s axial=%-4i torsion=%-4i\n" %(eid,self.eType,axial,torsion) 00360 ### 00361 return msg 00362 00363 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00364 return 'ComplexRodStrain writeF06 not implemented...',pageNum 00365 raise NotImplementedError() 00366 if self.dt is not None: 00367 return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase) 00368 00369 msg = header+[' S T R A I N S I N R O D E L E M E N T S ( C R O D )\n', 00370 ' ELEMENT AXIAL SAFETY TORSIONAL SAFETY ELEMENT AXIAL SAFETY TORSIONAL SAFETY\n', 00371 ' ID. STRAIN MARGIN STRAIN MARGIN ID. STRAIN MARGIN STRAIN MARGIN\n'] 00372 out = [] 00373 for eid in sorted(self.axial): 00374 axial = self.axial[eid] 00375 torsion = self.torsion[eid] 00376 (vals2,isAllZeros) = self.writeFloatsImag13E([axial,torsion]) 00377 (axial,torsion) = vals2 00378 out.append([eid,axial,torsion]) 00379 00380 nOut = len(out) 00381 nWrite = nOut 00382 if nOut%2==1: 00383 nWrite = nOut-1 00384 for i in xrange(0,nWrite,2): 00385 outLine = ' %8i %13s %10.4E %13s %10.4E %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[i]+out[i+1])) 00386 msg.append(outLine) 00387 00388 if nOut%2==1: 00389 outLine = ' %8i %13s %10.4E %13s %10.4E\n' %(tuple(out[-1])) 00390 msg.append(outLine) 00391 msg.append(pageStamp+str(pageNum)+'\n') 00392 return(''.join(msg),pageNum) 00393 00394 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00395 return 'ComplexRodStress writeF06Transient not implemented...',pageNum 00396 raise NotImplementedError() 00397 words = [' S T R A I N S I N R O D E L E M E N T S ( C R O D )\n', 00398 ' ELEMENT AXIAL SAFETY TORSIONAL SAFETY ELEMENT AXIAL SAFETY TORSIONAL SAFETY\n', 00399 ' ID. STRAIN MARGIN STRAIN MARGIN ID. STRAIN MARGIN STRAIN MARGIN\n'] 00400 msg = [] 00401 for dt,axials in sorted(self.axial.iteritems()): 00402 dtLine = '%14s = %12.5E\n'%(self.dataCode['name'],dt) 00403 header[2] = dtLine 00404 msg += header+words 00405 out = [] 00406 for eid in sorted(axials): 00407 axial = self.axial[dt][eid] 00408 torsion = self.torsion[dt][eid] 00409 00410 out.append([eid,axial,torsion]) 00411 00412 nOut = len(out) 00413 nWrite = nOut 00414 if nOut%2==1: 00415 nWrite = nOut-1 00416 for i in xrange(0,nWrite,2): 00417 outLine = ' %8i %13.6E %10.4E %13.6E %10.4E %8i %13.6E %10.4E %13.6E %10.4E\n' %(tuple(out[i]+out[i+1])) 00418 msg.append(outLine) 00419 00420 if nOut%2==1: 00421 outLine = ' %8i %13.6E %10.4E %13.6E %10.4E\n' %(tuple(out[-1])) 00422 msg.append(outLine) 00423 msg.append(pageStamp+str(pageNum)+'\n') 00424 pageNum+=1 00425 return(''.join(msg),pageNum-1) 00426 00427 def __repr__(self): 00428 if self.dt is not None: 00429 return self.__reprTransient__() 00430 00431 msg = '---ROD STRAINS---\n' 00432 msg += '%-6s %6s ' %('EID','eType') 00433 headers = ['axial','torsion'] 00434 for header in headers: 00435 msg += '%8s ' %(header) 00436 msg += '\n' 00437 00438 for eid in sorted(self.axial): 00439 axial = self.axial[eid] 00440 torsion = self.torsion[eid] 00441 msg += '%-6i %6s ' %(eid,self.eType) 00442 vals = [axial,torsion] 00443 for val in vals: 00444 if abs(val)<1e-7: 00445 msg += '%8s ' %('0') 00446 else: 00447 msg += '%8.3g ' %(val) 00448 ### 00449 msg += '\n' 00450 return msg