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