def test_q_2d(self): logging.debug('') logging.debug('test_q_2d') logger = logging.getLogger() wedge = create_wedge_2d((20, 10), 0.5, 2., 30.) # Big-endian binary. write_plot3d_q(wedge, 'be-binary.xyz', 'be-binary.q', logger=logger, big_endian=True, unformatted=False) domain = read_plot3d_q('be-binary.xyz', 'be-binary.q', logger=logger, dim=2, multiblock=False, big_endian=True, unformatted=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger)) # Little-endian unformatted. write_plot3d_q(domain, 'unformatted.xyz', 'unformatted.q', logger=logger) domain = read_plot3d_q('unformatted.xyz', 'unformatted.q', logger=logger, dim=2, multiblock=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger))
def test_q_3d(self): logging.debug('') logging.debug('test_q_3d') logger = logging.getLogger() wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) # Big-endian binary. write_plot3d_q(wedge, 'be-binary.xyz', 'be-binary.q', logger=logger, big_endian=True, unformatted=False) domain = read_plot3d_q('be-binary.xyz', 'be-binary.q', logger=logger, multiblock=False, big_endian=True, unformatted=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger)) # Little-endian unformatted. write_plot3d_q(domain, 'unformatted.xyz', 'unformatted.q', logger=logger) domain = read_plot3d_q('unformatted.xyz', 'unformatted.q', logger=logger, multiblock=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger)) # Multiblock. wedge2 = create_wedge_3d((29, 19, 9), 5., 2.5, 4., 30.) domain.add_domain(wedge2) write_plot3d_q(domain, 'unformatted.xyz', 'unformatted.q', logger=logger) domain = read_plot3d_q('unformatted.xyz', 'unformatted.q', logger=logger) shape = read_plot3d_shape('unformatted.xyz', logger=logger) self.assertEqual(shape, [(30, 20, 10), (29, 19, 9)]) # Errors. try: read_plot3d_q('unformatted.xyz', 'unformatted.q', blanking=True, logger=logger, multiblock=False) except NotImplementedError as exc: self.assertEqual(str(exc), 'blanking not supported yet') else: self.fail('Expected NotImplementedError') try: read_plot3d_q('unformatted.xyz', 'unformatted.q', planes=True, logger=logger, multiblock=False) except NotImplementedError as exc: self.assertEqual(str(exc), 'planar format not supported yet') else: self.fail('Expected NotImplementedError')
def test_q_3d(self): logging.debug('') logging.debug('test_q_3d') logger = logging.getLogger() wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) # Big-endian binary. write_plot3d_q(wedge, 'be-binary.xyz', 'be-binary.q', logger=logger, big_endian=True, unformatted=False) domain = read_plot3d_q('be-binary.xyz', 'be-binary.q', logger=logger, multiblock=False, big_endian=True, unformatted=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger)) # Little-endian unformatted. write_plot3d_q(domain, 'unformatted.xyz', 'unformatted.q', logger=logger) domain = read_plot3d_q('unformatted.xyz', 'unformatted.q', logger=logger, multiblock=False) self.assertFalse(domain.is_equivalent(wedge, logger=logger)) domain.rename_zone('xyzzy', domain.zone_1) self.assertTrue(domain.is_equivalent(wedge, logger=logger)) # Multiblock. wedge2 = create_wedge_3d((29, 19, 9), 5., 2.5, 4., 30.) domain.add_domain(wedge2) write_plot3d_q(domain, 'unformatted.xyz', 'unformatted.q', logger=logger) domain = read_plot3d_q('unformatted.xyz', 'unformatted.q', logger=logger) shape = read_plot3d_shape('unformatted.xyz', logger=logger) self.assertEqual(shape, [(30, 20, 10), (29, 19, 9)]) # Errors. try: read_plot3d_q('unformatted.xyz', 'unformatted.q', blanking=True, logger=logger, multiblock=False) except NotImplementedError as exc: self.assertEqual(str(exc), 'blanking not supported yet') else: self.fail('Expected NotImplementedError') try: read_plot3d_q('unformatted.xyz', 'unformatted.q', planes=True, logger=logger, multiblock=False) except NotImplementedError as exc: self.assertEqual(str(exc), 'planar format not supported yet') else: self.fail('Expected NotImplementedError') assert_raises(self, "write_plot3d_q(logger, 'u.xyz', 'u.q')", globals(), locals(), TypeError, "'domain' argument must be a DomainObj or Zone") assert_raises(self, "write_plot3d_f(logger, 'u.xyz', 'u.f')", globals(), locals(), TypeError, "'domain' argument must be a DomainObj or Zone") assert_raises(self, "write_plot3d_grid(logger, 'u.xyz')", globals(), locals(), TypeError, "'domain' argument must be a DomainObj or Zone") wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) delattr(wedge.xyzzy.flow_solution, 'mach') assert_raises(self, "write_plot3d_q(wedge, 'u.xyz', 'u.q')", globals(), locals(), AttributeError, "zone xyzzy flow_solution is missing ['mach']") assert_raises(self, "write_plot3d_f(wedge, 'u.xyz', 'u.f', ['froboz'])", globals(), locals(), AttributeError, "zone xyzzy flow_solution is missing ['froboz']")
def test_extend(self): logging.debug('') logging.debug('test_extend') logger = logging.getLogger() # Create vanilla 3D wedge. wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) self.assertEqual(wedge.xyzzy.shape, (30, 20, 10)) self.assertEqual(wedge.xyzzy.flow_solution.shape, (30, 20, 10)) # Extend for ghost planes. domain = wedge.extend([('i', +1., 2, 1)]) zone = domain.xyzzy self.assertEqual(zone.shape, (32, 20, 10)) self.assertEqual(zone.flow_solution.shape, (31, 20, 10)) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (35, 20, 10)) self.assertEqual(zone.flow_solution.shape, (32, 20, 10)) zone = zone.extend('j', +1., 2, 1) self.assertEqual(zone.shape, (35, 22, 10)) self.assertEqual(zone.flow_solution.shape, (32, 21, 10)) zone = zone.extend('j', -1., 3, 1) self.assertEqual(zone.shape, (35, 25, 10)) self.assertEqual(zone.flow_solution.shape, (32, 22, 10)) zone = zone.extend('k', +1., 2, 1) self.assertEqual(zone.shape, (35, 25, 12)) self.assertEqual(zone.flow_solution.shape, (32, 22, 11)) zone = zone.extend('k', -1., 3, 1) self.assertEqual(zone.shape, (35, 25, 15)) self.assertEqual(zone.flow_solution.shape, (32, 22, 12)) self.assertEqual(zone.grid_coordinates.shape, (35, 25, 15)) # Uncomment to visualize result. # Note that unless you fix the flow extensions above to match the grid # extensions the flow will have strange artifacts. # write_plot3d_q(zone, 'ghost_wedge.xyz', 'ghost_wedge.q') zone.grid_coordinates.ghosts = (3, 2, 3, 2, 3, 2) self.assertEqual(zone.grid_coordinates.shape, (30, 20, 10)) zone.flow_solution.ghosts = (1, 1, 1, 1, 1, 1) self.assertEqual(zone.flow_solution.shape, (30, 20, 10)) # Extract to no-ghosts zone and show equivalent to original. zone2 = zone.extract(0, -1, 0, -1, 0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone2.shape, (30, 20, 10)) self.assertEqual(zone2.flow_solution.shape, (30, 20, 10)) self.assertTrue(zone2.is_equivalent(wedge.xyzzy, logger)) # Write out with ghosts in place. Read and show equivalent to original. try: write_plot3d_q(zone, 'zone_3d.xyz', 'zone_3d.q') domain = read_plot3d_q('zone_3d.xyz', 'zone_3d.q', multiblock=False) self.assertTrue(domain.zone_1.is_equivalent(wedge.xyzzy, logger)) finally: for name in ('zone_3d.xyz', 'zone_3d.q'): if os.path.exists(name): os.remove(name) # Create vanilla 2D wedge. wedge = create_wedge_2d((20, 10), 0.5, 2., 30.) self.assertEqual(wedge.xyzzy.shape, (20, 10)) self.assertEqual(wedge.xyzzy.flow_solution.shape, (20, 10)) # Extend for ghost planes. zone = wedge.xyzzy.extend('i', +1., 2, 1) self.assertEqual(zone.shape, (22, 10)) self.assertEqual(zone.flow_solution.shape, (21, 10)) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (25, 10)) self.assertEqual(zone.flow_solution.shape, (22, 10)) zone = zone.extend('j', +1., 2, 1) self.assertEqual(zone.shape, (25, 12)) self.assertEqual(zone.flow_solution.shape, (22, 11)) zone = zone.extend('j', -1., 3, 1) self.assertEqual(zone.shape, (25, 15)) self.assertEqual(zone.flow_solution.shape, (22, 12)) # Uncomment to visualize result. # Note that unless you fix the flow extensions above to match the grid # extensions the flow will have strange artifacts. # write_plot3d_q(zone, 'ghost_sector.xyz', 'ghost_sector.q') zone.grid_coordinates.ghosts = (3, 2, 3, 2) self.assertEqual(zone.grid_coordinates.shape, (20, 10)) zone.flow_solution.ghosts = (1, 1, 1, 1) self.assertEqual(zone.flow_solution.shape, (20, 10)) write_plot3d_q(wedge, 'zone_2d.xyz', 'zone_2d.q') # Extract to no-ghosts zone and show equivalent to original. zone2 = zone.extract(0, -1, 0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone2.shape, (20, 10)) self.assertEqual(zone2.flow_solution.shape, (20, 10)) self.assertTrue(zone2.is_equivalent(wedge.xyzzy, logger)) # Write out with ghosts in place. Read and show equivalent to original. try: write_plot3d_q(zone, 'zone_2d.xyz', 'zone_2d.q') domain = read_plot3d_q('zone_2d.xyz', 'zone_2d.q', dim=2, multiblock=False) self.assertTrue(domain.zone_1.is_equivalent(wedge.xyzzy, logger)) finally: for name in ('zone_2d.xyz', 'zone_2d.q'): if os.path.exists(name): os.remove(name) # Create vanilla 2D curve. curve = create_curve_2d(20, 0.5, 30.) self.assertEqual(curve.xyzzy.shape, (20, )) self.assertEqual(curve.xyzzy.flow_solution.shape, (20, )) # Extend for ghost planes. zone = curve.xyzzy.extend('i', +1., 2, 1) self.assertEqual(zone.shape, (22, )) self.assertEqual(zone.flow_solution.shape, (21, )) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (25, )) self.assertEqual(zone.flow_solution.shape, (22, )) zone.grid_coordinates.ghosts = (3, 2) self.assertEqual(zone.grid_coordinates.shape, (20, )) zone.flow_solution.ghosts = (1, 1) self.assertEqual(zone.flow_solution.shape, (20, )) # Extract to no-ghosts zone and show equivalent to original. zone = zone.extract(0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone.shape, (20, )) self.assertEqual(zone.flow_solution.shape, (20, )) self.assertTrue(zone.is_equivalent(curve.xyzzy, logger)) # No-op extend. wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) domain = wedge.extend([('i', +1., 0, 0)]) self.assertTrue(domain.is_equivalent(wedge, logger)) assert_raises(self, "wedge.xyzzy.flow_solution.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises( self, "wedge.xyzzy.flow_solution.momentum.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises(self, "wedge.xyzzy.flow_solution.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.flow_solution.momentum.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.flow_solution.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') assert_raises( self, "wedge.xyzzy.flow_solution.momentum.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') wedge = create_wedge_2d((30, 20), 0.5, 2., 30.) assert_raises(self, "wedge.xyzzy.flow_solution.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') assert_raises( self, "wedge.xyzzy.flow_solution.momentum.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') curve = create_curve_2d(20, 0.5, 30.) assert_raises(self, "curve.xyzzy.flow_solution.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises(self, "curve.xyzzy.grid_coordinates.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises( self, "curve.xyzzy.flow_solution.momentum.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises(self, "FlowSolution().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'FlowSolution is empty!') assert_raises(self, "GridCoordinates().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'Grid is empty!') assert_raises(self, "Vector().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'Vector is empty!')
def test_extend(self): logging.debug('') logging.debug('test_extend') logger = logging.getLogger() # Create vanilla 3D wedge. wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) self.assertEqual(wedge.xyzzy.shape, (30, 20, 10)) self.assertEqual(wedge.xyzzy.flow_solution.shape, (30, 20, 10)) # Extend for ghost planes. domain = wedge.extend([('i', +1., 2, 1)]) zone = domain.xyzzy self.assertEqual(zone.shape, (32, 20, 10)) self.assertEqual(zone.flow_solution.shape, (31, 20, 10)) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (35, 20, 10)) self.assertEqual(zone.flow_solution.shape, (32, 20, 10)) zone = zone.extend('j', +1., 2, 1) self.assertEqual(zone.shape, (35, 22, 10)) self.assertEqual(zone.flow_solution.shape, (32, 21, 10)) zone = zone.extend('j', -1., 3, 1) self.assertEqual(zone.shape, (35, 25, 10)) self.assertEqual(zone.flow_solution.shape, (32, 22, 10)) zone = zone.extend('k', +1., 2, 1) self.assertEqual(zone.shape, (35, 25, 12)) self.assertEqual(zone.flow_solution.shape, (32, 22, 11)) zone = zone.extend('k', -1., 3, 1) self.assertEqual(zone.shape, (35, 25, 15)) self.assertEqual(zone.flow_solution.shape, (32, 22, 12)) self.assertEqual(zone.grid_coordinates.shape, (35, 25, 15)) # Uncomment to visualize result. # Note that unless you fix the flow extensions above to match the grid # extensions the flow will have strange artifacts. # write_plot3d_q(zone, 'ghost_wedge.xyz', 'ghost_wedge.q') zone.grid_coordinates.ghosts = (3, 2, 3, 2, 3, 2) self.assertEqual(zone.grid_coordinates.shape, (30, 20, 10)) zone.flow_solution.ghosts = (1, 1, 1, 1, 1, 1) self.assertEqual(zone.flow_solution.shape, (30, 20, 10)) # Extract to no-ghosts zone and show equivalent to original. zone2 = zone.extract(0, -1, 0, -1, 0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone2.shape, (30, 20, 10)) self.assertEqual(zone2.flow_solution.shape, (30, 20, 10)) self.assertTrue(zone2.is_equivalent(wedge.xyzzy, logger)) # Write out with ghosts in place. Read and show equivalent to original. try: write_plot3d_q(zone, 'zone_3d.xyz', 'zone_3d.q') domain = read_plot3d_q('zone_3d.xyz', 'zone_3d.q', multiblock=False) self.assertTrue(domain.zone_1.is_equivalent(wedge.xyzzy, logger)) finally: for name in ('zone_3d.xyz', 'zone_3d.q'): if os.path.exists(name): os.remove(name) # Create vanilla 2D wedge. wedge = create_wedge_2d((20, 10), 0.5, 2., 30.) self.assertEqual(wedge.xyzzy.shape, (20, 10)) self.assertEqual(wedge.xyzzy.flow_solution.shape, (20, 10)) # Extend for ghost planes. zone = wedge.xyzzy.extend('i', +1., 2, 1) self.assertEqual(zone.shape, (22, 10)) self.assertEqual(zone.flow_solution.shape, (21, 10)) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (25, 10)) self.assertEqual(zone.flow_solution.shape, (22, 10)) zone = zone.extend('j', +1., 2, 1) self.assertEqual(zone.shape, (25, 12)) self.assertEqual(zone.flow_solution.shape, (22, 11)) zone = zone.extend('j', -1., 3, 1) self.assertEqual(zone.shape, (25, 15)) self.assertEqual(zone.flow_solution.shape, (22, 12)) # Uncomment to visualize result. # Note that unless you fix the flow extensions above to match the grid # extensions the flow will have strange artifacts. # write_plot3d_q(zone, 'ghost_sector.xyz', 'ghost_sector.q') zone.grid_coordinates.ghosts = (3, 2, 3, 2) self.assertEqual(zone.grid_coordinates.shape, (20, 10)) zone.flow_solution.ghosts = (1, 1, 1, 1) self.assertEqual(zone.flow_solution.shape, (20, 10)) write_plot3d_q(wedge, 'zone_2d.xyz', 'zone_2d.q') # Extract to no-ghosts zone and show equivalent to original. zone2 = zone.extract(0, -1, 0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone2.shape, (20, 10)) self.assertEqual(zone2.flow_solution.shape, (20, 10)) self.assertTrue(zone2.is_equivalent(wedge.xyzzy, logger)) # Write out with ghosts in place. Read and show equivalent to original. try: write_plot3d_q(zone, 'zone_2d.xyz', 'zone_2d.q') domain = read_plot3d_q('zone_2d.xyz', 'zone_2d.q', dim=2, multiblock=False) self.assertTrue(domain.zone_1.is_equivalent(wedge.xyzzy, logger)) finally: for name in ('zone_2d.xyz', 'zone_2d.q'): if os.path.exists(name): os.remove(name) # Create vanilla 2D curve. curve = create_curve_2d(20, 0.5, 30.) self.assertEqual(curve.xyzzy.shape, (20,)) self.assertEqual(curve.xyzzy.flow_solution.shape, (20,)) # Extend for ghost planes. zone = curve.xyzzy.extend('i', +1., 2, 1) self.assertEqual(zone.shape, (22,)) self.assertEqual(zone.flow_solution.shape, (21,)) zone = zone.extend('i', -1., 3, 1) self.assertEqual(zone.shape, (25,)) self.assertEqual(zone.flow_solution.shape, (22,)) zone.grid_coordinates.ghosts = (3, 2) self.assertEqual(zone.grid_coordinates.shape, (20,)) zone.flow_solution.ghosts = (1, 1) self.assertEqual(zone.flow_solution.shape, (20,)) # Extract to no-ghosts zone and show equivalent to original. zone = zone.extract(0, -1, grid_ghosts=(0, 0, 0, 0, 0, 0), flow_ghosts=(0, 0, 0, 0, 0, 0)) self.assertEqual(zone.shape, (20,)) self.assertEqual(zone.flow_solution.shape, (20,)) self.assertTrue(zone.is_equivalent(curve.xyzzy, logger)) # No-op extend. wedge = create_wedge_3d((30, 20, 10), 5., 0.5, 2., 30.) domain = wedge.extend([('i', +1., 0, 0)]) self.assertTrue(domain.is_equivalent(wedge, logger)) assert_raises(self, "wedge.xyzzy.flow_solution.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises(self, "wedge.xyzzy.flow_solution.momentum.extend('i', 0., 10)", globals(), locals(), ValueError, 'delta must be non-zero') assert_raises(self, "wedge.xyzzy.flow_solution.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.flow_solution.momentum.extend('i', 1., 0)", globals(), locals(), ValueError, 'npoints must be >= 1') assert_raises(self, "wedge.xyzzy.flow_solution.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') assert_raises(self, "wedge.xyzzy.flow_solution.momentum.extend('l', 1., 10)", globals(), locals(), ValueError, 'axis must be i, j, or k') wedge = create_wedge_2d((30, 20), 0.5, 2., 30.) assert_raises(self, "wedge.xyzzy.flow_solution.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') assert_raises(self, "wedge.xyzzy.grid_coordinates.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') assert_raises(self, "wedge.xyzzy.flow_solution.momentum.extend('k', 1., 10)", globals(), locals(), ValueError, 'axis must be i or j') curve = create_curve_2d(20, 0.5, 30.) assert_raises(self, "curve.xyzzy.flow_solution.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises(self, "curve.xyzzy.grid_coordinates.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises(self, "curve.xyzzy.flow_solution.momentum.extend('j', 1., 10)", globals(), locals(), ValueError, 'axis must be i') assert_raises(self, "FlowSolution().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'FlowSolution is empty!') assert_raises(self, "GridCoordinates().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'Grid is empty!') assert_raises(self, "Vector().extend('j', 1., 10)", globals(), locals(), RuntimeError, 'Vector is empty!')