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