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