pyNastran
0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
|
00001 ## GNU Lesser General Public License 00002 ## 00003 ## Program pyNastran - a python interface to NASTRAN files 00004 ## Copyright (C) 2011-2012 Steven Doyle, Al Danial 00005 ## 00006 ## Authors and copyright holders of pyNastran 00007 ## Steven Doyle <mesheb82@gmail.com> 00008 ## Al Danial <al.danial@gmail.com> 00009 ## 00010 ## This file is part of pyNastran. 00011 ## 00012 ## pyNastran is free software: you can redistribute it and/or modify 00013 ## it under the terms of the GNU Lesser General Public License as published by 00014 ## the Free Software Foundation, either version 3 of the License, or 00015 ## (at your option) any later version. 00016 ## 00017 ## pyNastran is distributed in the hope that it will be useful, 00018 ## but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 ## GNU General Public License for more details. 00021 ## 00022 ## You should have received a copy of the GNU Lesser General Public License 00023 ## along with pyNastran. If not, see <http://www.gnu.org/licenses/>. 00024 ## 00025 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