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 import sys 00026 from struct import pack 00027 from pyNastran.op2.resultObjects.op2_Objects import scalarObject 00028 00029 class gridPointForcesObject(scalarObject): 00030 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00031 scalarObject.__init__(self,dataCode,iSubcase) 00032 self.forces = {} 00033 self.moments = {} 00034 self.elemName = {} 00035 self.eids = {} 00036 00037 self.dt = dt 00038 if isSort1: 00039 if dt is not None: 00040 self.add = self.addSort1 00041 ### 00042 else: 00043 assert dt is not None 00044 self.add = self.addSort2 00045 ### 00046 00047 def addNewTransient(self,dt): # eKey 00048 """initializes the transient variables""" 00049 self.forces[dt] = {} 00050 self.moments[dt] = {} 00051 #self.elemName[dt] = {} 00052 #self.eids[dt] = {} 00053 #self.elemName[eKey] = [] 00054 #self.eids[eKey] = [] 00055 self.elemName = {} 00056 self.eids = {} 00057 00058 def add(self,dt,eKey,eid,elemName,f1,f2,f3,m1,m2,m3): 00059 if eKey not in self.forces: 00060 self.eids[eKey] = [] 00061 self.forces[eKey] = [] 00062 self.moments[eKey] = [] 00063 self.elemName[eKey] = [] 00064 self.forces[eKey].append( [f1,f2,f3]) # Fx,Fy,Fz 00065 self.moments[eKey].append([m1,m2,m3]) # Mx,My,Mz 00066 self.elemName[eKey].append(elemName) 00067 self.eids[eKey].append(eid) 00068 00069 def addSort1(self,dt,eKey,eid,elemName,f1,f2,f3,m1,m2,m3): 00070 if dt not in self.forces: 00071 #print "new transient" 00072 self.addNewTransient(dt) 00073 00074 #print "%s=%s eKey=%s eid=%s elemName=%s f1=%s" %(self.dataCode['name'],dt,eKey,eid,elemName,f1) 00075 if eKey not in self.forces[dt]: 00076 self.eids[eKey] = [] 00077 self.forces[dt][eKey] = [] 00078 self.moments[dt][eKey] = [] 00079 self.elemName[eKey] = [] 00080 self.forces[dt][eKey].append( [f1,f2,f3]) # Mx,My,Mz 00081 self.moments[dt][eKey].append([m1,m2,m3]) # Fx,Fy,Fz 00082 self.elemName[eKey].append(elemName) 00083 self.eids[eKey].append(eid) 00084 00085 def updateDt(self,dataCode,freq): 00086 self.dataCode = dataCode 00087 self.applyDataCode() 00088 if freq is not None: 00089 self.log.debug("updating %s...%s=%s iSubcase=%s" %(self.dataCode['name'],self.dataCode['name'],freq,self.iSubcase)) 00090 self.dt = dt 00091 self.addNewTransient() 00092 ### 00093 00094 def deleteTransient(self,dt): 00095 del self.forces[dt] 00096 del self.moments[dt] 00097 del self.elemName[dt] 00098 00099 def getTransients(self): 00100 k = self.forces.keys() 00101 k.sort() 00102 return k 00103 00104 #def cleanupObj(self): 00105 #k = self.elemName.keys() 00106 #self.elemName = self.elemName[k[0]] 00107 #self.eids = self.eids[k[0]] 00108 00109 def writeF06(self,header,pageStamp,pageNum=1,f=None): 00110 if self.nonlinearFactor is not None: 00111 return self.writeF06Transient(header,pageStamp,pageNum,f) 00112 00113 msg = header+[' G R I D P O I N T F O R C E B A L A N C E\n', 00114 ' \n', 00115 ' POINT-ID ELEMENT-ID SOURCE T1 T2 T3 R1 R2 R3\n',] 00116 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00117 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00118 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00119 zero = ' ' 00120 for eKey,Force in sorted(self.forces.iteritems()): 00121 for iLoad,force in enumerate(Force): 00122 (f1,f2,f3) = force 00123 (m1,m2,m3) = self.moments[eKey][iLoad] 00124 (elemName) = self.elemName[eKey][iLoad] 00125 eid = self.eids[eKey][iLoad] 00126 vals = [f1,f2,f3,m1,m2,m3] 00127 (vals2,isAllZeros) = self.writeFloats13E(vals) 00128 [f1,f2,f3,m1,m2,m3] = vals2 00129 if eid==0: 00130 eid='' 00131 msg.append('%s %8s %10s %-8s %s %s %s %s %s %-s\n' %(zero,eKey,eid,elemName,f1,f2,f3,m1,m2,m3.rstrip())) 00132 zero=' ' 00133 zero = '0' 00134 ### 00135 ### 00136 msg.append(pageStamp+str(pageNum)+'\n') 00137 if f is not None: 00138 f.write(''.join(msg)) 00139 msg = [''] 00140 return (''.join(msg),pageNum) 00141 00142 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None): 00143 msg = header+[' G R I D P O I N T F O R C E B A L A N C E\n', 00144 ' \n', 00145 ' POINT-ID ELEMENT-ID SOURCE T1 T2 T3 R1 R2 R3\n',] 00146 #'0 13683 3736 TRIAX6 4.996584E+00 0.0 1.203093E+02 0.0 0.0 0.0' 00147 #' 13683 3737 TRIAX6 -4.996584E+00 0.0 -1.203093E+02 0.0 0.0 0.0' 00148 #' 13683 *TOTALS* 6.366463E-12 0.0 -1.364242E-12 0.0 0.0 0.0' 00149 for dt,Forces in sorted(self.forces.iteritems()): 00150 zero = ' ' 00151 for eKey,Force in sorted(Forces.iteritems()): 00152 for iLoad,force in enumerate(Force): 00153 (f1,f2,f3) = force 00154 (m1,m2,m3) = self.moments[dt][eKey][iLoad] 00155 (elemName) = self.elemName[eKey][iLoad] 00156 eid = self.eids[eKey][iLoad] 00157 00158 vals = [f1,f2,f3,m1,m2,m3] 00159 (vals2,isAllZeros) = self.writeFloats13E(vals) 00160 [f1,f2,f3,m1,m2,m3] = vals2 00161 if eid==0: 00162 eid='' 00163 00164 msg.append('%s %8s %10s %8s %s %s %s %s %s %-s\n' %(zero,eKey,eid,elemName,f1,f2,f3,m1,m2,m3)) 00165 zero=' ' 00166 ### 00167 zero = '0' 00168 ### 00169 msg.append(pageStamp+str(pageNum)+'\n') 00170 if f is not None: 00171 f.write(''.join(msg)) 00172 msg = [''] 00173 pageNum+=1 00174 return (''.join(msg),pageNum-1) 00175 00176 def __repr__(self): 00177 return '' 00178 return self.writeF06([],'PAGE ',1)[0] 00179 #return '---gridPointForceObject---' 00180 00181 class complexGridPointForcesObject(scalarObject): 00182 def __init__(self,dataCode,isSort1,iSubcase,freq=None): 00183 scalarObject.__init__(self,dataCode,iSubcase) 00184 raise NotImplementedError() 00185 00186 00187 00188