pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
bush.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 # pylint: disable=C0103,R0902,R0904,R0914
00026 
00027 from __future__ import division, print_function
00028 
00029 from pyNastran.bdf.cards.baseCard import Property
00030 
00031 class BushingProperty(Property):
00032     type = 'BushingProperty'
00033     def __init__(self, card, data):
00034         Property.__init__(self, card, data)
00035 
00036     def crossReference(self, model):
00037         pass
00038 
00039 class PBUSH(BushingProperty):
00040     type = 'PBUSH'
00041     def __init__(self, card=None, data=None):
00042         BushingProperty.__init__(self, card, data)
00043 
00044         # K parameter
00045         self.Ki = []
00046 
00047         # B parameter
00048         self.Bi = []
00049 
00050         # GE parameter
00051         self.GEi = []
00052         
00053         # RCV parameters
00054         self.sa = None
00055         self.st = None
00056         self.ea = None
00057         self.et = None
00058 
00059         if card:
00060             ## Property ID
00061             self.pid = card.field(1)
00062             
00063             nFields = card.nFields()
00064             self.vars = []
00065             iStart = 2
00066             while iStart < nFields:
00067                 pname = card.field(iStart)
00068                 if   pname == 'K':
00069                     self.getK(card, iStart)
00070                 elif pname == 'B':
00071                     self.getB(card, iStart)
00072                 elif pname == 'GE':
00073                     self.getGE(card, iStart)
00074                 elif pname == 'RCV':
00075                     self.getRCV(card, iStart)
00076                 else:
00077                     break
00078                 iStart += 8
00079             ###
00080         else:
00081             self.pid = data[0]
00082             self.b   = data[1]
00083             raise NotImplementedError('PBUSH data...')
00084         ###
00085         #print self
00086 
00087     def getK(self, card, iStart):
00088         ## Flag indicating that the next 1 to 6 fields are stiffness values in
00089         ## the element coordinate system.
00090         #self.k = card.field(iStart)
00091         ## Nominal stiffness values in directions 1 through 6.
00092         ## See Remarks 2 and 3. (Real; Default = 0.0)
00093         self.Ki = card.fields(i=iStart+1, j=iStart+6)
00094         #print "Ki = ",self.Ki
00095         self.vars.append('K')
00096 
00097     def getB(self, card, iStart):
00098         ## Flag indicating that the next 1 to 6 fields are force-per-velocity
00099         ## damping.
00100         #self.b = card.field(iStart)
00101         ## Force per unit velocity (Real)
00102         ## Nominal damping coefficients in direction 1 through 6 in units of
00103         ## force per unit velocity. See Remarks 2, 3, and 9. (Real; Default=0.)
00104         self.Bi = card.fields(i=iStart+1, j=iStart+6)
00105         self.vars.append('B')
00106 
00107     def getGE(self, card, iStart):
00108         ## Flag indicating that the next fields, 1 through 6 are structural
00109         ## damping constants. See Remark 7. (Character)
00110         #self.ge = card.field(iStart)
00111         ## Nominal structural damping constant in directions 1 through 6. See
00112         ## Remarks 2. and 3. (Real; Default = 0.0)
00113         self.GEi = card.fields(i=iStart+1, j=iStart+6)
00114         self.vars.append('GE')
00115 
00116     def getRCV(self, card, iStart):
00117         ## Flag indicating that the next 1 to 4 fields are stress or strain
00118         ## coefficients. (Character)
00119         #self.ge = card.field(iStart)
00120         self.sa = card.field(iStart+1, 1.)
00121         self.st = card.field(iStart+2, 1.)
00122         self.ea = card.field(iStart+3, 1.)
00123         self.et = card.field(iStart+4, 1.)
00124         self.vars.append('RCV')
00125 
00126     def rawFields(self):
00127         fields = ['PBUSH', self.pid]
00128         for var in self.vars:
00129             if var == 'K':
00130                 fields += ['K']+self.Ki
00131             elif var == 'B':
00132                 fields += ['B']+self.Bi
00133             elif var == 'GE':
00134                 fields += ['GE']+self.GEi
00135             elif var == 'RCV':
00136                 fields += ['RCV', self.sa, self.st, self.ea, self.et]
00137             else:
00138                 raise RuntimeError('not supported PBUSH field...')
00139             nSpaces = 8-(len(fields)-1)%8
00140             
00141             #print "nSpaces = ",nSpaces
00142             if nSpaces < 8:
00143                 fields += [None]*(nSpaces+1)
00144             ###
00145         return fields
00146 
00147     def reprFields(self):
00148         return self.rawFields()
00149 
00150 class PBUSH1D(BushingProperty):
00151     type = 'PBUSH1D'
00152     def __init__(self, card=None, data=None):
00153         BushingProperty.__init__(self, card, data)
00154 
00155         # SPRING parameters
00156         self.springType  = None
00157         self.springIDT   = None
00158         self.springIDC   = None
00159         self.springIDTDU = None
00160         self.springIDCDU = None
00161         
00162         # DAMPER parameters
00163         self.damperType  = None
00164         self.damperIDT   = None
00165         self.damperIDC   = None
00166         self.damperIDTDV = None
00167         self.damperIDCDV = None
00168 
00169         # GENER parameters
00170         self.generIDT   = None
00171         self.generIDC   = None
00172         self.generIDTDU = None
00173         self.generIDCDU = None
00174         self.generIDTDV = None
00175         self.generIDCDV = None
00176         
00177         # SHOCK parameters
00178         self.shockType  = None
00179         self.shockCVT    = None
00180         self.shockCVC    = None
00181         self.shockExpVT  = None
00182         self.shockExpVC  = None
00183         self.shockIDTS   = None
00184         
00185         self.shockIDETS  = None
00186         self.shockIDECS  = None
00187         self.shockIDETSD = None
00188         self.shockIDECSD = None
00189 
00190         if card:
00191             ## Property ID
00192             self.pid = card.field(1)
00193             self.k  = card.field(2)
00194             self.c  = card.field(3)
00195             self.m  = card.field(4)
00196             #
00197             self.sa = card.field(6)
00198             self.se = card.field(7)
00199             
00200             nFields = card.nFields()
00201             self.vars = []
00202             iStart = 9
00203             while iStart < nFields:
00204                 pname = card.field(iStart)
00205                 if   pname == 'SHOCKA':
00206                     iStart = self.getShockA(card, iStart)
00207                 elif pname == 'SPRING':
00208                     self.getSpring(card, iStart)
00209                 elif pname == 'DAMPER':
00210                     self.getDamper(card, iStart)
00211                 elif pname == 'GENER':
00212                     self.getGener(card, iStart)
00213                 else:
00214                     break
00215                 iStart += 8
00216             ###
00217         else:
00218             self.pid = data[0]
00219             self.b   = data[1]
00220             raise NotImplementedError('PBUSH1D data...')
00221         ###
00222 
00223     def getShockA(self, card, iStart):
00224         self.shockType  = card.field(iStart+1)
00225         self.shockCVT    = card.field(iStart+2)
00226         self.shockCVC    = card.field(iStart+3)
00227         self.shockExpVT  = card.field(iStart+4)
00228         self.shockExpVC  = card.field(iStart+5)
00229         self.shockIDTS   = card.field(iStart+6)
00230         
00231         self.shockIDETS  = card.field(iStart+9)
00232         self.shockIDECS  = card.field(iStart+10)
00233         self.shockIDETSD = card.field(iStart+11)
00234         self.shockIDECSD = card.field(iStart+12)
00235         iStart += 8
00236         return iStart
00237 
00238     def getSpring(self, card, iStart):
00239         self.springType  = card.field(iStart+1)
00240         self.springIDT   = card.field(iStart+2)
00241         self.springIDC   = card.field(iStart+3)
00242         self.springIDTDU = card.field(iStart+4)
00243         self.springIDCDU = card.field(iStart+5)
00244         self.vars.append('SPRING')
00245 
00246     def getDamper(self, card, iStart):
00247         self.damperType  = card.field(iStart+1)
00248         self.damperIDT   = card.field(iStart+2)
00249         self.damperIDC   = card.field(iStart+3)
00250         self.damperIDTDV = card.field(iStart+4)
00251         self.damperIDCDV = card.field(iStart+5)
00252         self.vars.append('DAMPER')
00253 
00254     def getGener(self, card, iStart):
00255         self.generIDT   = card.field(iStart+2)
00256         self.generIDC   = card.field(iStart+3)
00257         self.generIDTDU = card.field(iStart+4)
00258         self.generIDCDU = card.field(iStart+5)
00259         self.generIDTDV = card.field(iStart+6)
00260         self.generIDCDV = card.field(iStart+7)
00261         self.vars.append('GENER')
00262 
00263     def _shockFields(self):
00264         fields = ['SHOCKA', self.shockType, self.shockCVT, self.shockCVC, self.shockExpVT, self.shockExpVC, self.shockIDTS,
00265                   None, None, self.shockIDETS, self.shockIDECS, self.shockIDETSD, self.shockIDECSD]
00266         return fields
00267 
00268     def _springFields(self):
00269         fields = ['SPRING', self.springType, self.springIDT, self.springIDC, self.springIDTDU, self.springIDCDU]
00270         return fields
00271 
00272     def _damperFields(self):
00273         fields = ['DAMPER', self.damperType, self.damperIDT, self.damperIDC, self.damperIDTDV, self.damperIDCDV]
00274         return fields
00275 
00276     def _generFields(self):
00277         fields = ['GENER', None, self.generIDT, self.generIDC, self.generIDTDU, self.generIDCDU, self.generIDTDV, self.generIDCDV]
00278         return fields
00279 
00280     def rawFields(self):
00281         fields = ['PBUSH1D', self.pid, self.k, self.c, self.m, None, self.sa, self.se, None]
00282         for var in self.vars:
00283             if var == 'SHOCKA':
00284                 fields += self._shockFields()
00285             elif var == 'SPRING':
00286                 fields += self._springFields()
00287             elif var == 'DAMPER':
00288                 fields += self._damperFields()
00289             elif var == 'GENER':
00290                 fields += self._generFields()
00291             else:
00292                 raise RuntimeError('var=%s not supported PBUSH1D field...' %(var))
00293             nSpaces = 8-(len(fields)-1)%8
00294             
00295             #print "nSpaces = ",nSpaces
00296             if nSpaces < 8:
00297                 fields += [None]*(nSpaces)
00298             ###
00299         return fields
00300 
00301     def reprFields(self):
00302         return self.rawFields()
00303 
00304 #class PBUSH2D
00305 #class PBUSHT
 All Classes Namespaces Files Functions Variables