pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
ogf_Objects.py
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables