def test_create_subcomm(self): vm = OcgVM() if vm.size != 2: raise SkipTest('vm.size != 2') self.assertFalse(vm._is_dummy) vm.create_subcomm('test', [], is_current=True) self.assertTrue(vm.is_null) vm.finalize() self.assertFalse(vm.is_null)
def test_barrier(self): if MPI_SIZE != 4: raise SkipTest('MPI_SIZE != 4') vm = OcgVM() live_ranks = [1, 3] vm.create_subcomm('for barrier', live_ranks, is_current=True) if not vm.is_null: self.assertEqual(vm.size, 2) else: self.assertNotIn(MPI_RANK, live_ranks) if MPI_RANK in live_ranks: vm.barrier() vm.finalize()
def test_gather(self): if MPI_SIZE != 8: raise SkipTest('MPI_SIZE != 8') vm = OcgVM() live_ranks = [1, 3, 7] # vm.set_live_ranks(live_ranks) vm.create_subcomm('tester', live_ranks, is_current=True) if MPI_RANK in live_ranks: value = MPI_RANK gathered_value = vm.gather(value) if MPI_RANK == 1: self.assertEqual(gathered_value, [1, 3, 7]) elif MPI_RANK in live_ranks: self.assertIsNone(gathered_value) vm.finalize()
def test_bcast(self): if MPI_SIZE != 8: raise SkipTest('MPI_SIZE != 8') vm = OcgVM() live_ranks = [1, 3, 5] vm.create_subcomm('tester', live_ranks, is_current=True) # vm.set_live_ranks(live_ranks) if vm.rank == 0: root_value = 101 else: root_value = None if MPI_RANK in live_ranks: global_value = vm.bcast(root_value) self.assertEqual(global_value, 101) else: self.assertIsNone(root_value) vm.finalize()
def test_get_intersects(self): dist = OcgDist() dist.create_dimension('x', 5, dist=False) dist.create_dimension('y', 5, dist=True) dist.update_dimension_bounds() if MPI_RANK == 0: x = Variable(value=[1, 2, 3, 4, 5], name='x', dimensions=['x']) y = Variable(value=[10, 20, 30, 40, 50], name='y', dimensions=['y']) else: x, y = [None] * 2 x = variable_scatter(x, dist) y = variable_scatter(y, dist) if MPI_RANK < 2: self.assertTrue(y.dimensions[0].dist) grid = Grid(x=x, y=y) if not grid.is_empty: self.assertTrue(grid.dimensions[0].dist) pa = get_geometry_variable(grid) if MPI_RANK >= 2: self.assertTrue(pa.is_empty) polygon = box(2.5, 15, 4.5, 45) if not grid.is_empty: self.assertTrue(pa.dimensions[0].dist) # if MPI_RANK == 0: # self.write_fiona_htmp(GeometryVariable(value=polygon), 'polygon') # self.write_fiona_htmp(grid.abstraction_geometry, 'grid-{}'.format(MPI_RANK)) # Try an empty subset. live_ranks = vm.get_live_ranks_from_object(pa) vm.create_subcomm('test_get_intersects', live_ranks, is_current=True) if not vm.is_null: with self.assertRaises(EmptySubsetError): pa.get_intersects(Point(-8000, 9000)) sub, slc = pa.get_intersects(polygon, return_slice=True) else: sub, slc = [None] * 2 # self.write_fiona_htmp(sub, 'sub-{}'.format(MPI_RANK)) if MPI_SIZE == 1: self.assertEqual(sub.shape, (3, 2)) else: # This is the non-distributed dimension. if MPI_SIZE == 2: self.assertEqual(sub.shape[1], 2) # This is the distributed dimension. if MPI_RANK in live_ranks: if MPI_RANK < 5: self.assertNotEqual(sub.shape[0], 3) else: self.assertTrue(sub.is_empty) if not vm.is_null: desired_points_slc = pa.get_distributed_slice(slc).get_value() desired_points_manual = [Point(x, y) for x, y in itertools.product(grid.x.get_value().flat, grid.y.get_value().flat)] desired_points_manual = [pt for pt in desired_points_manual if pt.intersects(polygon)] for desired_points in [desired_points_manual, desired_points_slc.flat]: for pt in desired_points: found = False for pt_actual in sub.get_value().flat: if pt_actual.almost_equals(pt): found = True break self.assertTrue(found) # Test w/out an associated grid. if not vm.is_null: pa = self.get_geometryvariable(dimensions='ngeom') polygon = box(0.5, 1.5, 1.5, 2.5) sub = pa.get_intersects(polygon) self.assertEqual(sub.shape, (1,)) self.assertEqual(sub.get_value()[0], Point(1, 2))
def test_create_subcomm(self): vm = OcgVM() vm.create_subcomm('test', [], is_current=True) self.assertTrue(vm.is_null) vm.finalize() self.assertFalse(vm.is_null)
def test_get_intersects(self): dist = OcgDist() dist.create_dimension('x', 5, dist=False) dist.create_dimension('y', 5, dist=True) dist.update_dimension_bounds() if MPI_RANK == 0: x = Variable(value=[1, 2, 3, 4, 5], name='x', dimensions=['x']) y = Variable(value=[10, 20, 30, 40, 50], name='y', dimensions=['y']) else: x, y = [None] * 2 x = variable_scatter(x, dist) y = variable_scatter(y, dist) if MPI_RANK < 2: self.assertTrue(y.dimensions[0].dist) grid = Grid(x=x, y=y) if not grid.is_empty: self.assertTrue(grid.dimensions[0].dist) pa = get_geometry_variable(grid) if MPI_RANK >= 2: self.assertTrue(pa.is_empty) polygon = box(2.5, 15, 4.5, 45) if not grid.is_empty: self.assertTrue(pa.dimensions[0].dist) # if MPI_RANK == 0: # self.write_fiona_htmp(GeometryVariable(value=polygon), 'polygon') # self.write_fiona_htmp(grid.abstraction_geometry, 'grid-{}'.format(MPI_RANK)) # Try an empty subset. live_ranks = vm.get_live_ranks_from_object(pa) vm.create_subcomm('test_get_intersects', live_ranks, is_current=True) if not vm.is_null: with self.assertRaises(EmptySubsetError): pa.get_intersects(Point(-8000, 9000)) sub, slc = pa.get_intersects(polygon, return_slice=True) else: sub, slc = [None] * 2 # self.write_fiona_htmp(sub, 'sub-{}'.format(MPI_RANK)) if MPI_SIZE == 1: self.assertEqual(sub.shape, (3, 2)) else: # This is the non-distributed dimension. if MPI_SIZE == 2: self.assertEqual(sub.shape[1], 2) # This is the distributed dimension. if MPI_RANK in live_ranks: if MPI_RANK < 5: self.assertNotEqual(sub.shape[0], 3) else: self.assertTrue(sub.is_empty) if not vm.is_null: desired_points_slc = pa.get_distributed_slice(slc).get_value() desired_points_manual = [ Point(x, y) for x, y in itertools.product(grid.x.get_value().flat, grid.y.get_value().flat) ] desired_points_manual = [ pt for pt in desired_points_manual if pt.intersects(polygon) ] for desired_points in [ desired_points_manual, desired_points_slc.flat ]: for pt in desired_points: found = False for pt_actual in sub.get_value().flat: if pt_actual.almost_equals(pt): found = True break self.assertTrue(found) # Test w/out an associated grid. if not vm.is_null: pa = self.get_geometryvariable(dimensions='ngeom') polygon = box(0.5, 1.5, 1.5, 2.5) sub = pa.get_intersects(polygon) self.assertEqual(sub.shape, (1, )) self.assertEqual(sub.get_value()[0], Point(1, 2))