pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oes_compositePlates.py
Go to the documentation of this file.
00001 ## GNU Lesser General Public License
00002 ## 
00003 ## Program pyNastran - a python interface to NASTRAN files
00004 ## Copyright (C) 2011-2012  Steven Doyle, Al Danial
00005 ## 
00006 ## Authors and copyright holders of pyNastran
00007 ## Steven Doyle <mesheb82@gmail.com>
00008 ## Al Danial    <al.danial@gmail.com>
00009 ## 
00010 ## This file is part of pyNastran.
00011 ## 
00012 ## pyNastran is free software: you can redistribute it and/or modify
00013 ## it under the terms of the GNU Lesser General Public License as published by
00014 ## the Free Software Foundation, either version 3 of the License, or
00015 ## (at your option) any later version.
00016 ## 
00017 ## pyNastran is distributed in the hope that it will be useful,
00018 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 ## GNU General Public License for more details.
00021 ## 
00022 ## You should have received a copy of the GNU Lesser General Public License
00023 ## along with pyNastran.  If not, see <http://www.gnu.org/licenses/>.
00024 ## 
00025 
00026 from __future__ import division, print_function
00027 
00028 import sys
00029 
00030 from .oes_objects import stressObject, strainObject
00031 
00032 
00033 class CompositePlateStressObject(stressObject):
00034     """
00035     # sCode = 0
00036                     S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )
00037     ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      MAX
00038       ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        SHEAR
00039 
00040     """
00041     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00042         stressObject.__init__(self,dataCode,iSubcase)
00043         self.eType  = {}
00044 
00045         self.code = [self.formatCode,self.sortCode,self.sCode]
00046         self.o11    = {}
00047         self.o22    = {}
00048         self.t12    = {}
00049         self.t1z    = {}
00050         self.t2z    = {}
00051         self.angle  = {}
00052         self.majorP = {}
00053         self.minorP = {}
00054         #self.fiberCurvature = {}
00055         self.ovmShear       = {}
00056         #print "self.dataCode = ",self.dataCode
00057         #if self.isVonMisesStress():
00058         if self.code == [1,0,0]:
00059             assert self.isVonMises()==False,'isVonMises=%s' %(self.isVonMises())
00060             #self.isVonMises      = True
00061         else:
00062             raise InvalidCodeError('compositePlateStress - get the format/sort/stressCode=%s' %(self.code))
00063         ###
00064 
00065         self.dt = dt
00066         if isSort1:
00067             if dt is not None:
00068                 self.add = self.addSort1
00069                 self.addNewEid = self.addNewEidSort1
00070             ###
00071         else:
00072             assert dt is not None
00073             self.add = self.addSort2
00074             self.addNewEid = self.addNewEidSort2
00075         ###
00076 
00077     def addF06Data(self,data,transient,eType):
00078         """
00079                        S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )
00080         ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      MAX
00081           ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        SHEAR
00082             151    1  -1.02406E+04  4.18348E+05  4.14359E+02   -8.62021E+00  1.86352E+04   89.94  4.18348E+05 -1.02410E+04  2.14295E+05
00083         """
00084         if transient is None:
00085             #for line in data:
00086                 #print line
00087             #sys.exit()
00088             for line in data:
00089                 #print line
00090                 if eType=='CQUAD4':
00091                     (eid,iLayer,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovmShear) = line
00092                     #if nid=='CEN/4': nid='C'
00093                     if eid not in self.eType:
00094                         self.eType[eid] = 'CQUAD4'
00095                         self.o11[eid]    = [o11]
00096                         self.o22[eid]    = [o22]
00097                         self.t12[eid]    = [t12]
00098                         self.t1z[eid]    = [t1z]
00099                         self.t2z[eid]    = [t2z]
00100                         self.angle[eid]  = [angle]
00101                         self.majorP[eid] = [majorP]
00102                         self.minorP[eid] = [minorP]
00103                         self.ovmShear[eid] = [ovmShear]
00104                     else:
00105                         self.o11[eid].append(o11)
00106                         self.o22[eid].append(o22)
00107                         self.t12[eid].append(t12)
00108                         self.t1z[eid].append(t1z)
00109                         self.t2z[eid].append(t2z)
00110                         self.angle[eid].append(angle)
00111                         self.majorP[eid].append(majorP)
00112                         self.minorP[eid].append(minorP)
00113                         self.ovmShear[eid].append(ovmShear)
00114                 else:
00115                     raise NotImplementedError('line=%s not supported...' %(line))
00116             return
00117         #for line in data:
00118             #print line
00119         raise NotImplementedError('transient results not supported')
00120 
00121     def deleteTransient(self,dt):
00122         del self.o11[dt]
00123         del self.o22[dt]
00124         del self.t12[dt]
00125         del self.t1z[dt]
00126         del self.t2z[dt]
00127         del self.angle[dt]
00128         del self.majorP[dt]
00129         del self.minorP[dt]
00130         del self.ovmShear[dt]
00131 
00132     def getTransients(self):
00133         k = self.o11.keys()
00134         k.sort()
00135         return k
00136 
00137     def addNewTransient(self,dt):
00138         """
00139         initializes the transient variables
00140         """
00141         #self.fiberDistance[dt] = {}
00142         self.o11[dt]    = {}
00143         self.o22[dt]    = {}
00144         self.t12[dt]    = {}
00145         self.t1z[dt]    = {}
00146         self.t2z[dt]    = {}
00147         self.angle[dt]  = {}
00148         self.majorP[dt] = {}
00149         self.minorP[dt] = {}
00150         self.ovmShear[dt] = {}
00151 
00152     def addNewEid(self,eType,dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm):
00153         """all points are located at the centroid"""
00154         #print "Composite Plate Strain add..."
00155         msg = "eid=%s eType=%s o11=%g o22=%g t12=%g t1z=%g t2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,eType,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00156         if eid in self.o11:
00157             return self.add(dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00158         assert eid not in self.o11,msg+'\n  o11=%s eType=%s code=%s' %(self.o11[eid],self.eType[eid],self.dataCode)
00159 
00160         self.eType[eid]  = eType
00161         self.o11[eid]    = [o11]
00162         self.o22[eid]    = [o22]
00163         self.t12[eid]    = [t12]
00164         self.t1z[eid]    = [t1z]
00165         self.t2z[eid]    = [t2z]
00166         self.angle[eid]  = [angle]
00167         self.majorP[eid] = [majorP]
00168         self.minorP[eid] = [minorP]
00169         self.ovmShear[eid]    = [ovm]
00170         #print msg
00171         #if nodeID==0: raise Exception(msg)
00172 
00173     def addNewEidSort1(self,eType,dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm):
00174         """all points are located at the centroid"""
00175         #print "Composite Plate Strain add..."
00176 
00177         if dt not in self.o11:
00178             self.addNewTransient(dt)
00179         if eid in self.o11[dt]:
00180             return self.add(dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00181 
00182         assert eid not in self.o11[dt]
00183         self.eType[eid]  = eType
00184         self.o11[dt][eid]    = [o11]
00185         self.o22[dt][eid]    = [o22]
00186         self.t12[dt][eid]    = [t12]
00187         self.t1z[dt][eid]    = [t1z]
00188         self.t2z[dt][eid]    = [t2z]
00189         self.angle[dt][eid]  = [angle]
00190         self.majorP[dt][eid] = [majorP]
00191         self.minorP[dt][eid] = [minorP]
00192         self.ovmShear[dt][eid]    = [ovm]
00193         msg = "eid=%s o11=%g o22=%g t12=%g t1z=%g t2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00194         #print msg
00195         #if nodeID==0: raise Exception(msg)
00196 
00197     def add(self,dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm):
00198         #print "***add"
00199         msg = "eid=%s o11=%g o22=%g t12=%g t1z=%g t2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00200         #print msg
00201         #print self.o11
00202         self.o11[eid].append(o11)
00203         self.o22[eid].append(o22)
00204         self.t12[eid].append(t12)
00205         self.t1z[eid].append(t1z)
00206         self.t2z[eid].append(t2z)
00207         self.angle[eid].append(angle)
00208         self.majorP[eid].append(majorP)
00209         self.minorP[eid].append(minorP)
00210         self.ovmShear[eid].append(ovm)
00211         #if nodeID==0: raise Exception(msg)
00212 
00213     def addSort1(self,dt,eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm):
00214         #print "***add"
00215         msg = "eid=%s o11=%g o22=%g t12=%g t1z=%g t2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,o11,o22,t12,t1z,t2z,angle,majorP,minorP,ovm)
00216         #print msg
00217         #print self.o11
00218 
00219         self.o11[dt][eid].append(o11)
00220         self.o22[dt][eid].append(o22)
00221         self.t12[dt][eid].append(t12)
00222         self.t1z[dt][eid].append(t1z)
00223         self.t2z[dt][eid].append(t2z)
00224         self.angle[dt][eid].append(angle)
00225         self.majorP[dt][eid].append(majorP)
00226         self.minorP[dt][eid].append(minorP)
00227         self.ovmShear[dt][eid].append(ovm)
00228         #if nodeID==0: raise Exception(msg)
00229 
00230     def getHeaders(self):
00231         headers = ['o11','o22','t12','t1z','t2z']
00232         if self.isVonMises:
00233             headers.append('oVonMises')
00234         else:
00235             headers.append('maxShear')
00236         return headers
00237 
00238     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00239         if self.nonlinearFactor is not None:
00240             return self.writeF06Transient(header,pageStamp,pageNum,f)
00241 
00242         if self.isVonMises():
00243             von   = 'VON'
00244             mises = 'MISES'
00245         else:
00246             von   = 'MAX'
00247             mises = 'SHEAR'
00248 
00249         words = ['   ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      %s\n' %(von),
00250                  '     ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        %s\n'  %(mises)]
00251 
00252         eTypes = self.eType.values()
00253         if 'CQUAD4' in eTypes or 'QUAD4LC' in eTypes:
00254             quadMsg = header+['                   S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )\n']+words
00255             isQuad = True
00256         else:
00257             quadMsg = []
00258             isQuad = False
00259 
00260         if 'CTRIA3' in eTypes or 'TRIA3LC' in eTypes:
00261             isTri = True
00262             triMsg = header+['                   S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( T R I A 3 )\n']+words
00263         else:
00264             isTri = False
00265             triMsg = []
00266         ###
00267         for eid,o11s in sorted(self.o11.iteritems()):
00268             out = ''
00269             eType = self.eType[eid]
00270             for iLayer in xrange(len(o11s)):
00271                 o11 = self.o11[eid][iLayer]
00272                 o22 = self.o22[eid][iLayer]
00273                 t12 = self.t12[eid][iLayer]
00274                 t1z = self.t1z[eid][iLayer]
00275                 t2z = self.t2z[eid][iLayer]
00276 
00277                 angle = self.angle[eid][iLayer]
00278                 major = self.majorP[eid][iLayer]
00279                 minor = self.minorP[eid][iLayer]
00280                 ovm   = self.ovmShear[eid][iLayer]
00281                 (vals2,isAllZeros) = self.writeFloats12E([o11,o22,t12,t1z,t2z,major,minor,ovm])
00282                 [o11,o22,t12,t1z,t2z,major,minor,ovm] = vals2
00283                 out += '0 %8s %4s  %12s %12s %12s   %12s %12s  %6.2F %12s %12s %-s\n' %(eid,iLayer+1,o11,o22,t12,t1z,t2z,angle,major,minor,ovm)
00284 
00285             if eType in ['CQUAD4','QUAD4LC']:
00286                 quadMsg.append(out)
00287             elif eType in ['CTRIA3','TRIA3LC']:
00288                 triMsg.append(out)
00289             #else:
00290             #    raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8LC
00291             ###
00292         ###
00293         if isQuad:
00294             quadMsg.append(pageStamp+str(pageNum)+'\n')
00295             pageNum+=1
00296         if isTri:
00297             triMsg.append(pageStamp+str(pageNum)+'\n')
00298             pageNum+=1
00299 
00300         msg = ''.join(quadMsg+triMsg)
00301         return (msg,pageNum)
00302 
00303     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00304         if self.isVonMises():
00305             von   = 'VON'
00306             mises = 'MISES'
00307         else:
00308             von   = 'MAX'
00309             mises = 'SHEAR'
00310 
00311         words = ['   ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      %s\n' %(von),
00312                  '     ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        %s\n'  %(mises)]
00313 
00314         eTypes = self.eType.values()        
00315         if 'CQUAD4' in eTypes or 'QUAD4LC' in eTypes:
00316             quadWords = ['                   S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )\n']+words
00317             isQuad = True
00318         else:
00319             quadWords = []
00320             isQuad = False
00321 
00322         if 'CTRIA3' in eTypes or 'TRIA3LC' in eTypes:
00323             isTri = True
00324             triWords = ['                   S T R E S S E S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( T R I A 3 )\n']+words
00325         else:
00326             isTri = False
00327             triWords = []
00328         ###
00329         
00330         msg = []
00331         for dt,O11s in sorted(self.o11.iteritems()):
00332             quadMsg = []
00333             triMsg = []
00334             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00335             if isQuad:
00336                 quadMsg = header + quadWords
00337             if isTri:
00338                 triMsg = header + triWords
00339 
00340             for eid,o11s in sorted(O11s.iteritems()):
00341                 out = ''
00342                 eType = self.eType[eid]
00343                 for iLayer in xrange(len(o11s)):
00344                     o11 = self.o11[dt][eid][iLayer]
00345                     o22 = self.o22[dt][eid][iLayer]
00346                     t12 = self.t12[dt][eid][iLayer]
00347                     t1z = self.t1z[dt][eid][iLayer]
00348                     t2z = self.t2z[dt][eid][iLayer]
00349 
00350                     angle = self.angle[dt][eid][iLayer]
00351                     major = self.majorP[dt][eid][iLayer]
00352                     minor = self.minorP[dt][eid][iLayer]
00353                     ovm   = self.ovmShear[dt][eid][iLayer]
00354                     (vals2,isAllZeros) = self.writeFloats12E([o11,o22,t12,t1z,t2z,major,minor,ovm])
00355                     [o11,o22,t12,t1z,t2z,major,minor,ovm] = vals2
00356                     out += '0 %8s %4s  %12s %12s %12s   %12s %12s  %6.2F %12s %12s %-s\n' %(eid,iLayer+1,o11,o22,t12,t1z,t2z,angle,major,minor,ovm)
00357 
00358                 if eType in ['CQUAD4','QUAD4LC']:
00359                     quadMsg.append(out)
00360                 elif eType in ['CTRIA3','TRIA3LC']:
00361                     triMsg.append(out)
00362                 #else:
00363                 #    raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8LC
00364                 ###
00365             ###
00366             if isQuad:
00367                 quadMsg.append(pageStamp+str(pageNum)+'\n')
00368                 pageNum+=1
00369             if isTri:
00370                 triMsg.append(pageStamp+str(pageNum)+'\n')
00371                 pageNum+=1
00372             ###
00373             msg += quadMsg+triMsg
00374         ###
00375         return (''.join(msg),pageNum-1)
00376 
00377     def __repr__(self):
00378         return self.writeF06(['','',''],'PAGE ',1)[0]
00379         if self.nonlinearFactor is not None:
00380             return self.__reprTransient__()
00381 
00382         msg = '---COMPOSITE PLATE STRESS---\n'
00383         msg += '%-6s %8s %8s ' %('EID','eType','iLayer')
00384         headers = self.getHeaders()
00385         for header in headers:
00386             msg += '%10s ' %(header)
00387         msg += '\n'
00388 
00389         for eid,o11s in sorted(self.o11.iteritems()):
00390             eType = self.eType[eid]
00391             for iLayer in xrange(len(o11s)):
00392                 o11 = self.o11[eid][iLayer]
00393                 o22 = self.o22[eid][iLayer]
00394                 t12 = self.t12[eid][iLayer]
00395                 t1z = self.t1z[eid][iLayer]
00396                 t2z = self.t2z[eid][iLayer]
00397 
00398                 angle = self.angle[eid][iLayer]
00399                 major = self.majorP[eid][iLayer]
00400                 minor = self.minorP[eid][iLayer]
00401                 ovm   = self.ovmShear[eid][iLayer]
00402 
00403                 msg += '%-6i %8s %8s ' %(eid,eType,iLayer+1,)
00404                 vals = [o11,o22,t12,t1z,t2z,ovm]
00405                 for val in vals:
00406                     if abs(val)<1e-6:
00407                         msg += '%10s ' %('0')
00408                     else:
00409                         msg += '%10i ' %(val)
00410                     ###
00411                 msg += '\n'
00412             ###
00413         ###
00414         return msg
00415 
00416     def __reprTransient__(self):
00417         msg = '---COMPOSITE PLATE STRESS---\n'
00418         msg += '%-6s %8s %8s ' %('EID','eType','iLayer')
00419         headers = self.getHeaders()
00420         for header in headers:
00421             msg += '%10s ' %(header)
00422         msg += '\n'
00423 
00424         for dt,O11s in sorted(self.o11.iteritems()):
00425             msg += "dt = %s\n" %(dt)
00426             for eid,o11s in sorted(O11s.iteritems()):
00427                 eType = self.eType[eid]
00428                 for iLayer in xrange(len(o11s)):
00429                     o11 = self.o11[dt][eid][iLayer]
00430                     o22 = self.o22[dt][eid][iLayer]
00431                     t12 = self.t12[dt][eid][iLayer]
00432                     t1z = self.t1z[dt][eid][iLayer]
00433                     t2z = self.t2z[dt][eid][iLayer]
00434 
00435                     angle = self.angle[dt][eid][iLayer]
00436                     major = self.majorP[dt][eid][iLayer]
00437                     minor = self.minorP[dt][eid][iLayer]
00438                     ovm   = self.ovmShear[dt][eid][iLayer]
00439 
00440                     msg += '%-6i %8s %8s ' %(eid,eType,iLayer+1,)
00441                     vals = [o11,o22,t12,t1z,t2z,ovm]
00442                     for val in vals:
00443                         if abs(val)<1e-6:
00444                             msg += '%10s ' %('0')
00445                         else:
00446                             msg += '%10i ' %(val)
00447                         ###
00448                     msg += '\n'
00449                 ###
00450         ###
00451         return msg
00452 
00453 class CompositePlateStrainObject(strainObject):
00454     """
00455     ???
00456     ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      MAX
00457       ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        SHEAR
00458     """
00459     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00460         strainObject.__init__(self,dataCode,iSubcase)
00461 
00462         self.eType  = {}
00463         self.code = [self.formatCode,self.sortCode,self.sCode]
00464         self.e11    = {}
00465         self.e22    = {}
00466         self.e12    = {}
00467         self.e1z    = {}
00468         self.e2z    = {}
00469         self.angle  = {}
00470         self.majorP = {}
00471         self.minorP = {}
00472         
00473         if self.code == [1,0,14]:
00474             self.evmShear   = {}
00475             assert self.isVonMises()==False
00476         else:
00477             raise InvalidCodeError('compositePlateStrain - get the format/sort/stressCode=%s' %(self.code))
00478         ###
00479 
00480         self.dt = dt
00481         if isSort1:
00482             if dt is not None:
00483                 self.add = self.addSort1
00484                 self.addNewEid = self.addNewEidSort1
00485             ###
00486         else:
00487             assert dt is not None
00488             self.add = self.addSort2
00489             self.addNewEid = self.addNewEidSort2
00490         ###
00491 
00492     def deleteTransient(self,dt):
00493         del self.e11[dt]
00494         del self.e22[dt]
00495         del self.e12[dt]
00496         del self.e1z[dt]
00497         del self.e2z[dt]
00498         del self.angle[dt]
00499         del self.majorP[dt]
00500         del self.minorP[dt]
00501         del self.evmShear[dt]
00502 
00503     def getTransients(self):
00504         k = self.e11.keys()
00505         k.sort()
00506         return k
00507 
00508     def addNewTransient(self,dt):
00509         """
00510         initializes the transient variables
00511         """
00512         #self.fiberDistance[dt] = {}
00513         self.e11[dt]    = {}
00514         self.e22[dt]    = {}
00515         self.e12[dt]    = {}
00516         self.e1z[dt]    = {}
00517         self.e2z[dt]    = {}
00518         self.angle[dt]  = {}
00519         self.majorP[dt] = {}
00520         self.minorP[dt] = {}
00521         self.evmShear[dt] = {}
00522 
00523     def addNewEid(self,eType,dt,eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm):
00524         """all points are located at the centroid"""
00525         #print "Composite Plate Strain add..."
00526         if eid in self.e11:
00527             return self.add(dt,eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm)
00528         assert eid not in self.e11
00529         assert isinstance(eid,int)
00530         self.eType[eid]  = eType
00531         self.e11[eid]    = [e11]
00532         self.e22[eid]    = [e22]
00533         self.e12[eid]    = [e12]
00534         self.e1z[eid]    = [e1z]
00535         self.e2z[eid]    = [e2z]
00536         self.angle[eid]  = [angle]
00537         self.majorP[eid] = [majorP]
00538         self.minorP[eid] = [minorP]
00539         self.evmShear[eid] = [evm]
00540         msg = "eid=%s e11=%g e22=%g e12=%g e1z=%g e2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm)
00541         #print msg
00542         #if nodeID==0: raise Exception(msg)
00543 
00544     def addNewEidSort1(self,eType,dt,eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm):
00545         """all points are located at the centroid"""
00546         #print "Composite Plate Strain add..."
00547         
00548         if dt not in self.e11:
00549             self.addNewTransient(dt)
00550         assert eid not in self.e11[dt]
00551         assert isinstance(eid,int)
00552 
00553         self.eType[eid]  = eType
00554         self.e11[dt][eid]    = [e11]
00555         self.e22[dt][eid]    = [e22]
00556         self.e12[dt][eid]    = [e12]
00557         self.e1z[dt][eid]    = [e1z]
00558         self.e2z[dt][eid]    = [e2z]
00559         self.angle[dt][eid]  = [angle]
00560         self.majorP[dt][eid] = [majorP]
00561         self.minorP[dt][eid] = [minorP]
00562         self.evmShear[dt][eid] = [evm]
00563         msg = "eid=%s e11=%g e22=%g e12=%g e1z=%g e2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm)
00564         #print msg
00565         #if nodeID==0: raise Exception(msg)
00566 
00567     def add(self,dt,eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm):
00568         #print "***add"
00569         msg = "eid=%s e11=%g e22=%g e12=%g e1z=%g e2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm)
00570         #print msg
00571         #print self.o11
00572         self.e11[eid].append(e11)
00573         self.e22[eid].append(e22)
00574         self.e12[eid].append(e12)
00575         self.e1z[eid].append(e1z)
00576         self.e2z[eid].append(e2z)
00577         self.angle[eid].append(angle)
00578         self.majorP[eid].append(majorP)
00579         self.minorP[eid].append(minorP)
00580         self.evmShear[eid].append(evm)
00581         #if nodeID==0: raise Exception(msg)
00582 
00583     def addSort1(self,dt,eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm):
00584         #print "***add"
00585         msg = "eid=%s e11=%g e22=%g e12=%g e1z=%g e2z=%g \nangle=%g major=%g minor=%g vm=%g" %(eid,e11,e22,e12,e1z,e2z,angle,majorP,minorP,evm)
00586         #print msg
00587         #print self.o11
00588         self.e11[dt][eid].append(e11)
00589         self.e22[dt][eid].append(e22)
00590         self.e12[dt][eid].append(e12)
00591         self.e1z[dt][eid].append(e1z)
00592         self.e2z[dt][eid].append(e2z)
00593         self.angle[dt][eid].append(angle)
00594         self.majorP[dt][eid].append(majorP)
00595         self.minorP[dt][eid].append(minorP)
00596         self.evmShear[dt][eid].append(evm)
00597         #if nodeID==0: raise Exception(msg)
00598 
00599     def getHeaders(self):
00600         headers = ['e11','e22','e12','e1z','e2z']
00601         if self.isVonMises:
00602             headers.append('eVonMises')
00603         else:
00604             headers.append('maxShear')
00605         return headers
00606 
00607     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00608         if self.nonlinearFactor is not None:
00609             return self.writeF06Transient(header,pageStamp,pageNum,f)
00610 
00611         if self.isVonMises():
00612             von   = 'VON'
00613             mises = 'MISES'
00614         else:
00615             von   = 'MAX'
00616             mises = 'SHEAR'
00617 
00618         words = ['   ELEMENT  PLY   STRAINS IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR   STRAINS  PRINCIPAL  STRAINS (ZERO SHEAR)      %s\n' %(von),
00619                  '     ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        %s\n'  %(mises)]
00620 
00621         eTypes = self.eType.values()
00622         if 'CQUAD4' in eTypes or 'QUAD4LC' in eTypes:
00623             quadMsg = header+['                     S T R A I N S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )\n']+words
00624             isQuad = True
00625         else:
00626             quadMsg = []
00627             isQuad = False
00628 
00629         if 'CTRIA3' in eTypes or 'TRIA3LC' in eTypes:
00630             isTri = True
00631             triMsg = header+['                     S T R A I N S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( T R I A 3 )\n']+words
00632         else:
00633             isTri = False
00634             triMsg = []
00635         ###
00636         for eid,e11s in sorted(self.e11.iteritems()):
00637             out = ''
00638             eType = self.eType[eid]
00639             for iLayer in xrange(len(e11s)):
00640                 e11 = self.e11[eid][iLayer]
00641                 e22 = self.e22[eid][iLayer]
00642                 e12 = self.e12[eid][iLayer]
00643                 e1z = self.e1z[eid][iLayer]
00644                 e2z = self.e2z[eid][iLayer]
00645 
00646                 angle = self.angle[eid][iLayer]
00647                 major = self.majorP[eid][iLayer]
00648                 minor = self.minorP[eid][iLayer]
00649                 evm   = self.evmShear[eid][iLayer]
00650                 
00651                 (vals2,isAllZeros) = self.writeFloats12E([e11,e22,e12,e1z,e2z,major,minor,evm])
00652                 [e11,e22,e12,e1z,e2z,major,minor,evm] = vals2
00653                 out += '0 %8s %4s  %12s %12s %12s   %12s %12s  %6.2F %12s %12s %-s\n' %(eid,iLayer+1,e11,e22,e12,e1z,e2z,angle,major,minor,evm)
00654 
00655             if eType in ['CQUAD4','QUAD4LC']:
00656                 quadMsg.append(out)
00657             elif eType in ['CTRIA3','TRIA3LC']:
00658                 triMsg.append(out)
00659             #else:
00660             #    raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8LC
00661             ###
00662         ###
00663         if isQuad:
00664             quadMsg.append(pageStamp+str(pageNum)+'\n')
00665             pageNum+=1
00666         if isTri:
00667             triMsg.append(pageStamp+str(pageNum)+'\n')
00668             pageNum+=1
00669 
00670         msg = ''.join(quadMsg+triMsg)
00671         return (msg,pageNum)
00672 
00673     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00674         if self.isVonMises():
00675             von   = 'VON'
00676             mises = 'MISES'
00677         else:
00678             von   = 'MAX'
00679             mises = 'SHEAR'
00680 
00681         words = ['   ELEMENT  PLY  STRESSES IN FIBER AND MATRIX DIRECTIONS    INTER-LAMINAR  STRESSES  PRINCIPAL STRESSES (ZERO SHEAR)      %s\n' %(von),
00682                  '     ID      ID    NORMAL-1     NORMAL-2     SHEAR-12     SHEAR XZ-MAT  SHEAR YZ-MAT  ANGLE    MAJOR        MINOR        %s\n'  %(mises)]
00683 
00684         eTypes = self.eType.values()        
00685         if 'CQUAD4' in eTypes or 'QUAD4LC' in eTypes:
00686             quadWords = ['                     S T R A I N S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( Q U A D 4 )\n']+words
00687             isQuad = True
00688         else:
00689             quadWords = []
00690             isQuad = False
00691 
00692         if 'CTRIA3' in eTypes or 'TRIA3LC' in eTypes:
00693             isTri = True
00694             triWords = ['                     S T R A I N S   I N   L A Y E R E D   C O M P O S I T E   E L E M E N T S   ( T R I A 3 )\n']+words
00695         else:
00696             isTri = False
00697             triWords = []
00698         ###
00699         
00700         msg = []
00701         for dt,e11s in sorted(self.e11.iteritems()):
00702             quadMsg = []
00703             triMsg = []
00704             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00705             if isQuad:
00706                 quadMsg = header + quadWords
00707             if isTri:
00708                 triMsg = header + triWords
00709 
00710             for eid,e11s in sorted(e11s.iteritems()):
00711                 out = ''
00712                 eType = self.eType[eid]
00713                 for iLayer in xrange(len(e11s)):
00714                     e11 = self.e11[dt][eid][iLayer]
00715                     e22 = self.e22[dt][eid][iLayer]
00716                     e12 = self.e12[dt][eid][iLayer]
00717                     e1z = self.e1z[dt][eid][iLayer]
00718                     e2z = self.e2z[dt][eid][iLayer]
00719 
00720                     angle = self.angle[dt][eid][iLayer]
00721                     major = self.majorP[dt][eid][iLayer]
00722                     minor = self.minorP[dt][eid][iLayer]
00723                     evm   = self.evmShear[dt][eid][iLayer]
00724                     (vals2,isAllZeros) = self.writeFloats12E([e11,e22,e12,e1z,e2z,major,minor,evm])
00725                     [e11,e22,e12,e1z,e2z,major,minor,evm] = vals2
00726                     out += '0 %8s %4s  %12s %12s %12s   %12s %12s  %6.2F %12s %12s %-s\n' %(eid,iLayer+1,e11,e22,e12,e1z,e2z,angle,major,minor,evm)
00727 
00728                 if eType in ['CQUAD4','QUAD4LC']:
00729                     quadMsg.append(out)
00730                 elif eType in ['CTRIA3','TRIA3LC']:
00731                     triMsg.append(out)
00732                 else:
00733                     raise NotImplementedError('eType = |%r|' %(eType))
00734                 ###
00735             ###
00736             if isQuad:
00737                 quadMsg.append(pageStamp+str(pageNum)+'\n')
00738                 pageNum+=1
00739             if isTri:
00740                 triMsg.append(pageStamp+str(pageNum)+'\n')
00741                 pageNum+=1
00742             ###
00743             msg += quadMsg+triMsg
00744         ###
00745         return (''.join(msg),pageNum-1)
00746 
00747     def __repr__(self):
00748         return self.writeF06(['','',''],'PAGE ',1)[0]
00749         if self.nonlinearFactor is not None:
00750             return self.__reprTransient__()
00751 
00752         msg = '---COMPOSITE PLATE STAIN---\n'
00753         msg += '%-6s %8s %8s ' %('EID','eType','iLayer')
00754         headers = self.getHeaders()
00755         for header in headers:
00756             msg += '%10s ' %(header)
00757         msg += '\n'
00758 
00759         for eid,e11s in sorted(self.e11.iteritems()):
00760             eType = self.eType[eid]
00761             for iLayer in xrange(len(e11s)):
00762                 e11 = self.e11[eid][iLayer]
00763                 e22 = self.e22[eid][iLayer]
00764                 e12 = self.e12[eid][iLayer]
00765                 e1z = self.e1z[eid][iLayer]
00766                 e2z = self.e2z[eid][iLayer]
00767 
00768                 angle = self.angle[eid][iLayer]
00769                 major = self.majorP[eid][iLayer]
00770                 minor = self.minorP[eid][iLayer]
00771                 evm   = self.evmShear[eid][iLayer]
00772 
00773                 msg += '%-6i %8s %8s ' %(eid,eType,iLayer+1,)
00774                 vals = [e11,e22,e12,e1z,e2z,evm]
00775                 for val in vals:
00776                     if abs(val)<1e-6:
00777                         msg += '%10s ' %('0')
00778                     else:
00779                         msg += '%10.3g ' %(val)
00780                     ###
00781                 msg += '\n'
00782             ###
00783         ###
00784         return msg
00785 
00786     def __reprTransient__(self):
00787         msg = '---COMPOSITE PLATE STAIN---\n'
00788         headers = self.getHeaders()
00789         msg += '%-6s %8s %8s ' %('EID','eType','iLayer')
00790         for header in headers:
00791             msg += '%10s ' %(header)
00792         msg += '\n'
00793 
00794         for dt,E11s in sorted(self.e11.iteritems()):
00795             msg += '%s = %g\n' %(self.dataCode['name'],dt)
00796             for eid,e11s in sorted(E11s.iteritems()):
00797                 eType = self.eType[eid]
00798                 for iLayer in xrange(len(e11s)):
00799                     e11 = self.e11[dt][eid][iLayer]
00800                     e22 = self.e22[dt][eid][iLayer]
00801                     e12 = self.e12[dt][eid][iLayer]
00802                     e1z = self.e1z[dt][eid][iLayer]
00803                     e2z = self.e2z[dt][eid][iLayer]
00804 
00805                     angle = self.angle[dt][eid][iLayer]
00806                     major = self.majorP[dt][eid][iLayer]
00807                     minor = self.minorP[dt][eid][iLayer]
00808                     evm   = self.evmShear[dt][eid][iLayer]
00809 
00810                     msg += '%-6i %8s %8s ' %(eid,eType,iLayer+1,)
00811                     vals = [e11,e22,e12,e1z,e2z,evm]
00812                     for val in vals:
00813                         if abs(val)<1e-6:
00814                             msg += '%10s ' %('0')
00815                         else:
00816                             msg += '%10.3g ' %(val)
00817                         ###
00818                     msg += '\n'
00819                 ###
00820             ###
00821         ###
00822         return msg
 All Classes Namespaces Files Functions Variables