pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oqg_mpcForces.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 MPCForcesObject(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 = 'mpcForces'
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)
00042         msg = header+['                               F O R C E S   O F   M U L T I - 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         ###
00058         msg.append(pageStamp+str(pageNum)+'\n')
00059         if f is not None:
00060             f.write(''.join(msg))
00061             msg = ['']
00062         return (''.join(msg),pageNum)
00063 
00064     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00065         words = ['                               F O R C E S   O F   M U L T I - P O I N T   C O N S T R A I N T\n',
00066                  ' \n',
00067                  '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00068         msg = []
00069         for dt,translations in sorted(self.translations.iteritems()):
00070             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00071             msg += header+words
00072             for nodeID,translation in sorted(translations.iteritems()):
00073                 rotation = self.rotations[dt][nodeID]
00074                 gridType = self.gridTypes[nodeID]
00075 
00076                 (dx,dy,dz) = translation
00077                 (rx,ry,rz) = rotation
00078                 vals = [dx,dy,dz,rx,ry,rz]
00079                 (vals2,isAllZeros) = self.writeFloats13E(vals)
00080                 if not isAllZeros:
00081                     [dx,dy,dz,rx,ry,rz] = vals2
00082                     msg.append('%14i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip()))
00083                 ###
00084             ###
00085             msg.append(pageStamp+str(pageNum)+'\n')
00086             if f is not None:
00087                 f.write(''.join(msg))
00088                 msg = ['']
00089             pageNum+=1
00090         return (''.join(msg),pageNum-1)
00091 
00092     def __reprTransient__(self):
00093         msg = '---MPC FORCES---\n'
00094         if self.nonlinearFactor is not None:
00095             msg += 'dt = %g\n' %(self.dt)
00096 
00097         headers = ['T1','T2','T3','R1','R2','R3']
00098         msg += '%-8s ' %('GRID')
00099         for header in headers:
00100             msg += '%10s ' %(header)
00101         msg += '\n'
00102 
00103         for dt,translations in sorted(self.translations.iteritems()):
00104             msg += 'dt = %s' %(dt)
00105             for nodeID,translation in sorted(translations.iteritems()):
00106                 rotation = self.rotations[dt][nodeID]
00107                 (Fx,Fy,Fz) = translation
00108                 (Mx,My,Mz) = rotation
00109 
00110                 msg += '%-8i ' %(nodeID)
00111                 vals = [Fx,Fy,Fz,Mx,My,Mx]
00112                 for val in vals:
00113                     if abs(val)<1e-6:
00114                         msg += '%10s ' %(0)
00115                     else:
00116                         msg += '%10.2f ' %(val)
00117                     ###
00118                 msg += '\n'
00119             ###
00120         return msg
00121 
00122     def __repr__(self):
00123         if self.nonlinearFactor is not None:
00124             return self.__reprTransient__()
00125 
00126         msg = '---MPC FORCES---\n'
00127         if self.dt is not None:
00128             msg += 'dt = %g\n' %(self.dt)
00129 
00130         headers = ['T1','T2','T3','R1','R2','R3']
00131         msg += '%-8s ' %('GRID')
00132         for header in headers:
00133             msg += '%10s ' %(header)
00134         msg += '\n'
00135 
00136         for nodeID,translation in sorted(self.translations.iteritems()):
00137             rotation = self.rotations[nodeID]
00138             (Fx,Fy,Fz) = translation
00139             (Mx,My,Mz) = rotation
00140 
00141             msg += '%-8i ' %(nodeID)
00142             vals = [Fx,Fy,Fz,Mx,My,Mx]
00143             for val in vals:
00144                 if abs(val)<1e-6:
00145                     msg += '%10s ' %(0)
00146                 else:
00147                     msg += '%10.2f ' %(val)
00148                 ###
00149             msg += '\n'
00150         return msg
00151 
00152 class ComplexMPCForcesObject(ComplexTableObject):
00153     def __init__(self,dataCode,isSort1,iSubcase,dt=None):
00154         ComplexTableObject.__init__(self,dataCode,isSort1,iSubcase,dt)
00155 
00156     def writeMatlab(self,iSubcase,f=None,isMagPhase=False):
00157         name = 'mpcForces'
00158         if self.nonlinearFactor is None:
00159             return self._writeMatlab(name,iSubcase,f,isMagPhase)
00160         else:
00161             return self._writeMatlabTransient(name,iSubcase,f,isMagPhase)
00162 
00163     def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00164         if self.nonlinearFactor is not None:
00165             return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase)
00166         msg = header+['                               F O R C E S   O F   M U L T I - P O I N T   C O N S T R A I N T\n',
00167                ' \n',
00168                '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00169         raise RuntimeError('is this valid...')
00170         for nodeID,translation in sorted(self.translations.iteritems()):
00171             rotation = self.rotations[nodeID]
00172             gridType = self.gridTypes[nodeID]
00173 
00174             (dx,dy,dz) = translation
00175             #dxr=dx.real; dyr=dy.real; dzr=dz.real; 
00176             #dxi=dx.imag; dyi=dy.imag; dzi=dz.imag
00177 
00178             (rx,ry,rz) = rotation
00179             #rxr=rx.real; ryr=ry.real; rzr=rz.real
00180             #rxi=rx.imag; ryi=ry.imag; rzi=rz.imag
00181 
00182             #vals = [dxr,dyr,dzr,rxr,ryr,rzr,dxi,dyi,dzi,rxi,ryi,rzi]
00183             vals = list(translation)+list(rotation)
00184             (vals2,isAllZeros) = self.writeFloats13E(vals)
00185             if not isAllZeros:
00186                 [dx,dy,dz,rx,ry,rz] = vals2
00187                 msg.append('%14i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,dx,dy,dz,rx,ry,rz.rstrip()))
00188         ###
00189         msg.append(pageStamp+str(pageNum)+'\n')
00190         if f is not None:
00191             f.write(''.join(msg))
00192             msg = ['']
00193         return (''.join(msg),pageNum)
00194 
00195     def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False):
00196         words = ['                         C O M P L E X   F O R C E S   O F   M U L T I   P O I N T   C O N S T R A I N T\n',
00197                  '                                                          (REAL/IMAGINARY)\n',
00198                  ' \n',
00199                  '      POINT ID.   TYPE          T1             T2             T3             R1             R2             R3\n']
00200         msg = []
00201         for dt,translations in sorted(self.translations.iteritems()):
00202             header[1] = ' %s = %10.4E\n' %(self.dataCode['name'],dt)
00203             msg+= header+words
00204             for nodeID,translation in sorted(translations.iteritems()):
00205                 rotation = self.rotations[dt][nodeID]
00206                 gridType = self.gridTypes[nodeID]
00207 
00208                 (dx,dy,dz) = translation
00209                 (rx,ry,rz) = rotation
00210 
00211                 vals = [dx,dy,dz,rx,ry,rz]
00212                 (vals2,isAllZeros) = self.writeImagFloats13E(vals,isMagPhase)
00213                 if not isAllZeros:
00214                     [v1r,v2r,v3r,v4r,v5r,v6r,  v1i,v2i,v3i,v4i,v5i,v6i] = vals2
00215                     msg.append('0%13i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,v1r,v2r,v3r,v4r,v5r,v6r.rstrip()))
00216                     msg.append(' %13i %6s     %13s  %13s  %13s  %13s  %13s  %-s\n' %(nodeID,gridType,v1i,v2i,v3i,v4i,v5i,v6i.rstrip()))
00217                 ###
00218             ###
00219             msg.append(pageStamp+str(pageNum)+'\n')
00220             if f is not None:
00221                 f.write(''.join(msg))
00222                 msg = ['']
00223             pageNum+=1
00224         return (''.join(msg),pageNum-1)
00225 
00226     def __reprTransient__(self):
00227         msg = '---COMPLEX MPC FORCES---\n'
00228         if self.nonlinearFactor is not None:
00229             msg += 'dt = %g\n' %(self.dt)
00230 
00231         raise RuntimeError('is this valid...')
00232         headers = ['T1','T2','T3','R1','R2','R3']
00233         msg += '%-8s ' %('GRID')
00234         for header in headers:
00235             msg += '%10s ' %(header)
00236         msg += '\n'
00237 
00238         for dt,translations in sorted(self.translations.iteritems()):
00239             msg += 'dt = %s' %(dt)
00240             for nodeID,translation in sorted(translations.iteritems()):
00241                 rotation = self.rotations[dt][nodeID]
00242                 msg += '%-8i ' %(nodeID)
00243                 vals = translation+rotation
00244                 for val in vals:
00245                     if abs(val)<1e-6:
00246                         msg += '%10s ' %(0)
00247                     else:
00248                         msg += '%10.2f ' %(val)
00249                     ###
00250                 msg += '\n'
00251             ###
00252         return msg
00253 
00254     def __repr__(self):
00255         if self.nonlinearFactor is not None:
00256             return self.__reprTransient__()
00257 
00258         msg = '---COMPLEX MPC FORCES---\n'
00259         if self.dt is not None:
00260             msg += 'dt = %g\n' %(self.dt)
00261 
00262         raise RuntimeError('is this valid...')
00263         headers = ['T1','T2','T3','R1','R2','R3']
00264         msg += '%-8s ' %('GRID')
00265         for header in headers:
00266             msg += '%10s ' %(header)
00267         msg += '\n'
00268 
00269         for nodeID,translation in sorted(self.translations.iteritems()):
00270             rotation = self.rotations[nodeID]
00271             (Fx,Fy,Fz) = translation
00272             (Mx,My,Mz) = rotation
00273 
00274             msg += '%-8i ' %(nodeID)
00275             vals = [Fx,Fy,Fz,Mx,My,Mx]
00276             for val in vals:
00277                 if abs(val)<1e-6:
00278                     msg += '%10s ' %(0)
00279                 else:
00280                     msg += '%10.2f ' %(val)
00281                 ###
00282             msg += '\n'
00283         return msg
00284 
 All Classes Namespaces Files Functions Variables