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 ..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
 All Classes Namespaces Files Functions Variables