pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oqg_spcForces.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 #from numpy import array
00026 from pyNastran.op2.resultObjects.tableObject import TableObject,ComplexTableObject
00027 
00028 class SPCForcesObject(TableObject):
00029     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00030         TableObject.__init__(self,dataCode,isSort1,iSubcase,dt)
00031 
00032     def writeMatlab(self,iSubcase,f=None,isMagPhase=False):
00033         name = 'spcForces'
00034         if self.nonlinearFactor is None:
00035             return self._writeMatlab(name,iSubcase,f)
00036         else:
00037             return self._writeMatlabTransient(name,iSubcase,f)
00038 
00039     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00040         if self.nonlinearFactor is not None:
00041             return self.writeF06Transient(header,pageStamp,pageNum,f)
00042         msg = header+['                               F O R C E S   O F   S I N G L E - P O I N T   C O N S T R A I N T\n',
00043                ' \n',
00044                '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00045         for nodeID,translation in sorted(self.translations.iteritems()):
00046             rotation = self.rotations[nodeID]
00047             gridType = self.gridTypes[nodeID]
00048 
00049             (dx,dy,dz) = translation
00050             (rx,ry,rz) = rotation
00051             vals = [dx,dy,dz,rx,ry,rz]
00052             (vals2,isAllZeros) = self.writeFloats13E(vals)
00053             if not isAllZeros:
00054                 [dx,dy,dz,rx,ry,rz] = vals2
00055                 msg.append('%14i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip()))
00056         ###
00057         msg.append(pageStamp+str(pageNum)+'\n')
00058         if f is not None:
00059             f.write(''.join(msg))
00060             msg = ['']
00061         return (''.join(msg),pageNum)
00062 
00063     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00064         words = ['                               F O R C E S   O F   S I N G L E - P O I N T   C O N S T R A I N T\n',
00065                  ' \n',
00066                  '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00067         return self._writeF06TransientBlock(words,header,pageStamp,pageNum,f)
00068 
00069     def __reprTransient__(self):
00070         msg = '---SPC FORCES---\n'
00071         if self.nonlinearFactor is not None:
00072             msg += 'dt = %g\n' %(self.dt)
00073 
00074         headers = ['T1','T2','T3','R1','R2','R3']
00075         msg += '%-8s ' %('GRID')
00076         for header in headers:
00077             msg += '%10s ' %(header)
00078         msg += '\n'
00079 
00080         for dt,translations in sorted(self.translations.iteritems()):
00081             msg += 'dt = %s' %(dt)
00082             for nodeID,translation in sorted(translations.iteritems()):
00083                 rotation = self.rotations[dt][nodeID]
00084                 (Fx,Fy,Fz) = translation
00085                 (Mx,My,Mz) = rotation
00086 
00087                 msg += '%-8i ' %(nodeID)
00088                 vals = [Fx,Fy,Fz,Mx,My,Mx]
00089                 for val in vals:
00090                     if abs(val)<1e-6:
00091                         msg += '%10s ' %(0)
00092                     else:
00093                         msg += '%10.2f ' %(val)
00094                     ###
00095                 msg += '\n'
00096             ###
00097         return msg
00098 
00099     def __repr__(self):
00100         return self.writeF06(['',''],'PAGE ',1)[0]
00101 
00102         if self.nonlinearFactor is not None:
00103             return self.__reprTransient__()
00104 
00105         msg = '---SPC FORCES---\n'
00106         if self.dt is not None:
00107             msg += 'dt = %g\n' %(self.dt)
00108 
00109         headers = ['T1','T2','T3','R1','R2','R3']
00110         msg += '%-8s ' %('GRID')
00111         for header in headers:
00112             msg += '%10s ' %(header)
00113         msg += '\n'
00114 
00115         for nodeID,translation in sorted(self.translations.iteritems()):
00116             rotation = self.rotations[nodeID]
00117             (Fx,Fy,Fz) = translation
00118             (Mx,My,Mz) = rotation
00119 
00120             msg += '%-8i ' %(nodeID)
00121             vals = [Fx,Fy,Fz,Mx,My,Mx]
00122             for val in vals:
00123                 if abs(val)<1e-6:
00124                     msg += '%10s ' %(0)
00125                 else:
00126                     msg += '%10.2f ' %(val)
00127                 ###
00128             msg += '\n'
00129         return msg
00130 
00131 class ComplexSPCForcesObject(ComplexTableObject):
00132     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00133         ComplexTableObject.__init__(self,dataCode,isSort1,iSubcase,dt)
00134 
00135     def writeMatlab(self,iSubcase,f=None,isMagPhase=False):
00136         name = 'spcForces'
00137         if self.nonlinearFactor is None:
00138             return self._writeMatlab(name,iSubcase,f)
00139         else:
00140             return self._writeMatlabTransient(name,iSubcase,f)
00141 
00142     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00143         if self.nonlinearFactor is not None:
00144             return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase)
00145         msg = header+['                               F O R C E S   O F   S I N G L E - P O I N T   C O N S T R A I N T\n',
00146                ' \n',
00147                '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00148         raise RuntimeError('is this valid...')
00149         for nodeID,translation in sorted(self.translations.iteritems()):
00150             rotation = self.rotations[nodeID]
00151             gridType = self.gridTypes[nodeID]
00152 
00153             (dx,dy,dz) = translation
00154             #dxr=dx.real; dyr=dy.real; dzr=dz.real; 
00155             #dxi=dx.imag; dyi=dy.imag; dzi=dz.imag
00156 
00157             (rx,ry,rz) = rotation
00158             #rxr=rx.real; ryr=ry.real; rzr=rz.real
00159             #rxi=rx.imag; ryi=ry.imag; rzi=rz.imag
00160 
00161             #vals = [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi]
00162             vals = list(translation)+list(rotation)
00163             (vals2,isAllZeros) = self.writeFloats13E(vals)
00164             if not isAllZeros:
00165                 [dx,dy,dz,rx,ry,rz] = vals2
00166                 msg.append('%14i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip()))
00167         ###
00168         msg.append(pageStamp+str(pageNum)+'\n')
00169         if f is not None:
00170             f.write(''.join(msg))
00171             msg = ['']
00172         return (''.join(msg),pageNum)
00173 
00174     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00175         words = ['                         C O M P L E X   F O R C E S   O F   S I N G L E   P O I N T   C O N S T R A I N T\n']
00176         return self._writeF06TransientBlock(words,header,pageStamp,pageNum,f,isMagPhase)
00177 
00178     def __reprTransient__(self):
00179         msg = '---COMPLEX SPC FORCES---\n'
00180         if self.nonlinearFactor is not None:
00181             msg += 'dt = %g\n' %(self.dt)
00182 
00183         raise RuntimeError('is this valid...')
00184         headers = ['T1','T2','T3','R1','R2','R3']
00185         msg += '%-8s ' %('GRID')
00186         for header in headers:
00187             msg += '%10s ' %(header)
00188         msg += '\n'
00189 
00190         for dt,translations in sorted(self.translations.iteritems()):
00191             msg += 'dt = %s' %(dt)
00192             for nodeID,translation in sorted(translations.iteritems()):
00193                 rotation = self.rotations[dt][nodeID]
00194                 msg += '%-8i ' %(nodeID)
00195                 vals = translation+rotation
00196                 for val in vals:
00197                     if abs(val)<1e-6:
00198                         msg += '%10s ' %(0)
00199                     else:
00200                         msg += '%10.2f ' %(val)
00201                     ###
00202                 msg += '\n'
00203             ###
00204         return msg
00205 
00206     def __repr__(self):
00207         return self.writeF06(['',''],'PAGE ',1)[0]
00208         if self.nonlinearFactor is not None:
00209             return self.__reprTransient__()
00210 
00211         msg = '---COMPLEX SPC FORCES---\n'
00212         if self.nonlinearFactor is not None:
00213             msg += 'dt = %g\n' %(self.dt)
00214 
00215         raise RuntimeError('is this valid...')
00216         headers = ['T1','T2','T3','R1','R2','R3']
00217         msg += '%-8s ' %('GRID')
00218         for header in headers:
00219             msg += '%10s ' %(header)
00220         msg += '\n'
00221 
00222         for nodeID,translation in sorted(self.translations.iteritems()):
00223             rotation = self.rotations[nodeID]
00224             (Fx,Fy,Fz) = translation
00225             (Mx,My,Mz) = rotation
00226 
00227             msg += '%-8i ' %(nodeID)
00228             vals = [Fx,Fy,Fz,Mx,My,Mx]
00229             for val in vals:
00230                 if abs(val)<1e-6:
00231                     msg += '%10s ' %(0)
00232                 else:
00233                     msg += '%10.2f ' %(val)
00234                 ###
00235             msg += '\n'
00236         return msg
00237 
 All Classes Namespaces Files Functions Variables