pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
oug.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 #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     
 All Classes Namespaces Files Functions Variables