def test_get_unioned_spatial_average_parallel(self): if MPI_SIZE != 8: raise SkipTest('MPI_SIZE != 8') dist = OcgDist() geom_count = dist.create_dimension('geom_count', size=8, dist=True) time_count = dist.create_dimension('time', size=3) dist.update_dimension_bounds() if not geom_count.is_empty: gvar = GeometryVariable(value=[Point(1.0, 1.0).buffer(MPI_RANK + 2)] * len(geom_count), dimensions=geom_count) value = np.zeros((len(time_count), len(geom_count)), dtype=float) for ii in range(value.shape[0]): value[ii] = [MPI_RANK + 1 + ii + 1] * len(geom_count) data = Variable(name='data', value=value, dtype=float, dimensions=[time_count, geom_count]) else: gvar = GeometryVariable(dimensions=geom_count) data = Variable(name='data', dimensions=[time_count, geom_count], dtype=float) gvar.parent.add_variable(data) self.assertTrue(gvar.is_empty == data.is_empty == gvar.parent.is_empty) with vm.scoped_by_emptyable('union', gvar): if vm.is_null: unioned = None else: unioned = gvar.get_unioned(spatial_average='data') if unioned is not None: self.assertIsInstance(unioned, GeometryVariable) actual = unioned.parent[data.name] self.assertAlmostEqual(actual.get_value().max(), 5.5466666666666677) else: self.assertIsNone(unioned)
def test_get_intersection_state_boundaries(self): path_shp = self.path_state_boundaries geoms = [] with fiona.open(path_shp) as source: for record in source: geom = shape(record['geometry']) geoms.append(geom) gvar = GeometryVariable(value=geoms, dimensions='ngeom') gvar_sub = gvar.get_unioned() if gvar_sub is not None: subset = gvar_sub.get_value().flatten()[0] else: subset = None subset = MPI_COMM.bcast(subset) resolution = 2.0 keywords = dict(with_bounds=[False]) for k in self.iter_product_keywords(keywords): grid = self.get_gridxy_global(resolution=resolution, with_bounds=k.with_bounds) res = grid.get_intersection(subset) if not res.is_empty: self.assertTrue(res.get_mask().any()) else: self.assertIsInstance(res, GeometryVariable) if k.with_bounds: area = res.area if area is None: area = 0.0 else: area = area.sum() areas = MPI_COMM.gather(area) if MPI_RANK == 0: area_global = sum(areas) self.assertAlmostEqual(area_global, 1096.0819224080542) else: mask = res.get_mask() if mask is None: masked = 0 else: masked = mask.sum() masked = MPI_COMM.gather(masked) if MPI_RANK == 0: total_masked = sum(masked) self.assertEqual(total_masked, 858)
def test_get_unioned_spatial_average_parallel(self): if MPI_SIZE != 8: raise SkipTest('MPI_SIZE != 8') dist = OcgDist() geom_count = dist.create_dimension('geom_count', size=8, dist=True) time_count = dist.create_dimension('time', size=3) dist.update_dimension_bounds() if not geom_count.is_empty: gvar = GeometryVariable( value=[Point(1.0, 1.0).buffer(MPI_RANK + 2)] * len(geom_count), dimensions=geom_count) value = np.zeros((len(time_count), len(geom_count)), dtype=float) for ii in range(value.shape[0]): value[ii] = [MPI_RANK + 1 + ii + 1] * len(geom_count) data = Variable(name='data', value=value, dtype=float, dimensions=[time_count, geom_count]) else: gvar = GeometryVariable(dimensions=geom_count) data = Variable(name='data', dimensions=[time_count, geom_count], dtype=float) gvar.parent.add_variable(data) self.assertTrue(gvar.is_empty == data.is_empty == gvar.parent.is_empty) with vm.scoped_by_emptyable('union', gvar): if vm.is_null: unioned = None else: unioned = gvar.get_unioned(spatial_average='data') if unioned is not None: self.assertIsInstance(unioned, GeometryVariable) actual = unioned.parent[data.name] self.assertAlmostEqual(actual.get_value().max(), 5.5466666666666677) else: self.assertIsNone(unioned)
def test_get_intersects_state_boundaries(self): path_shp = self.path_state_boundaries geoms = [] with fiona.open(path_shp) as source: for record in source: geom = shape(record['geometry']) geoms.append(geom) gvar = GeometryVariable(value=geoms, dimensions='ngeom') gvar_sub = gvar.get_unioned() if gvar_sub is not None: subset = gvar_sub.get_value().flatten()[0] else: subset = None subset = MPI_COMM.bcast(subset) resolution = 1.0 for with_bounds in [False, True]: grid = self.get_gridxy_global(resolution=resolution, with_bounds=with_bounds) vm.create_subcomm_by_emptyable('global grid', grid, is_current=True) if not vm.is_null: res = grid.get_intersects(subset, return_slice=True) grid_sub, slc = res vm.create_subcomm_by_emptyable('grid subset', grid_sub, is_current=True) if not vm.is_null: mask = Variable('mask_after_subset', grid_sub.get_mask(), dimensions=grid_sub.dimensions) mask = variable_gather(mask) if vm.rank == 0: mask_sum = np.invert(mask.get_value()).sum() mask_shape = mask.shape else: mask_sum = None mask_shape = None mask_sum = vm.bcast(mask_sum) mask_shape = vm.bcast(mask_shape) if with_bounds: self.assertEqual(mask_shape, (54, 113)) self.assertEqual( slc, (slice(108, 162, None), slice(1, 114, None))) self.assertEqual(mask_sum, 1358) else: if MPI_SIZE == 2: grid_bounds_global = [ dim.bounds_global for dim in grid_sub.dimensions ] self.assertEqual(grid_bounds_global, [(0, 52), (0, 105)]) self.assertEqual(mask_shape, (52, 105)) self.assertEqual( slc, (slice(109, 161, None), slice(8, 113, None))) self.assertEqual(mask_sum, 1087) if vm.rank == 0: path = self.get_temporary_file_path('foo.nc') else: path = None path = vm.bcast(path) field = Field(grid=grid_sub) field.write(path) vm.finalize() vm.__init__() MPI_COMM.Barrier()