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 00026 00027 from __future__ import division, print_function 00028 from struct import unpack 00029 00030 #91 -> PENTANL 00031 #2 -> BEAM 00032 #33 -> TUBE 00033 #92 -> CONRODNL 00034 class RealElementsStressStrain(object): 00035 00036 def skipOES_Element(self): 00037 self.log.debug('skipping approach/table/format/sortCode=%s on %s table' % (self.atfsCode,self.tableName)) 00038 #print 'skipping approach/table/format/sortCode=%s on %s table' % (self.atfsCode,self.tableName) 00039 #print self.codeInformation() 00040 self.handleResultsBuffer3(self.dummyPass, None, debug=True) 00041 00042 def dummyPass(self): 00043 self.data = b'' 00044 00045 def OES_Thermal(self,debug=False): 00046 #assert self.numWide==5,'invalid numWide...numWide=%s' % (self.numWide) 00047 00048 dt = self.nonlinearFactor 00049 (format1, extract) = self.getOUG_FormatStart() 00050 format1 += '2i5f' # 1+2+5=8 00051 format1 = bytes(format1) 00052 while len(self.data) >= 32: # 4*8 00053 #print self.printSection(40) 00054 eData = self.data[0:32] 00055 self.data = self.data[32: ] 00056 #print "len(data) = ",len(eData) 00057 00058 out = unpack(format1, eData) 00059 (eid,sideID,hbdyID,cnvCoeff,fApplied,fConv,fRad,fTotal) = out 00060 eid = extract(eid, dt) 00061 #print "eid=%s sideID=%s hbdyID=%s coeff=%s fApplied=%s fConv=%s fRad=%s fTotal=%s" % (eid,sideID,hbdyID,cnvCoeff,fApplied,fConv,fRad,fTotal) 00062 #self.obj.addNewEid(eid,axial,axialMS,torsion,torsionMS) 00063 00064 #print "eid=%i axial=%i torsion=%i" % (eid,axial,torsion) 00065 #print "len(data) = ",len(self.data) 00066 ### 00067 #print self.rodStress[self.iSubcase] 00068 00069 def OES_basicElement(self): 00070 """ 00071 genericStressReader - works on CROD_1, CELAS2_12 00072 stress & strain 00073 formatCode=1 sortCode=0 (eid,axial,axialMS,torsion,torsionMS) 00074 """ 00075 dt = self.nonlinearFactor 00076 (format1, extract) = self.getOUG_FormatStart() 00077 (nTotal,dataFormat) = self.obj.getLength() 00078 dataFormat = format1+dataFormat 00079 #print "nTotal=%s dataFormat=%s len(data)=%s" % (nTotal,dataFormat,len(self.data)) 00080 dataFormat = bytes(dataFormat) 00081 n = 0 00082 nEntries = len(self.data)//nTotal 00083 for i in xrange(nEntries): 00084 eData = self.data[n:n+nTotal] 00085 out = unpack(dataFormat, eData) 00086 #print "out = ",out 00087 eid = extract(out[0],dt) 00088 self.obj.addNewEid(dt, eid,out[1:]) 00089 n+=nTotal 00090 self.data = self.data[n: ] 00091 00092 def OES_CBEAM_2(self): 00093 dt = self.nonlinearFactor 00094 (formatStart, extract) = self.getOUG_FormatStart() 00095 00096 nNodes = 10 # 11-1 00097 nTotal = self.obj.getLengthTotal() 00098 (n1,format1) = self.obj.getLength1() 00099 (n2,format2) = self.obj.getLength2() 00100 format1 = formatStart+format1 00101 format1 = bytes(format1) 00102 format2 = bytes(format2) 00103 while len(self.data) >= nTotal: 00104 eData = self.data[0:n1] 00105 self.data = self.data[n1: ] 00106 #print "len(data) = ",len(eData) 00107 00108 out = unpack(format1, eData) 00109 #print "outA = ",out 00110 eid2 = extract(out[0], dt) 00111 self.obj.addNewEid(dt, eid2,out[1:]) 00112 00113 for iNode in xrange(nNodes): 00114 eData = self.data[0:n2] 00115 self.data = self.data[n2: ] 00116 out = unpack(format2, eData) 00117 #print "outB = ",out 00118 self.obj.add(dt, eid2,out) 00119 00120 #print "eid=%i axial=%i torsion=%i" % (eid,axial,torsion) 00121 #print "len(data) = ",len(self.data) 00122 ### 00123 00124 def OES_CQUAD4_33(self): 00125 """ 00126 GRID-ID DISTANCE,NORMAL-X,NORMAL-Y,SHEAR-XY,ANGLE,MAJOR MINOR,VONMISES 00127 """ 00128 dt = self.nonlinearFactor 00129 (format1, extract) = self.getOUG_FormatStart() 00130 format1 += '16f' 00131 format1 = bytes(format1) 00132 00133 nNodes = 0 # centroid + 4 corner points 00134 #self.printSection(20) 00135 #term = data[0:4] CEN/ 00136 #data = data[4:] 00137 #print "*****" 00138 #self.printBlock(self.data) 00139 00140 assert self.numWide == 17, ('invalid numWide...numWide=%s' 00141 % (self.numWide)) 00142 00143 while len(self.data) >= 68: # 2+17*5 = 87 -> 87*4 = 348 00144 #print self.printBlock(self.data[0:100]) 00145 #(eid,) = unpack(b'i',self.data[0:4]) 00146 #self.data = self.data[8:] # 2 00147 eData = self.data[0:68] # 4*17 00148 self.data = self.data[68: ] 00149 out = unpack(format1, eData) # 17 00150 (eid, fd1, sx1, sy1, txy1, angle1, major1, minor1, maxShear1, 00151 fd2, sx2, sy2, txy2, angle2, major2, minor2, maxShear2) = out 00152 00153 eid = extract(eid, dt) 00154 00155 #print "eid=%i grid=%s fd1=%-3.1f sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,'C',fd1,sx1,sy1,txy1,angle1,major1,minor1,maxShear1) 00156 #print " fd2=%-3.1f sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,maxShear2) 00157 #print "nNodes = ",nNodes 00158 self.obj.addNewEid('CQUAD4',dt, eid,'C',fd1,sx1,sy1,txy1,angle1,major1,minor1,maxShear1) 00159 self.obj.add( dt, eid,'C',fd2,sx2,sy2,txy2,angle2,major2,minor2,maxShear2) 00160 00161 for nodeID in xrange(nNodes): #nodes pts 00162 eData = self.data[0:68] # 4*17 00163 self.data = self.data[68: ] 00164 out = unpack(b'i16f', eData[0:68]) 00165 (grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1, 00166 fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2,) = out 00167 00168 #print "eid=%i grid=%i fd1=%i sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00169 #print " fd2=%i sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00170 #print "len(data) = ",len(self.data) 00171 #self.printBlock(self.data) 00172 self.obj.addNewNode(dt, eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00173 self.obj.add( dt, eid,grid,fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00174 ### 00175 #print '--------------------' 00176 #print "len(data) = ",len(self.data) 00177 #print "tell = ",self.op2.tell() 00178 00179 #self.printSection(100) 00180 #self.dn += 348 00181 ### 00182 00183 def OES_CBAR_34(self): 00184 dt = self.nonlinearFactor 00185 #print "len(data) = ",len(self.data) 00186 assert self.numWide == 16, ('invalid numWide...numWide=%s' 00187 % (self.numWide)) 00188 00189 (format1, extract) = self.getOUG_FormatStart() 00190 format1 += '15f' 00191 format1 = bytes(format1) 00192 00193 while len(self.data) >= 64: 00194 #self.printBlock(self.data) 00195 eData = self.data[0:64] 00196 self.data = self.data[64: ] 00197 #print "len(data) = ",len(eData) 00198 00199 (eid,s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt, 00200 s1b,s2b,s3b,s4b, smaxb,sminb,MSc)= unpack(format1, eData) 00201 eid2 = extract(eid, dt) 00202 self.obj.addNewEid('CBAR',dt, eid2,s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt, 00203 s1b,s2b,s3b,s4b, smaxb,sminb,MSc) 00204 00205 #print "eid=%i s1=%i s2=%i s3=%i s4=%i axial=%-5i smax=%i smin=%i MSt=%i MSc=%i" % (eid,s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt,MSc) 00206 #print " s1=%i s2=%i s3=%i s4=%i smax=%i smin=%i" % (s1b,s2b,s3b,s4b,smaxb,sminb) 00207 #print "len(data) = ",len(self.data) 00208 ### 00209 00210 def OES_CSOLID_67(self): 00211 """ 00212 stress is extracted at the centroid 00213 CTETRA_39 00214 CPENTA_67 00215 CHEXA_68 00216 """ 00217 dt = self.nonlinearFactor 00218 (format1, extract) = self.getOUG_FormatStart() 00219 format1 += "i4si" 00220 format1 = bytes(format1) 00221 00222 #nNodes = 5 # 1 centroid + 4 corner points 00223 #self.printSection(20) 00224 #term = self.data[0:4] CEN/ 00225 #self.data = self.data[4:] 00226 #print "*****" 00227 ElementType = self.ElementType(self.elementType) 00228 nNodes = 1 # this is a minimum, it will be reset later 00229 nNodesExpected = 1 00230 #assert self.numWide in [109,151,193],'invalid numWide...numWide=%s' % (self.numWide) 00231 while len(self.data)>= 16+84*nNodesExpected: 00232 eData = self.data[0:16] 00233 self.data = self.data[16:] 00234 #self.printBlock(eData) 00235 00236 out = unpack(format1, eData) 00237 (eid,cid,abcd,nNodes) = out 00238 eid2 = extract(eid, dt) 00239 #print "abcd = |%s|" % (abcd) 00240 #print "eid=%s cid=%s nNodes=%s nNodesExpected=%s" % (eid,cid,nNodes,nNodesExpected) 00241 00242 assert nNodes < 21, self.printBlock(eData) 00243 00244 if ElementType=='TETRA': nNodesExpected = 5 00245 elif ElementType=='PENTA': nNodesExpected = 7 00246 elif ElementType=='HEXA': nNodesExpected = 9 00247 else: 00248 raise NotImplementedError('not supported....EType=%s eType=%s nNodes=%s numWide=%s' % (ElementType,self.elementType,nNodes,self.numWide)) 00249 00250 #print "len(data) = ",len(self.data) 00251 for nodeID in xrange(nNodesExpected): #nodes pts, +1 for centroid (???) 00252 #print "len(data)A = ",len(self.data) 00253 eData = self.data[0:4*21] # for the stresses 00254 self.data = self.data[4*21: ] 00255 #print "len(data)B = ",len(self.data) 00256 #self.printBlock(eData) 00257 00258 #print "self.tableCode = ",self.tableCode 00259 #print "len(data) = ",len(self.data) 00260 00261 gridDevice, = unpack(b'i', eData[0:4]) 00262 #print "gridDevice = ",gridDevice 00263 if gridDevice == 0: 00264 grid = 'C' 00265 else: 00266 #grid = (gridDevice - deviceCode) // 10 00267 grid = gridDevice 00268 ### 00269 00270 out = unpack(b'20f', eData[4:4*21]) 00271 (sxx, sxy, s1, a1, a2, a3, pressure, svm, 00272 syy, syz, s2, b1, b2, b3, 00273 szz, sxz, s3, c1, c2, c3) = out 00274 00275 #print "%s eid=%s cid=%s grid=%s sxx=%-6i txy=%-5i s1=%-6i a1=%i a2=%i a3=%i press=%i vm=%s" % (elementType,eid,cid,grid,sxx,sxy,s1,a1,a2,a3,pressure,svm) 00276 #print "%s eid=%s cid=%s grid=%s syy=%-6i tyz=%-5i s2=%-6i b1=%i b2=%i b3=%i" % (elementType,eid,cid,grid,syy,syz,s2,b1,b2,b3) 00277 #print "%s eid=%s cid=%s grid=%s szz=%-6i txz=%-5i s3=%-6i c1=%i c2=%i c3=%i" % (elementType,eid,cid,grid,szz,sxz,s3,c1,c2,c3) 00278 #print "" 00279 00280 #smax = max(s1,s2,s3) 00281 #smin = min(s1,s2,s3) 00282 00283 aCos = [] 00284 bCos = [] 00285 cCos = [] 00286 if nodeID==0: 00287 #print "adding new eid" 00288 self.obj.addNewEid(ElementType,cid,dt, eid2,grid,sxx,syy,szz,sxy,syz,sxz,s1,s2,s3,aCos,bCos,cCos,pressure,svm) 00289 else: 00290 self.obj.add( dt, eid2,grid,sxx,syy,szz,sxy,syz,sxz,s1,s2,s3,aCos,bCos,cCos,pressure,svm) 00291 #self.printBlock(data) 00292 #sys.exit('finished a CEHXA') 00293 #print self.solidStress[self.iSubcase] 00294 ### 00295 #print '--------------------' 00296 #print "len(data) = ",len(self.data) 00297 00298 #self.printSection(100) 00299 #self.printBlock(self.data[0:100]) 00300 #self.printBlock(self.data[1:100]) 00301 #self.printBlock(self.data[2:100]) 00302 #self.printBlock(self.data[3:100]) 00303 ### 00304 00305 def OES_CTRIA3_74(self): 00306 """ 00307 DISTANCE,NORMAL-X,NORMAL-Y,SHEAR-XY,ANGLE,MAJOR,MINOR,VONMISES 00308 stress is extracted at the centroid 00309 """ 00310 assert self.numWide == 17, ('invalid numWide...numWide=%s' 00311 % (self.numWide)) 00312 00313 dt = self.nonlinearFactor 00314 (format1, extract) = self.getOUG_FormatStart() 00315 format1 += '16f' 00316 format1 = bytes(format1) 00317 00318 while len(self.data) >= 68: # 4*17 00319 eData = self.data[0:68] 00320 self.data = self.data[68: ] 00321 out = unpack(format1, eData) 00322 00323 (eid, fd1, sx1, sy1, txy1, angle1, major1, minor1, vm1, 00324 fd2, sx2, sy2, txy2, angle2, major2, minor2, vm2,) = out 00325 eid = extract(eid, dt) 00326 #print "eid=%i fd1=%i sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00327 #print " fd2=%i sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00328 self.obj.addNewEid('CTRIA3',dt, eid,'C',fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00329 self.obj.add( dt, eid,'C',fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00330 ### 00331 00332 def OES_CSOLID_85(self): # works 00333 """ 00334 stress is extracted at the centroid 00335 CTETRA_85 00336 CPENTA_91 ??? 00337 CHEXA_93 ??? 00338 """ 00339 #print "starting nonlinear solid element..." 00340 #nNodes = 5 # 1 centroid + 4 corner points 00341 #self.printSection(20) 00342 #term = self.data[0:4] CEN/ 00343 #self.data = self.data[4:] 00344 #print "*****" 00345 dt = self.nonlinearFactor 00346 (format1, extract) = self.getOUG_FormatStart() 00347 format1 += "4s" 00348 format1 = bytes(format1) 00349 00350 nNodes = 4 # this is a minimum, it will be reset later 00351 nNodesExpected = 1 00352 assert self.numWide in [82],'invalid numWide...numWide=%s' % (self.numWide) 00353 while len(self.data)>= 16+84*nNodesExpected: 00354 eData = self.data[0:8] 00355 self.data = self.data[8:] 00356 #self.printBlock(eData) 00357 00358 out = unpack(format1, eData) 00359 (eid,abcd) = out 00360 #print "abcd = |%s|" % (a+b+c+d) 00361 #print "eid=%s cid=%s nNodes=%s nNodesExpected=%s" % (eid,cid,nNodes,nNodesExpected) 00362 00363 assert nNodes < 21, self.printBlock(eData) 00364 eid = extract(eid, dt) 00365 if( nNodes in [4, 10]): 00366 elementType = "CTETRA" 00367 nNodesExpected = 5 00368 #elif(nNodes in [6,15]): 00369 # elementType = "CPENTA" 00370 # nNodesExpected = 7 00371 #elif(nNodes in [8,20]): 00372 # elementType = "CHEXA" 00373 # nNodesExpected = 9 00374 #else: 00375 # raise Exception('not supported....nNodes=%s' % (nNodes)) 00376 00377 #print "len(data) = ",len(self.data) 00378 for nodeID in xrange(nNodesExpected): #nodes pts, +1 for centroid (???) 00379 #print "len(data)A = ",len(self.data) 00380 eData = self.data[0:64] # 4*16; for the stresses 00381 self.data = self.data[64: ] 00382 #print "len(data)B = ",len(self.data) 00383 #self.printBlock(eData) 00384 00385 #print "self.tableCode = ",self.tableCode 00386 00387 #print "len(data) = ",len(self.data) 00388 00389 #gridDevice, = unpack(b'i', eData[0:4]) 00390 #print "gridDevice = ",gridDevice 00391 00392 out = unpack(b'i15f', eData[:64]) # 18-3 = 15 00393 00394 (gridGauss, sxx, syy, szz, sxy, syz, sxz, se, 00395 eps, ecs, exx, eyy, ezz, exy, eyz, exz) = out 00396 00397 if gridGauss == 0: 00398 gridGauss = 'C' 00399 else: 00400 #grid = (gridDevice - deviceCode) // 10 00401 gridGauss = gridGauss 00402 00403 #print "%s gridGauss=%-5s eid=%s sxx=%g syy=%g szz=%g" % (elementType,gridGauss,eid,sxx,syy,szz) 00404 00405 #print "%s eid=%s cid=%s grid=%s sxx=%-6i txy=%-5i s1=%-6i a1=%i a2=%i a3=%i press=%i vm=%s" % (elementType,eid,cid,grid,sxx,sxy,s1,a1,a2,a3,pressure,svm) 00406 #print "%s eid=%s cid=%s grid=%s syy=%-6i tyz=%-5i s2=%-6i b1=%i b2=%i b3=%i" % (elementType,eid,cid,grid,syy,syz,s2,b1,b2,b3) 00407 #print "%s eid=%s cid=%s grid=%s szz=%-6i txz=%-5i s3=%-6i c1=%i c2=%i c3=%i" % (elementType,eid,cid,grid,szz,sxz,s3,c1,c2,c3) 00408 #print "" 00409 00410 #smax = max(s1,s2,s3) 00411 #smin = min(s1,s2,s3) 00412 00413 #if nodeID==0: 00414 # #print "adding new eid" 00415 # self.obj.addNewEid(elementType,cid,eid,grid,sxx,syy,szz,sxy,syz,sxz,aCos,bCos,cCos,pressure,svm) 00416 #else: 00417 # self.obj.add( eid,grid,sxx,syy,szz,sxy,syz,sxz,aCos,bCos,cCos,pressure,svm) 00418 #print "eid=%i grid=%i fd1=%i sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00419 #print " fd2=%i sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00420 #self.printBlock(data) 00421 #sys.exit('finished a CTETRANL') 00422 #print self.solidStress[self.iSubcase] 00423 ### 00424 #print '--------------------' 00425 #print "len(data) = ",len(self.data) 00426 00427 #self.printSection(100) 00428 #self.printBlock(self.data[0:100]) 00429 #self.printBlock(self.data[1:100]) 00430 #self.printBlock(self.data[2:100]) 00431 #self.printBlock(self.data[3:100]) 00432 ### 00433 #print self.solidStress[self.iSubcase] 00434 00435 00436 def OES_field1(self): 00437 if self.isSort1(): 00438 #raise NotImplementedError('SORT1 is not supported') 00439 return ('i', self.scaleEid) 00440 elif self.isSort2(): 00441 if self.analysisCode in [1, 2, 3, 4, 7, 8, 9, 11, 12]: # eid 00442 return ('i', self.scaleEid) 00443 elif self.analysisCode == 5: # freq 00444 #freq 00445 return ('f', self.scaleDt) 00446 #raise NotImplementedError('freq is not supported') 00447 elif self.analysisCode == 6: # time 00448 #time 00449 return ('f', self.scaleDt) 00450 #raise NotImplementedError('time is not supported') 00451 elif self.analysisCode == 10: # fqts: 00452 #fqts # freqTime 00453 return ('f', self.scaleDt) 00454 #raise NotImplementedError('freqTime is not supported') 00455 else: 00456 raise NotImplementedError('invalid SORT2 analysisCode=%s' % (self.analysisCode)) 00457 ### 00458 else: 00459 raise NotImplementedError('invalid SORTx code') 00460 ### 00461 00462 def OES_CTRIAX6_53(self): 00463 #(Format1,scaleValue) = self.OES_field1() 00464 #Format = Format1+'ifffffff' 00465 dt = self.nonlinearFactor 00466 (format1, extract) = self.getOUG_FormatStart() 00467 format1 += 'i7f' 00468 format1 = bytes(format1) 00469 while len(self.data) >= 132: # (1+8*4)*4 = 33*4 = 132 00470 eData = self.data[0:36] # 4*9 00471 self.data = self.data[36: ] 00472 out = unpack(format1, eData) 00473 (eid,loc,rs,azs,As,ss,maxp,tmax,octs) = out 00474 eid = extract(eid, dt) 00475 #print "eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" % (eid,loc,rs,azs,As,ss,maxp,tmax,octs) 00476 self.obj.addNewEid(dt, eid,loc,rs,azs,As,ss,maxp,tmax,octs) 00477 00478 for i in xrange(3): 00479 eData = self.data[0:32] # 4*8 00480 self.data = self.data[32: ] 00481 out = unpack(b'i7f', eData) 00482 (loc, rs, azs, As, ss, maxp, tmax, octs) = out 00483 #print "eid=%s loc=%s rs=%s azs=%s as=%s ss=%s maxp=%s tmx=%s octs=%s" % (eid,loc,rs,azs,As,ss,maxp,tmax,octs) 00484 self.obj.add(dt, eid,loc,rs,azs,As,ss,maxp,tmax,octs) 00485 ### 00486 00487 def OES_RODNL_89_92(self): 00488 dt = self.nonlinearFactor 00489 (format1, extract) = self.getOUG_FormatStart() 00490 format1 += '6f' # 1+6=7 00491 format1 = bytes(format1) 00492 00493 while len(self.data) >= 28: # len(format1)*4 = 7*4 = 28 00494 eData = self.data[0:28] 00495 self.data = self.data[28: ] 00496 out = unpack(format1, eData) 00497 00498 (eid,axial,equivStress,totalStrain,effPlasticCreepStrain,effCreepStrain,linearTorsionalStresss) = out 00499 eid = extract(eid, dt) 00500 data = (eid,axial,equivStress,totalStrain,effPlasticCreepStrain,effCreepStrain,linearTorsionalStresss) 00501 00502 #print "eid=%s axial=%s equivStress=%s totalStrain=%s effPlasticCreepStrain=%s effCreepStrain=%s linearTorsionalStresss=%s" % (eid,axial,equivStress,totalStrain,effPlasticCreepStrain,effCreepStrain,linearTorsionalStresss) 00503 self.obj.add(self.elementType,dt,data) 00504 00505 ### 00506 00507 def OES_CQUAD4NL_90(self): 00508 dt = self.nonlinearFactor 00509 (format1, extract) = self.getOUG_FormatStart() 00510 00511 nStep = 52 #4*13 00512 format1 += '12f' # 1+12=13 00513 format1 = bytes(format1) 00514 assert 13 == self.numWide, 'numWide=%s not 13' % (self.numWide) 00515 00516 while len(self.data)>=nStep: 00517 eData = self.data[0:nStep] 00518 self.data = self.data[nStep: ] 00519 00520 out = unpack(format1, eData) # numWide=13 00521 (eid,fd1,sx1,sy1,sz1,txy1, es1, eps1, ecs1, ex1, ey1, ez1, exy1) = out 00522 eid = extract(eid, dt) 00523 data = (eid,fd1,sx1,sy1,sz1,txy1, es1, eps1, ecs1, ex1, ey1, ez1, exy1) 00524 self.obj.addNewEid(self.elementType,dt,data) 00525 00526 #print "eid=%s axial=%s equivStress=%s totalStrain=%s effPlasticCreepStrain=%s effCreepStrain=%s linearTorsionalStresss=%s" % (eid,axial,equivStress,totalStrain,effPlasticCreepStrain,effCreepStrain,linearTorsionalStresss) 00527 ### 00528 00529 def OES_CPENTANL_91(self): 00530 """ 00531 The DMAP manual says fields 3-18 repeat 7 times. but they dont. 00532 They repeat 6 times. Other DMAP cards are correct with 00533 their repeat statements. 00534 """ 00535 n = 0 00536 dt = self.nonlinearFactor 00537 (format1, extract) = self.getOUG_FormatStart() 00538 format1 += '4s' 00539 format1 = bytes(format1) 00540 00541 while len(self.data) >= 456: # 2+16*7 = 114 -> 114*4 = 456 00542 eData = self.data[0:8] 00543 self.data = self.data[8:] 00544 (eid,a,b,c,d) = unpack(format1, eData) 00545 eid = extract(eid, dt) 00546 #out = unpack(b"ii",eData) 00547 #(eid,cType) = out 00548 cType = a+b+c+d 00549 00550 for i in xrange(7): 00551 #print "len(self.data) = ",len(self.data) 00552 eData = self.data[0:64] 00553 self.data = self.data[64:] 00554 out = unpack(b'i15f', eData) 00555 assert len(out) == 16 00556 (grid, sx, sy, sz, sxy, syz, sxz, se, 00557 eps, ecs, ex, ey, ez, exy, eyz, exz) = out 00558 #print "eid=%3s cType=%s sx=%i sy=%i sz=%i sxy=%s syz=%i szx=%i se=%s" % (eid,cType,sx,sy,sz,sxy,syz,sxz,se) 00559 #print "gid=%3s ecs=%.3g ex=%.3g ey=%.3g ez=%.3g exy=%.3g eyz=%.3g ezx=%.3g" % (grid,ecs,ex,ey,ez,exy,eyz,exz) 00560 #print "" 00561 assert a == 'G' 00562 00563 #self.data = self.data[1456:] 00564 #self.firstPass = True 00565 00566 def OES_CHEXANL_93(self): 00567 """ 00568 The DMAP manual says fields 3-18 repeat 9 times. but they dont. 00569 They repeat 8 times. Other DMAP cards are correct with 00570 their repeat statements. 00571 """ 00572 #print "CHEXANL_93" 00573 #print "len(self.data) = ",len(self.data) 00574 00575 n = 0 00576 dt = self.nonlinearFactor 00577 (format1, extract) = self.getOUG_FormatStart() 00578 format1 += '4s' 00579 format1 = bytes(format1) 00580 00581 while len(self.data) >= 584: # 2+16*9 = 146 -> 146*4 = 584 00582 eData = self.data[0:8] 00583 self.data = self.data[8:] 00584 (eid,cType) = unpack(format1, eData) 00585 eid = extract(eid, dt) 00586 #out = unpack('2i',eData) 00587 #(eid,cType) = out 00588 00589 for i in xrange(9): 00590 #print "len(self.data) = ",len(self.data) 00591 eData = self.data[0:64] 00592 self.data = self.data[64:] 00593 out = unpack(b'i15f', eData) 00594 assert len(out) == 16 00595 (grid,sx,sy,sz,sxy,syz,sxz,se,eps,ecs,ex,ey,ez,exy,eyz,exz) = out 00596 #print "eid=%3s cType=%s sx=%i sy=%i sz=%i sxy=%s syz=%i szx=%i se=%s" % (eid,cType,sx,sy,sz,sxy,syz,sxz,se) 00597 #print "gid=%3s ecs=%.3g ex=%.3g ey=%.3g ez=%.3g exy=%.3g eyz=%.3g ezx=%.3g" % (grid,ecs,ex,ey,ez,exy,eyz,exz) 00598 #print "" 00599 assert a == 'G' 00600 00601 #self.data = self.data[1456:] 00602 #sys.exit('hexa...') 00603 #print "buffer time..." 00604 #self.firstPass = True 00605 00606 def OES_CBEAM_94(self): 00607 nNodes = 10 # 11-1 00608 00609 #nTotal = self.obj.getLengthTotal() 00610 #(n1,format1) = self.obj.getLength1() 00611 #(n2,format2) = self.obj.getLength2() 00612 nTotal = 2*4 + (18-3)*9*4 00613 nTotal = 204 00614 00615 n1 = 24 00616 format1 = '4s5f' 00617 format1 = bytes(format1) 00618 #print "len(data) = ",len(self.data) 00619 while len(self.data) >= nTotal: 00620 eData = self.data[0:8] 00621 self.data = self.data[8: ] 00622 (eid,gridA) = unpack(b'2i', eData) 00623 #print "eid=%s gridA=%s" % (eid,gridA) 00624 00625 for i in xrange(1): 00626 for j in xrange(4): # c,d,e,f @ A; c,d,e,f @ B 00627 eData = self.data[0:n1] 00628 self.data = self.data[n1: ] 00629 out = unpack(format1, eData) 00630 (loc,nsx,nse,te,epe,ece) = out 00631 #print "loc=%s nsx=%s nse=%s te=%s epe=%s ece=%s" % (loc,nsx,nse,te,epe,ece) 00632 ### 00633 #self.obj.add(eid,out) 00634 ### 00635 00636 def OES_CQUAD4_95(self): # works (doesnt handle all stress/strain cases tho) 00637 """ 00638 GRID-ID DISTANCE,NORMAL-X,NORMAL-Y,SHEAR-XY,ANGLE,MAJOR MINOR,VONMISES 00639 composite quad 00640 """ 00641 eType = self.ElementType(self.elementType) 00642 00643 #self.printSection(20) 00644 #term = data[0:4] CEN/ 00645 #data = data[4:] 00646 assert self.numWide == 11,'invalid numWide...numWide=%s' % (self.numWide) 00647 00648 dt = self.nonlinearFactor 00649 (format1, extract) = self.getOUG_FormatStart() 00650 format1 += 'i9f' 00651 format1 = bytes(format1) 00652 00653 while len(self.data) >= 44: # 2+17*5 = 87 -> 87*4 = 348 00654 eData = self.data[0:44] # 4*11 00655 self.data = self.data[44: ] 00656 out = unpack(format1, eData) 00657 (eid,iLayer,o1,o2,t12,t1z,t2z,angle,major,minor,ovm) = out 00658 #print "out =",out 00659 eid = extract(eid, dt) 00660 00661 if eid!=self.eid2: # originally initialized to None, the buffer doesnt reset it, so it is the old value 00662 #print "1 - eid=%s iLayer=%i o1=%i o2=%i ovm=%i" % (eid,iLayer,o1,o2,ovm) 00663 self.obj.addNewEid(eType,dt, eid,o1,o2,t12,t1z,t2z,angle,major,minor,ovm) 00664 else: 00665 #print "2 - eid=%s iLayer=%i o1=%i o2=%i ovm=%i" % (eid,iLayer,o1,o2,ovm) 00666 self.obj.add(dt, eid,o1,o2,t12,t1z,t2z,angle,major,minor,ovm) 00667 ### 00668 self.eid2 = eid 00669 #self.dn += 348 00670 ### 00671 #print "3 - eid=%s iLayer=%i o1=%i o2=%i ovm=%i" % (eid,iLayer,o1,o2,ovm) 00672 #self.printSection(100) 00673 00674 def OES_QUAD4FD_139(self): # hyperelastic 00675 """ 00676 Hyperelastic Quad 00677 36+4*7*4 = 148 00678 """ 00679 #x = 0 00680 dt = self.nonlinearFactor 00681 (format1, extract) = self.getOUG_FormatStart() 00682 format1 += '4si6f' # 1 + 4+1+6 = 12 00683 format1 = bytes(format1) 00684 while len(self.data) >= 148: 00685 #if x==2: 00686 # sys.exit('end of hyperQuad') 00687 eData = self.data[0:36] # 4*9 00688 self.data = self.data[36: ] 00689 out = unpack(format1, eData) 00690 00691 (eid,Type,ID,sx,sy,sxy,angle,smj,smi) = out 00692 eid = extract(eid, dt) 00693 self.obj.addNewEid(dt,[eid,Type,sx,sy,sxy,angle,smj,smi]) 00694 #print "eid=%s Type=%s\n***ID=%s sx=%s sy=%s sxy=%s angle=%s major=%s minor=%s" % (eid,Type,ID,sx,sy,sxy,angle,smj,smi) 00695 for i in xrange(3): 00696 eData = self.data[0:28] # 4*7 00697 self.data = self.data[28: ] 00698 out = unpack(b'i6f', eData) 00699 #(ID,sx,sy,sxy,angle,smj,smi) = out 00700 self.obj.add(dt, eid, out) 00701 #print "***ID=%s sx=%s sy=%s sxy=%s angle=%s major=%s minor=%s" % (ID,sx,sy,sxy,angle,smj,smi) 00702 ### 00703 #self.obj.add(data) 00704 #x+=1 00705 ### 00706 #sys.exit('end of hyperQuad') 00707 00708 def OES_CQUADR_82(self): # not done... 00709 """ 00710 GRID-ID DISTANCE,NORMAL-X,NORMAL-Y,SHEAR-XY,ANGLE,MAJOR MINOR,VONMISES 00711 """ 00712 if self.elementType == 82: # CQUADR 00713 nTotal = 348 # 2+17*5 = 87 -> 87*4 = 348 00714 nNodes = 4 # centroid + 4 corner points 00715 eType = 'CQUADR' 00716 else: 00717 raise RuntimeError('elementType=%s nTotal not defined...' 00718 % (self.elementType)) 00719 00720 dt = self.nonlinearFactor 00721 (format1, extract) = self.getOUG_FormatStart() 00722 format1 += '16f' # 1+16 = 17 00723 format1 = bytes(format1) 00724 00725 while len(self.data) >= nTotal: 00726 (eid,_) = unpack(b'i4s', self.data[0:8]) 00727 self.data = self.data[8:] # 2 00728 eid = extract(eid, dt) 00729 eData = self.data[0:68] # 4*17 00730 self.data = self.data[68: ] 00731 out = unpack(format1, eData) # len=17*4 00732 (grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1, 00733 fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2,) = out 00734 grid = 'C' 00735 self.obj.addNewEid(eType,eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00736 self.obj.add( eid,grid,fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00737 00738 for nodeID in xrange(nNodes): #nodes pts 00739 eData = self.data[0:68] 00740 self.data = self.data[68: ] 00741 out = unpack(b'i16f', eData) 00742 (grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1, 00743 fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2,) = out 00744 00745 #print "eid=%i grid=%i fd1=%i sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00746 #print " fd2=%i sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00747 #print "len(data) = ",len(self.data) 00748 #self.printBlock(self.data) 00749 self.obj.addNewNode(eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00750 self.obj.add( eid,grid,fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00751 ### 00752 ### 00753 00754 def OES_CQUAD4_144(self): # works 00755 """ 00756 GRID-ID DISTANCE,NORMAL-X,NORMAL-Y,SHEAR-XY,ANGLE,MAJOR MINOR,VONMISES 00757 """ 00758 #self.printSection(20) 00759 #term = data[0:4] CEN/ 00760 #data = data[4:] 00761 #print "*****" 00762 #self.printBlock(self.data) 00763 #assert self.numWide==87,'invalid numWide...numWide=%s' % (self.numWide) 00764 #if self.numWide==87: # 2+(17-1)*5 = 87 -> 87*4 = 348 00765 00766 if self.elementType == 144: # CQUAD4 00767 nTotal = 348 # 2+17*5 = 87 -> 87*4 = 348 00768 nNodes = 4 # centroid + 4 corner points 00769 eType = 'CQUAD4' 00770 elif self.elementType == 64: # CQUAD8 00771 nTotal = 348 # 2+17*5 = 87 -> 87*4 = 348 00772 nNodes = 4 # centroid + 4 corner points 00773 eType = 'CQUAD8' 00774 elif self.elementType == 82: # CQUADR 00775 nTotal = 348 # 2+17*5 = 87 -> 87*4 = 348 00776 nNodes = 4 # centroid + 4 corner points 00777 eType = 'CQUAD4' ## @todo write the word CQUADR 00778 00779 elif self.elementType == 75: # CTRIA6 00780 nTotal = 280 # 2+17*3 = 70 -> 70*4 = 280 00781 nNodes = 3 # centroid + 3 corner points 00782 eType = 'CTRIA6' 00783 elif self.elementType == 70: # CTRIAR 00784 nTotal = 280 # 2+17*3 = 70 -> 70*4 = 280 00785 nNodes = 3 # centroid + 3 corner points 00786 eType = 'CTRIAR' ## @todo write the word CTRIAR 00787 else: 00788 raise NotImplementedError('elementType=%s nTotal not defined...' 00789 % (self.elementType)) 00790 00791 dt = self.nonlinearFactor 00792 (format1, extract) = self.getOUG_FormatStart() 00793 format1 += '16f' 00794 format1 = bytes(format1) 00795 00796 while len(self.data) >= nTotal: 00797 (eid,_) = unpack(b'i4s',self.data[0:8]) 00798 self.data = self.data[8:] # 2 00799 eid = extract(eid, dt) 00800 eData = self.data[0:68] 00801 self.data = self.data[68: ] 00802 out = unpack(format1, eData) # len=17*4 00803 (grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1, 00804 fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2,) = out 00805 grid = 'C' 00806 self.obj.addNewEid(eType,dt, eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00807 self.obj.add( dt, eid,grid,fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00808 00809 for nodeID in xrange(nNodes): #nodes pts 00810 eData = self.data[0:68] 00811 self.data = self.data[68: ] 00812 out = unpack(b'i16f', eData) 00813 (grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1, 00814 fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2,) = out 00815 00816 #print "eid=%i grid=%i fd1=%i sx1=%i sy1=%i txy1=%i angle1=%i major1=%i minor1=%i vm1=%i" % (eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00817 #print " fd2=%i sx2=%i sy2=%i txy2=%i angle2=%i major2=%i minor2=%i vm2=%i\n" % (fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00818 #print "len(data) = ",len(self.data) 00819 #self.printBlock(self.data) 00820 self.obj.addNewNode(dt, eid,grid,fd1,sx1,sy1,txy1,angle1,major1,minor1,vm1) 00821 self.obj.add( dt, eid,grid,fd2,sx2,sy2,txy2,angle2,major2,minor2,vm2) 00822 ### 00823 #print '--------------------' 00824 #print "len(data) = ",len(self.data) 00825 #print "tell = ",self.op2.tell() 00826 00827 #self.printSection(100) 00828 #sys.exit('asdf') 00829 #self.dn += 348 00830 ### 00831 ### 00832 # elif self.numWide==77: 00833 # while len(self.data) >= 308: # 2+15*5 = 77 -> 77*4 = 308 00834 # (eid,_) = unpack(b'i4s',self.data[0:8]) 00835 # self.data = self.data[8:] # 2 00836 # eData = self.data[0:62] # 4*15 00837 # self.data = self.data[62: ] 00838 # 00839 # out = unpack(b'i14f', eData) # 15 00840 # (grid,fd1,sx1r,sx11,sy1r,sy11,txy1r,txy11, 00841 # fd2,sx2r,sx21,sy2r,sy21,txy2r,txy21) = out 00842 # 00843 # for nodeID in xrange(nNodes): #nodes pts 00844 # eData = self.data[0:4*15] 00845 # self.data = self.data[4*15: ] 00846 # out = unpack(b'i14f', eData) 00847 # (grid,fd1,sx1r,sx11,sy1r,sy11,txy1r,txy11, 00848 # fd2,sx2r,sx21,sy2r,sy21,txy2r,txy21) = out 00849 # ### 00850 # ### 00851 # ### 00852 # elif self.numWide==47: 00853 # while len(self.data) >= 188: # 2+9*5 = 47 -> 47*4 = 188 00854 # (eid,_) = unpack(b'i4s',self.data[0:8]) 00855 # self.data = self.data[8:] # 2 00856 # eData = self.data[0:36] # 4*9 00857 # self.data = self.data[36: ] 00858 # 00859 # out = unpack(b'i8f', eData) # 9 00860 # (grid,fd1,sx1,sy1,txy1, 00861 # fd2,sx2,sy2,txy2) = out 00862 # 00863 # for nodeID in xrange(nNodes): #nodes pts 00864 # eData = self.data[0:36] # 4*9 00865 # self.data = self.data[36: ] 00866 # out = unpack(b'i8f', eData) 00867 # (grid,fd1,sx1,sy1,txy1, 00868 # fd2,sx2,sy2,txy2) = out 00869 # ### 00870 # ### 00871 # ### 00872 # ### 00873 # else: 00874 # raise NotImplementedError('invalid numWide') 00875