pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oes_plates.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 import sys
00028 
00029 from .oes_objects import stressObject, strainObject
00030 
00031 
00032 class PlateStressObject(stressObject):
00033     """
00034     ELEMENT      FIBER               STRESSES IN ELEMENT COORD SYSTEM             PRINCIPAL STRESSES (ZERO SHEAR)                 
00035       ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        VON MISES
00036           6    CEN/4  -1.250000E-01  -4.278394E+02  8.021165E+03 -1.550089E+02   -88.9493   8.024007E+03 -4.306823E+02  4.227345E+03
00037                        1.250000E-01   5.406062E+02  1.201854E+04 -4.174177E+01   -89.7916   1.201869E+04  5.404544E+02  5.739119E+03
00038 
00039 
00040                          S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  
00041     ELEMENT              FIBER            STRESSES IN ELEMENT COORD SYSTEM         PRINCIPAL STRESSES (ZERO SHEAR)          MAX  
00042       ID      GRID-ID   DISTANCE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR         SHEAR   
00043           6    CEN/4  -1.250000E-01  -4.278394E+02  8.021165E+03 -1.550089E+02   -88.9493   8.024007E+03 -4.306823E+02  4.227345E+03
00044                        1.250000E-01   5.406062E+02  1.201854E+04 -4.174177E+01   -89.7916   1.201869E+04  5.404544E+02  5.739119E+03
00045     """
00046     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00047         stressObject.__init__(self,dataCode,iSubcase)
00048         self.eType = {}
00049 
00050         #self.appendDataMember('sCodes','sCode')
00051         #print "self.sCode = ",self.sCode
00052         self.code = [self.formatCode,self.sortCode,self.sCode]
00053 
00054         self.fiberCurvature = {}
00055         self.oxx    = {}
00056         self.oyy    = {}
00057         self.txy    = {}
00058         self.angle  = {}
00059         self.majorP = {}
00060         self.minorP = {}
00061         self.ovmShear = {}
00062 
00063         self.dt = dt
00064         if isSort1:
00065             if dt is not None:
00066                 self.add = self.addSort1
00067                 self.addNewEid = self.addNewEidSort1
00068                 self.addNewNode = self.addNewNodeSort1
00069         else:
00070             assert dt is not None
00071             self.add = self.addSort2
00072             self.addNewEid = self.addNewEidSort2
00073             self.addNewNode = self.addNewNodeSort2
00074 
00075 
00076     def addF06Data(self,data,transient):
00077         if transient is None:
00078             eType = data[0][0]
00079             for line in data:
00080                 if eType=='CTRIA3':
00081                     (eType,eid,f1,ox1,oy1,txy1,angle1,o11,o21,ovm1,
00082                                f2,ox2,oy2,txy2,angle2,o12,o22,ovm2) = line
00083                     self.eType[eid] = eType
00084                     self.fiberCurvature[eid] = {'C':[f1,f2]}
00085                     self.oxx[eid]      = {'C':[ox1,ox2]}
00086                     self.oyy[eid]      = {'C':[oy1,oy2]}
00087                     self.txy[eid]      = {'C':[txy1,txy2]}
00088                     self.angle[eid]    = {'C':[angle1,angle2]}
00089                     self.majorP[eid]   = {'C':[o11,o12]}
00090                     self.minorP[eid]   = {'C':[o21,o22]}
00091                     self.ovmShear[eid] = {'C':[ovm1,ovm2]}
00092                 elif eType=='CQUAD4':
00093                     #assert len(line)==19,'len(line)=%s' %(len(line))
00094                     if len(line)==19: # Centroid - bilinear
00095                         (eType,eid,nid,f1,ox1,oy1,txy1,angle1,o11,o21,ovm1,
00096                                        f2,ox2,oy2,txy2,angle2,o12,o22,ovm2) = line
00097                         if nid=='CEN/4': nid='C'
00098                         self.eType[eid] = eType
00099                         self.fiberCurvature[eid] = {nid:[f1,f2]}
00100                         self.oxx[eid]      = {nid:[ox1,ox2]}
00101                         self.oyy[eid]      = {nid:[oy1,oy2]}
00102                         self.txy[eid]      = {nid:[txy1,txy2]}
00103                         self.angle[eid]    = {nid:[angle1,angle2]}
00104                         self.majorP[eid]   = {nid:[o11,o12]}
00105                         self.minorP[eid]   = {nid:[o21,o22]}
00106                         self.ovmShear[eid] = {nid:[ovm1,ovm2]}
00107                     elif len(line)==18: # Centroid
00108                         (eType,eid,f1,ox1,oy1,txy1,angle1,o11,o21,ovm1,
00109                                    f2,ox2,oy2,txy2,angle2,o12,o22,ovm2) = line
00110                         nid='C'
00111                         self.eType[eid] = eType
00112                         self.fiberCurvature[eid] = {nid:[f1,f2]}
00113                         self.oxx[eid]      = {nid:[ox1,ox2]}
00114                         self.oyy[eid]      = {nid:[oy1,oy2]}
00115                         self.txy[eid]      = {nid:[txy1,txy2]}
00116                         self.angle[eid]    = {nid:[angle1,angle2]}
00117                         self.majorP[eid]   = {nid:[o11,o12]}
00118                         self.minorP[eid]   = {nid:[o21,o22]}
00119                         self.ovmShear[eid] = {nid:[ovm1,ovm2]}
00120                     elif len(line)==17: ## Bilinear
00121                         #print line
00122                         (nid,f1,ox1,oy1,txy1,angle1,o11,o21,ovm1,
00123                              f2,ox2,oy2,txy2,angle2,o12,o22,ovm2) = line
00124                         self.fiberCurvature[eid][nid] = [f1,f2]
00125                         self.oxx[eid][nid]      = [ox1,ox2]
00126                         self.oyy[eid][nid]      = [oy1,oy2]
00127                         self.txy[eid][nid]      = [txy1,txy2]
00128                         self.angle[eid][nid]    = [angle1,angle2]
00129                         self.majorP[eid][nid]   = [o11,o12]
00130                         self.minorP[eid][nid]   = [o21,o22]
00131                         self.ovmShear[eid][nid] = [ovm1,ovm2]
00132                     else:
00133                         assert len(line)==19,'len(line)=%s' %(len(line))
00134                         raise NotImplementedError()
00135                     ###
00136                 else:
00137                     raise NotImplementedError('line=%s not supported...' %(line))
00138             return
00139         #for line in data:
00140             #print line
00141         raise NotImplementedError('transient results not supported')
00142 
00143     def deleteTransient(self,dt):
00144         #del self.fiberCurvature[dt]
00145         del self.oxx[dt]
00146         del self.oyy[dt]
00147         del self.txy[dt]
00148         del self.angle[dt]
00149         del self.majorP[dt]
00150         del self.minorP[dt]
00151         del self.ovmShear[dt]
00152 
00153     def getTransients(self):
00154         k = self.oxx.keys()
00155         k.sort()
00156         return k
00157     
00158     def addNewTransient(self,dt):
00159         """
00160         initializes the transient variables
00161         """
00162         self.dt = dt
00163         #self.fiberCurvature[dt] = {}
00164         self.oxx[dt]      = {}
00165         self.oyy[dt]      = {}
00166         self.txy[dt]      = {}
00167         self.angle[dt]    = {}
00168         self.majorP[dt]   = {}
00169         self.minorP[dt]   = {}
00170         self.ovmShear[dt] = {}
00171 
00172     def addNewEid(self,eType,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00173         #print "***addNewEid..."
00174         #if eid in self.oxx:
00175             #return self.add(dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00176 
00177         #assert eid not in self.oxx
00178         self.eType[eid] = eType
00179         self.fiberCurvature[eid] = {nodeID: [fd]}
00180         assert isinstance(eid,int)
00181         self.oxx[eid]    = {nodeID: [oxx]}
00182         self.oyy[eid]    = {nodeID: [oyy]}
00183         self.txy[eid]    = {nodeID: [txy]}
00184         self.angle[eid]  = {nodeID: [angle]}
00185         self.majorP[eid] = {nodeID: [majorP]}
00186         self.minorP[eid] = {nodeID: [minorP]}
00187         self.ovmShear[eid] = {nodeID: [ovm]}
00188         msg = "eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00189         #print msg
00190         if nodeID==0: raise Exception(msg)
00191 
00192     def addNewEidSort1(self,eType,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00193         #print "***addNewEidTransient..."
00194         #msg = "dt=%s eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g vm=%g" %(dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00195         msg = "dt=%s eid=%s nodeID=%s fd=%g oxx=%g major=%g vm=%g" %(dt,eid,nodeID,fd,oxx,majorP,ovm)
00196         #print msg
00197         #if eid in self.ovmShear[dt]:
00198         #    return self.add(eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00199 
00200         if dt in self.oxx and eid in self.oxx[dt]:  # SOL200, erase the old result
00201            #nid = nodeID
00202            #msg = "dt=%s eid=%s nodeID=%s fd=%s oxx=%s major=%s vm=%s" %(dt,eid,nodeID,str(self.fiberCurvature[eid][nid]),str(self.oxx[dt][eid][nid]),str(self.majorP[dt][eid][nid]),str(self.ovmShear[dt][eid][nid]))
00203            self.deleteTransient(dt)
00204            self.addNewTransient(dt)
00205         
00206         assert isinstance(eid,int)
00207         self.eType[eid] = eType
00208         if dt not in self.oxx:
00209             self.addNewTransient(dt)
00210         self.fiberCurvature[eid] = {nodeID: [fd]}
00211         self.oxx[dt][eid]      = {nodeID: [oxx]}
00212         self.oyy[dt][eid]      = {nodeID: [oyy]}
00213         self.txy[dt][eid]      = {nodeID: [txy]}
00214         self.angle[dt][eid]    = {nodeID: [angle]}
00215         self.majorP[dt][eid]   = {nodeID: [majorP]}
00216         self.minorP[dt][eid]   = {nodeID: [minorP]}
00217         self.ovmShear[dt][eid] = {nodeID: [ovm]}
00218         #print msg
00219         if nodeID==0: raise Exception(msg)
00220 
00221     def add(self,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00222         #print "***add"
00223         msg = "eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g ovmShear=%g" %(eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00224         #print msg
00225         #print self.oxx
00226         #print self.fiberCurvature
00227         assert isinstance(eid,int)
00228         self.fiberCurvature[eid][nodeID].append(fd)
00229         self.oxx[eid][nodeID].append(oxx)
00230         self.oyy[eid][nodeID].append(oyy)
00231         self.txy[eid][nodeID].append(txy)
00232         self.angle[eid][nodeID].append(angle)
00233         self.majorP[eid][nodeID].append(majorP)
00234         self.minorP[eid][nodeID].append(minorP)
00235         self.ovmShear[eid][nodeID].append(ovm)
00236         if nodeID==0: raise Exception(msg)
00237 
00238     def addSort1(self,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00239         #print "***addTransient"
00240         msg = "dt=%s eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g vm=%g" %(dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00241         #print msg
00242         #print self.oxx
00243         #print self.fiberCurvatrure
00244         assert eid is not None
00245         self.fiberCurvature[eid][nodeID].append(fd)
00246         self.oxx[dt][eid][nodeID].append(oxx)
00247         self.oyy[dt][eid][nodeID].append(oyy)
00248         self.txy[dt][eid][nodeID].append(txy)
00249         self.angle[dt][eid][nodeID].append(angle)
00250         self.majorP[dt][eid][nodeID].append(majorP)
00251         self.minorP[dt][eid][nodeID].append(minorP)
00252         self.ovmShear[dt][eid][nodeID].append(ovm)
00253         if nodeID==0: raise Exception(msg)
00254 
00255     def addNewNode(self,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00256         #print "***addNewNode"
00257         assert eid is not None
00258         #assert nodeID not in self.oxx[eid]
00259         self.fiberCurvature[eid][nodeID] = [fd]
00260         self.oxx[eid][nodeID]    = [oxx]
00261         self.oyy[eid][nodeID]    = [oyy]
00262         self.txy[eid][nodeID]    = [txy]
00263         self.angle[eid][nodeID]  = [angle]
00264         self.majorP[eid][nodeID] = [majorP]
00265         self.minorP[eid][nodeID] = [minorP]
00266         self.ovmShear[eid][nodeID]    = [ovm]
00267         msg = "eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g ovmShear=%g" %(eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00268         #print msg
00269         if nodeID==0: raise Exception(msg)
00270 
00271     def addNewNodeSort1(self,dt,eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm):
00272         #print "***addNewNodeTransient"
00273         #print self.oxx
00274         assert eid is not None
00275         msg = "eid=%s nodeID=%s fd=%g oxx=%g oyy=%g \ntxy=%g angle=%g major=%g minor=%g ovmShear=%g" %(eid,nodeID,fd,oxx,oyy,txy,angle,majorP,minorP,ovm)
00276         #print msg
00277         #assert nodeID not in self.oxx[dt][eid]
00278         self.fiberCurvature[eid][nodeID] = [fd]
00279         self.oxx[dt][eid][nodeID]    = [oxx]
00280         self.oyy[dt][eid][nodeID]    = [oyy]
00281         self.txy[dt][eid][nodeID]    = [txy]
00282         self.angle[dt][eid][nodeID]  = [angle]
00283         self.majorP[dt][eid][nodeID] = [majorP]
00284         self.minorP[dt][eid][nodeID] = [minorP]
00285         self.ovmShear[dt][eid][nodeID]    = [ovm]
00286         if nodeID==0: raise Exception(msg)
00287 
00288     def getHeaders(self):
00289         if self.isFiberDistance():
00290             headers = ['fiberDist']
00291         else:
00292             headers = ['curvature']
00293         headers += ['oxx','oyy','txy','majorP','minorP']
00294         if self.isVonMises():
00295             headers.append('oVonMises')
00296         else:
00297             headers.append('maxShear')
00298         return headers
00299 
00300     def __reprTransient__(self):
00301         msg = '---ISOTROPIC PLATE STRESS---\n'
00302         headers = self.getHeaders()
00303         msg += '%-6s %6s %8s %7s ' %('EID','eType','nodeID','iLayer')
00304         for header in headers:
00305             msg += '%10s ' %(header)
00306         msg += '\n'
00307 
00308         #print self.oxx.keys()
00309         for dt,oxxs in sorted(self.oxx.iteritems()):
00310             msg += '%s = %g\n' %(self.dataCode['name'],dt)
00311             for eid,oxxNodes in sorted(oxxs.iteritems()):
00312                 eType = self.eType[eid]
00313                 for nid in sorted(oxxNodes):
00314                     for iLayer in xrange(len(self.oxx[dt][eid][nid])):
00315                         fd    = self.fiberCurvature[eid][nid][iLayer]
00316                         oxx   = self.oxx[   dt][eid][nid][iLayer]
00317                         oyy   = self.oyy[   dt][eid][nid][iLayer]
00318                         txy   = self.txy[   dt][eid][nid][iLayer]
00319                        #angle = self.angle[ dt][eid][nid][iLayer]
00320                         major = self.majorP[dt][eid][nid][iLayer]
00321                         minor = self.minorP[dt][eid][nid][iLayer]
00322                         ovm = self.ovmShear[dt][eid][nid][iLayer]
00323 
00324                         msg += '%-6i %6s %8s %7s %10g ' %(eid,eType,nid,iLayer+1,fd)
00325                         vals = [oxx,oyy,txy,major,minor,ovm]
00326                         for val in vals:
00327                             if abs(val)<1e-6:
00328                                 msg += '%10s ' %('0')
00329                             else:
00330                                 try:
00331                                     msg += '%10i ' %(int(val))
00332                                 except:
00333                                     print("bad val = %s" %(val))
00334                                     raise
00335                             ###
00336                         msg += '\n'
00337                     ###
00338                 ###
00339             ###
00340         ###
00341         return msg
00342 
00343     def writeMatlab(self,name,iSubcase,f=None,isMagPhase=False):
00344         if self.nonlinearFactor is not None:
00345             return self.writeMatlabTransient(name,iSubcase,f,isMagPhase)
00346         
00347         #if self.isVonMises():
00348         #    vonMises = 'vonMises'
00349         #else:
00350         #    vonMises = 'maxShear'
00351 
00352         #if self.isFiberDistance():
00353         #    fiberCurvature = 'fiberDistance'
00354         #else:
00355         #    fiberCurvature = 'fiberCurvature'
00356 
00357         triMsg   = None
00358         tri6Msg  = None
00359         trirMsg  = None
00360         quadMsg  = None
00361         quad8Msg = None
00362         quadrMsg = None
00363         eTypes = self.eType.values()
00364         if 'CQUAD4' in eTypes:
00365             qkey = eTypes.index('CQUAD4')
00366             kkey = self.eType.keys()[qkey]
00367             ekey = self.oxx[kkey].keys()
00368             isBilinear=True
00369             quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  \n \n']+quadMsgTemp
00370             if len(ekey)==1:
00371                 isBilinear=False
00372                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )\n']+triMsgTemp
00373 
00374         if 'CQUAD8' in eTypes:
00375             quad8Msg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 8 )\n']+triMsgTemp
00376 
00377         if 'CQUADR' in eTypes:
00378             qkey = eTypes.index('CQUADR')
00379             kkey = self.eType.keys()[qkey]
00380             ekey = self.oxx[kkey].keys()
00381             isBilinear=True
00382             quadrMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )        OPTION = BILIN  \n \n']+quadMsgTemp
00383             if len(ekey)==1:
00384                 isBilinear=False
00385                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )\n']+triMsgTemp
00386 
00387         if 'CTRIA3' in eTypes:
00388             triMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 3 )\n']+triMsgTemp
00389 
00390         if 'CTRIA6' in eTypes:
00391             tri6Msg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 6 )\n']+triMsgTemp
00392 
00393         if 'CTRIAR' in eTypes:
00394             trirMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A R )\n']+triMsgTemp
00395 
00396         msgPacks = {'CTRIA3':triMsg,
00397                     'CTRIA6':tri6Msg,
00398                     'CTRIAR':trirMsg,
00399                     'CQUAD4':quadMsg,
00400                     'CQUAD8':quad8Msg,
00401                     'CQUADR':quadrMsg,}
00402 
00403         validTypes = ['CTRIA3','CTRIA6','CTRIAR','CQUAD4','CQUAD8','CQUADR']
00404         (typesOut,orderedETypes) = self.getOrderedETypes(validTypes)
00405 
00406         msg = []
00407         for eType in typesOut:
00408             eids = orderedETypes[eType]
00409             if eids:
00410                 eids.sort()
00411                 msgPack = msgPacks[eType]
00412 
00413                 msg += header+msgPack
00414                 if eType in ['CQUAD4']:
00415                     if isBilinear:
00416                         for eid in eids:
00417                             out = self.writeMatlab_Quad4_Bilinear(eid,4)
00418                             msg.append(out)
00419                     else:
00420                         for eid in eids:
00421                             out = self.writeMatlab_Tri3(eid)
00422                             msg.append(out)
00423 
00424                 elif eType in ['CTRIA3']:
00425                     a = 'fem.plateStress(%i).tri3.elementIDs = %s\n' %(iSubcase,eids)
00426                     b = 'fem.plateStress(%i).tri3.oxx = [' %(iSubcase)
00427                     for eid in eids:
00428                         out = self.writeMatlab_Tri3(eid)
00429                         msg.append(out)
00430                 elif eType in ['CQUAD8']:
00431                     for eid in eids:
00432                         out = self.writeMatlab_Quad4_Bilinear(eid,5)
00433                         msg.append(out)
00434                 elif eType in ['CTRIAR','CTRIA6']:
00435                     for eid in eids:
00436                         out = self.writeMatlab_Quad4_Bilinear(eid,3)
00437                         msg.append(out)
00438                 else:
00439                     raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8, CTRIA6
00440                 ###
00441                 f.write(''.join(msg))
00442                 msg = []
00443             ###
00444         ###
00445 
00446     def writeMatlab_Tri3(self,eid):
00447         msg = ''
00448         oxxNodes = self.oxx[eid].keys()
00449         for nid in sorted(oxxNodes):
00450             for iLayer in xrange(len(self.oxx[eid][nid])):
00451                 fd    = self.fiberCurvature[eid][nid][iLayer]
00452                 oxx   = self.oxx[eid][nid][iLayer]
00453                 oyy   = self.oyy[eid][nid][iLayer]
00454                 txy   = self.txy[eid][nid][iLayer]
00455                 angle = self.angle[eid][nid][iLayer]
00456                 major = self.majorP[eid][nid][iLayer]
00457                 minor = self.minorP[eid][nid][iLayer]
00458                 ovm = self.ovmShear[eid][nid][iLayer]
00459                 ([fd,oxx,oyy,txy,major,minor,ovm],isAllZeros) = self.writeFloats13E([fd,oxx,oyy,txy,major,minor,ovm])
00460                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
00461 
00462                 if iLayer==0:
00463                     msg += '0  %6i   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %(eid,fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00464                 else:
00465                     msg += '   %6s   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %('', fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00466                 ###
00467             ###
00468         ###
00469         return msg
00470 
00471     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00472         if self.nonlinearFactor is not None:
00473             return self.writeF06Transient(header,pageStamp,pageNum)
00474 
00475         if self.isVonMises():
00476             vonMises = 'VON MISES'
00477         else:
00478             vonMises = 'MAX SHEAR'
00479 
00480         if self.isFiberDistance():
00481             quadMsgTemp = ['    ELEMENT              FIBER            STRESSES IN ELEMENT COORD SYSTEM         PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00482                            '      ID      GRID-ID   DISTANCE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
00483             triMsgTemp = ['  ELEMENT      FIBER               STRESSES IN ELEMENT COORD SYSTEM             PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00484                           '    ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
00485         else:
00486             quadMsgTemp = ['    ELEMENT              FIBER            STRESSES IN ELEMENT COORD SYSTEM         PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00487                            '      ID      GRID-ID  CURVATURE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
00488             triMsgTemp = ['  ELEMENT      FIBER               STRESSES IN ELEMENT COORD SYSTEM             PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00489                           '    ID.      CURVATURE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
00490 
00491         triMsg   = None
00492         tri6Msg  = None
00493         trirMsg  = None
00494         quadMsg  = None
00495         quad8Msg = None
00496         quadrMsg = None
00497         eTypes = self.eType.values()
00498         if 'CQUAD4' in eTypes:
00499             qkey = eTypes.index('CQUAD4')
00500             kkey = self.eType.keys()[qkey]
00501             ekey = self.oxx[kkey].keys()
00502             isBilinear=True
00503             quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  \n \n']+quadMsgTemp
00504             if len(ekey)==1:
00505                 isBilinear=False
00506                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )\n']+triMsgTemp
00507 
00508         if 'CQUAD8' in eTypes:
00509             quad8Msg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 8 )\n']+triMsgTemp
00510 
00511         if 'CQUADR' in eTypes:
00512             qkey = eTypes.index('CQUADR')
00513             kkey = self.eType.keys()[qkey]
00514             ekey = self.oxx[kkey].keys()
00515             isBilinear=True
00516             quadrMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )        OPTION = BILIN  \n \n']+quadMsgTemp
00517             if len(ekey)==1:
00518                 isBilinear=False
00519                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )\n']+triMsgTemp
00520 
00521         if 'CTRIA3' in eTypes:
00522             triMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 3 )\n']+triMsgTemp
00523 
00524         if 'CTRIA6' in eTypes:
00525             tri6Msg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 6 )\n']+triMsgTemp
00526 
00527         if 'CTRIAR' in eTypes:
00528             trirMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A R )\n']+triMsgTemp
00529 
00530         msgPacks = {'CTRIA3':triMsg,
00531                     'CTRIA6':tri6Msg,
00532                     'CTRIAR':trirMsg,
00533                     'CQUAD4':quadMsg,
00534                     'CQUAD8':quad8Msg,
00535                     'CQUADR':quadrMsg,}
00536 
00537         validTypes = ['CTRIA3','CTRIA6','CTRIAR','CQUAD4','CQUAD8','CQUADR']
00538         (typesOut,orderedETypes) = self.getOrderedETypes(validTypes)
00539 
00540         msg = []
00541         for eType in typesOut:
00542             eids = orderedETypes[eType]
00543             if eids:
00544                 eids.sort()
00545                 #print "eType = ",eType
00546                 #print "eids = ",eids
00547                 #print "eType = ",eType
00548                 msgPack = msgPacks[eType]
00549 
00550                 msg += header+msgPack
00551                 if eType in ['CQUAD4']:
00552                     if isBilinear:
00553                         for eid in eids:
00554                             out = self.writeF06_Quad4_Bilinear(eid,4)
00555                             msg.append(out)
00556                     else:
00557                         for eid in eids:
00558                             out = self.writeF06_Tri3(eid)
00559                             msg.append(out)
00560                     ###
00561                 elif eType in ['CTRIA3']:
00562                     for eid in eids:
00563                         out = self.writeF06_Tri3(eid)
00564                         msg.append(out)
00565                 elif eType in ['CQUAD8']:
00566                     for eid in eids:
00567                         out = self.writeF06_Quad4_Bilinear(eid,5)
00568                         msg.append(out)
00569                 elif eType in ['CTRIAR','CTRIA6']:
00570                     for eid in eids:
00571                         out = self.writeF06_Quad4_Bilinear(eid,3)
00572                         msg.append(out)
00573                 else:
00574                     raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8, CTRIA6
00575                 ###
00576                 msg.append(pageStamp+str(pageNum)+'\n')
00577                 if f is not None:
00578                     f.write(''.join(msg))
00579                     msg = ['']
00580                 pageNum+=1
00581             ###
00582         ###
00583         return (''.join(msg),pageNum-1)
00584 
00585 
00586     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00587         if self.isVonMises():
00588             vonMises = 'VON MISES'
00589         else:
00590             vonMises = 'MAX SHEAR'
00591 
00592         if self.isFiberDistance():
00593             quadMsgTemp = ['    ELEMENT              FIBER            STRESSES IN ELEMENT COORD SYSTEM         PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00594                            '      ID      GRID-ID   DISTANCE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
00595             triMsgTemp = ['  ELEMENT      FIBER               STRESSES IN ELEMENT COORD SYSTEM             PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00596                           '    ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
00597         else:
00598             quadMsgTemp = ['    ELEMENT              FIBER            STRESSES IN ELEMENT COORD SYSTEM         PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00599                            '      ID      GRID-ID  CURVATURE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
00600             triMsgTemp = ['  ELEMENT      FIBER               STRESSES IN ELEMENT COORD SYSTEM             PRINCIPAL STRESSES (ZERO SHEAR)                 \n',
00601                           '    ID.      CURVATURE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
00602 
00603         triMsg   = None
00604         tri6Msg  = None
00605         trirMsg  = None
00606         quadMsg  = None
00607         quad8Msg = None
00608         quadrMsg = None
00609 
00610         eTypes = self.eType.values()
00611         dts = self.oxx.keys()
00612         dt = dts[0]
00613         if 'CQUAD4' in eTypes:
00614             qkey = eTypes.index('CQUAD4')
00615             kkey = self.eType.keys()[qkey]
00616             #print "qkey=%s kkey=%s" %(qkey,kkey)
00617             ekey = self.oxx[dt][kkey].keys()
00618             isBilinear=True
00619             quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  \n \n']+quadMsgTemp
00620             if len(ekey)==1:
00621                 isBilinear=False
00622                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )\n']+triMsgTemp
00623 
00624         if 'CQUAD8' in eTypes:
00625             quad8Msg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 8 )\n']+triMsgTemp
00626 
00627         if 'CQUADR' in eTypes:
00628             qkey = eTypes.index('CQUADR')
00629             kkey = self.eType.keys()[qkey]
00630             ekey = self.oxx[kkey].keys()
00631             isBilinear=True
00632             quadrMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )        OPTION = BILIN  \n \n']+quadMsgTemp
00633             if len(ekey)==1:
00634                 isBilinear=False
00635                 quadMsg = header+['                         S T R E S S E S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )\n']+triMsgTemp
00636 
00637         if 'CTRIA3' in eTypes:
00638             triMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 3 )\n']+triMsgTemp
00639 
00640         if 'CTRIA6' in eTypes:
00641             tri6Msg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 6 )\n']+triMsgTemp
00642 
00643         if 'CTRIAR' in eTypes:
00644             trirMsg = header+['                           S T R E S S E S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A R )\n']+triMsgTemp
00645 
00646         msgPacks = {'CTRIA3':triMsg,
00647                     'CTRIA6':tri6Msg,
00648                     'CTRIAR':trirMsg,
00649                     'CQUAD4':quadMsg,
00650                     'CQUAD8':quad8Msg,
00651                     'CQUADR':quadrMsg,}
00652 
00653 
00654         validTypes = ['CTRIA3','CTRIA6','CTRIAR','CQUAD4','CQUAD8','CQUADR']
00655         (typesOut,orderedETypes) = self.getOrderedETypes(validTypes)
00656 
00657         msg = []
00658         dts = self.oxx.keys()
00659         dts.sort()
00660         for eType in typesOut:
00661             #print "eType = ",eType
00662             eids = orderedETypes[eType]
00663             #print "eids = ",eids
00664             if eids:
00665                 msgPack = msgPacks[eType]
00666                 eids.sort()
00667                 if eType in ['CQUAD4']:
00668                     if isBilinear:
00669                         for dt in dts:
00670                             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00671                             msg += header+msgPack
00672                             for eid in eids:
00673                                 out = self.writeF06_Quad4_BilinearTransient(dt,eid,4)
00674                                 msg.append(out)
00675                     else:
00676                         for dt in dts:
00677                             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00678                             msg += header+msgPack
00679                             for eid in eids:
00680                                 out = self.writeF06_Tri3Transient(dt,eid)
00681                                 msg.append(out)
00682                     ###
00683                 elif eType in ['CTRIA3']:
00684                     for dt in dts:
00685                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00686                         msg += header+msgPack
00687                         for eid in eids:
00688                             out = self.writeF06_Tri3Transient(dt,eid)
00689                             msg.append(out)
00690                 elif eType in ['CTRIA6','CTRIAR']:
00691                     for dt in dts:
00692                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00693                         msg += header+msgPack
00694                         for eid in eids:
00695                             out = self.writeF06_Quad4_BilinearTransient(dt,eid,3)
00696                             msg.append(out)
00697                 elif eType in ['CQUAD8']:
00698                     for dt in dts:
00699                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00700                         msg += header+msgPack
00701                         for eid in eids:
00702                             out = self.writeF06_Quad4_BilinearTransient(dt,eid,5)
00703                             msg.append(out)
00704                 else:
00705                     raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8, CTRIA6
00706                 ###
00707                 msg.append(pageStamp+str(pageNum)+'\n')
00708                 if f is not None:
00709                     f.write(''.join(msg))
00710                     msg = ['']
00711                 pageNum+=1
00712         ###
00713         return (''.join(msg),pageNum-1)
00714 
00715     def writeF06_Quad4_Bilinear(self,eid,n):
00716         msg = ''
00717         k = self.oxx[eid].keys()
00718         k.remove('C')
00719         k.sort()
00720         for nid in ['C']+k:
00721             for iLayer in xrange(len(self.oxx[eid][nid])):
00722                 fd    = self.fiberCurvature[eid][nid][iLayer]
00723                 oxx   = self.oxx[eid][nid][iLayer]
00724                 oyy   = self.oyy[eid][nid][iLayer]
00725                 txy   = self.txy[eid][nid][iLayer]
00726                 angle = self.angle[eid][nid][iLayer]
00727                 major = self.majorP[eid][nid][iLayer]
00728                 minor = self.minorP[eid][nid][iLayer]
00729                 ovm = self.ovmShear[eid][nid][iLayer]
00730                 ([fd,oxx,oyy,txy,major,minor,ovm],isAllZeros) = self.writeFloats13E([fd,oxx,oyy,txy,major,minor,ovm])
00731                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
00732 
00733                 if nid=='C' and iLayer==0:
00734                     msg += '0  %8i %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %(eid,'CEN/'+str(n),fd,oxx,oyy,txy,angle,major,minor,ovm)
00735                 elif iLayer==0:
00736                     msg += '   %8s %8i  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %('',nid,     fd,oxx,oyy,txy,angle,major,minor,ovm)
00737                 elif iLayer==1:
00738                     msg += '   %8s %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n\n' %('','',    fd,oxx,oyy,txy,angle,major,minor,ovm)
00739                 else:
00740                     raise Exception('Invalid option for cquad4')
00741                 ###
00742             ###
00743         ###
00744         return msg
00745 
00746     def writeF06_Quad4_BilinearTransient(self,dt,eid,n):
00747         msg = ''
00748         k = self.oxx[dt][eid].keys()
00749         k.remove('C')
00750         k.sort()
00751         for nid in ['C']+k:
00752             for iLayer in xrange(len(self.oxx[dt][eid][nid])):
00753                 fd    = self.fiberCurvature[eid][nid][iLayer]
00754                 oxx   = self.oxx[dt][eid][nid][iLayer]
00755                 oyy   = self.oyy[dt][eid][nid][iLayer]
00756                 txy   = self.txy[dt][eid][nid][iLayer]
00757                 angle = self.angle[dt][eid][nid][iLayer]
00758                 major = self.majorP[dt][eid][nid][iLayer]
00759                 minor = self.minorP[dt][eid][nid][iLayer]
00760                 ovm = self.ovmShear[dt][eid][nid][iLayer]
00761                 ([fd,oxx,oyy,txy,major,minor,ovm],isAllZeros) = self.writeFloats13E([fd,oxx,oyy,txy,major,minor,ovm])
00762                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
00763 
00764                 if nid=='C' and iLayer==0:
00765                     msg += '0  %8i %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %(eid,'CEN/'+str(n),fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00766                 elif iLayer==0:
00767                     msg += '   %8s %8i  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %('',nid,     fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00768                 elif iLayer==1:
00769                     msg += '   %8s %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n\n' %('','',    fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00770                 else:
00771                     #msg += '   %8s %8s  %13E  %13E %13E %13E   %8.4F  %13E %13E %13E\n' %('','',  fd,oxx,oyy,txy,angle,major,minor,ovm)
00772                     raise RuntimeError('Invalid option for cquad4')
00773                 ###
00774             ###
00775         ###
00776         return msg
00777 
00778     def writeF06_Tri3(self,eid):
00779         msg = ''
00780         oxxNodes = self.oxx[eid].keys()
00781         for nid in sorted(oxxNodes):
00782             for iLayer in xrange(len(self.oxx[eid][nid])):
00783                 fd    = self.fiberCurvature[eid][nid][iLayer]
00784                 oxx   = self.oxx[eid][nid][iLayer]
00785                 oyy   = self.oyy[eid][nid][iLayer]
00786                 txy   = self.txy[eid][nid][iLayer]
00787                 angle = self.angle[eid][nid][iLayer]
00788                 major = self.majorP[eid][nid][iLayer]
00789                 minor = self.minorP[eid][nid][iLayer]
00790                 ovm = self.ovmShear[eid][nid][iLayer]
00791                 ([fd,oxx,oyy,txy,major,minor,ovm],isAllZeros) = self.writeFloats13E([fd,oxx,oyy,txy,major,minor,ovm])
00792                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
00793 
00794                 if iLayer==0:
00795                     msg += '0  %6i   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %(eid,fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00796                 else:
00797                     msg += '   %6s   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %('', fd,oxx,oyy,txy,angle,major,minor,ovm.rstrip())
00798                 ###
00799             ###
00800         ###
00801         return msg
00802 
00803     def writeF06_Tri3Transient(self,dt,eid):
00804         msg = ''
00805         oxxNodes = self.oxx[dt][eid].keys()
00806         for nid in sorted(oxxNodes):
00807             for iLayer in xrange(len(self.oxx[dt][eid][nid])):
00808                 fd    = self.fiberCurvature[eid][nid][iLayer]
00809                 oxx   = self.oxx[dt][eid][nid][iLayer]
00810                 oyy   = self.oyy[dt][eid][nid][iLayer]
00811                 txy   = self.txy[dt][eid][nid][iLayer]
00812                 angle = self.angle[dt][eid][nid][iLayer]
00813                 major = self.majorP[dt][eid][nid][iLayer]
00814                 minor = self.minorP[dt][eid][nid][iLayer]
00815                 ovm = self.ovmShear[dt][eid][nid][iLayer]
00816                 ([fd,oxx,oyy,txy,major,minor,ovm],isAllZeros) = self.writeFloats13E([fd,oxx,oyy,txy,major,minor,ovm])
00817                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
00818 
00819                 if iLayer==0:
00820                     msg += '0  %6i   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %(eid,fd,oxx,oyy,txy,angle,major,minor,ovm)
00821                 else:
00822                     msg += '   %6s   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %('',  fd,oxx,oyy,txy,angle,major,minor,ovm)
00823                 ###
00824             ###
00825         ###
00826         return msg
00827 
00828     def __repr__(self):
00829         #print "sCodes = ",self.sCodes
00830         if self.nonlinearFactor is not None:
00831             return self.__reprTransient__()
00832 
00833         msg = '---ISOTROPIC PLATE STRESS---\n'
00834         headers = self.getHeaders()
00835         msg += '%-6s %6s %8s %7s ' %('EID','eType','nodeID','iLayer')
00836         for header in headers:
00837             msg += '%10s ' %(header)
00838         msg += '\n'
00839 
00840         #print self.oxx.keys()
00841         for eid,oxxNodes in sorted(self.oxx.iteritems()):
00842             eType = self.eType[eid]
00843             for nid in sorted(oxxNodes):
00844                 for iLayer in xrange(len(self.oxx[eid][nid])):
00845                     fd    = self.fiberCurvature[eid][nid][iLayer]
00846                     oxx   = self.oxx[eid][nid][iLayer]
00847                     oyy   = self.oyy[eid][nid][iLayer]
00848                     txy   = self.txy[eid][nid][iLayer]
00849                    #angle = self.angle[eid][nid][iLayer]
00850                     major = self.majorP[eid][nid][iLayer]
00851                     minor = self.minorP[eid][nid][iLayer]
00852                     ovm = self.ovmShear[eid][nid][iLayer]
00853 
00854                     msg += '%-6i %6s %8s %7s %10g ' %(eid,eType,nid,iLayer+1,fd)
00855                     vals = [oxx,oyy,txy,major,minor,ovm]
00856                     for val in vals:
00857                         if abs(val)<1e-6:
00858                             msg += '%10s ' %('0')
00859                         else:
00860                             try:
00861                                 msg += '%10i ' %(val)
00862                             except:
00863                                 print("bad val = %s" %(val))
00864                                 raise
00865                         ###
00866                     msg += '\n'
00867                 ###
00868             ###
00869         ###
00870         return msg
00871 
00872 class PlateStrainObject(strainObject):
00873     """
00874     # ??? - is this just 11
00875     ELEMENT      STRAIN               STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)                 
00876       ID.       CURVATURE          NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        VON MISES
00877     
00878     # sCode=11
00879                            S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  
00880     ELEMENT              STRAIN            STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)               
00881       ID      GRID-ID   CURVATURE       NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       VON MISES 
00882 
00883     # sCode=15
00884                            S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )
00885     ELEMENT      FIBER                STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)                 
00886       ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        VON MISES
00887 
00888     # sCode=10
00889                            S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  
00890     ELEMENT              STRAIN            STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)          MAX  
00891       ID      GRID-ID   CURVATURE       NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR         SHEAR   
00892     """
00893     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00894         strainObject.__init__(self,dataCode,iSubcase)
00895         self.eType     = {}
00896 
00897         self.code = [self.formatCode,self.sortCode,self.sCode]
00898         
00899         #print self.dataCode
00900         self.fiberCurvature = {}
00901         self.exx    = {}
00902         self.eyy    = {}
00903         self.exy    = {}
00904         self.angle  = {}
00905         self.majorP = {}
00906         self.minorP = {}
00907         self.evmShear = {}
00908 
00909         self.dt = dt
00910         if isSort1:
00911             if dt is not None:
00912                 self.add = self.addSort1
00913                 self.addNewEid = self.addNewEidSort1
00914         else:
00915             assert dt is not None
00916             self.add = self.addSort2
00917             self.addNewEid = self.addNewEidSort2
00918 
00919     def addF06Data(self,data,transient):
00920         if transient is None:
00921             eType = data[0][0]
00922             for line in data:
00923                 if eType=='CTRIA3':
00924                     (eType,eid,f1,ex1,ey1,exy1,angle1,e11,e21,evm1,
00925                                f2,ex2,ey2,exy2,angle2,e12,e22,evm2) = line
00926                     self.eType[eid] = eType
00927                     self.fiberCurvature[eid] = {'C':[f1,f2]}
00928                     self.exx[eid]      = {'C':[ex1,ex2]}
00929                     self.eyy[eid]      = {'C':[ey1,ey2]}
00930                     self.exy[eid]      = {'C':[exy1,exy2]}
00931                     self.angle[eid]    = {'C':[angle1,angle2]}
00932                     self.majorP[eid]   = {'C':[e11,e12]}
00933                     self.minorP[eid]   = {'C':[e21,e22]}
00934                     self.evmShear[eid] = {'C':[evm1,evm2]}
00935                 elif eType=='CQUAD4':
00936                     #assert len(line)==19,'len(line)=%s' %(len(line))
00937                     #print line
00938                     if len(line)==19: # Centroid - bilinear
00939                         (eType,eid,nid,f1,ex1,ey1,exy1,angle1,e11,e21,evm1,
00940                                        f2,ex2,ey2,exy2,angle2,e12,e22,evm2) = line
00941                         if nid=='CEN/4': nid='C'
00942                         self.eType[eid] = eType
00943                         self.fiberCurvature[eid] = {nid:[f1,f2]}
00944                         self.exx[eid]      = {nid:[ex1,ex2]}
00945                         self.eyy[eid]      = {nid:[ey1,ey2]}
00946                         self.exy[eid]      = {nid:[exy1,exy2]}
00947                         self.angle[eid]    = {nid:[angle1,angle2]}
00948                         self.majorP[eid]   = {nid:[e11,e12]}
00949                         self.minorP[eid]   = {nid:[e21,e22]}
00950                         self.evmShear[eid] = {nid:[evm1,evm2]}
00951                     elif len(line)==18: # Centroid
00952                         (eType,eid,f1,ex1,ey1,exy1,angle1,e11,e21,evm1,
00953                                    f2,ex2,ey2,exy2,angle2,e12,e22,evm2) = line
00954                         nid='C'
00955                         self.eType[eid] = eType
00956                         self.fiberCurvature[eid] = {nid:[f1,f2]}
00957                         self.exx[eid]      = {nid:[ex1,ex2]}
00958                         self.eyy[eid]      = {nid:[ey1,ey2]}
00959                         self.exy[eid]      = {nid:[exy1,exy2]}
00960                         self.angle[eid]    = {nid:[angle1,angle2]}
00961                         self.majorP[eid]   = {nid:[e11,e12]}
00962                         self.minorP[eid]   = {nid:[e21,e22]}
00963                         self.evmShear[eid] = {nid:[evm1,evm2]}
00964                     elif len(line)==17: ## Bilinear node
00965                         #print line
00966                         (nid,f1,ex1,ey1,exy1,angle1,e11,e21,evm1,
00967                              f2,ex2,ey2,exy2,angle2,e12,e22,evm2) = line
00968                         self.fiberCurvature[eid][nid] = [f1,f2]
00969                         self.exx[eid][nid]      = [ex1,ex2]
00970                         self.eyy[eid][nid]      = [ey1,ey2]
00971                         self.txy[eid][nid]      = [exy1,exy2]
00972                         self.angle[eid][nid]    = [angle1,angle2]
00973                         self.majorP[eid][nid]   = [e11,e12]
00974                         self.minorP[eid][nid]   = [e21,e22]
00975                         self.evmShear[eid][nid] = [evm1,evm2]
00976                     else:
00977                         assert len(line)==19,'len(line)=%s' %(len(line))
00978                         raise NotImplementedError()
00979                     ###
00980                 else:
00981                     raise NotImplementedError('line=%s not supported...' %(line))
00982             return
00983         raise NotImplementedError('transient results not supported')
00984 
00985     def deleteTransient(self,dt):
00986         #del self.fiberCurvature[dt]
00987         del self.exx[dt]
00988         del self.eyy[dt]
00989         del self.exy[dt]
00990         del self.angle[dt]
00991         del self.majorP[dt]
00992         del self.minorP[dt]
00993         del self.evmShear[dt]
00994 
00995     def getTransients(self):
00996         k = self.exx.keys()
00997         k.sort()
00998         return k
00999 
01000     def addNewTransient(self,dt):
01001         """
01002         initializes the transient variables
01003         """
01004         #self.fiberCurvature[dt] = {}
01005         self.exx[dt]    = {}
01006         self.eyy[dt]    = {}
01007         self.exy[dt]    = {}
01008         self.angle[dt]  = {}
01009         self.majorP[dt] = {}
01010         self.minorP[dt] = {}
01011         self.evmShear[dt] = {}
01012 
01013     def addNewEid(self,eType,dt,eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm):
01014         #print "Plate add..."
01015         msg = "eid=%s nodeID=%s curvature=%g exx=%g eyy=%g \nexy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01016         
01017         if nodeID != 'C': # centroid
01018             assert 0<nodeID<1000000000, 'nodeID=%s %s' %(nodeID,msg)
01019 
01020         #if eid in self.exx:
01021             #return self.add(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01022         #assert eid not in self.exx
01023         self.eType[eid] = eType
01024         self.fiberCurvature[eid] = {nodeID: [curvature]}
01025         self.exx[eid]    = {nodeID: [exx]}
01026         self.eyy[eid]    = {nodeID: [eyy]}
01027         self.exy[eid]    = {nodeID: [exy]}
01028         self.angle[eid]  = {nodeID: [angle]}
01029         self.majorP[eid] = {nodeID: [majorP]}
01030         self.minorP[eid] = {nodeID: [minorP]}
01031         self.evmShear[eid]    = {nodeID: [evm]}
01032         #print msg
01033         if nodeID==0: raise Exception(msg)
01034 
01035     def addNewEidSort1(self,eType,dt,eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm):
01036         #print "Plate add..."
01037         msg = "eid=%s nodeID=%s curvature=%g exx=%g eyy=%g \nexy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01038         #print msg
01039 
01040         if nodeID != 'C': # centroid
01041             assert 0<nodeID<1000000000, 'nodeID=%s %s' %(nodeID,msg)
01042 
01043         if dt not in self.exx:
01044             self.addNewTransient(dt)
01045         #if eid in self.evmShear[dt]:  # SOL200, erase the old result
01046             #nid = nodeID
01047             #msg = "dt=%s eid=%s nodeID=%s fd=%s oxx=%s major=%s vm=%s" %(dt,eid,nodeID,str(self.fiberCurvature[eid][nid]),str(self.oxx[dt][eid][nid]),str(self.majorP[dt][eid][nid]),str(self.ovmShear[dt][eid][nid]))
01048             #self.deleteTransient(dt)
01049             #self.addNewTransient()
01050         
01051         self.eType[eid] = eType
01052         self.fiberCurvature[eid] = {nodeID: [curvature]}
01053         self.exx[dt][eid]    = {nodeID: [exx]}
01054         self.eyy[dt][eid]    = {nodeID: [eyy]}
01055         self.exy[dt][eid]    = {nodeID: [exy]}
01056         self.angle[dt][eid]  = {nodeID: [angle]}
01057         self.majorP[dt][eid] = {nodeID: [majorP]}
01058         self.minorP[dt][eid] = {nodeID: [minorP]}
01059         self.evmShear[dt][eid]    = {nodeID: [evm]}
01060         #print msg
01061         if nodeID==0: raise Exception(msg)
01062 
01063     def add(self,dt,eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm):
01064         #print "***add"
01065         msg = "eid=%s nodeID=%s curvature=%g exx=%g eyy=%g \nexy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01066         #print msg
01067         #print self.oxx
01068         #print self.fiberCurvature
01069         if nodeID != 'C': # centroid
01070             assert 0<nodeID<1000000000, 'nodeID=%s' %(nodeID)
01071         self.fiberCurvature[eid][nodeID].append(curvature)
01072         self.exx[eid][nodeID].append(exx)
01073         self.eyy[eid][nodeID].append(eyy)
01074         self.exy[eid][nodeID].append(exy)
01075         self.angle[eid][nodeID].append(angle)
01076         self.majorP[eid][nodeID].append(majorP)
01077         self.minorP[eid][nodeID].append(minorP)
01078         self.evmShear[eid][nodeID].append(evm)
01079         if nodeID==0: raise Exception(msg)
01080 
01081     def addSort1(self,dt,eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm):
01082         #print "***add"
01083         msg = "eid=%s nodeID=%s curvature=%g exx=%g eyy=%g \nexy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01084         #print msg
01085         #print self.oxx
01086         #print self.fiberCurvature
01087         if nodeID != 'C': # centroid
01088             assert 0<nodeID<1000000000, 'nodeID=%s' %(nodeID)
01089 
01090         self.fiberCurvature[eid][nodeID].append(curvature)
01091         self.exx[dt][eid][nodeID].append(exx)
01092         self.eyy[dt][eid][nodeID].append(eyy)
01093         self.exy[dt][eid][nodeID].append(exy)
01094         self.angle[dt][eid][nodeID].append(angle)
01095         self.majorP[dt][eid][nodeID].append(majorP)
01096         self.minorP[dt][eid][nodeID].append(minorP)
01097         self.evmShear[dt][eid][nodeID].append(evm)
01098         if nodeID==0: raise Exception(msg)
01099 
01100     def addNewNode(self,dt,eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm):
01101         #print "***addNewNode"
01102         #print self.oxx
01103         msg = "eid=%s nodeID=%s curvature=%g exx=%g eyy=%g \nexy=%g angle=%g major=%g minor=%g vm=%g" %(eid,nodeID,curvature,exx,eyy,exy,angle,majorP,minorP,evm)
01104         assert nodeID not in self.exx[eid],msg
01105         self.fiberCurvature[eid][nodeID] = [curvature]
01106         self.exx[eid][nodeID]    = [exx]
01107         self.eyy[eid][nodeID]    = [eyy]
01108         self.exy[eid][nodeID]    = [exy]
01109         self.angle[eid][nodeID]  = [angle]
01110         self.majorP[eid][nodeID] = [majorP]
01111         self.minorP[eid][nodeID] = [minorP]
01112         self.evmShear[eid][nodeID]    = [evm]
01113         #print msg
01114         if nodeID==0: raise Exception(msg)
01115 
01116     def getHeaders(self):
01117         if self.isFiberDistance():
01118             headers = ['fiberDist']
01119         else:
01120             headers = ['curvature']
01121     
01122         headers += ['exx','eyy','exy','eMajor','eMinor']
01123         if self.isVonMises():
01124             headers.append('eVonMises')
01125         else:
01126             headers.append('maxShear')
01127         return headers
01128 
01129     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
01130         if self.nonlinearFactor is not None:
01131             return self.writeF06Transient(header,pageStamp,pageNum,f)
01132 
01133         if self.isVonMises():
01134             vonMises = 'VON MISES'
01135         else:
01136             vonMises = 'MAX SHEAR'
01137 
01138         if self.isFiberDistance(): 
01139             quadMsgTemp = ['    ELEMENT              FIBER                STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)\n',
01140                            '      ID      GRID-ID   DISTANCE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
01141             triMsgTemp = ['  ELEMENT      FIBER               STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)\n',
01142                           '    ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
01143         else:
01144             quadMsgTemp = ['    ELEMENT              STRAIN            STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)\n',
01145                            '      ID      GRID-ID   CURVATURE       NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
01146             triMsgTemp = ['  ELEMENT      STRAIN               STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)\n',
01147                           '    ID.       CURVATURE          NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
01148         ###
01149 
01150         quadMsg  = None
01151         quad8Msg = None
01152         quadrMsg = None
01153         triMsg   = None
01154         tri6Msg  = None
01155         trirMsg  = None
01156 
01157         eTypes = self.eType.values()
01158         if 'CQUAD4' in eTypes:
01159             qkey = eTypes.index('CQUAD4')
01160             kkey = self.eType.keys()[qkey]
01161             ekey = self.exx[kkey].keys()
01162             isBilinear=True
01163             quadMsg     = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  \n \n']+quadMsgTemp
01164             if len(ekey)==1:
01165                 isBilinear=False
01166                 quadMsg = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )\n']+triMsgTemp
01167 
01168         if 'CQUAD8' in eTypes:
01169             qkey = eTypes.index('CQUAD8')
01170             kkey = self.eType.keys()[qkey]
01171             ekey = self.exx[kkey].keys()
01172             isBilinear=True
01173             quad8Msg     = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 8 )        OPTION = BILIN  \n \n']+quadMsgTemp
01174             if len(ekey)==1:
01175                 isBilinear=False
01176                 quad8Msg = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 8 )\n']+triMsgTemp
01177 
01178         if 'CQUADR' in eTypes:
01179             qkey = eTypes.index('CQUADR')
01180             kkey = self.eType.keys()[qkey]
01181             ekey = self.exx[kkey].keys()
01182             isBilinear=True
01183             quadrMsg     = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )        OPTION = BILIN  \n \n']+quadMsgTemp
01184             if len(ekey)==1:
01185                 isBilinear=False
01186                 quadrMsg = header+['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D R )\n']+triMsgTemp
01187 
01188         if 'CTRIA3' in eTypes:
01189             triMsg = header+['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 3 )\n']+triMsgTemp
01190 
01191         if 'CTRIA6' in eTypes:
01192             tri6Msg = header+['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 6 )\n']+triMsgTemp
01193 
01194         if 'CTRIAR' in eTypes:
01195             trirMsg = header+['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A R )\n']+triMsgTemp
01196 
01197         msgPacks = {'CTRIA3':triMsg,
01198                     'CTRIA6':tri6Msg,
01199                     'CTRIAR':trirMsg,
01200                     'CQUAD4':quadMsg,
01201                     'CQUAD8':quad8Msg,
01202                     'CQUADR':quadrMsg,}
01203 
01204         validTypes = ['CTRIA3','CTRIA6','CTRIAR','CQUAD4','CQUAD8','CQUADR']
01205         (typesOut,orderedETypes) = self.getOrderedETypes(validTypes)
01206 
01207         msg = []
01208         for eType in typesOut:
01209             eids = orderedETypes[eType]
01210             if eids:
01211                 #print "eids = ",eids
01212                 #print "eType = ",eType
01213                 msgPack = msgPacks[eType]
01214                 eids.sort()
01215                 msg += header+msgPack
01216                 if eType in ['CQUAD4']:
01217                     if isBilinear:
01218                         for eid in eids:
01219                             out = self.writeF06_Quad4_Bilinear(eid,4)
01220                     else:
01221                         for eid in eids:
01222                             out = self.writeF06_Tri3(eid)
01223                     ###
01224                 elif eType in ['CTRIA3']:
01225                     for eid in eids:
01226                         out = self.writeF06_Tri3(eid)
01227                 elif eType in ['CQUAD8']:
01228                     for eid in eids:
01229                         out = self.writeF06_Quad4_Bilinear(eid,5)
01230                 elif eType in ['CTRIA6','CTRIAR']:
01231                     for eid in eids:
01232                         out = self.writeF06_Quad4_Bilinear(eid,3)
01233                 else:
01234                     raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8, CTRIA6
01235                 ###
01236                 msg.append(out)
01237                 msg.append(pageStamp+str(pageNum)+'\n')
01238                 if f is not None:
01239                     f.write(''.join(msg))
01240                     msg = ['']
01241                 pageNum+=1
01242             ###
01243         ###
01244         return (''.join(msg),pageNum-1)
01245 
01246     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
01247         if self.isVonMises():
01248             vonMises = 'VON MISES'
01249         else:
01250             vonMises = 'MAX SHEAR'
01251 
01252         if self.isFiberDistance(): 
01253             quadMsgTemp = ['    ELEMENT              FIBER                STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)                 \n',
01254                            '      ID      GRID-ID   DISTANCE        NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
01255             triMsgTemp = ['  ELEMENT      FIBER               STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)                 \n',
01256                           '    ID.       DISTANCE           NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
01257         else:
01258             quadMsgTemp = ['    ELEMENT              STRAIN            STRAINS IN ELEMENT COORD SYSTEM         PRINCIPAL  STRAINS (ZERO SHEAR)                 \n',
01259                            '      ID      GRID-ID   CURVATURE       NORMAL-X      NORMAL-Y      SHEAR-XY      ANGLE        MAJOR         MINOR       %s \n' %(vonMises)]
01260             triMsgTemp = ['  ELEMENT      STRAIN               STRAINS IN ELEMENT COORD SYSTEM             PRINCIPAL  STRAINS (ZERO SHEAR)                 \n',
01261                           '    ID.       CURVATURE          NORMAL-X       NORMAL-Y      SHEAR-XY       ANGLE         MAJOR           MINOR        %s\n' %(vonMises)]
01262         ###
01263 
01264         quadMsg  = None
01265         quad8Msg = None
01266         quadrMsg = None
01267         triMsg   = None
01268         tri6Msg  = None
01269         trirMsg  = None
01270 
01271         eTypes = self.eType.values()
01272         if 'CQUAD4' in eTypes:
01273             ElemKey = eTypes.index('CQUAD4')
01274             #print qkey
01275             eid = self.eType.keys()[ElemKey]
01276             #print "self.oxx = ",self.oxx
01277             #print "eid=%s" %(eid)
01278             dt = self.exx.keys()[0]
01279             #print "dt=%s" %(dt)
01280             nLayers = len(self.exx[dt][eid])
01281             #print "elementKeys = ",elementKeys
01282             isBilinear=True
01283             quadMsg     = ['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )        OPTION = BILIN  \n \n']+quadMsgTemp
01284             if nLayers==1:
01285                 isBilinear=False
01286                 quadMsg = ['                           S T R A I N S   I N   Q U A D R I L A T E R A L   E L E M E N T S   ( Q U A D 4 )\n']+triMsgTemp
01287 
01288         if 'CTRIA3' in eTypes:
01289             triMsg = ['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 3 )\n']+triMsgTemp
01290 
01291         if 'CTRIA6' in eTypes:
01292             tri6Msg = header+['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A 6 )\n']+triMsgTemp
01293 
01294         if 'CTRIAR' in eTypes:
01295             trirMsg = header+['                             S T R A I N S   I N   T R I A N G U L A R   E L E M E N T S   ( T R I A R )\n']+triMsgTemp
01296 
01297         msg = []
01298         msgPacks = {'CTRIA3':triMsg,
01299                     'CTRIA6':tri6Msg,
01300                     'CTRIAR':trirMsg,
01301                     'CQUAD4':quadMsg,
01302                     'CQUAD8':quad8Msg,
01303                     'CQUADR':quadrMsg,}
01304 
01305         validTypes = ['CTRIA3','CTRIA6','CTRIAR','CQUAD4','CQUAD8','CQUADR']
01306         (typesOut,orderedETypes) = self.getOrderedETypes(validTypes)
01307 
01308         msg = []
01309         dts = self.exx.keys()
01310         dts.sort()
01311         for eType in typesOut:
01312             eids = orderedETypes[eType]
01313             if eids:
01314                 eids.sort()
01315                 eType = self.eType[eid]
01316                 if eType in ['CQUAD4']:
01317                     if isBilinear:
01318                         for dt in dts:
01319                             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
01320                             for eid in eids:
01321                                 out = self.writeF06_Quad4_BilinearTransient(dt,eid,4)
01322                                 msg.append(out)
01323                             msg.append(pageStamp+str(pageNum)+'\n')
01324                             pageNum+=1
01325                     else:
01326                         for dt in dts:
01327                             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
01328                             for eid in eids:
01329                                 out = self.writeF06_Tri3Transient(dt,eid)
01330                                 msg.append(out)
01331                             msg.append(pageStamp+str(pageNum)+'\n')
01332                             pageNum+=1
01333                 elif eType in ['CTRIA3']:
01334                     for dt in dts:
01335                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
01336                         for eid in eids:
01337                             out = self.writeF06_Tri3Transient(dt,eid)
01338                             msg.append(out)
01339                         msg.append(pageStamp+str(pageNum)+'\n')
01340                         pageNum+=1
01341                 elif eType in ['CQUAD8']:
01342                     for dt in dts:
01343                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
01344                         for eid in eids:
01345                             out = self.writeF06_Quad4_BilinearTransient(dt,eid,5)
01346                             msg.append(out)
01347                         msg.append(pageStamp+str(pageNum)+'\n')
01348                         pageNum+=1
01349                 elif eType in ['CTRIA6','CTRIAR']:
01350                     for dt in dts:
01351                         header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
01352                         for eid in eids:
01353                             out = self.writeF06_Quad4_BilinearTransient(dt,eid,3)
01354                             msg.append(out)
01355                         msg.append(pageStamp+str(pageNum)+'\n')
01356                         pageNum+=1
01357                 else:
01358                     raise NotImplementedError('eType = |%r|' %(eType)) # CQUAD8, CTRIA6
01359                 ###
01360             ###
01361         ###
01362         return (''.join(msg),pageNum-1)
01363 
01364     def writeF06_Quad4_Bilinear(self,eid,n):
01365         msg = ''
01366         k = self.exx[eid].keys()
01367         k.remove('C')
01368         k.sort()
01369         for nid in ['C']+k:
01370             for iLayer in xrange(len(self.exx[eid][nid])):
01371                 fd    = self.fiberCurvature[eid][nid][iLayer]
01372                 exx   = self.exx[eid][nid][iLayer]
01373                 eyy   = self.eyy[eid][nid][iLayer]
01374                 exy   = self.exy[eid][nid][iLayer]
01375                 angle = self.angle[eid][nid][iLayer]
01376                 major = self.majorP[eid][nid][iLayer]
01377                 minor = self.minorP[eid][nid][iLayer]
01378                 evm   = self.evmShear[eid][nid][iLayer]
01379                 ([fd,exx,eyy,exy,major,minor,evm],isAllZeros) = self.writeFloats13E([fd,exx,eyy,exy,major,minor,evm])
01380                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
01381 
01382                 if nid=='C' and iLayer==0:
01383                     msg += '0  %8i %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %(eid,'CEN/'+str(n),fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01384                 elif iLayer==0:
01385                     msg += '   %8s %8i  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %('',nid,     fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01386                 elif iLayer==1:
01387                     msg += '   %8s %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n\n' %('','',    fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01388                 else:
01389                     raise Exception('Invalid option for cquad4')
01390                 ###
01391             ###
01392         ###
01393         return msg
01394 
01395     def writeF06_Quad4_BilinearTransient(self,dt,eid,n):
01396         msg = ''
01397         k = self.exx[dt][eid].keys()
01398         k.remove('C')
01399         k.sort()
01400         for nid in ['C']+k:
01401             for iLayer in xrange(len(self.exx[dt][eid][nid])):
01402                 fd    = self.fiberCurvature[eid][nid][iLayer]
01403                 exx   = self.exx[dt][eid][nid][iLayer]
01404                 eyy   = self.eyy[dt][eid][nid][iLayer]
01405                 exy   = self.exy[dt][eid][nid][iLayer]
01406                 angle = self.angle[dt][eid][nid][iLayer]
01407                 major = self.majorP[dt][eid][nid][iLayer]
01408                 minor = self.minorP[dt][eid][nid][iLayer]
01409                 evm   = self.evmShear[dt][eid][nid][iLayer]
01410 
01411                 ([fd,exx,eyy,exy,major,minor,evm],isAllZeros) = self.writeFloats13E([fd,exx,eyy,exy,major,minor,evm])
01412                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
01413 
01414                 if nid=='C' and iLayer==0:
01415                     msg += '0  %8i %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %(eid,'CEN/'+str(n),fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01416                 elif iLayer==0:
01417                     msg += '   %8s %8i  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n' %('',nid,     fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01418                 elif iLayer==1:
01419                     msg += '   %8s %8s  %13s  %13s %13s %13s   %8s  %13s %13s %-s\n\n' %('','',    fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01420                 else:
01421                     raise Exception('Invalid option for cquad4')
01422                 ###
01423             ###
01424         ###
01425         return msg
01426 
01427     def writeF06_Tri3(self,eid):
01428         msg = ''
01429         k = self.exx[eid].keys()
01430         for nid in sorted(k):
01431             for iLayer in xrange(len(self.exx[eid][nid])):
01432                 fd    = self.fiberCurvature[eid][nid][iLayer]
01433                 exx   = self.exx[eid][nid][iLayer]
01434                 eyy   = self.eyy[eid][nid][iLayer]
01435                 exy   = self.exy[eid][nid][iLayer]
01436                 angle = self.angle[eid][nid][iLayer]
01437                 major = self.majorP[eid][nid][iLayer]
01438                 minor = self.minorP[eid][nid][iLayer]
01439                 evm   = self.evmShear[eid][nid][iLayer]
01440 
01441                 ([fd,exx,eyy,exy,major,minor,evm],isAllZeros) = self.writeFloats13E([fd,exx,eyy,exy,major,minor,evm])
01442                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
01443                 if iLayer==0:
01444                     msg += '0  %6i   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %(eid,fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01445                 else:
01446                     msg += '   %6s   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %('', fd,exx,eyy,exy,angle,major,minor,evm.rstrip())
01447                 ###
01448             ###
01449         ###
01450         return msg
01451 
01452     def writeF06_Tri3Transient(self,dt,eid):
01453         msg = ''
01454         exxNodes = self.exx[dt][eid]
01455         #k = exxNodes.keys()
01456         for nid in sorted(exxNodes):
01457             for iLayer in xrange(len(self.exx[dt][eid][nid])):
01458                 fd    = self.fiberCurvature[eid][nid][iLayer]
01459                 exx   = self.exx[dt][eid][nid][iLayer]
01460                 eyy   = self.eyy[dt][eid][nid][iLayer]
01461                 exy   = self.exy[dt][eid][nid][iLayer]
01462                 angle = self.angle[dt][eid][nid][iLayer]
01463                 major = self.majorP[dt][eid][nid][iLayer]
01464                 minor = self.minorP[dt][eid][nid][iLayer]
01465                 evm   = self.evmShear[dt][eid][nid][iLayer]
01466 
01467                 ([fd,exx,eyy,exy,major,minor,evm],isAllZeros) = self.writeFloats13E([fd,exx,eyy,exy,major,minor,evm])
01468                 ([angle],isAllZeros) = self.writeFloats8p4F([angle])
01469                 if iLayer==0:
01470                     msg += '0  %6i   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %(eid,fd,exx,eyy,exy,angle,major,minor,evm)
01471                 else:
01472                     msg += '   %6s   %13s     %13s  %13s  %13s   %8s   %13s   %13s  %-s\n' %('', fd,exx,eyy,exy,angle,major,minor,evm)
01473                 ###
01474             ###
01475         ###
01476         return msg
01477 
01478     def __repr__(self):
01479         if self.nonlinearFactor is not None:
01480             return self.__reprTransient__()
01481 
01482         msg = '---ISOTROPIC PLATE STRAIN---\n'
01483         headers = self.getHeaders()
01484         msg += '%-6s %6s %8s %7s ' %('EID','eType','nodeID','iLayer')
01485         for header in headers:
01486             msg += '%10s ' %(header)
01487         msg += '\n'
01488 
01489         for eid,exxNodes in sorted(self.exx.iteritems()):
01490             eType = self.eType[eid]
01491             for nid in sorted(exxNodes):
01492                 for iLayer in xrange(len(self.exx[eid][nid])):
01493                     fd    = self.fiberCurvature[eid][nid][iLayer]
01494                     exx   = self.exx[eid][nid][iLayer]
01495                     eyy   = self.eyy[eid][nid][iLayer]
01496                     exy   = self.exy[eid][nid][iLayer]
01497                    #angle = self.angle[eid][nid][iLayer]
01498                     major = self.majorP[eid][nid][iLayer]
01499                     minor = self.minorP[eid][nid][iLayer]
01500                     evm   = self.evmShear[eid][nid][iLayer]
01501                     
01502                     msg += '%-6i %6s %8s %7s %10g ' %(eid,eType,nid,iLayer+1,fd)
01503                     vals = [exx,eyy,exy,major,minor,evm]
01504                     for val in vals:
01505                         if abs(val)<1e-6:
01506                             msg += '%10s ' %('0.')
01507                         else:
01508                             msg += '%10.3g ' %(val)
01509                         ###
01510                     msg += '\n'
01511 
01512                     #msg += "eid=%s eType=%s nid=%s iLayer=%s exx=%-9.3g eyy=%-9.3g exy=%-9.3g evm=%-9.3g\n" %(eid,eType,nid,iLayer,exx,eyy,exy,evm)
01513                 ###
01514             ###
01515         ###
01516         return msg
01517 
01518     def __reprTransient__(self):
01519         msg = '---ISOTROPIC PLATE STRAIN---\n'
01520         headers = self.getHeaders()
01521         msg += '%-6s %6s %8s %7s ' %('EID','eType','nodeID','iLayer')
01522         for header in headers:
01523             msg += '%10s ' %(header)
01524         msg += '\n'
01525 
01526         for dt,exx in sorted(self.exx.iteritems()):
01527             msg += '%s = %g\n' %(self.dataCode['name'],dt)
01528             for eid,exxNodes in sorted(exx.iteritems()):
01529                 eType = self.eType[eid]
01530                 for nid in sorted(exxNodes):
01531                     for iLayer in xrange(len(self.exx[dt][eid][nid])):
01532                         fd    = self.fiberCurvature[eid][nid][iLayer]
01533                         exx   = self.exx[   dt][eid][nid][iLayer]
01534                         eyy   = self.eyy[   dt][eid][nid][iLayer]
01535                         exy   = self.exy[   dt][eid][nid][iLayer]
01536                        #angle = self.angle[ dt][eid][nid][iLayer]
01537                         major = self.majorP[dt][eid][nid][iLayer]
01538                         minor = self.minorP[dt][eid][nid][iLayer]
01539                         evm   = self.evmShear[   dt][eid][nid][iLayer]
01540 
01541                         msg += '%-6i %6s %8s %7s %10g ' %(eid,eType,nid,iLayer+1,fd)
01542                         vals = [exx,eyy,exy,major,minor,evm]
01543                         for val in vals:
01544                             if abs(val)<1e-6:
01545                                 msg += '%10s ' %('0.')
01546                             else:
01547                                 msg += '%10.3g ' %(val)
01548                             ###
01549                         msg += '\n'
01550 
01551                         #msg += "eid=%s eType=%s nid=%s iLayer=%s exx=%-9.3g eyy=%-9.3g exy=%-9.3g evm=%-9.3g\n" %(eid,eType,nid,iLayer,exx,eyy,exy,evm)
01552                     ###
01553                 ###
01554             ###
01555         ###
01556         return msg
 All Classes Namespaces Files Functions Variables