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