def get_wrap_field(crs=None, unwrapped=True): ompi = OcgDist() ompi.create_dimension('x', 5, dist=False) ompi.create_dimension('y', 7, dist=True) ompi.create_dimension('time', size_current=4, dist=False) ompi.update_dimension_bounds() if MPI_RANK == 0: row = Variable(value=[-60, -40, -20, 0, 20, 40, 60], name='y', dimensions='y') if unwrapped: col_value = [1, 90, 180, 225, 270] else: col_value = [-170, -85, 0, 85, 170] col = Variable(value=col_value, name='x', dimensions='x') grid = Grid(col, row) value = np.zeros((4, 7, 5)) for col_idx in range(value.shape[-1]): value[:, :, col_idx] = col_idx time = TemporalVariable(name='time', value=[1, 2, 3, 4], dimensions='time') var = Variable(name='foo', value=value, dimensions=['time', 'y', 'x']) field = Field(grid=grid, is_data=var, crs=crs, time=time) else: field = None field = variable_collection_scatter(field, ompi) return field
def test_system_parallel_write_ndvariable(self): """Test a parallel CSV write with a n-dimensional variable.""" ompi = OcgDist() ompi.create_dimension('time', 3) ompi.create_dimension('extra', 2) ompi.create_dimension('x', 4) ompi.create_dimension('y', 7, dist=True) ompi.update_dimension_bounds() if MPI_RANK == 0: path = self.get_temporary_file_path('foo.csv') t = TemporalVariable(name='time', value=[1, 2, 3], dtype=float, dimensions='time') t.set_extrapolated_bounds('the_time_bounds', 'bounds') extra = Variable(name='extra', value=[7, 8], dimensions='extra') x = Variable(name='x', value=[9, 10, 11, 12], dimensions='x', dtype=float) x.set_extrapolated_bounds('x_bounds', 'bounds') # This will have the distributed dimension. y = Variable(name='y', value=[13, 14, 15, 16, 17, 18, 19], dimensions='y', dtype=float) y.set_extrapolated_bounds('y_bounds', 'bounds') data = Variable(name='data', value=np.random.rand(3, 2, 7, 4), dimensions=['time', 'extra', 'y', 'x']) vc = VariableCollection(variables=[t, extra, x, y, data]) else: path, vc = [None] * 2 path = MPI_COMM.bcast(path) vc = variable_collection_scatter(vc, ompi) with vm.scoped_by_emptyable('write', vc): if not vm.is_null: vc.write(path, iter_kwargs={ 'variable': 'data', 'followers': ['time', 'extra', 'y', 'x'] }, driver=DriverCSV) if MPI_RANK == 0: desired = 169 with open(path, 'r') as f: lines = f.readlines() self.assertEqual(len(lines), desired)
def test_reduce_global(self): pt = self.fixture(cindex=self.fixture_cindex(1), start_index=1) self.assertEqual(pt.start_index, 1) dist = OcgDist() for d in pt.parent.dimensions.values(): d = d.copy() if d.name == self.fixture_element_dimension.name: d.dist = True dist.add_dimension(d) dist.update_dimension_bounds() new_parent = variable_collection_scatter(pt.parent, dist) vm.create_subcomm_by_emptyable('coordinate reduction', new_parent, is_current=True) if vm.is_null: return pt.parent = new_parent sub = pt.get_distributed_slice(slice(2, 5)) vm.create_subcomm_by_emptyable('distributed slice', sub, is_current=True) if vm.is_null: return actual = sub.reduce_global() actual_cindex = actual.cindex.extract() actual_cindex = variable_gather(actual_cindex) if vm.rank == 0: actual_cindex = actual_cindex.get_value().flatten().tolist() self.assertEqual(actual_cindex, [1, 2, 3]) gathered = [ variable_gather(c.extract()) for c in actual.coordinate_variables ] if vm.rank == 0: actual_coords = [] for c in gathered: actual_coords.append(c.get_value().tolist()) desired = [[2.0, 3.0, 4.0], [8.0, 9.0, 10.0], [14.0, 15.0, 16.0]] self.assertEqual(actual_coords, desired) path = self.get_temporary_file_path('foo.nc') actual.parent.write(path) actual = Field.read(path) self.assertEqual(actual['cindex'].attrs['start_index'], 1)
def test_system_parallel_write_ndvariable(self): """Test a parallel vector GIS write with a n-dimensional variable.""" ompi = OcgDist() ompi.create_dimension('time', 3) ompi.create_dimension('extra', 2) ompi.create_dimension('x', 4) ompi.create_dimension('y', 7, dist=True) ompi.update_dimension_bounds() if MPI_RANK == 0: path = self.get_temporary_file_path('foo.shp') t = TemporalVariable(name='time', value=[1, 2, 3], dtype=float, dimensions='time') t.set_extrapolated_bounds('the_time_bounds', 'bounds') extra = Variable(name='extra', value=[7, 8], dimensions='extra') x = Variable(name='x', value=[9, 10, 11, 12], dimensions='x', dtype=float) x.set_extrapolated_bounds('x_bounds', 'bounds') # This will have the distributed dimension. y = Variable(name='y', value=[13, 14, 15, 16, 17, 18, 19], dimensions='y', dtype=float) y.set_extrapolated_bounds('y_bounds', 'bounds') data = Variable(name='data', value=np.random.rand(3, 2, 7, 4), dimensions=['time', 'extra', 'y', 'x']) dimension_map = {'x': {'variable': 'x', 'bounds': 'x_bounds'}, 'y': {'variable': 'y', 'bounds': 'y_bounds'}, 'time': {'variable': 'time', 'bounds': 'the_time_bounds'}} vc = Field(variables=[t, extra, x, y, data], dimension_map=dimension_map, is_data='data') vc.set_abstraction_geom() else: path, vc = [None] * 2 path = MPI_COMM.bcast(path) vc = variable_collection_scatter(vc, ompi) with vm.scoped_by_emptyable('write', vc): if not vm.is_null: vc.write(path, driver=DriverVector) MPI_COMM.Barrier() desired = 168 rd = RequestDataset(path, driver=DriverVector) sizes = MPI_COMM.gather(rd.get().geom.shape[0]) if MPI_RANK == 0: self.assertEqual(sum(sizes), desired)
def test_system_parallel_write_ndvariable(self): """Test a parallel vector GIS write with a n-dimensional variable.""" ompi = OcgDist() ompi.create_dimension('time', 3) ompi.create_dimension('extra', 2) ompi.create_dimension('x', 4) ompi.create_dimension('y', 7, dist=True) ompi.update_dimension_bounds() if MPI_RANK == 0: path = self.get_temporary_file_path('foo.shp') t = TemporalVariable(name='time', value=[1, 2, 3], dtype=float, dimensions='time') t.set_extrapolated_bounds('the_time_bounds', 'bounds') extra = Variable(name='extra', value=[7, 8], dimensions='extra') x = Variable(name='x', value=[9, 10, 11, 12], dimensions='x', dtype=float) x.set_extrapolated_bounds('x_bounds', 'bounds') # This will have the distributed dimension. y = Variable(name='y', value=[13, 14, 15, 16, 17, 18, 19], dimensions='y', dtype=float) y.set_extrapolated_bounds('y_bounds', 'bounds') data = Variable(name='data', value=np.random.rand(3, 2, 7, 4), dimensions=['time', 'extra', 'y', 'x']) dimension_map = {'x': {'variable': 'x', 'bounds': 'x_bounds'}, 'y': {'variable': 'y', 'bounds': 'y_bounds'}, 'time': {'variable': 'time', 'bounds': 'the_time_bounds'}} vc = Field(variables=[t, extra, x, y, data], dimension_map=dimension_map, is_data='data') vc.set_abstraction_geom() else: path, vc = [None] * 2 path = MPI_COMM.bcast(path) vc = variable_collection_scatter(vc, ompi) with vm.scoped_by_emptyable('write', vc): if not vm.is_null: vc.write(path, driver=DriverVector) MPI_COMM.Barrier() desired = 168 rd = RequestDataset(path, driver=DriverVector) sizes = MPI_COMM.gather(rd.get().geom.shape[0]) if MPI_RANK == 0: self.assertEqual(sum(sizes), desired)
def test_variable_collection_scatter(self): dest_mpi = OcgDist() five = dest_mpi.create_dimension('five', 5, dist=True) ten = dest_mpi.create_dimension('ten', 10) dest_mpi.create_variable(name='five', dimensions=five) dest_mpi.create_variable(name='all_in', dimensions=ten) dest_mpi.create_variable(name='i_could_be_a_coordinate_system') dest_mpi.update_dimension_bounds() if MPI_RANK == 0: var = Variable('holds_five', np.arange(5), dimensions='five') var_empty = Variable('i_could_be_a_coordinate_system', attrs={'reality': 'im_not'}) var_not_dist = Variable('all_in', value=np.arange(10) + 10, dimensions='ten') vc = VariableCollection(variables=[var, var_empty, var_not_dist]) else: vc = None svc = variable_collection_scatter(vc, dest_mpi) self.assertEqual( svc['i_could_be_a_coordinate_system'].attrs['reality'], 'im_not') if MPI_RANK < 2: self.assertFalse(svc['all_in'].is_empty) self.assertNumpyAll(svc['all_in'].get_value(), np.arange(10) + 10) self.assertFalse(svc.is_empty) self.assertFalse(svc['i_could_be_a_coordinate_system'].is_empty) else: self.assertTrue(svc['all_in'].is_empty) self.assertTrue(svc.is_empty) self.assertTrue(svc['i_could_be_a_coordinate_system'].is_empty) if MPI_RANK == 0: self.assertNumpyAll(var.get_value(), vc[var.name].get_value()) actual = svc['holds_five'].get_value() if MPI_SIZE == 2: desired = {0: np.arange(3), 1: np.arange(3, 5)} self.assertNumpyAll(actual, desired[MPI_RANK]) actual = svc['holds_five'].is_empty if MPI_RANK > 1: self.assertTrue(actual) else: self.assertFalse(actual)
def test_reduce_global(self): pt = self.fixture(cindex=self.fixture_cindex(1), start_index=1) self.assertEqual(pt.start_index, 1) dist = OcgDist() for d in pt.parent.dimensions.values(): d = d.copy() if d.name == self.fixture_element_dimension.name: d.dist = True dist.add_dimension(d) dist.update_dimension_bounds() new_parent = variable_collection_scatter(pt.parent, dist) vm.create_subcomm_by_emptyable('coordinate reduction', new_parent, is_current=True) if vm.is_null: return pt.parent = new_parent sub = pt.get_distributed_slice(slice(2, 5)) vm.create_subcomm_by_emptyable('distributed slice', sub, is_current=True) if vm.is_null: return actual = sub.reduce_global() actual_cindex = actual.cindex.extract() actual_cindex = variable_gather(actual_cindex) if vm.rank == 0: actual_cindex = actual_cindex.get_value().flatten().tolist() self.assertEqual(actual_cindex, [1, 2, 3]) gathered = [variable_gather(c.extract()) for c in actual.coordinate_variables] if vm.rank == 0: actual_coords = [] for c in gathered: actual_coords.append(c.get_value().tolist()) desired = [[2.0, 3.0, 4.0], [8.0, 9.0, 10.0], [14.0, 15.0, 16.0]] self.assertEqual(actual_coords, desired) path = self.get_temporary_file_path('foo.nc') actual.parent.write(path) actual = Field.read(path) self.assertEqual(actual['cindex'].attrs['start_index'], 1)
def test_system_parallel_write_ndvariable(self): """Test a parallel CSV write with a n-dimensional variable.""" ompi = OcgDist() ompi.create_dimension('time', 3) ompi.create_dimension('extra', 2) ompi.create_dimension('x', 4) ompi.create_dimension('y', 7, dist=True) ompi.update_dimension_bounds() if MPI_RANK == 0: path = self.get_temporary_file_path('foo.csv') t = TemporalVariable(name='time', value=[1, 2, 3], dtype=float, dimensions='time') t.set_extrapolated_bounds('the_time_bounds', 'bounds') extra = Variable(name='extra', value=[7, 8], dimensions='extra') x = Variable(name='x', value=[9, 10, 11, 12], dimensions='x', dtype=float) x.set_extrapolated_bounds('x_bounds', 'bounds') # This will have the distributed dimension. y = Variable(name='y', value=[13, 14, 15, 16, 17, 18, 19], dimensions='y', dtype=float) y.set_extrapolated_bounds('y_bounds', 'bounds') data = Variable(name='data', value=np.random.rand(3, 2, 7, 4), dimensions=['time', 'extra', 'y', 'x']) vc = VariableCollection(variables=[t, extra, x, y, data]) else: path, vc = [None] * 2 path = MPI_COMM.bcast(path) vc = variable_collection_scatter(vc, ompi) with vm.scoped_by_emptyable('write', vc): if not vm.is_null: vc.write(path, iter_kwargs={'variable': 'data', 'followers': ['time', 'extra', 'y', 'x']}, driver=DriverCSV) if MPI_RANK == 0: desired = 169 with open(path, 'r') as f: lines = f.readlines() self.assertEqual(len(lines), desired)
def test_variable_collection_scatter(self): dest_mpi = OcgDist() five = dest_mpi.create_dimension('five', 5, dist=True) ten = dest_mpi.create_dimension('ten', 10) dest_mpi.create_variable(name='five', dimensions=five) dest_mpi.create_variable(name='all_in', dimensions=ten) dest_mpi.create_variable(name='i_could_be_a_coordinate_system') dest_mpi.update_dimension_bounds() if MPI_RANK == 0: var = Variable('holds_five', np.arange(5), dimensions='five') var_empty = Variable('i_could_be_a_coordinate_system', attrs={'reality': 'im_not'}) var_not_dist = Variable('all_in', value=np.arange(10) + 10, dimensions='ten') vc = VariableCollection(variables=[var, var_empty, var_not_dist]) else: vc = None svc = variable_collection_scatter(vc, dest_mpi) self.assertEqual(svc['i_could_be_a_coordinate_system'].attrs['reality'], 'im_not') if MPI_RANK < 2: self.assertFalse(svc['all_in'].is_empty) self.assertNumpyAll(svc['all_in'].get_value(), np.arange(10) + 10) self.assertFalse(svc.is_empty) self.assertFalse(svc['i_could_be_a_coordinate_system'].is_empty) else: self.assertTrue(svc['all_in'].is_empty) self.assertTrue(svc.is_empty) self.assertTrue(svc['i_could_be_a_coordinate_system'].is_empty) if MPI_RANK == 0: self.assertNumpyAll(var.get_value(), vc[var.name].get_value()) actual = svc['holds_five'].get_value() if MPI_SIZE == 2: desired = {0: np.arange(3), 1: np.arange(3, 5)} self.assertNumpyAll(actual, desired[MPI_RANK]) actual = svc['holds_five'].is_empty if MPI_RANK > 1: self.assertTrue(actual) else: self.assertFalse(actual)
def test_get_intersects(self): subset_geom = self.fixture_subset_geom() poly = self.fixture() # Scatter the polygon geometry coordinates for the parallel case =============================================== dist = OcgDist() for d in poly.parent.dimensions.values(): d = d.copy() if d.name == poly.dimensions[0].name: d.dist = True dist.add_dimension(d) dist.update_dimension_bounds() poly.parent = variable_collection_scatter(poly.parent, dist) vm.create_subcomm_by_emptyable('scatter', poly, is_current=True) if vm.is_null: return poly.parent._validate_() for v in poly.parent.values(): self.assertEqual(id(v.parent), id(poly.parent)) self.assertEqual(len(v.parent), len(poly.parent)) # ============================================================================================================== # p = os.path.join('/tmp/subset_geom.shp') # s = GeometryVariable.from_shapely(subset_geom) # s.write_vector(p) # p = os.path.join('/tmp/poly.shp') # s = poly.convert_to() # s.write_vector(p) sub = poly.get_intersects(subset_geom) vm.create_subcomm_by_emptyable('after intersects', sub, is_current=True) if vm.is_null: return actual = [] for g in sub.iter_geometries(): if g[1] is not None: actual.append([g[1].centroid.x, g[1].centroid.y]) desired = [[20.0, -49.5], [10.0, -44.5], [10.0, -39.5]] actual = vm.gather(actual) if vm.rank == 0: gactual = [] for a in actual: for ia in a: gactual.append(ia) self.assertEqual(gactual, desired) self.assertEqual(len(sub.parent), len(poly.parent)) sub.parent._validate_() sub2 = sub.reduce_global() sub2.parent._validate_() # p = os.path.join('/tmp/sub.shp') # s = sub.convert_to() # s.write_vector(p) # p = os.path.join('/tmp/sub2.shp') # s = sub2.convert_to() # s.write_vector(p) # Gather then broadcast coordinates so all coordinates are available on each process. to_add = [] for gather_target in [sub2.x, sub2.y]: gathered = variable_gather(gather_target.extract()) gathered = vm.bcast(gathered) to_add.append(gathered) for t in to_add: sub2.parent.add_variable(t, force=True) for ctr, to_check in enumerate([sub, sub2]): actual = [] for g in to_check.iter_geometries(): if g[1] is not None: actual.append([g[1].centroid.x, g[1].centroid.y]) desired = [[20.0, -49.5], [10.0, -44.5], [10.0, -39.5]] actual = vm.gather(actual) if vm.rank == 0: gactual = [] for a in actual: for ia in a: gactual.append(ia) self.assertEqual(gactual, desired)
def test_get_intersects(self): self.add_barrier = False subset_geom = self.fixture_subset_geom() poly = self.fixture() dist = OcgDist() for d in poly.parent.dimensions.values(): d = d.copy() if d.name == poly.dimensions[0].name: d.dist = True dist.add_dimension(d) dist.update_dimension_bounds() poly.parent = variable_collection_scatter(poly.parent, dist) vm.create_subcomm_by_emptyable('scatter', poly, is_current=True) if vm.is_null: return poly.parent._validate_() for v in poly.parent.values(): self.assertEqual(id(v.parent), id(poly.parent)) self.assertEqual(len(v.parent), len(poly.parent)) sub = poly.get_intersects(subset_geom) vm.create_subcomm_by_emptyable('after intersects', sub, is_current=True) if vm.is_null: return actual = [] for g in sub.iter_geometries(): if g[1] is not None: actual.append([g[1].centroid.x, g[1].centroid.y]) desired = [[20.0, -49.5], [10.0, -44.5], [10.0, -39.5]] actual = vm.gather(actual) if vm.rank == 0: gactual = [] for a in actual: for ia in a: gactual.append(ia) self.assertEqual(gactual, desired) self.assertEqual(len(sub.parent), len(poly.parent)) sub.parent._validate_() sub2 = sub.reduce_global() sub2.parent._validate_() # Gather then broadcast coordinates so all coordinates are available on each process. to_add = [] for gather_target in [sub2.x, sub2.y]: gathered = variable_gather(gather_target.extract()) gathered = vm.bcast(gathered) to_add.append(gathered) for t in to_add: sub2.parent.add_variable(t, force=True) for ctr, to_check in enumerate([sub, sub2]): actual = [] for g in to_check.iter_geometries(): if g[1] is not None: actual.append([g[1].centroid.x, g[1].centroid.y]) desired = [[20.0, -49.5], [10.0, -44.5], [10.0, -39.5]] actual = vm.gather(actual) if vm.rank == 0: gactual = [] for a in actual: for ia in a: gactual.append(ia) self.assertEqual(gactual, desired)