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 #pylint: disable=E1101,W0612,R0201 00026 from itertools import izip 00027 00028 from pyNastran.op2.tables.oug.oug_displacements import DisplacementObject, ComplexDisplacementObject 00029 from pyNastran.op2.tables.oug.oug_temperatures import TemperatureObject 00030 00031 00032 class OUG(object): 00033 def __init__(self): 00034 self.displacements = {} 00035 self.temperatures = {} 00036 00037 def getDisplacement(self): 00038 """ 00039 D I S P L A C E M E N T V E C T O R 00040 00041 POINT ID. TYPE T1 T2 T3 R1 R2 R3 00042 1 G 9.663032E-05 0.0 -2.199001E-04 0.0 -9.121119E-05 0.0 00043 2 G 0.0 0.0 0.0 0.0 0.0 0.0 00044 3 G 0.0 0.0 0.0 0.0 0.0 0.0 00045 00046 analysisCode = 1 (Statics) 00047 deviceCode = 1 (Print) 00048 tableCode = 1 (Displacement) 00049 sortCode = 0 (Sort2,Real,Sorted Results) => sortBits = [0,0,0] 00050 numWide = 8 (???) 00051 """ 00052 (subcaseName, iSubcase, transient, dt, analysisCode, isSort1) = self.readSubcaseNameID() 00053 headers = self.skip(2) 00054 dataCode = {'log':self.log, 'analysisCode':analysisCode, 00055 'deviceCode':1, 'tableCode':1, 00056 'sortCode':0, 'sortBits':[0, 0, 0], 'numWide':8, 00057 'tableName':'OUG', 'nonlinearFactor': dt} 00058 #print "headers = %s" %(headers) 00059 data = self.readTable([int,str,float,float,float,float,float,float]) 00060 00061 if iSubcase in self.displacements: 00062 self.displacements[iSubcase].addF06Data(data,transient) 00063 else: 00064 isSort1 = True 00065 disp = DisplacementObject(dataCode,isSort1,iSubcase) 00066 disp.addF06Data(data,transient) 00067 self.displacements[iSubcase] = disp 00068 self.iSubcases.append(iSubcase) 00069 00070 def getComplexDisplacement(self): # @todo: make a complexDisplacement object 00071 """ 00072 BACKWARD WHIRL 00073 SUBCASE 2 00074 POINT-ID = 101 00075 C O M P L E X D I S P L A C E M E N T V E C T O R 00076 (MAGNITUDE/PHASE) 00077 00078 FREQUENCY TYPE T1 T2 T3 R1 R2 R3 00079 2.000000E+01 G 3.242295E-16 1.630439E-01 1.630439E-01 1.691497E-17 1.362718E-01 1.362718E-01 00080 196.0668 90.0000 180.0000 63.4349 180.0000 270.0000 00081 00082 tableCode = 1 (Displacement) 00083 formatCode = 3 (Magnitude/Phase) 00084 sortBits = [0,1,1] (Sort1,Real/Imaginary,RandomResponse) 00085 analysisCode = 5 (Frequency) 00086 sortCode = 2 (Random Response) 00087 """ 00088 (subcaseName, iSubcase, transient, dt, analysisCode, isSort1) = self.readSubcaseNameID() 00089 headers = self.skip(3) 00090 data = [] 00091 00092 dataCode = {'log':self.log, 'analysisCode':5, 'deviceCode':1, 00093 'tableCode':1, 'sortCode':2, 'sortBits':[0, 1, 1], 00094 'numWide':14, 'formatCode':3, 'tableName':'OUGV1', 00095 'nonlinearFactor': dt, 00096 #'mode':iMode,'eigr':transient[1], 'modeCycle':cycle, 00097 #'dataNames':['mode', 'eigr', 'modeCycle'], 00098 #'name':'mode', 00099 #'sCode':0, 00100 #'elementName':'CBAR', 'elementType':34, 'stressBits':stressBits, 00101 } 00102 while 1: 00103 line = self.infile.readline()[1:].rstrip('\r\n ') 00104 if 'PAGE' in line: 00105 break 00106 sline = line.strip().split() 00107 line2 = self.infile.readline()[1:].rstrip('\r\n ') 00108 sline += line2.strip().split() 00109 out = [float(sline[0]),sline[1].strip(),float(sline[2]), float(sline[3]), float(sline[4]), 00110 float(sline[5]), float(sline[6]), float(sline[7]), 00111 float(sline[8]), float(sline[9]), float(sline[10]), 00112 float(sline[11]), float(sline[12]), float(sline[13]), ] 00113 #print sline 00114 #print out 00115 data.append(out) 00116 self.i += 2 00117 ### 00118 self.i += 1 00119 00120 if iSubcase in self.displacements: 00121 self.displacements[iSubcase].addF06Data(data, transient) 00122 else: 00123 isSort1 = True 00124 disp = ComplexDisplacementObject(dataCode, isSort1, iSubcase) 00125 disp.addF06Data(data, transient) 00126 self.displacements[iSubcase] = disp 00127 self.iSubcases.append(iSubcase) 00128 00129 def getTemperatureVector(self): 00130 """ 00131 LOAD STEP = 1.00000E+00 00132 T E M P E R A T U R E V E C T O R 00133 00134 POINT ID. TYPE ID VALUE ID+1 VALUE ID+2 VALUE ID+3 VALUE ID+4 VALUE ID+5 VALUE 00135 1 S 1.300000E+03 1.300000E+03 1.300000E+03 1.300000E+03 1.300000E+03 1.300000E+03 00136 7 S 1.300000E+03 1.300000E+03 1.300000E+03 1.300000E+03 00137 analysisCode = 1 (Statics) 00138 deviceCode = 1 (Print) 00139 tableCode = 1 (Displacement/Temperature) 00140 sortCode = 0 (Sort2,Real,Sorted Results) => sortBits = [0,0,0] 00141 formatCode = 1 (Real) 00142 sCode = 0 (Stress) 00143 numWide = 8 (???) 00144 """ 00145 (subcaseName, iSubcase, transient, dt, analysisCode, isSort1) = self.readSubcaseNameID() 00146 #print transient 00147 00148 headers = self.skip(2) 00149 #print "headers = %s" %(headers) 00150 data = self.readTemperatureTable() 00151 00152 dataCode = {'log':self.log, 'analysisCode':1, 'deviceCode':1, 00153 'tableCode':1, 'sortCode':0, 'sortBits':[0,0,0], 00154 'numWide':8, 'tableName':'OUG', 'nonlinearFactor': dt, 00155 #'thermalCode':1, 00156 #'formatCode':1, 00157 #'elementName':eType,'sCode':0,'stressBits':stressBits 00158 } 00159 00160 if iSubcase in self.temperatures: 00161 self.temperatures[iSubcase].addF06Data(data, transient) 00162 else: 00163 isSort1 = True 00164 temp = TemperatureObject(dataCode, isSort1, iSubcase) 00165 temp.addF06Data(data, transient) 00166 self.temperatures[iSubcase] = temp 00167 self.iSubcases.append(iSubcase) 00168 00169 def readTemperatureTable(self): 00170 data = [] 00171 Format = [int, str, float, float, float, float, float, float] 00172 while 1: 00173 line = self.infile.readline()[1:].rstrip('\r\n ') 00174 if 'PAGE' in line: 00175 return data 00176 sline = [line[0:15], line[15:22].strip(), line[22:40], line[40:55], line[55:70], line[70:85], line[85:100], line[100:115]] 00177 sline = self.parseLineTemperature(sline, Format) 00178 data.append(sline) 00179 return data 00180 00181 def parseLineTemperature(self, sline, Format): 00182 out = [] 00183 for (entry, iFormat) in izip(sline, Format): 00184 if entry is '': 00185 return out 00186 #print "sline=|%r|\n entry=|%r| format=%r" %(sline,entry,iFormat) 00187 entry2 = iFormat(entry) 00188 out.append(entry2) 00189 return out 00190