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 import sys 00026 #import copy 00027 00028 # pyNastran 00029 from pyNastran.op2.resultObjects.tableObject import TableObject,ComplexTableObject 00030 00031 class AccelerationObject(TableObject): # approachCode=11, thermal=0 00032 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00033 TableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00034 00035 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00036 name = 'accelerations' 00037 if self.nonlinearFactor is None: 00038 return self._writeMatlab(name,iSubcase,f) 00039 else: 00040 return self._writeMatlabTransient(name,iSubcase,f) 00041 00042 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00043 if self.nonlinearFactor is not None: 00044 return self.writeF06Transient(header,pageStamp,pageNum,f) 00045 words = [' A C C E L E R A T I O N V E C T O R\n', 00046 ' \n', 00047 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00048 words += self.getTableMarker() 00049 return self._writeF06Block(words,header,pageStamp,pageNum,f) 00050 00051 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00052 words = [' A C C E L E R A T I O N V E C T O R\n', 00053 ' \n', 00054 ' POINT ID. TYPE T1 T2 T3 R1 R2 R3\n'] 00055 words += self.getTableMarker() 00056 return self._writeF06TransientBlock(words,header,pageStamp,pageNum,f) 00057 00058 def __repr__(self): 00059 #return '' 00060 if self.nonlinearFactor is not None: 00061 return self.__reprTransient__() 00062 00063 msg = '---ACCELERATIONS---\n' 00064 msg += self.writeHeader() 00065 00066 for nodeID,translation in sorted(self.translations.iteritems()): 00067 rotation = self.rotations[nodeID] 00068 gridType = self.gridTypes[nodeID] 00069 00070 (dx,dy,dz) = translation 00071 (rx,ry,rz) = rotation 00072 00073 msg += '%-10i %-8s ' %(nodeID,gridType) 00074 vals = [dx,dy,dz,rx,ry,rz] 00075 for val in vals: 00076 if abs(val)<1e-6: 00077 msg += '%10s ' %(0) 00078 else: 00079 msg += '%10.3e ' %(val) 00080 ### 00081 msg += '\n' 00082 return msg 00083 00084 def __reprTransient__(self): 00085 msg = '---TRANSIENT ACCELERATIONS---\n' 00086 msg += self.writeHeader() 00087 00088 for dt,translations in sorted(self.translations.iteritems()): 00089 msg += '%s = %g\n' %(self.dataCode['name'],dt) 00090 for nodeID,translation in sorted(translations.iteritems()): 00091 rotation = self.rotations[dt][nodeID] 00092 gridType = self.gridTypes[nodeID] 00093 (dx,dy,dz) = translation 00094 (rx,ry,rz) = rotation 00095 00096 msg += '%-10i %8s ' %(nodeID,gridType) 00097 vals = [dx,dy,dz,rx,ry,rz] 00098 for val in vals: 00099 if abs(val)<1e-6: 00100 msg += '%10s ' %(0) 00101 else: 00102 msg += '%10.3e ' %(val) 00103 ### 00104 msg += '\n' 00105 ### 00106 return msg 00107 00108 class ComplexAccelerationObject(ComplexTableObject): # tableCode=11, approachCode=??? 00109 def __init__(self,dataCode,isSort1,iSubcase,dt=None): 00110 ComplexTableObject.__init__(self,dataCode,isSort1,iSubcase,dt) 00111 00112 def writeMatlab(self,iSubcase,f=None,isMagPhase=False): 00113 name = 'accelerations' 00114 if self.nonlinearFactor is None: 00115 return self._writeMatlab(name,iSubcase,f,isMagPhase) 00116 else: 00117 return self._writeMatlabTransient(name,iSubcase,f,isMagPhase) 00118 00119 def writeF06(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00120 if self.nonlinearFactor is not None: 00121 return self.writeF06Transient(header,pageStamp,pageNum,f,isMagPhase) 00122 00123 words = [' C O M P L E X A C C E L E R A T I O N V E C T O R\n'] 00124 return self._writeF06Block(words,header,pageStamp,pageNum,f,isMagPhase) 00125 00126 def writeF06Transient(self,header,pageStamp,pageNum=1,f=None,isMagPhase=False): 00127 words = [' C O M P L E X A C C E L E R A T I O N V E C T O R\n'] 00128 return self._writeF06TransientBlock(words,header,pageStamp,pageNum,f,isMagPhase) 00129 00130 def __repr__(self): 00131 return self.writeF06(['','',''],'PAGE ',1)[0] 00132 #if self.nonlinearFactor is not None: 00133 #return self.__reprTransient__() 00134 00135 msg = '---COMPLEX ACCELERATIONS---\n' 00136 #if self.nonlinearFactor is not None: 00137 # msg += '%s = %g\n' %(self.dataCode['name'],self.dt) 00138 headers = ['DxReal','DxImag','DyReal','DyImag','DzReal','DyImag','RxReal','RxImag','RyReal','RyImag','RzReal','RzImag'] 00139 msg += '%-10s ' %('nodeID') 00140 for header in headers: 00141 msg += '%10s ' %(header) 00142 msg += '\n' 00143 00144 for freq,translations in sorted(self.translations.iteritems()): 00145 msg += '%s = %g\n' %(self.dataCode['name'],freq) 00146 00147 for nodeID,translation in sorted(translations.iteritems()): 00148 rotation = self.rotations[freq][nodeID] 00149 00150 msg += '%-10i ' %(nodeID) 00151 vals = translation+rotation 00152 for val in vals: 00153 if abs(val)<1e-6: 00154 msg += '%10s ' %(0) 00155 else: 00156 msg += '%10.3e ' %(val) 00157 ### 00158 msg += '\n' 00159 ### 00160 return msg