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