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 # 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