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 #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