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 from .oes_objects import stressObject, strainObject 00029 from pyNastran.op2.op2Errors import InvalidCodeError 00030 00031 00032 class BarStressObject(stressObject): 00033 """ 00034 # sCode=0 00035 S T R E S S E S I N B A R E L E M E N T S ( C B A R ) 00036 ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T 00037 ID. SB1 SB2 SB3 SB4 STRESS SB-MAX SB-MIN M.S.-C 00038 """ 00039 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00040 stressObject.__init__(self,dataCode,iSubcase) 00041 self.eType = {} 00042 00043 self.code = [self.formatCode,self.sortCode,self.sCode] 00044 00045 self.s1 = {} 00046 self.s2 = {} 00047 self.s3 = {} 00048 self.s4 = {} 00049 self.axial = {} 00050 self.smax = {} 00051 self.smin = {} 00052 self.MS_tension = {} 00053 self.MS_compression = {} 00054 00055 #if self.elementType==100: 00056 #self.getLength = self.getLength100_format1_sort0 00057 #self.addNewEid = self.addNewEid100 00058 00059 self.dt = dt 00060 #print "BAR dt=%s" %(dt) 00061 if isSort1: 00062 if dt is not None: 00063 #self.add = self.addSort1 00064 self.addNewEid = self.addNewEidSort1 00065 ### 00066 else: 00067 assert dt is not None 00068 #self.add = self.addSort2 00069 self.addNewEid = self.addNewEidSort2 00070 ### 00071 00072 def addF06Data(self,data,transient): 00073 if transient is None: 00074 for line in data: 00075 (eType,eid,s1A,s2A,s3A,s4A,axialA,smaxA,sminA,MSt, 00076 s1B,s2B,s3B,s4B, smaxB,sminB,MSc) = line 00077 self.eType[eid] = 'CBAR' 00078 self.s1[eid] = [s1A,s1B] 00079 self.s2[eid] = [s2A,s2B] 00080 self.s3[eid] = [s3A,s3B] 00081 self.s4[eid] = [s4A,s4B] 00082 00083 self.axial[eid] = axialA 00084 self.smax[eid] = [smaxA,smaxB] 00085 self.smin[eid] = [sminA,sminB] 00086 #self.MS_tension[eid] = MSt 00087 #self.MS_compression[eid] = MSc 00088 ### 00089 return 00090 00091 (dtName,dt) = transient 00092 self.dataCode['name'] = dtName 00093 #print "dt = ",dt 00094 #print "dtName = ",dtName 00095 if dt not in self.s1: 00096 self.updateDt(self.dataCode, dt) 00097 self.isTransient = True 00098 00099 for line in data: 00100 (eType,eid,s1A,s2A,s3A,s4A,axialA,smaxA,sminA,MSt, 00101 s1B,s2B,s3B,s4B, smaxB,sminB,MSc) = line 00102 self.eType[eid] = 'CBAR' 00103 self.s1[dt][eid] = [s1A,s1B] 00104 self.s2[dt][eid] = [s2A,s2B] 00105 self.s3[dt][eid] = [s3A,s3B] 00106 self.s4[dt][eid] = [s4A,s4B] 00107 00108 self.axial[dt][eid] = axialA 00109 self.smax[dt][eid] = [smaxA,smaxB] 00110 self.smin[dt][eid] = [sminA,sminB] 00111 #self.MS_tension[dt][eid] = MSt 00112 #self.MS_compression[dt][eid] = MSc 00113 ### 00114 00115 def getLength(self): 00116 return (68, 'iffffffffffffffff') 00117 00118 def deleteTransient(self, dt): 00119 del self.s1[dt] 00120 del self.s2[dt] 00121 del self.s3[dt] 00122 del self.s4[dt] 00123 del self.axial[dt] 00124 del self.smax[dt] 00125 del self.smin[dt] 00126 00127 def getTransients(self): 00128 k = self.s1.keys() 00129 k.sort() 00130 return k 00131 00132 def addNewTransient(self, dt): 00133 """ 00134 initializes the transient variables 00135 """ 00136 #print "****add new transient****" 00137 self.dt = dt 00138 self.s1[dt] = {} 00139 self.s2[dt] = {} 00140 self.s3[dt] = {} 00141 self.s4[dt] = {} 00142 self.axial[dt] = {} 00143 self.smax[dt] = {} 00144 self.smin[dt] = {} 00145 #self.MS_tension[dt] = {} 00146 #self.MS_compression[dt] = {} 00147 00148 def addNewEid100(self,dt,out): 00149 #print "out = ",out 00150 #return 00151 (eid,s1,s2,s3,s4,axial,smax,smin,MSt,MSc) = out 00152 #print "Bar Stress add..." 00153 self.eType[eid] = 'CBAR' #eType 00154 00155 if self.eid in self.s1: 00156 self.s1[eid].append(s1) 00157 self.s2[eid].append(s2) 00158 self.s3[eid].append(s3) 00159 self.s4[eid].append(s4) 00160 self.axial[eid].append(axial) 00161 self.smax[eid].append(smax) 00162 self.smin[eid].append(smin) 00163 #self.MS_tension[eid].append(MSt) 00164 #self.MS_compression[eid].append(MSc) 00165 else: 00166 self.s1[eid] = [s1] 00167 self.s2[eid] = [s2] 00168 self.s3[eid] = [s3] 00169 self.s4[eid] = [s4] 00170 self.axial[eid] = axial 00171 self.smax[eid] = [smax] 00172 self.smin[eid] = [smin] 00173 #self.MS_tension[eid] = MSt 00174 #self.MS_compression[eid] = MSc 00175 00176 #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) 00177 #print msg 00178 #if nodeID==0: raise Exception(msg) 00179 00180 def addNewEid(self,eType,dt,eid,s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt, 00181 s1b,s2b,s3b,s4b, smaxb,sminb,MSc): 00182 #print "Bar Stress add..." 00183 self.eType[eid] = eType 00184 00185 self.s1[eid] = [s1a,s1b] 00186 self.s2[eid] = [s2a,s2b] 00187 self.s3[eid] = [s3a,s3b] 00188 self.s4[eid] = [s4a,s4b] 00189 self.axial[eid] = axial 00190 self.smax[eid] = [smaxa,smaxb] 00191 self.smin[eid] = [smina,sminb] 00192 #self.MS_tension[eid] = MSt 00193 #self.MS_compression[eid] = MSc 00194 00195 #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) 00196 #print msg 00197 #if nodeID==0: raise Exception(msg) 00198 00199 def addNewEidSort1(self,eType,dt,eid,s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt, 00200 s1b,s2b,s3b,s4b, smaxb,sminb,MSc): 00201 msg = "dt=%s eid=%s s1a=%s" %(dt,eid,s1a) 00202 #print msg 00203 if dt not in self.s1: 00204 self.addNewTransient(dt) 00205 self.eType[eid] = eType 00206 #print self.s1 00207 self.s1[dt][eid] = [s1a,s1b] 00208 self.s2[dt][eid] = [s2a,s2b] 00209 self.s3[dt][eid] = [s3a,s3b] 00210 self.s4[dt][eid] = [s4a,s4b] 00211 self.axial[dt][eid] = axial 00212 self.smax[dt][eid] = [smaxa,smaxb] 00213 self.smin[dt][eid] = [smina,sminb] 00214 #self.MS_tension[dt][eid] = MSt 00215 #self.MS_compression[dt][eid] = MSc 00216 00217 #if nodeID==0: raise Exception(msg) 00218 00219 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00220 if self.nonlinearFactor is not None: 00221 return self.writeF06Transient(header,pageStamp,pageNum,f) 00222 00223 msg = header+[ 00224 ' S T R E S S E S I N B A R E L E M E N T S ( C B A R )\n', 00225 ' ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T\n', 00226 ' ID. SB1 SB2 SB3 SB4 STRESS SB-MAX SB-MIN M.S.-C\n', 00227 ] 00228 00229 for eid,S1s in sorted(self.s1.iteritems()): 00230 eType = self.eType[eid] 00231 axial = self.axial[eid] 00232 #MSt = self.MSt[eid] 00233 #MSc = self.MSc[eid] 00234 MSt = '' 00235 MSc = '' 00236 00237 s1 = self.s1[eid] 00238 s2 = self.s2[eid] 00239 s3 = self.s3[eid] 00240 s4 = self.s4[eid] 00241 smax = self.smax[eid] 00242 smin = self.smin[eid] 00243 vals = [s1[0],s2[0],s3[0],s4[0],axial,smax[0],smin[0], 00244 s1[1],s2[1],s3[1],s4[1], smax[1],smin[1]] 00245 (vals2,isAllZeros) = self.writeFloats13E(vals) 00246 [s1a,s2a,s3a,s4a,axial,smaxa,smina, 00247 s1b,s2b,s3b,s4b, smaxb,sminb] = vals2 00248 msg.append('0%8i %13s %13s %13s %13s %13s %13s %13s %-s\n' %(eid, s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt.rstrip())) 00249 msg.append(' %8s %13s %13s %13s %13s %13s %13s %13s %-s\n' %('', s1b,s2b,s3b,s4b,'', smaxb,sminb,MSc.rstrip())) 00250 ### 00251 msg.append(pageStamp+str(pageNum)+'\n') 00252 return (''.join(msg),pageNum) 00253 00254 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00255 words = [ 00256 ' S T R E S S E S I N B A R E L E M E N T S ( C B A R )\n', 00257 ' ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T\n', 00258 ' ID. SB1 SB2 SB3 SB4 STRESS SB-MAX SB-MIN M.S.-C\n', 00259 ] 00260 msg = [] 00261 for dt,S1s in sorted(self.s1.iteritems()): 00262 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00263 msg += header + words 00264 for eid,S1 in sorted(S1s.iteritems()): 00265 eType = self.eType[eid] 00266 axial = self.axial[dt][eid] 00267 #MSt = self.MSt[eid] 00268 #MSc = self.MSc[eid] 00269 MSt = '' 00270 MSc = '' 00271 00272 s1 = self.s1[dt][eid] 00273 s2 = self.s2[dt][eid] 00274 s3 = self.s3[dt][eid] 00275 s4 = self.s4[dt][eid] 00276 smax = self.smax[dt][eid] 00277 smin = self.smin[dt][eid] 00278 vals = [s1[0],s2[0],s3[0],s4[0],axial,smax[0],smin[0], 00279 s1[1],s2[1],s3[1],s4[1], smax[1],smin[1]] 00280 (vals2,isAllZeros) = self.writeFloats13E(vals) 00281 [s1a,s2a,s3a,s4a,axial,smaxa,smina, 00282 s1b,s2b,s3b,s4b, smaxb,sminb] = vals2 00283 msg.append('0%8i %13s %13s %13s %13s %13s %13s %13s %-s\n' %(eid, s1a,s2a,s3a,s4a,axial,smaxa,smina,MSt.rstrip())) 00284 msg.append(' %8s %13s %13s %13s %13s %13s %13s %13s %-s\n' %('', s1b,s2b,s3b,s4b,'', smaxb,sminb,MSc.rstrip())) 00285 ### 00286 msg.append(pageStamp+str(pageNum)+'\n') 00287 pageNum+=1 00288 return (''.join(msg),pageNum-1) 00289 00290 def __repr__(self): 00291 if self.nonlinearFactor is not None: 00292 return self.__reprTransient__() 00293 00294 msg = '---BAR STRESS---\n' 00295 msg += '%-6s %6s ' %('EID','eType') 00296 headers = ['s1','s2','s3','s4','Axial','sMax','sMin'] 00297 for header in headers: 00298 msg += '%8s ' %(header) 00299 msg += '\n' 00300 00301 for eid,S1s in sorted(self.s1.iteritems()): 00302 eType = self.eType[eid] 00303 axial = self.axial[eid] 00304 #MSt = self.MSt[eid] 00305 #MSc = self.MSc[eid] 00306 00307 s1 = self.s1[eid] 00308 s2 = self.s2[eid] 00309 s3 = self.s3[eid] 00310 s4 = self.s4[eid] 00311 smax = self.smax[eid] 00312 smin = self.smin[eid] 00313 msg += '%-6i %6s ' %(eid,eType) 00314 vals = [s1[0],s2[0],s3[0],s4[0],axial,smax[0],smin[0]] 00315 for val in vals: 00316 if abs(val)<1e-6: 00317 msg += '%8s ' %('0') 00318 else: 00319 msg += '%8i ' %(val) 00320 ### 00321 msg += '\n' 00322 00323 msg += '%s ' %(' '*13) 00324 vals = [s1[1],s2[1],s3[1],s4[1],'',smax[1],smin[1]] 00325 for val in vals: 00326 if isinstance(val,str): 00327 msg += '%8s ' %(val) 00328 elif abs(val)<1e-6: 00329 msg += '%8s ' %('0') 00330 else: 00331 msg += '%8i ' %(val) 00332 ### 00333 msg += '\n' 00334 00335 00336 #msg += "eid=%-4s eType=%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i axial=-%5i smax=%-5i smax=%-4i\n" %(eid,eType,s1[0],s2[0],s3[0],s4[0],axial, smax[0],smin[0]) 00337 #msg += "%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i %s smax=%-5i smax=%-4i\n" %(' '*4, s1[1],s2[1],s3[1],s4[1],' ',smax[1],smin[1]) 00338 ### 00339 return msg 00340 00341 def __reprTransient__(self): 00342 msg = '---BAR STRESS---\n' 00343 msg += '%-6s %6s ' %('EID','eType') 00344 headers = ['s1','s2','s3','s4','Axial','sMax','sMin'] 00345 for header in headers: 00346 msg += '%8s ' %(header) 00347 msg += '\n' 00348 00349 for dt,S1ss in sorted(self.s1.iteritems()): 00350 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00351 for eid,S1s in sorted(S1ss.iteritems()): 00352 eType = self.eType[eid] 00353 axial = self.axial[dt][eid] 00354 #MSt = self.MSt[dt][eid] 00355 #MSc = self.MSc[dt][eid] 00356 00357 s1 = self.s1[dt][eid] 00358 s2 = self.s2[dt][eid] 00359 s3 = self.s3[dt][eid] 00360 s4 = self.s4[dt][eid] 00361 smax = self.smax[dt][eid] 00362 smin = self.smin[dt][eid] 00363 msg += '%-6i %6s ' %(eid,eType) 00364 vals = [s1[0],s2[0],s3[0],s4[0],axial,smax[0],smin[0]] 00365 for val in vals: 00366 if abs(val)<1e-6: 00367 msg += '%8s ' %('0') 00368 else: 00369 msg += '%8i ' %(val) 00370 ### 00371 msg += '\n' 00372 00373 msg += '%s ' %(' '*13) 00374 vals = [s1[1],s2[1],s3[1],s4[1],'',smax[1],smin[1]] 00375 for val in vals: 00376 if isinstance(val,str): 00377 msg += '%8s ' %(val) 00378 elif abs(val)<1e-6: 00379 msg += '%8s ' %('0') 00380 else: 00381 msg += '%8i ' %(val) 00382 ### 00383 msg += '\n' 00384 00385 #msg += "eid=%-4s eType=%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i axial=-%5i smax=%-5i smax=%-4i\n" %(eid,eType,s1[0],s2[0],s3[0],s4[0],axial, smax[0],smin[0]) 00386 #msg += "%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i %s smax=%-5i smax=%-4i\n" %(' '*4, s1[1],s2[1],s3[1],s4[1],' ',smax[1],smin[1]) 00387 ### 00388 ### 00389 return msg 00390 00391 class BarStrainObject(strainObject): 00392 """ 00393 # sCode=10 00394 S T R A I N S I N B A R E L E M E N T S ( C B A R ) 00395 ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T 00396 ID. SB1 SB2 SB3 SB4 STRAIN SB-MAX SB-MIN M.S.-C 00397 00398 """ 00399 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00400 strainObject.__init__(self,dataCode,iSubcase) 00401 self.eType = {} 00402 00403 self.code = [self.formatCode,self.sortCode,self.sCode] 00404 if self.code in [ [1,0,0],[1,0,1] ]: 00405 #raise InvalidCodeError('barStrain - get the format/sort/stressCode=%s' %(self.code)) 00406 self.e1 = {} 00407 self.e2 = {} 00408 self.e3 = {} 00409 self.e4 = {} 00410 self.axial = {} 00411 self.emax = {} 00412 self.emin = {} 00413 #self.MS_tension = {} 00414 #self.MS_compression = {} 00415 elif self.code == [1,0,10]: 00416 self.e1 = {} 00417 self.e2 = {} 00418 self.e3 = {} 00419 self.e4 = {} 00420 self.axial = {} 00421 self.emax = {} 00422 self.emin = {} 00423 self.MS_tension = {} 00424 self.MS_compression = {} 00425 else: 00426 raise InvalidCodeError('barStrain - get the format/sort/stressCode=%s' %(self.code)) 00427 ### 00428 if isSort1: 00429 if dt is not None: 00430 self.add = self.addSort1 00431 self.addNewEid = self.NewEidSort1 00432 ### 00433 else: 00434 assert dt is not None 00435 self.add = self.addSort2 00436 self.addNewEid = self.NewEidSort2 00437 ### 00438 00439 def addF06Data(self,data,transient): 00440 if transient is None: 00441 for line in data: 00442 (eType,eid,e1A,e2A,e3A,e4A,axialA,emaxA,eminA,MSt, 00443 e1B,e2B,e3B,e4B, emaxB,eminB,MSc) = line 00444 self.eType[eid] = 'CBAR' 00445 self.e1[eid] = [e1A,e1B] 00446 self.e2[eid] = [e2A,e2B] 00447 self.e3[eid] = [e3A,e3B] 00448 self.e4[eid] = [e4A,e4B] 00449 00450 self.axial[eid] = axialA 00451 self.emax[eid] = [emaxA,emaxB] 00452 self.emin[eid] = [eminA,eminB] 00453 #self.MS_tension[eid] = MSt 00454 #self.MS_compression[eid] = MSc 00455 ### 00456 return 00457 00458 (dtName,dt) = transient 00459 self.dataCode['name'] = dtName 00460 if dt not in self.s1: 00461 self.updateDt(self.dataCode,dt) 00462 self.isTransient = True 00463 00464 for line in data: 00465 (eType,eid,e1A,e2A,e3A,e4A,axialA,emaxA,eminA,MSt, 00466 e1B,e2B,e3B,e4B, emaxB,eminB,MSc) = line 00467 self.eType[eid] = 'CBAR' 00468 self.e1[dt][eid] = [e1A,e1B] 00469 self.e2[dt][eid] = [e2A,e2B] 00470 self.e3[dt][eid] = [e3A,e3B] 00471 self.e4[dt][eid] = [e4A,e4B] 00472 00473 self.axial[dt][eid] = axialA 00474 self.emax[dt][eid] = [emaxA,emaxB] 00475 self.emin[dt][eid] = [eminA,eminB] 00476 #self.MS_tension[dt][eid] = MSt 00477 #self.MS_compression[dt][eid] = MSc 00478 ### 00479 00480 def deleteTransient(self,dt): 00481 del self.e1[dt] 00482 del self.e2[dt] 00483 del self.e3[dt] 00484 del self.e4[dt] 00485 del self.exial[dt] 00486 del self.emax[dt] 00487 del self.emin[dt] 00488 00489 def getTransients(self): 00490 k = self.e1.keys() 00491 k.sort() 00492 return k 00493 00494 def addNewTransient(self, dt): 00495 """ 00496 initializes the transient variables 00497 """ 00498 self.e1[dt] = {} 00499 self.e2[dt] = {} 00500 self.e3[dt] = {} 00501 self.e4[dt] = {} 00502 self.axial[dt] = {} 00503 self.emax[dt] = {} 00504 self.emin[dt] = {} 00505 #self.MS_tension[dt] = {} 00506 #self.MS_compression[dt] = {} 00507 00508 def addNewEid(self,eType,dt,eid,e1a,e2a,e3a,e4a,axial,emaxa,emina,MSt, 00509 e1b,e2b,e3b,e4b, emaxb,eminb,MSc): 00510 #print "Bar Stress add..." 00511 self.eType[eid] = eType 00512 self.e1[eid] = [e1a,e1b] 00513 self.e2[eid] = [e2a,e2b] 00514 self.e3[eid] = [e3a,e3b] 00515 self.e4[eid] = [e4a,e4b] 00516 self.axial[eid] = axial 00517 self.emax[eid] = [emaxa,emaxb] 00518 self.emin[eid] = [emina,eminb] 00519 #self.MS_tension[eid] = MSt 00520 #self.MS_compression[eid] = MSc 00521 00522 #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) 00523 #print msg 00524 #if nodeID==0: raise Exception(msg) 00525 00526 def addNewEidSort1(self,eType,dt,eid,e1a,e2a,e3a,e4a,axial,emaxa,emina,MSt, 00527 e1b,e2b,e3b,e4b, emaxb,eminb,MSc): 00528 #print "Bar Stress add..." 00529 00530 self.eType[eid] = eType 00531 if dt not in self.e1: 00532 self.addNewTransient(dt) 00533 00534 self.e1[dt][eid] = [e1a,e1b] 00535 self.e2[dt][eid] = [e2a,e2b] 00536 self.e3[dt][eid] = [e3a,e3b] 00537 self.e4[dt][eid] = [e4a,e4b] 00538 self.axial[dt][eid] = axial 00539 self.emax[dt][eid] = [emaxa,emaxb] 00540 self.emin[dt][eid] = [emina,eminb] 00541 #self.MS_tension[dt][eid] = MSt 00542 #self.MS_compression[dt][eid] = MSc 00543 00544 #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) 00545 #print msg 00546 #if nodeID==0: raise Exception(msg) 00547 00548 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00549 if self.isTransient: 00550 return self.writeF06Transient(header,pageStamp,pageNum,f) 00551 00552 msg = header+[ 00553 ' S T R A I N S I N B A R E L E M E N T S ( C B A R )\n', 00554 ' ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T\n', 00555 ' ID. SB1 SB2 SB3 SB4 STRAIN SB-MAX SB-MIN M.S.-C\n', 00556 ] 00557 for eid,E1s in sorted(self.e1.iteritems()): 00558 eType = self.eType[eid] 00559 axial = self.axial[eid] 00560 #MSt = self.MSt[eid] 00561 #MSc = self.MSc[eid] 00562 MSt = '' 00563 MSc = '' 00564 00565 e1 = self.e1[eid] 00566 e2 = self.e2[eid] 00567 e3 = self.e3[eid] 00568 e4 = self.e4[eid] 00569 emax = self.emax[eid] 00570 emin = self.emin[eid] 00571 vals = [e1[0],e2[0],e3[0],e4[0],axial,emax[0],emin[0], 00572 e1[1],e2[1],e3[1],e4[1],emax[1],emin[1]] 00573 (vals2,isAllZeros) = self.writeFloats13E(vals) 00574 [e10,e20,e30,e40,axial,emax0,emin0, 00575 e11,e21,e31,e41,emax1,emin1] = vals2 00576 00577 msg.append('0%8i %13s %13s %13s %13s %13s %13s %13s %-s\n' %(eid, e10,e20,e30,e40,axial,emax0,emin0,MSt.rstrip())) 00578 msg.append(' %8s %13s %13s %13s %13s %13s %13s %13s %-s\n' %('', e11,e21,e31,e41,'', emax1,emin1,MSc.rstrip())) 00579 ### 00580 msg.append(pageStamp+str(pageNum)+'\n') 00581 return (''.join(msg),pageNum) 00582 00583 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00584 words = [ 00585 ' S T R A I N S I N B A R E L E M E N T S ( C B A R )\n', 00586 ' ELEMENT SA1 SA2 SA3 SA4 AXIAL SA-MAX SA-MIN M.S.-T\n', 00587 ' ID. SB1 SB2 SB3 SB4 STRAIN SB-MAX SB-MIN M.S.-C\n', 00588 ] 00589 msg = [] 00590 for dt,E1s in sorted(self.e1.iteritems()): 00591 header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt) 00592 msg += header + words 00593 for eid,e1s in sorted(E1s.iteritems()): 00594 eType = self.eType[eid] 00595 axial = self.axial[eid] 00596 #MSt = self.MSt[eid] 00597 #MSc = self.MSc[eid] 00598 MSt = '' 00599 MSc = '' 00600 00601 e1 = self.e1[eid] 00602 e2 = self.e2[eid] 00603 e3 = self.e3[eid] 00604 e4 = self.e4[eid] 00605 emax = self.emax[eid] 00606 emin = self.emin[eid] 00607 vals = [e1[0],e2[0],e3[0],e4[0],axial,emax[0],emin[0], 00608 e1[1],e2[1],e3[1],e4[1],emax[1],emin[1]] 00609 (vals2,isAllZeros) = self.writeFloats13E(vals) 00610 [e10,e20,e30,e40,axial,emax0,emin0, 00611 e11,e21,e31,e41,emax1,emin1] = vals2 00612 00613 msg.append('0%8i %13s %13s %13s %13s %13s %13s %13s %-s\n' %(eid, e10,e20,e30,e40,axial,emax0,emin0,MSt.rstrip())) 00614 msg.append(' %8s %13s %13s %13s %13s %13s %13s %13s %-s\n' %('', e11,e21,e31,e41,'', emax1,emin1,MSc.rstrip())) 00615 ### 00616 msg.append(pageStamp+str(pageNum)+'\n') 00617 pageNum+=1 00618 return (''.join(msg),pageNum-1) 00619 00620 def __repr__(self): 00621 if self.isTransient: 00622 return self.__reprTransient__() 00623 00624 msg = '---BAR STRAIN---\n' 00625 msg += '%-8s %6s ' %('EID','eType') 00626 headers = ['e1','e2','e3','e4','Axial','eMax','eMin'] 00627 for header in headers: 00628 msg += '%10s ' %(header) 00629 msg += '\n' 00630 00631 for eid,E1s in sorted(self.e1.iteritems()): 00632 eType = self.eType[eid] 00633 axial = self.axial[eid] 00634 #MSt = self.MS_tension[eid] 00635 #MSc = self.MS_compression[eid] 00636 00637 e1 = self.e1[eid] 00638 e2 = self.e2[eid] 00639 e3 = self.e3[eid] 00640 e4 = self.e4[eid] 00641 emax = self.emax[eid] 00642 emin = self.emin[eid] 00643 msg += '%-8i %6s ' %(eid,eType) 00644 vals = [e1[0],e2[0],e3[0],e4[0],axial,emax[0],emin[0]] 00645 for val in vals: 00646 if abs(val)<1e-6: 00647 msg += '%10s ' %('0') 00648 else: 00649 msg += '%10.3g ' %(val) 00650 ### 00651 msg += '\n' 00652 00653 msg += '%s ' %(' '*17) 00654 vals = [e1[1],e2[1],e3[1],e4[1],'',emax[1],emin[1]] 00655 for val in vals: 00656 if isinstance(val,str): 00657 msg += '%10s ' %(val) 00658 elif abs(val)<1e-6: 00659 msg += '%10s ' %('0') 00660 else: 00661 msg += '%10.3g ' %(val) 00662 ### 00663 msg += '\n' 00664 00665 #msg += "eid=%-4s eType=%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i axial=-%5i smax=%-5i smax=%-4i\n" %(eid,eType,s1[0],s2[0],s3[0],s4[0],axial, smax[0],smin[0]) 00666 #msg += "%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i %s smax=%-5i smax=%-4i\n" %(' '*4, s1[1],s2[1],s3[1],s4[1],' ',smax[1],smin[1]) 00667 ### 00668 return msg 00669 00670 def __reprTransient__(self): 00671 msg = '---BAR STRAIN---\n' 00672 msg += '%-8s %6s ' %('EID','eType') 00673 headers = ['e1','e2','e3','e4','Axial','eMax','eMin'] 00674 for header in headers: 00675 msg += '%10s ' %(header) 00676 msg += '\n' 00677 00678 for dt,E1s in sorted(self.e1.iteritems()): 00679 msg += "%s = %g\n" %(self.dataCode['name'],dt) 00680 for eid,e1s in sorted(Els.iteritems()): 00681 eType = self.eType[eid] 00682 axial = self.axial[dt][eid] 00683 #MSt = self.MS_tension[dt][eid] 00684 #MSc = self.MS_compression[dt][eid] 00685 00686 e1 = self.e1[dt][eid] 00687 e2 = self.e2[dt][eid] 00688 e3 = self.e3[dt][eid] 00689 e4 = self.e4[dt][eid] 00690 emax = self.emax[dt][eid] 00691 emin = self.emin[dt][eid] 00692 msg += '%-8i %6s ' %(eid,eType) 00693 vals = [e1[0],e2[0],e3[0],e4[0],axial,emax[0],emin[0]] 00694 for val in vals: 00695 if abs(val)<1e-6: 00696 msg += '%10s ' %('0') 00697 else: 00698 msg += '%10.3g ' %(val) 00699 ### 00700 msg += '\n' 00701 00702 msg += '%s ' %(' '*17) 00703 vals = [e1[1],e2[1],e3[1],e4[1],'',emax[1],emin[1]] 00704 for val in vals: 00705 if isinstance(val,str): 00706 msg += '%10s ' %(val) 00707 elif abs(val)<1e-6: 00708 msg += '%10s ' %('0') 00709 else: 00710 msg += '%10.3g ' %(val) 00711 ### 00712 msg += '\n' 00713 00714 #msg += "eid=%-4s eType=%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i axial=-%5i smax=%-5i smax=%-4i\n" %(eid,eType,s1[0],s2[0],s3[0],s4[0],axial, smax[0],smin[0]) 00715 #msg += "%s s1=%-4i s2=%-4i s3=%-4i s4=%-4i %s smax=%-5i smax=%-4i\n" %(' '*4, s1[1],s2[1],s3[1],s4[1],' ',smax[1],smin[1]) 00716 ### 00717 ### 00718 return msg