pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oes_rods.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 
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
 All Classes Namespaces Files Functions Variables