def execute(self): super(Comp_Plate, self).execute() parser = FileParser() parser.set_file(self.nastran_filename) self.comp_elm_dict = {} parser.reset_anchor() for cquad4 in range(1,26): parser.mark_anchor("CQUAD4") elmtype = parser.transfer_var(0, 1) elmid = parser.transfer_var(0, 2) pid = parser.transfer_var(0, 3) if pid not in self.comp_elm_dict: self.comp_elm_dict[ pid ] = [] self.comp_elm_dict[pid].append( elmid ) max_minor_strain_by_pid, max_major_strain_by_pid = self.calculate_max_strains() self.property1_max_major_strain = max_major_strain_by_pid[ 801 ] self.property2_max_major_strain = max_major_strain_by_pid[ 802 ] self.property3_max_major_strain = max_major_strain_by_pid[ 803 ] self.property1_max_minor_strain = max_minor_strain_by_pid[ 801 ] self.property2_max_minor_strain = max_minor_strain_by_pid[ 802 ] self.property3_max_minor_strain = max_minor_strain_by_pid[ 803 ] # Calculate the maximum strain (max(major,minor)) for each property self.property1_max_major_minor_strain = max( self.property1_max_major_strain, self.property1_max_minor_strain ) self.property2_max_major_minor_strain = max( self.property2_max_major_strain, self.property2_max_minor_strain ) self.property3_max_major_minor_strain = max( self.property3_max_major_strain, self.property3_max_minor_strain )
def load_model(self, filename): """Reads in an existing PDCYL input file and populates the variable tree with its values.""" infile = FileParser() infile.set_file(filename) # Title is a string self.title = infile.transfer_line(2) # Print flag becomes a Bool if infile.transfer_var(4, 1) == 3: self.icalc = True else: self.icalc = False # Named variables in dictionary for key, val in self._fields.iteritems(): self.set(val, infile.transfer_var(key, 1))
def load_model(self, filename): """Reads in an existing PDCYL input file and populates the variable tree with its values.""" infile = FileParser() infile.set_file(filename) # Title is a string self.title = infile.transfer_line(2) # Print flag becomes a Bool if infile.transfer_var(4, 1) == 3: self.icalc = True else: self.icalc = False # Named variables in dictionary for key, val in self._fields.iteritems(): self.set(val, infile.transfer_var(key, 1))
def test_output_parse(self): data = "Junk\n" + \ "Anchor\n" + \ " A 1, 2 34, Test 1e65\n" + \ " B 4 Stuff\n" + \ "Anchor\n" + \ " C 77 False NaN 333.444\n" + \ " 1,2,3,4,5\n" + \ " Inf 1.#QNAN -1.#IND\n" outfile = open(self.filename, 'w') outfile.write(data) outfile.close() gen = FileParser() gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('Anchor') val = gen.transfer_var(1, 1) self.assertEqual(val, 'A') gen.reset_anchor() val = gen.transfer_var(3, 2) self.assertEqual(val, 4) self.assertEqual(type(val), int) gen.mark_anchor('Anchor',2) val = gen.transfer_var(1, 4) self.assertEqual(isnan(val), True) val = gen.transfer_var(3, 1) self.assertEqual(isinf(val), True) val = gen.transfer_var(3, 2) self.assertEqual(isnan(val), True) val = gen.transfer_var(3, 3) self.assertEqual(isnan(val), True) val = gen.transfer_line(-1) self.assertEqual(val, ' B 4 Stuff') # Now, let's try column delimiters gen.set_delimiters('columns') gen.mark_anchor('Anchor',-1) val = gen.transfer_var(1, 8, 10) self.assertEqual(val, 'als') val = gen.transfer_var(1, 17) self.assertEqual(val, 333.444) # Test some errors try: gen.mark_anchor('C 77', 3.14) except ValueError, err: msg = "The value for occurrence must be an integer" self.assertEqual(str(err), msg)
def test_comment_char(self): # Check to see if the use of the comment # characters works data = "Junk\n" + \ "CAnchor\n" + \ " Z 11, 22 344, Test 1e65\n" + \ " B 4 Stuff\n" + \ " $ Anchor\n" + \ " Q 1, 2 34, Test 1e65\n" + \ " B 4 Stuff\n" + \ "Anchor\n" + \ " A 1, 2 34, Test 1e65\n" + \ " B 4 Stuff\n" + \ "Anchor\n" + \ " C 77 False NaN 333.444\n" + \ " 1,2,3,4,5\n" + \ " Inf 1.#QNAN -1.#IND\n" outfile = open(self.filename, 'w') outfile.write(data) outfile.close() # Test full line comments gen = FileParser(full_line_comment_char="C") gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('Anchor') val = gen.transfer_var(1, 1) self.assertEqual(val, 'A') # Test end of line comments also gen = FileParser(full_line_comment_char="C", end_of_line_comment_char="$") gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('Anchor') val = gen.transfer_var(1, 1) self.assertEqual(val, 'A')
def test_comment_char(self): # Check to see if the use of the comment # characters works data = "Junk\n" + \ "CAnchor\n" + \ " Z 11, 22 344, Test 1e65\n" + \ " B 4 Stuff\n" + \ " $ Anchor\n" + \ " Q 1, 2 34, Test 1e65\n" + \ " B 4 Stuff\n" + \ "Anchor\n" + \ " A 1, 2 34, Test 1e65\n" + \ " B 4 Stuff\n" + \ "Anchor\n" + \ " C 77 False NaN 333.444\n" + \ " 1,2,3,4,5\n" + \ " Inf 1.#QNAN -1.#IND\n" outfile = open(self.filename, 'w') outfile.write(data) outfile.close() # Test full line comments gen = FileParser(full_line_comment_char="C") gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('Anchor') val = gen.transfer_var(1, 1) self.assertEqual(val, 'A') # Test end of line comments also gen = FileParser(full_line_comment_char="C", end_of_line_comment_char="$") gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('Anchor') val = gen.transfer_var(1, 1) self.assertEqual(val, 'A')
def test_output_parse_same_anchors(self): data = "CQUAD4 1 3.456\n" + \ "CQUAD4 2 4.123\n" + \ "CQUAD4 3 7.222\n" + \ "CQUAD4 4\n" outfile = open(self.filename, 'w') outfile.write(data) outfile.close() gen = FileParser() gen.set_file(self.filename) gen.set_delimiters(' ') gen.mark_anchor('CQUAD4') val = gen.transfer_var(0, 3) self.assertEqual(val, 3.456) gen.mark_anchor('CQUAD4') val = gen.transfer_var(0, 3) self.assertEqual(val, 4.123) gen.mark_anchor('CQUAD4', 2) val = gen.transfer_var(0, 2) self.assertEqual(val, 4) gen.reset_anchor() gen.mark_anchor('CQUAD4', -1) val = gen.transfer_var(0, 2) self.assertEqual(val, 4) gen.mark_anchor('CQUAD4', -1) val = gen.transfer_var(0, 3) self.assertEqual(val, 7.222) gen.mark_anchor('CQUAD4', -2) val = gen.transfer_var(0, 3) self.assertEqual(val, 4.123)
def parse_output(self): """Parses the HSRNOISE output file and extracts data.""" outfile = FileParser() outfile.set_file('test.output') outfile.mark_anchor("JN8C4 JET NOISE MODULE") outfile.mark_anchor("TOTAL") self.thetas = outfile.transfer_array(4,2,4,18) self.Freq = outfile.transfer_2Darray(7,1,30,1) self.SPL = outfile.transfer_2Darray(7,2,30,18) outfile.mark_anchor("DBA") self.OASPL = outfile.transfer_array(-1, 2, -1, 18) self.OASPL30 = outfile.transfer_var(-1, 4) self.OASPL60 = outfile.transfer_var(-1, 7) self.OASPL90 = outfile.transfer_var(-1, 10) self.OASPL120 = outfile.transfer_var(-1, 13) self.OASPL150 = outfile.transfer_var(-1, 16) outfile.mark_anchor("EPNL SUMMARY") self.TotalEPNL = outfile.transfer_var(9, 2) self.TotalMaxPNLT = outfile.transfer_var(9, 5) self.JetEPNL = outfile.transfer_var(8, 2)
def parse_output(self): """Parses the HSRNOISE output file and extracts data.""" outfile = FileParser() outfile.set_file('test.output') outfile.mark_anchor("JN8C4 JET NOISE MODULE") outfile.mark_anchor("TOTAL") self.thetas = outfile.transfer_array(4, 2, 4, 18) self.Freq = outfile.transfer_2Darray(7, 1, 30, 1) self.SPL = outfile.transfer_2Darray(7, 2, 30, 18) outfile.mark_anchor("DBA") self.OASPL = outfile.transfer_array(-1, 2, -1, 18) self.OASPL30 = outfile.transfer_var(-1, 4) self.OASPL60 = outfile.transfer_var(-1, 7) self.OASPL90 = outfile.transfer_var(-1, 10) self.OASPL120 = outfile.transfer_var(-1, 13) self.OASPL150 = outfile.transfer_var(-1, 16) outfile.mark_anchor("EPNL SUMMARY") self.TotalEPNL = outfile.transfer_var(9, 2) self.TotalMaxPNLT = outfile.transfer_var(9, 5) self.JetEPNL = outfile.transfer_var(8, 2)
def test_more_delims(self): data = "anchor,1.0,2.0\n" + \ "abc=123.456\n" + \ "c=1,2,Word,6\n" + \ "d=C:/abc/def,a+b*c^2,(%#%),!true\n" + \ "a^33 1.#QNAN^#$%^" outfile = open(self.filename, 'w') outfile.write(data) outfile.close() op = FileParser() op.set_file(self.filename) olddelims = op.delimiter op.set_delimiters(' \t,=') op.mark_anchor('anchor') val = op.transfer_var(0, 1) self.assertEqual(val, 'anchor') val = op.transfer_var(0, 2) self.assertEqual(val, 1.0) val = op.transfer_var(1, 1) self.assertEqual(val, 'abc') val = op.transfer_var(1, 2) self.assertEqual(val, 123.456) val = op.transfer_var(2, 4) self.assertEqual(val, 'Word') val = op.transfer_var(2, 5) self.assertEqual(val, 6) val = op.transfer_var(3, 2) self.assertEqual(val, 'C:/abc/def') val = op.transfer_var(3, 3) self.assertEqual(val, 'a+b*c^2') val = op.transfer_var(3, 4) self.assertEqual(val, '(%#%)') val = op.transfer_var(3, 5) self.assertEqual(val, '!true') op.set_delimiters(' \t^') val = op.transfer_var(4, 1) self.assertEqual(val, 'a') val = op.transfer_var(4, 2) self.assertEqual(val, 33) val = op.transfer_var(4, 3) self.assertEqual(isnan(val), True) val = op.transfer_var(4, 4) self.assertEqual(val, '#$%')
def load_model(self, control_input='control.in', flocond_input='flocond.in', expnd_input='expnd.in', zrdmix_input='zrdmix.in', hwall_input='hwall.in'): '''Reads in an existing set of input files and populates the model.''' ignore = ['ist', 'ifab'] ct = Namelist(self) ct.set_filename(control_input) ct.parse_file() ct.load_model(ignore=ignore) ignore = ['p01d', 'p02d', 't01d', 't02d', 'rm1', 'rm2', 'gam', 'pinf', 'a1d', 'a2d', 'a3d'] fc = Namelist(self) fc.set_filename(flocond_input) fc.parse_file() fc.load_model(ignore=ignore) self.flow_in.pri.Pt = fc.find_card('floc', 'p01d') self.flow_in.sec.Pt = fc.find_card('floc', 'p02d') self.flow_in.pri.Tt = fc.find_card('floc', 't01d') self.flow_in.sec.Tt = fc.find_card('floc', 't02d') self.flow_in.pri.Mach = fc.find_card('floc', 'rm1') self.flow_in.sec.Mach = fc.find_card('floc', 'rm2') self.flow_in.gamma = fc.find_card('floc', 'gam') self.flow_in.Pstatic = fc.find_card('floc', 'pinf') a1d = fc.find_card('floc', 'a1d') a2d = fc.find_card('floc', 'a2d') a3d = fc.find_card('floc', 'a3d') ep = Namelist(self) ep.set_filename(expnd_input) ep.parse_file() ep.load_model() ignore = ['RLD', 'H0LM', 'H0HY', 'ALP1', 'ALP2', 'BWID'] zr = Namelist(self) zr.set_filename(zrdmix_input) zr.parse_file() zr.load_model(ignore=ignore) self.geo_in.length = zr.find_card('zrd', 'RLD') self.geo_in.LhWave = zr.find_card('zrd', 'H0LM') self.geo_in.LhMh = zr.find_card('zrd', 'H0HY') self.geo_in.ChuteAngles = zr.find_card('zrd', 'ALP1') #self.geo_in.ChuteAngles = zr.find_card('zrd', 'ALP2') BWID = zr.find_card('zrd', 'BWID') parser = FileParser() parser.set_file(hwall_input) parser.set_delimiters(", ") nrow = parser.transfer_var(0, 1) geom = zeros((nrow, 2), 'd') for index in range(nrow): geom[index, :] = parser.transfer_array(1+index, 1, 1+index, 2) self.geom = geom # Reverse area calculations for AsAp, AeAt and AR # Note that DREA only uses half the area as it assumes a plane of symmetry self.geo_in.Apri = 2.0*a1d self.geo_in.AsAp = 2.0*a2d/self.geo_in.Apri self.geo_in.Asec = self.geo_in.AsAp*self.geo_in.Apri self.geo_in.AeAt = 2.0*a3d/(self.geo_in.Apri+self.geo_in.Asec) self.geo_in.AR = BWID*BWID/(self.geo_in.Apri+self.geo_in.Asec) #self.geo_in.length = self.geom[-1, 0] self.geo_in.width = 0.5*(self.geo_in.Apri + self.geo_in.Asec)/self.geom[0,1] self.geo_in.Aexit = 2.0*self.geom[-1,1]*self.geo_in.width