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