def test_write_variable_fill_value_is_maintained(self): if vm.size != 4: raise SkipTest('vm.size != 4') dist = OcgDist() dim = dist.create_dimension('dim', 8, dist=True) dist.update_dimension_bounds() var = Variable(name='var', dimensions=dim, fill_value=2.) var.v()[0] = 1 var.v()[1] = 2 var.get_mask(create=True, check_value=True) if vm.rank == 0: path = self.get_temporary_file_path('foo.nc') else: path = None path = vm.bcast(path) var.parent.write(path) # if vm.rank == 0: # self.ncdump(path, header_only=False) with vm.scoped('read test', [0]): if not vm.is_null: invar = RequestDataset(path).create_field()['var'] self.assertEqual(invar.get_mask().sum(), 4) self.assertEqual(invar.fill_value, 2.)
def test_reorder(self): x = np.linspace(1, 360, num=7, dtype=float) x = Variable('lon', value=x, dimensions='dimx') y = Variable('lat', value=[-40, -20, 0, 20, 40], dimensions='dimy') t = Variable('time', value=[1, 2, 3], dimensions='dimt') data = Variable(name='data', value=np.zeros((3, 5, 7)), dimensions=['dimt', 'dimy', 'dimx'], dtype=float) data.get_value()[:] = 10. data.get_value()[:, :, 3:x.shape[0]] = 20. data_mask = data.get_mask(create=True) data_mask[:, :, 3:x.shape[0]] = 1 data.set_mask(data_mask) parent = Field(variables=[x, y, t, data]) grid = Grid(parent['lon'], parent['lat'], crs=Spherical(), parent=parent) desired_y = grid.y.get_value().copy() grid.wrap() self.assertFalse(np.any(data[:, :, 0:3].get_value() == 20.)) self.assertFalse(np.any(data.get_mask()[:, :, 0:3])) grid.reorder() actual = grid.x.get_value().tolist() desired = [ -179.5, -119.66666666666666, -59.833333333333314, 0.0, 1.0, 60.833333333333336, 120.66666666666667 ] self.assertEqual(actual, desired) self.assertNumpyAll(desired_y, grid.y.get_value()) rdata = grid.parent['data'] self.assertTrue(np.all(rdata[:, :, 0:3].get_value() == 20.)) self.assertTrue(np.all(rdata.get_mask()[:, :, 0:4])) self.assertFalse(np.any(rdata.get_mask()[:, :, 4:])) self.assertNumpyMayShareMemory(rdata.get_value(), data.get_value())
def test_system_masking(self): """Test how the mask is handled by the NetCDF python library.""" var = Variable(name='foo', value=[1, 2, 3], dimensions='three') self.assertIsNone(var.get_mask()) path = self.get_temporary_file_path('foo.nc') var.parent.write(path) invar = Field.read(path)['foo'] self.assertIsNone(invar.get_mask())
def test_write_variable(self): path = self.get_temporary_file_path('foo.nc') var = Variable(name='height', value=10.0, dimensions=[]) var.write(path) rd = RequestDataset(path) varin = SourcedVariable(name='height', request_dataset=rd) self.assertEqual(varin.get_value(), var.get_value()) # Test mask persists after write. v = Variable(name='the_mask', value=[1, 2, 3, 4], mask=[False, True, True, False], dimensions='ephemeral', fill_value=222) path = self.get_temporary_file_path('foo.nc') v.write(path) rd = RequestDataset(path, driver=DriverNetcdf) sv = SourcedVariable(name='the_mask', request_dataset=rd) self.assertEqual(sv.get_value().tolist(), [1, 222, 222, 4]) self.assertNumpyAll(sv.get_mask(), v.get_mask())
def test_system_masking(self): """Test behavior of the grid mask. This is an independently managed variable.""" x = Variable('xc', value=[1, 2, 3], dimensions='dimx') y = Variable('yc', value=[10, 20, 30, 40], dimensions='dimy') grid = Grid(x, y) data = Variable('data', value=np.zeros(grid.shape), dimensions=['dimy', 'dimx']) grid.parent.add_variable(data) gmask = grid.get_mask() self.assertIsNone(gmask) self.assertIsNone(grid.mask_variable) new_mask = np.zeros(grid.shape, dtype=bool) new_mask[1, 1] = True grid.set_mask(new_mask, cascade=True) self.assertIsInstance(grid.mask_variable, Variable) actual = grid.get_mask() self.assertNumpyAll(actual, new_mask) actual = get_variable_names(grid.get_member_variables()) desired = [x.name, y.name, grid._mask_name] self.assertAsSetEqual(actual, desired) self.assertNumpyAll(grid.get_mask(), data.get_mask()) path = self.get_temporary_file_path('foo.nc') grid.parent.write(path) with self.nc_scope(path) as ds: actual = ds.variables[grid.mask_variable.name] self.assertNumpyAll(grid.get_mask(), actual[:].mask) # Test mask is used when read from file. actual_field = RequestDataset(path).get() self.assertNumpyAll(grid.get_mask(), actual_field.grid.get_mask()) self.assertEqual(actual_field.grid.get_mask().sum(), 1) self.assertTrue(actual_field.grid.is_vectorized) self.assertEqual(actual_field.grid.get_mask().dtype, bool) actual_field.set_abstraction_geom() self.assertNumpyAll(actual_field.geom.get_mask(), grid.get_mask())
def test_write_variable(self): path = self.get_temporary_file_path('foo.nc') var = Variable(name='height', value=10.0, dimensions=[]) var.write(path) rd = RequestDataset(path) varin = SourcedVariable(name='height', request_dataset=rd) self.assertEqual(varin.get_value(), var.get_value()) # Test mask persists after write. v = Variable(name='the_mask', value=[1, 2, 3, 4], mask=[False, True, True, False], dimensions='ephemeral', fill_value=222) path = self.get_temporary_file_path('foo.nc') v.write(path) rd = RequestDataset(path, driver=DriverNetcdf) sv = SourcedVariable(name='the_mask', request_dataset=rd) self.assertEqual(sv.get_value().tolist(), [1, 222, 222, 4]) self.assertNumpyAll(sv.get_mask(), v.get_mask())