def test_DimensionCoordinate_climatology(self): x = cfdm.DimensionCoordinate() self.assertFalse(x.is_climatology()) self.assertIsNone(x.get_climatology(None)) x.set_climatology(False) self.assertFalse(x.is_climatology()) self.assertFalse(x.get_climatology()) x.set_climatology(True) self.assertTrue(x.is_climatology()) self.assertTrue(x.del_climatology()) self.assertIsNone(x.del_climatology(None))
def _dim_coord(self, label, data, properties={}, bounds=None, formula_data=None): bnds = False if bounds != None: if type(bounds) in [type(x) for x in [[], set()]]: bnds = 'data' elif bounds.__class__ == Ldp: bnds = 'full' else: assert False, 'bounds value invalid type' ## if formula_data != None: cfdata = cfdm.Data(data) if not bounds: dc = cfdm.DimensionCoordinate(data=cfdata, properties=properties) else: if bnds == 'full': bnds_construct = cfdm.Bounds(data=cfdm.Data(bounds.data), properties=bounds.properties) bnds_construct.nc_set_variable(bounds.label) else: bdat = cfdm.Data(bounds) bnds_construct = cfdm.Bounds(data=bdat) dc = cfdm.DimensionCoordinate(data=cfdata, properties=properties, bounds=bnds_construct) axis = cfdm.DomainAxis(dc.data.size) ##axis.nc_set_dimension( label ) dc.nc_set_variable(label) axis_tag = self.f.set_construct(axis) dim = self.f.set_construct(dc, axes=axis_tag) return (dc, axis_tag, axis, dim)
def test_DimensionCoordinate_set_data(self): x = cfdm.DimensionCoordinate() y = x.set_data(cfdm.Data([1, 2, 3])) self.assertIsNone(y) self.assertTrue(x.has_data()) # Test inplace x.del_data() y = x.set_data(cfdm.Data([1, 2, 3]), inplace=False) self.assertIsInstance(y, cfdm.DimensionCoordinate) self.assertFalse(x.has_data()) self.assertTrue(y.has_data()) # Exceptions should be raised for 0-d and N-d (N>=2) data with self.assertRaises(Exception): y = x.set_data(cfdm.Data([[1, 2, 3]])) with self.assertRaises(Exception): y = x.set_data(cfdm.Data(1))
def test_create_field_3(self): """Test ab initio creation of a third variation of field.""" # Dimension coordinates data = numpy.arange(9.0) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property("standard_name", "grid_longitude") dim0.set_property("units", "degrees") array = dim0.data.array array = numpy.array([array - 0.5, array + 0.5]).transpose((1, 0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.0))) dim1.set_property("standard_name", "grid_latitude") dim1.set_property("units", "degrees") dim2 = cfdm.DimensionCoordinate( data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.0]])), ) dim2.set_property("standard_name", "atmosphere_hybrid_height_coordinate") dim2.set_property("computed_standard_name", "altitude") dim3 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.array([15.0]))) dim3.set_property("standard_name", "time") dim3.set_property("units", "days since 2004-06-01") dim3.set_bounds(cfdm.Bounds(data=cfdm.Data([[0, 30.0]]))) # dim3.set_geometry('climatology') # Auxiliary coordinates ak = cfdm.DomainAncillary(data=cfdm.Data([10.0])) ak.set_property("units", "m") ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.0]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.0])) bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.0]]))) aux2 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(-45, 45, dtype="int32").reshape(10, 9))) aux2.set_property("units", "degree_N") aux2.set_property("standard_name", "latitude") aux3 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(60, 150, dtype="int32").reshape(9, 10))) aux3.set_property("standard_name", "longitude") aux3.set_property("units", "degreeE") array = numpy.ma.array( [ "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", ], dtype="S", ) array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property("standard_name", "greek_letters") # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1 + numpy.arange(90.0).reshape(9, 10) * 1234)) msr0.set_measure("area") msr0.set_property("units", "km2") # Data data = cfdm.Data(numpy.arange(90.0).reshape(10, 9)) properties = {"units": "m s-1"} f = cfdm.Field(properties=properties) f.set_property("standard_name", "eastward_wind") axisX = f.set_construct(cfdm.DomainAxis(9)) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) axisT = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=[axisX]) y = f.set_construct(dim1, axes=[axisY]) z = f.set_construct(dim2, axes=[axisZ]) f.set_construct(dim3, axes=[axisT]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=[axisZ]) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references # ref0 = cfdm.CoordinateReference( # parameters={'grid_mapping_name': 'rotated_latitude_longitude', # 'grid_north_pole_latitude': 38.0, # 'grid_north_pole_longitude': 190.0, # 'earth_radius': 6371007,}, # coordinates=[x, y, lat, lon] # ) coordinate_conversion = cfdm.CoordinateConversion( parameters={ "grid_mapping_name": "rotated_latitude_longitude", "grid_north_pole_latitude": 38.0, "grid_north_pole_longitude": 190.0, }) datum = cfdm.Datum(parameters={"earth_radius": 6371007}) ref0 = cfdm.CoordinateReference( coordinate_conversion=coordinate_conversion, datum=datum, coordinates=[x, y, lat, lon], ) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property("standard_name", "surface_altitude") orog.set_property("units", "m") orog = f.set_construct(orog, axes=[axisY, axisX]) datum1 = cfdm.Datum({"earth_radius": 6371007}) coordinate_conversion1 = cfdm.CoordinateConversion( parameters={ "standard_name": "atmosphere_hybrid_height_coordinate", "computed_standard_name": "altitude", }, domain_ancillaries={ "orog": orog, "a": ak, "b": bk }, ) ref1 = cfdm.CoordinateReference( datum=datum1, coordinate_conversion=coordinate_conversion1, coordinates=[z], ) ref1 = f.set_construct(ref1) # Field ancillary variables # g = f.transpose([1, 0]) g = f.copy() # g.standard_name = 'ancillary0' # g *= 0.01 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryA" f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() # g.standard_name = 'ancillary2' # g *= 0.001 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryB" f.set_construct(anc, axes=[axisX]) g = f[..., 0] g = g.squeeze() # g.standard_name = 'ancillary3' # g *= 0.001 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryC" f.set_construct(anc, axes=[axisY]) f.set_property("flag_values", numpy.array([1, 2, 4], "int32")) f.set_property("flag_meanings", "a bb ccc") f.set_property("flag_masks", [2, 1, 0]) cm0 = cfdm.CellMethod( axes=[axisX], method="mean", qualifiers={ "interval": [cfdm.Data(1, "day")], "comment": "ok" }, ) cm1 = cfdm.CellMethod(axes=[axisY], method="maximum", qualifiers={"where": "sea"}) cm2 = cfdm.CellMethod(axes=[axisT], method="maximum", qualifiers={"within": "years"}) cm3 = cfdm.CellMethod(axes=[axisT], method="minimum", qualifiers={"over": "years"}) f.set_construct(cm0) f.set_construct(cm1) f.set_construct(cm2) f.set_construct(cm3) cfdm.write(f, self.filename, fmt="NETCDF3_CLASSIC", verbose=verbose) g = cfdm.read(self.filename, verbose=verbose) self.assertEqual(len(g), 1, f"Read produced too many fields: {len(g)} != 1") g = g[0].squeeze() self.assertEqual( sorted(f.constructs), sorted(g.constructs), f"\n\nf (created in memory)" f"\n{f.constructs}" f"\n\n{f.constructs.items()}" f"\n\ng (read from disk)" f"\n{g.constructs}" f"\n\n{g.constructs.items()}", ) self.assertTrue( f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself", ) self.assertTrue( g.equals(g.copy(), verbose=verbose), "Field g not equal to a copy of itself", ) self.assertTrue( g.equals(f, verbose=verbose), "Field not equal to itself read back in", ) x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read( self.filename, verbose=verbose, extra=["domain_ancillary"], warnings=warnings, )
def test_create_field(self): """TODO DOCS.""" # Dimension coordinates dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.0))) dim1.set_property("standard_name", "grid_latitude") dim1.set_property("units", "degrees") data = numpy.arange(9.0) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property("standard_name", "grid_longitude") dim0.set_property("units", "degrees") dim0.nc_set_variable("x") array = dim0.data.array array = numpy.array([array - 0.5, array + 0.5]).transpose((1, 0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim2 = cfdm.DimensionCoordinate( data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.0]])), ) dim2.set_property("standard_name", "atmosphere_hybrid_height_coordinate") dim2.set_property("computed_standard_name", "altitude") # Auxiliary coordinates ak = cfdm.DomainAncillary(data=cfdm.Data([10.0])) ak.set_property("units", "m") ak.id = "atmosphere_hybrid_height_coordinate_ak" ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.0]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.0])) bk.id = "atmosphere_hybrid_height_coordinate_bk" bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.0]]))) aux2 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(-45, 45, dtype="int32").reshape(10, 9))) aux2.set_property("units", "degree_N") aux2.set_property("standard_name", "latitude") aux3 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(60, 150, dtype="int32").reshape(9, 10))) aux3.set_property("standard_name", "longitude") aux3.set_property("units", "degreeE") array = numpy.ma.array( [ "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", ], dtype="S", ) array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property("long_name", "greek_letters") # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1 + numpy.arange(90.0).reshape(9, 10) * 1234)) msr0.set_measure("area") msr0.set_property("units", "km2") msr0.nc_set_variable("areacella") # Data data = cfdm.Data(numpy.arange(90.0).reshape(10, 9)) properties = {"units": "m s-1"} f = cfdm.Field(properties=properties) f.set_property("standard_name", "eastward_wind") da = cfdm.DomainAxis(9) da.nc_set_dimension("grid_longitude") axisX = f.set_construct(da) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=axisX) y = f.set_construct(dim1, axes=axisY) z = f.set_construct(dim2, axes=[axisZ]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=axisZ) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references coordinate_conversion = cfdm.CoordinateConversion( parameters={ "grid_mapping_name": "rotated_latitude_longitude", "grid_north_pole_latitude": 38.0, "grid_north_pole_longitude": 190.0, }) datum = cfdm.Datum(parameters={"earth_radius": 6371007}) ref0 = cfdm.CoordinateReference( coordinate_conversion=coordinate_conversion, datum=datum, coordinates=[x, y, lat, lon], ) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property("standard_name", "surface_altitude") orog.set_property("units", "m") orog = f.set_construct(orog, axes=[axisY, axisX]) coordinate_conversion = cfdm.CoordinateConversion( parameters={ "standard_name": "atmosphere_hybrid_height_coordinate", "computed_standard_name": "altitude", }, domain_ancillaries={ "orog": orog, "a": ak, "b": bk }, ) ref1 = cfdm.CoordinateReference( coordinates=[z], datum=datum, coordinate_conversion=coordinate_conversion, ) ref1 = f.set_construct(ref1) # Field ancillary variables g = f.copy() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property("standard_name", "ancillaryA") f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property("long_name", "ancillaryB") f.set_construct(anc, axes=axisX) g = f[..., 0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property("foo", "bar") f.set_construct(anc, axes=[axisY]) f.set_property("flag_values", numpy.array([1, 2, 4], "int32")) f.set_property("flag_meanings", "a bb ccc") f.set_property("flag_masks", [2, 1, 0]) cm0 = cfdm.CellMethod( axes=axisX, method="mean", qualifiers={ "interval": [cfdm.Data(1, "day")], "comment": "ok" }, ) cm1 = cfdm.CellMethod(axes=[axisY], method="maximum", qualifiers={"where": "sea"}) f.set_construct(cm0) f.set_construct(cm1) self.assertTrue(f.equals(f, verbose=verbose), "Field f not equal to itself") self.assertTrue( f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself", ) cfdm.write(f, self.filename, fmt="NETCDF3_CLASSIC", verbose=verbose) g = cfdm.read(self.filename, verbose=1) array = (g[0].constructs.filter_by_identity( "long_name=greek_letters").value().data.array) self.assertEqual(array[1], b"beta") self.assertEqual(len(g), 1) g = g[0].squeeze() self.assertEqual( sorted(f.constructs), sorted(g.constructs), "\n\nf (created in memory)\n{}\n\n{}\n\ng " "(read from disk)\n{}\n\n{}".format( sorted(f.constructs), sorted(f.constructs.items()), sorted(g.constructs), sorted(g.constructs.items()), ), ) self.assertTrue( f.equals(f, verbose=verbose), "Field f not equal to itself after having been written to disk", ) self.assertTrue( f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself after having been " "written to disk", ) self.assertTrue( g.equals(g.copy(), verbose=verbose), "Field g not equal to a copy of itself", ) self.assertTrue( g.equals(f, verbose=verbose), "Field (f) not equal to itself read back in (g)", ) x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read( self.filename, verbose=verbose, extra="domain_ancillary", warnings=warnings, )
def test_DimensionCoordinate__init__(self): """Test the constructor of DimensionCoordinate.""" cfdm.DimensionCoordinate(source="qwerty")
class DimensionCoordinateTest(unittest.TestCase): """Unit test for the DimensionCoordinate class.""" filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file.nc") dim = cfdm.DimensionCoordinate() dim.set_property("standard_name", "latitude") a = numpy.array([ -30, -23.5, -17.8123, -11.3345, -0.7, -0.2, 0, 0.2, 0.7, 11.30003, 17.8678678, 23.5, 30, ]) dim.set_data(cfdm.Data(a, "degrees_north")) bounds = cfdm.Bounds() b = numpy.empty(a.shape + (2, )) b[:, 0] = a - 0.1 b[:, 1] = a + 0.1 bounds.set_data(cfdm.Data(b)) dim.set_bounds(bounds) def setUp(self): """Preparations called immediately before each test method.""" # Disable log messages to silence expected warnings cfdm.log_level("DISABLE") # Note: to enable all messages for given methods, lines or # calls (those without a 'verbose' option to do the same) # e.g. to debug them, wrap them (for methods, start-to-end # internally) as follows: # # cfdm.LOG_LEVEL('DEBUG') # < ... test code ... > # cfdm.log_level('DISABLE') def test_DimensionCoordinate__repr__str__dump(self): """Test all means of DimensionCoordinate inspection.""" f = cfdm.read(self.filename)[0] x = f.dimension_coordinates("grid_latitude").value() _ = repr(x) _ = str(x) self.assertIsInstance(x.dump(display=False), str) self.assertIsInstance(x.dump(display=False, _key="qwerty"), str) def test_DimensionCoordinate__init__(self): """Test the constructor of DimensionCoordinate.""" cfdm.DimensionCoordinate(source="qwerty") def test_DimensionCoordinate_set_data(self): """Test the `set_data` DimensionCoordinate method.""" x = cfdm.DimensionCoordinate() y = x.set_data(cfdm.Data([1, 2, 3])) self.assertIsNone(y) self.assertTrue(x.has_data()) # Test inplace x.del_data() y = x.set_data(cfdm.Data([1, 2, 3]), inplace=False) self.assertIsInstance(y, cfdm.DimensionCoordinate) self.assertFalse(x.has_data()) self.assertTrue(y.has_data()) # Exceptions should be raised for 0-d and N-d (N>=2) data with self.assertRaises(Exception): y = x.set_data(cfdm.Data([[1, 2, 3]])) with self.assertRaises(Exception): y = x.set_data(cfdm.Data(1)) def test_DimensionCoordinate_climatology(self): """Test the climatology DimensionCoordinate methods.""" x = cfdm.DimensionCoordinate() self.assertFalse(x.is_climatology()) self.assertIsNone(x.get_climatology(None)) x.set_climatology(False) self.assertFalse(x.is_climatology()) self.assertFalse(x.get_climatology()) x.set_climatology(True) self.assertTrue(x.is_climatology()) self.assertTrue(x.del_climatology()) self.assertIsNone(x.del_climatology(None))
import netCDF4 import cfdm import numpy f = cfdm.Field(properties={'standard_name': 'precipitation_flux'}) dc = cfdm.DimensionCoordinate(properties={'long_name': 'Longitude'}, data=cfdm.Data([0, 1, 2.])) fa = cfdm.FieldAncillary( properties={'standard_name': 'precipitation_flux status_flag'}, data=cfdm.Data(numpy.array([0, 0, 2], dtype='int8'))) longitude_axis = f.set_construct(cfdm.DomainAxis(3)) key = f.set_construct(dc, axes=longitude_axis) cm = cfdm.CellMethod(axes=longitude_axis, method='minimum') f.set_construct(cm)
def test_STRING(self): """Test constructs with underlying string type arrays.""" for array in ( numpy.ma.array(list("abcdefghij"), dtype="S"), numpy.ma.array( ["a", "b1", "c12", "d123", "e1234", "f", "g", "h", "i", "j"], dtype="S", ), ): # Initialize the field tas = cfdm.Field( properties={ "project": "research", "standard_name": "air_temperature", "units": "K", } ) # Create and set domain axes tas.set_construct(cfdm.DomainAxis(1)) tas.set_construct(cfdm.DomainAxis(1)) axis_Y = tas.set_construct(cfdm.DomainAxis(10)) axis_X = tas.set_construct(cfdm.DomainAxis(9)) # Set the field data tas.set_data( cfdm.Data(numpy.arange(90.0).reshape(10, 9)), axes=[axis_Y, axis_X], ) # Create and set the dimension coordinates dimension_coordinate_Y = cfdm.DimensionCoordinate( properties={ "standard_name": "grid_latitude", "units": "degrees", }, data=cfdm.Data(numpy.arange(10.0)), bounds=cfdm.Bounds( data=cfdm.Data(numpy.arange(20).reshape(10, 2)) ), ) dimension_coordinate_X = cfdm.DimensionCoordinate( properties={ "standard_name": "grid_longitude", "units": "degrees", }, data=cfdm.Data(numpy.arange(9.0)), bounds=cfdm.Bounds( data=cfdm.Data(numpy.arange(18).reshape(9, 2)) ), ) tas.set_construct(dimension_coordinate_Y, axes=[axis_Y]) tas.set_construct(dimension_coordinate_X, axes=[axis_X]) # Create and set the auxiliary coordinates array[0] = numpy.ma.masked aux0 = cfdm.AuxiliaryCoordinate( properties={"long_name": "Grid latitude name"}, data=cfdm.Data(array), ) tas.set_construct(aux0, axes=[axis_Y]) cfdm.write(tas, tempfile) tas1 = cfdm.read(tempfile)[0] aux1 = tas1.constructs.filter_by_identity( "long_name=Grid latitude name" ).value() self.assertEqual(aux0.data.shape, array.shape, aux0.data.shape) self.assertEqual(aux1.data.shape, array.shape, aux1.data.shape)
def test_create_field_2(self): # Dimension coordinates dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.))) dim1.set_property('standard_name', 'projection_y_coordinate') dim1.set_property('units', 'm') data = numpy.arange(9.) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property('standard_name', 'projection_x_coordinate') dim0.set_property('units', 'm') array = dim0.data.array array = numpy.array([array-0.5, array+0.5]).transpose((1, 0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim2 = cfdm.DimensionCoordinate( data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.]])) ) dim2.set_property( 'standard_name', 'atmosphere_hybrid_height_coordinate') # Auxiliary coordinates aux2 = cfdm.AuxiliaryCoordinate( data=cfdm.Data( numpy.arange(-45, 45, dtype='int32').reshape(10, 9))) aux2.set_property('units', 'degree_N') aux2.set_property('standard_name', 'latitude') aux3 = cfdm.AuxiliaryCoordinate( data=cfdm.Data(numpy.arange( 60, 150, dtype='int32').reshape(9, 10)) ) aux3.set_property('standard_name', 'longitude') aux3.set_property('units', 'degreeE') array = numpy.ma.array( ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta', 'theta', 'iota', 'kappa'], dtype='S' ) array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property('standard_name', 'greek_letters') # Domain ancillaries ak = cfdm.DomainAncillary(data=cfdm.Data([10.])) ak.set_property('units', 'm') ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.])) bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.]]))) # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1+numpy.arange(90.).reshape(9, 10)*1234)) msr0.set_measure('area') msr0.set_property('units', 'km2') # Data data = cfdm.Data(numpy.arange(90.).reshape(10, 9)) properties = {'units': 'm s-1'} f = cfdm.Field(properties=properties) f.set_property('standard_name', 'eastward_wind') axisX = f.set_construct(cfdm.DomainAxis(9)) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=[axisX]) y = f.set_construct(dim1, axes=[axisY]) z = f.set_construct(dim2, axes=[axisZ]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) greek = f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=[axisZ]) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references coordinate_conversion = cfdm.CoordinateConversion( parameters={'grid_mapping_name': "transverse_mercator", 'latitude_of_projection_origin': 49.0, 'longitude_of_central_meridian': -2.0, 'scale_factor_at_central_meridian': 0.9996012717, 'false_easting': 400000.0, 'false_northing': -100000.0, 'unit': "metre"}) datum0 = cfdm.Datum(parameters={'inverse_flattening': 299.3249646, 'longitude_of_prime_meridian': 0.0, 'semi_major_axis': 6377563.396}) ref0 = cfdm.CoordinateReference( coordinates=[x, y], datum=datum0, coordinate_conversion=coordinate_conversion ) coordinate_conversion = cfdm.CoordinateConversion( parameters={'grid_mapping_name': "latitude_longitude"}) datum2 = cfdm.Datum(parameters={'longitude_of_prime_meridian': 0.0, 'semi_major_axis': 6378137.0, 'inverse_flattening': 298.257223563}) ref2 = cfdm.CoordinateReference( coordinates=[lat, lon], datum=datum2, coordinate_conversion=coordinate_conversion) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) f.set_construct(ref2) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property('standard_name', 'surface_altitude') orog.set_property('units', 'm') orog = f.set_construct(orog, axes=[axisY, axisX]) coordinate_conversion = cfdm.CoordinateConversion( parameters={ 'standard_name': 'atmosphere_hybrid_height_coordinate' }, domain_ancillaries={ 'orog': orog, 'a': ak, 'b': bk } ) ref1 = cfdm.CoordinateReference( coordinates=[z], datum=datum0, coordinate_conversion=coordinate_conversion ) f.set_construct(ref1) # Field ancillary variables g = f.copy() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryA' f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryB' f.set_construct(anc, axes=[axisX]) g = f[..., 0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryC' f.set_construct(anc, axes=[axisY]) f.set_property('flag_values', numpy.array([1, 2, 4], 'int32')) f.set_property('flag_meanings', 'a bb ccc') f.set_property('flag_masks', [2, 1, 0]) cm0 = cfdm.CellMethod(axes=[axisX], method='mean', qualifiers={'interval': [cfdm.Data(1, 'day')], 'comment': 'ok'}) cm1 = cfdm.CellMethod(axes=[axisY], method='maximum', qualifiers={'where': 'sea'}) f.set_construct(cm0) f.set_construct(cm1) self.assertTrue(f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself") for fmt in ('NETCDF3_CLASSIC', 'NETCDF3_64BIT', 'NETCDF4', 'NETCDF4_CLASSIC'): cfdm.write(f, self.filename, fmt=fmt, verbose=verbose) g = cfdm.read(self.filename, verbose=verbose) self.assertEqual(len(g), 1, '{} != 1'.format(len(g))) g = g[0].squeeze() self.assertEqual(sorted(f.constructs), sorted(g.constructs), '\n\nf\n{}\n\n{}\n\ng\n{}\n\n{}'.format( sorted(f.constructs), sorted(f.constructs.items()), sorted(g.constructs), sorted(g.constructs.items()))) self.assertTrue(g.equals(g.copy(), verbose=verbose), "Field g not equal to a copy of itself") self.assertTrue(g.equals(f, verbose=verbose), "Field not equal to itself read back in") # --- End: for x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read(self.filename, verbose=verbose, extra=['domain_ancillary'], warnings=warnings)
# Create and set the field ancillary constructs field_ancillary = cfdm.FieldAncillary(properties={ 'standard_name': 'air_temperature standard_error', 'units': 'K' }, data=cfdm.Data( numpy.arange(90.).reshape(10, 9))) tas.set_construct(field_ancillary, axes=[axis_Y, axis_X]) # Create and set the dimension coordinate constructs dimension_coordinate_T = cfdm.DimensionCoordinate( properties={ 'standard_name': 'time', 'units': 'days since 2018-12-01' }, data=cfdm.Data([15.5]), bounds=cfdm.Bounds(data=cfdm.Data([[0., 31]]))) dimension_coordinate_Z = cfdm.DimensionCoordinate( properties={ 'computed_standard_name': 'pressure', 'standard_name': 'atmosphere_sigma_coordinate' }, data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1.0, 2.0]]))) dimension_coordinate_Y = cfdm.DimensionCoordinate( properties={ 'standard_name': 'grid_latitude',
import netCDF4 import cfdm import numpy f = cfdm.Field() time = cfdm.DimensionCoordinate(data=cfdm.Data( numpy.array([float(x) for x in range(10)], dtype='double')), properties={ 'standard_name': 'time', 'units': 'days since 2000-01-01 00:00:00' }) cr = cfdm.CoordinateReference(('time', )) time_dim = cfdm.DomainAxis(10) time_dim.nc_set_dimension('time') dom = cfdm.Domain() time_construct = f.set_construct(time_dim) key = f.set_construct(time, axes=time_construct) dom.set_data_axes([ 'time', ], key=key) ## self.set_var( 'lon', 'double', ('lon',), attributes={'standard_name':'longitude', 'units':'degree_east'}, ## data = [float(x)*2. for x in range(180)] ) ## self.set_var( 'lat', 'double', ('lat',), attributes={'standard_name':'latitude', 'units':'degree_north'}, ## data = [float(x)*2. - 89. for x in range(90)] )
def test_DimensionCoordinate__init__(self): """TODO DOCS.""" cfdm.DimensionCoordinate(source="qwerty")
def test_STRING(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for array in (numpy.ma.array(list('abcdefghij'), dtype='S'), numpy.ma.array([ 'a', 'b1', 'c12', 'd123', 'e1234', 'f', 'g', 'h', 'i', 'j' ], dtype='S')): # Initialize the field tas = cfdm.Field( properties={ 'project': 'research', 'standard_name': 'air_temperature', 'units': 'K' }) # Create and set domain axes axis_T = tas.set_construct(cfdm.DomainAxis(1)) axis_Z = tas.set_construct(cfdm.DomainAxis(1)) axis_Y = tas.set_construct(cfdm.DomainAxis(10)) axis_X = tas.set_construct(cfdm.DomainAxis(9)) # Set the field data tas.set_data(cfdm.Data(numpy.arange(90.).reshape(10, 9)), axes=[axis_Y, axis_X]) # Create and set the dimension coordinates dimension_coordinate_Y = cfdm.DimensionCoordinate( properties={ 'standard_name': 'grid_latitude', 'units': 'degrees' }, data=cfdm.Data(numpy.arange(10.)), bounds=cfdm.Bounds( data=cfdm.Data(numpy.arange(20).reshape(10, 2)))) dimension_coordinate_X = cfdm.DimensionCoordinate( properties={ 'standard_name': 'grid_longitude', 'units': 'degrees' }, data=cfdm.Data(numpy.arange(9.)), bounds=cfdm.Bounds( data=cfdm.Data(numpy.arange(18).reshape(9, 2)))) dim_Y = tas.set_construct(dimension_coordinate_Y, axes=[axis_Y]) dim_X = tas.set_construct(dimension_coordinate_X, axes=[axis_X]) # Create and set the auxiliary coordinates array[0] = numpy.ma.masked aux0 = cfdm.AuxiliaryCoordinate( properties={'long_name': 'Grid latitude name'}, data=cfdm.Data(array)) tas.set_construct(aux0, axes=[axis_Y]) cfdm.write(tas, tempfile) tas1 = cfdm.read(tempfile)[0] aux1 = tas1.constructs.filter_by_identity( 'long_name=Grid latitude name').value() self.assertEqual(aux0.data.shape, array.shape, aux0.data.shape) self.assertEqual(aux1.data.shape, array.shape, aux1.data.shape)
class DimensionCoordinateTest(unittest.TestCase): filename = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') dim = cfdm.DimensionCoordinate() dim.set_property('standard_name', 'latitude') a = numpy.array( [-30, -23.5, -17.8123, -11.3345, -0.7, -0.2, 0, 0.2, 0.7, 11.30003, 17.8678678, 23.5, 30] ) dim.set_data(cfdm.Data(a, 'degrees_north')) bounds = cfdm.Bounds() b = numpy.empty(a.shape + (2,)) b[:, 0] = a - 0.1 b[:, 1] = a + 0.1 bounds.set_data(cfdm.Data(b)) dim.set_bounds(bounds) def setUp(self): # Disable log messages to silence expected warnings cfdm.log_level('DISABLE') # Note: to enable all messages for given methods, lines or # calls (those without a 'verbose' option to do the same) # e.g. to debug them, wrap them (for methods, start-to-end # internally) as follows: # # cfdm.LOG_LEVEL('DEBUG') # < ... test code ... > # cfdm.log_level('DISABLE') def test_DimensionCoordinate__repr__str__dump(self): f = cfdm.read(self.filename)[0] x = f.dimension_coordinates('grid_latitude').value() _ = repr(x) _ = str(x) self.assertIsInstance(x.dump(display=False), str) self.assertIsInstance(x.dump(display=False, _key='qwerty'), str) def test_DimensionCoordinate__init__(self): c = cfdm.DimensionCoordinate(source='qwerty') def test_DimensionCoordinate_set_data(self): x = cfdm.DimensionCoordinate() y = x.set_data(cfdm.Data([1, 2, 3])) self.assertIsNone(y) self.assertTrue(x.has_data()) # Test inplace x.del_data() y = x.set_data(cfdm.Data([1, 2, 3]), inplace=False) self.assertIsInstance(y, cfdm.DimensionCoordinate) self.assertFalse(x.has_data()) self.assertTrue(y.has_data()) # Exceptions should be raised for 0-d and N-d (N>=2) data with self.assertRaises(Exception): y = x.set_data(cfdm.Data([[1, 2, 3]])) with self.assertRaises(Exception): y = x.set_data(cfdm.Data(1)) @unittest.skip("until 1.9.0.0") def test_DimensionCoordinate_climatology(self): x = cfdm.DimensionCoordinate() self.assertFalse(x.is_climatology()) self.assertIsNone(x.get_climatology(None)) x.set_climatology(False) self.assertFalse(x.is_climatology()) self.assertFalse(x.get_climatology()) x.set_climatology(True) self.assertTrue(x.is_climatology()) self.assertTrue(x.del_climatology()) self.assertIsNone(x.del_climatology(None))
def test_create_field_2(self): """Test ab initio creation of a second variation of field.""" # Dimension coordinates dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.0))) dim1.set_property("standard_name", "projection_y_coordinate") dim1.set_property("units", "m") data = numpy.arange(9.0) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property("standard_name", "projection_x_coordinate") dim0.set_property("units", "m") array = dim0.data.array array = numpy.array([array - 0.5, array + 0.5]).transpose((1, 0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim2 = cfdm.DimensionCoordinate( data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.0]])), ) dim2.set_property( "standard_name", "atmosphere_hybrid_height_coordinate" ) # Auxiliary coordinates aux2 = cfdm.AuxiliaryCoordinate( data=cfdm.Data(numpy.arange(-45, 45, dtype="int32").reshape(10, 9)) ) aux2.set_property("units", "degree_N") aux2.set_property("standard_name", "latitude") aux3 = cfdm.AuxiliaryCoordinate( data=cfdm.Data(numpy.arange(60, 150, dtype="int32").reshape(9, 10)) ) aux3.set_property("standard_name", "longitude") aux3.set_property("units", "degreeE") array = numpy.ma.array( [ "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", ], dtype="S", ) array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property("standard_name", "greek_letters") # Domain ancillaries ak = cfdm.DomainAncillary(data=cfdm.Data([10.0])) ak.set_property("units", "m") ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.0]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.0])) bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.0]]))) # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1 + numpy.arange(90.0).reshape(9, 10) * 1234) ) msr0.set_measure("area") msr0.set_property("units", "km2") # Data data = cfdm.Data(numpy.arange(90.0).reshape(10, 9)) properties = {"units": "m s-1"} f = cfdm.Field(properties=properties) f.set_property("standard_name", "eastward_wind") axisX = f.set_construct(cfdm.DomainAxis(9)) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=[axisX]) y = f.set_construct(dim1, axes=[axisY]) z = f.set_construct(dim2, axes=[axisZ]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=[axisZ]) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references coordinate_conversion = cfdm.CoordinateConversion( parameters={ "grid_mapping_name": "transverse_mercator", "latitude_of_projection_origin": 49.0, "longitude_of_central_meridian": -2.0, "scale_factor_at_central_meridian": 0.9996012717, "false_easting": 400000.0, "false_northing": -100000.0, "unit": "metre", } ) datum0 = cfdm.Datum( parameters={ "inverse_flattening": 299.3249646, "longitude_of_prime_meridian": 0.0, "semi_major_axis": 6377563.396, } ) ref0 = cfdm.CoordinateReference( coordinates=[x, y], datum=datum0, coordinate_conversion=coordinate_conversion, ) coordinate_conversion = cfdm.CoordinateConversion( parameters={"grid_mapping_name": "latitude_longitude"} ) datum2 = cfdm.Datum( parameters={ "longitude_of_prime_meridian": 0.0, "semi_major_axis": 6378137.0, "inverse_flattening": 298.257223563, } ) ref2 = cfdm.CoordinateReference( coordinates=[lat, lon], datum=datum2, coordinate_conversion=coordinate_conversion, ) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) f.set_construct(ref2) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property("standard_name", "surface_altitude") orog.set_property("units", "m") orog = f.set_construct(orog, axes=[axisY, axisX]) coordinate_conversion = cfdm.CoordinateConversion( parameters={ "standard_name": "atmosphere_hybrid_height_coordinate" }, domain_ancillaries={"orog": orog, "a": ak, "b": bk}, ) ref1 = cfdm.CoordinateReference( coordinates=[z], datum=datum0, coordinate_conversion=coordinate_conversion, ) f.set_construct(ref1) # Field ancillary variables g = f.copy() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryA" f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryB" f.set_construct(anc, axes=[axisX]) g = f[..., 0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = "ancillaryC" f.set_construct(anc, axes=[axisY]) f.set_property("flag_values", numpy.array([1, 2, 4], "int32")) f.set_property("flag_meanings", "a bb ccc") f.set_property("flag_masks", [2, 1, 0]) cm0 = cfdm.CellMethod( axes=[axisX], method="mean", qualifiers={"interval": [cfdm.Data(1, "day")], "comment": "ok"}, ) cm1 = cfdm.CellMethod( axes=[axisY], method="maximum", qualifiers={"where": "sea"} ) f.set_construct(cm0) f.set_construct(cm1) self.assertTrue( f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself", ) for fmt in ( "NETCDF3_CLASSIC", "NETCDF3_64BIT", "NETCDF4", "NETCDF4_CLASSIC", ): cfdm.write(f, self.filename, fmt=fmt, verbose=verbose) g = cfdm.read(self.filename, verbose=verbose) self.assertEqual(len(g), 1, f"{len(g)} != 1") g = g[0].squeeze() self.assertEqual( sorted(f.constructs), sorted(g.constructs), f"\n\nf (created in memory)" f"\n{f.constructs}" f"\n\n{f.constructs.items()}" f"\n\ng (read from disk)" f"\n{g.constructs}" f"\n\n{g.constructs.items()}", ) self.assertTrue( g.equals(g.copy(), verbose=verbose), "Field g not equal to a copy of itself", ) self.assertTrue( g.equals(f, verbose=verbose), "Field not equal to itself read back in", ) x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read( self.filename, verbose=verbose, extra=["domain_ancillary"], warnings=warnings, )
a = t.get_construct("fieldancillary0") a a.properties() a.data print("\n**Field creation**\n") print("\n**Stage 1:** The field construct is created without metadata\n") print("\n**Stage 2:** Metadata constructs are created independently.\n") print("\n**Stage 3:** The metadata constructs are inserted into the field\n") p = cfdm.Field(properties={"standard_name": "precipitation_flux"}) p dc = cfdm.DimensionCoordinate(properties={"long_name": "Longitude"}, data=cfdm.Data([0, 1, 2.0])) dc fa = cfdm.FieldAncillary( properties={"standard_name": "precipitation_flux status_flag"}, data=cfdm.Data(numpy.array([0, 0, 2], dtype="int8")), ) fa p = cfdm.Field() p p.set_property("standard_name", "precipitation_flux") p dc = cfdm.DimensionCoordinate() dc dc.set_property("long_name", "Longitude") dc.set_data(cfdm.Data([1, 2, 3.0])) dc
2393.7301, 2393.7301, 2393.7301, 2393.7301], [ 2393.6595, 2393.6595, 2393.6595, 2393.6595, 2393.6595, 2393.6595, 2393.6595, 2393.6595, 2393.6595], [ 2393.4478, 2393.4478, 2393.4478, 2393.4478, 2393.4478, 2393.4478, 2393.4478, 2393.4478, 2393.4478], [ 2393.0949, 2393.0949, 2393.0949, 2393.0949, 2393.0949, 2393.0949, 2393.0949, 2393.0949, 2393.0949], [ 2392.6009, 2392.6009, 2392.6009, 2392.6009, 2392.6009, 2392.6009, 2392.6009, 2392.6009, 2392.6009]]) data = numpy.around(data, 4) area.set_data(cfdm.Data(data)) orog = f.get_construct('surface_altitude').data[-1, -1] = 79.8 t = cfdm.DimensionCoordinate(properties={'standard_name': 'time', 'units': 'days since 2018-12-01'}) t.set_data(cfdm.Data([31.0])) a=cfdm.FieldAncillary(properties={'standard_name': 'air_temperature standard_error', 'units': 'K'}) data = numpy.random.uniform(0.1, 0.9, 90).reshape(10, 9) data = numpy.around(data, 2) a.set_data(cfdm.Data(data)) tda = f.set_domain_axis(cfdm.DomainAxis(1)) f.set_dimension_coordinate(t, axes=[tda]) f.set_field_ancillary(a, axes=['domainaxis1', 'domainaxis2']) f.del_construct('ncvar%ancillary_data') f.del_construct('ncvar%ancillary_data_1')
def test_create_field_3(self): # Dimension coordinates data = numpy.arange(9.) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property('standard_name', 'grid_longitude') dim0.set_property('units', 'degrees') array = dim0.data.array array = numpy.array([array-0.5, array+0.5]).transpose((1,0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.))) dim1.set_property('standard_name', 'grid_latitude') dim1.set_property('units', 'degrees') dim2 = cfdm.DimensionCoordinate(data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.]]))) dim2.set_property('standard_name' , 'atmosphere_hybrid_height_coordinate') dim2.set_property('computed_standard_name', 'altitude') dim3 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.array([15.0]))) dim3.set_property('standard_name', 'time') dim3.set_property('units', 'days since 2004-06-01') dim3.set_bounds(cfdm.Bounds(data=cfdm.Data([[0, 30.]]))) # dim3.set_geometry('climatology') # Auxiliary coordinates ak = cfdm.DomainAncillary(data=cfdm.Data([10.])) ak.set_property('units', 'm') ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.])) bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.]]))) aux2 = cfdm.AuxiliaryCoordinate( data=cfdm.Data(numpy.arange(-45, 45, dtype='int32').reshape(10, 9))) aux2.set_property('units', 'degree_N') aux2.set_property('standard_name', 'latitude') aux3 = cfdm.AuxiliaryCoordinate( data=cfdm.Data(numpy.arange(60, 150, dtype='int32').reshape(9, 10))) aux3.set_property('standard_name', 'longitude') aux3.set_property('units', 'degreeE') array = numpy.ma.array(['alpha','beta','gamma','delta','epsilon', 'zeta','eta','theta','iota','kappa'], dtype='S') array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property('standard_name', 'greek_letters') # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1+numpy.arange(90.).reshape(9, 10)*1234)) msr0.set_measure('area') msr0.set_property('units', 'km2') # Data data = cfdm.Data(numpy.arange(90.).reshape(10, 9)) properties = {'units': 'm s-1'} f = cfdm.Field(properties=properties) f.set_property('standard_name', 'eastward_wind') axisX = f.set_construct(cfdm.DomainAxis(9)) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) axisT = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=[axisX]) y = f.set_construct(dim1, axes=[axisY]) z = f.set_construct(dim2, axes=[axisZ]) t = f.set_construct(dim3, axes=[axisT]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) greek = f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=[axisZ]) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references # ref0 = cfdm.CoordinateReference( # parameters={'grid_mapping_name': 'rotated_latitude_longitude', # 'grid_north_pole_latitude': 38.0, # 'grid_north_pole_longitude': 190.0, # 'earth_radius': 6371007,}, # coordinates=[x, y, lat, lon] # ) coordinate_conversion = cfdm.CoordinateConversion( parameters={'grid_mapping_name': 'rotated_latitude_longitude', 'grid_north_pole_latitude': 38.0, 'grid_north_pole_longitude': 190.0}) datum = cfdm.Datum(parameters={'earth_radius': 6371007}) ref0 = cfdm.CoordinateReference( coordinate_conversion=coordinate_conversion, datum=datum, coordinates=[x, y, lat, lon] ) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property('standard_name', 'surface_altitude') orog.set_property('units', 'm') orog = f.set_construct(orog, axes=[axisY, axisX]) datum1 = cfdm.Datum({'earth_radius' : 6371007}) coordinate_conversion1 = cfdm.CoordinateConversion( parameters={'standard_name': 'atmosphere_hybrid_height_coordinate', 'computed_standard_name': 'altitude'}, domain_ancillaries={'orog': orog, 'a' : ak, 'b' : bk}) ref1 = cfdm.CoordinateReference( datum=datum1, coordinate_conversion=coordinate_conversion1, coordinates=[z] ) ref1 = f.set_construct(ref1) # Field ancillary variables # g = f.transpose([1, 0]) g = f.copy() # g.standard_name = 'ancillary0' # g *= 0.01 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryA' f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() # g.standard_name = 'ancillary2' # g *= 0.001 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryB' f.set_construct(anc, axes=[axisX]) g = f[..., 0] g = g.squeeze() # g.standard_name = 'ancillary3' # g *= 0.001 anc = cfdm.FieldAncillary(data=g.get_data()) anc.standard_name = 'ancillaryC' f.set_construct(anc, axes=[axisY]) f.set_property('flag_values', numpy.array([1, 2, 4], 'int32')) f.set_property('flag_meanings', 'a bb ccc') f.set_property('flag_masks', [2, 1, 0]) cm0 = cfdm.CellMethod(axes=[axisX], method='mean', qualifiers={'interval': [cfdm.Data(1, 'day')], 'comment' : 'ok'}) cm1 = cfdm.CellMethod(axes=[axisY], method='maximum', qualifiers={'where' : 'sea'}) cm2 = cfdm.CellMethod(axes=[axisT], method='maximum', qualifiers={'within' : 'years'}) cm3 = cfdm.CellMethod(axes=[axisT], method='minimum', qualifiers={'over' : 'years'}) f.set_construct(cm0) f.set_construct(cm1) f.set_construct(cm2) f.set_construct(cm3) if verbose: print(repr(f)) print(f) print(f.constructs) print(f.construct_data_axes()) f.dump() # sys.exit(0) cfdm.write(f, self.filename, fmt='NETCDF3_CLASSIC', verbose=verbose) g = cfdm.read(self.filename, verbose=verbose) #, squeeze=True) if verbose: # g[0].dump() # sys.exit(0) for x in g: x.print_read_report() self.assertTrue(len(g) == 1, 'Read produced too many fields: {} != 1'.format(len(g))) g = g[0].squeeze() # print g self.assertTrue(sorted(f.constructs) == sorted(g.constructs), '\n\nf (created in memory)\n{}\n\n{}\n\ng (read from disk)\n{}\n\n{}'.format( sorted(f.constructs), sorted(f.constructs.items()), sorted(g.constructs), sorted(g.constructs.items()))) self.assertTrue(f.equals(f.copy(), verbose=True), "Field f not equal to a copy of itself") self.assertTrue(g.equals(g.copy(), verbose=True), "Field g not equal to a copy of itself") # print f.dump() # print'f' # print f # print 'g' # print g # f.dump() # g.dump() if verbose: f.dump() g.dump() # sys.exit(0) self.assertTrue(g.equals(f, verbose=True), "Field not equal to itself read back in") # sys.exit(0) x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read(self.filename, verbose=verbose, extra=['domain_ancillary'], warnings=warnings) if verbose: for x in g: x.print_read_report() print(g) g[0].dump()
def test_create_field(self): # Dimension coordinates dim1 = cfdm.DimensionCoordinate(data=cfdm.Data(numpy.arange(10.))) dim1.set_property('standard_name', 'grid_latitude') dim1.set_property('units', 'degrees') data = numpy.arange(9.) + 20 data[-1] = 34 dim0 = cfdm.DimensionCoordinate(data=cfdm.Data(data)) dim0.set_property('standard_name', 'grid_longitude') dim0.set_property('units', 'degrees') dim0.nc_set_variable('x') array = dim0.data.array array = numpy.array([array - 0.5, array + 0.5]).transpose((1, 0)) array[-2, 1] = 30 array[-1, :] = [30, 36] dim0.set_bounds(cfdm.Bounds(data=cfdm.Data(array))) dim2 = cfdm.DimensionCoordinate( data=cfdm.Data([1.5]), bounds=cfdm.Bounds(data=cfdm.Data([[1, 2.]]))) dim2.set_property('standard_name', 'atmosphere_hybrid_height_coordinate') dim2.set_property('computed_standard_name', 'altitude') # Auxiliary coordinates ak = cfdm.DomainAncillary(data=cfdm.Data([10.])) ak.set_property('units', 'm') ak.id = 'atmosphere_hybrid_height_coordinate_ak' ak.set_bounds(cfdm.Bounds(data=cfdm.Data([[5, 15.]]))) bk = cfdm.DomainAncillary(data=cfdm.Data([20.])) bk.id = 'atmosphere_hybrid_height_coordinate_bk' bk.set_bounds(cfdm.Bounds(data=cfdm.Data([[14, 26.]]))) aux2 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(-45, 45, dtype='int32').reshape(10, 9))) aux2.set_property('units', 'degree_N') aux2.set_property('standard_name', 'latitude') aux3 = cfdm.AuxiliaryCoordinate(data=cfdm.Data( numpy.arange(60, 150, dtype='int32').reshape(9, 10))) aux3.set_property('standard_name', 'longitude') aux3.set_property('units', 'degreeE') array = numpy.ma.array([ 'alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta', 'theta', 'iota', 'kappa' ], dtype='S') array[0] = numpy.ma.masked aux4 = cfdm.AuxiliaryCoordinate(data=cfdm.Data(array)) aux4.set_property('long_name', 'greek_letters') # Cell measures msr0 = cfdm.CellMeasure( data=cfdm.Data(1 + numpy.arange(90.).reshape(9, 10) * 1234)) msr0.set_measure('area') msr0.set_property('units', 'km2') msr0.nc_set_variable('areacella') # Data data = cfdm.Data(numpy.arange(90.).reshape(10, 9)) properties = {'units': 'm s-1'} f = cfdm.Field(properties=properties) f.set_property('standard_name', 'eastward_wind') da = cfdm.DomainAxis(9) da.nc_set_dimension('grid_longitude') axisX = f.set_construct(da) axisY = f.set_construct(cfdm.DomainAxis(10)) axisZ = f.set_construct(cfdm.DomainAxis(1)) f.set_data(data, axes=[axisY, axisX]) x = f.set_construct(dim0, axes=axisX) y = f.set_construct(dim1, axes=axisY) z = f.set_construct(dim2, axes=[axisZ]) lat = f.set_construct(aux2, axes=[axisY, axisX]) lon = f.set_construct(aux3, axes=[axisX, axisY]) greek = f.set_construct(aux4, axes=[axisY]) ak = f.set_construct(ak, axes=axisZ) bk = f.set_construct(bk, axes=[axisZ]) # Coordinate references coordinate_conversion = cfdm.CoordinateConversion( parameters={ 'grid_mapping_name': 'rotated_latitude_longitude', 'grid_north_pole_latitude': 38.0, 'grid_north_pole_longitude': 190.0 }) datum = cfdm.Datum(parameters={'earth_radius': 6371007}) ref0 = cfdm.CoordinateReference( coordinate_conversion=coordinate_conversion, datum=datum, coordinates=[x, y, lat, lon]) f.set_construct(msr0, axes=[axisX, axisY]) f.set_construct(ref0) orog = cfdm.DomainAncillary(data=f.get_data()) orog.set_property('standard_name', 'surface_altitude') orog.set_property('units', 'm') orog = f.set_construct(orog, axes=[axisY, axisX]) coordinate_conversion = cfdm.CoordinateConversion(parameters={ 'standard_name': 'atmosphere_hybrid_height_coordinate', 'computed_standard_name': 'altitude' }, domain_ancillaries={ 'orog': orog, 'a': ak, 'b': bk }) ref1 = cfdm.CoordinateReference( coordinates=[z], datum=datum, coordinate_conversion=coordinate_conversion) ref1 = f.set_construct(ref1) # Field ancillary variables g = f.copy() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property('standard_name', 'ancillaryA') f.set_construct(anc, axes=[axisY, axisX]) g = f[0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property('long_name', 'ancillaryB') f.set_construct(anc, axes=axisX) g = f[..., 0] g = g.squeeze() anc = cfdm.FieldAncillary(data=g.get_data()) anc.set_property('foo', 'bar') f.set_construct(anc, axes=[axisY]) f.set_property('flag_values', numpy.array([1, 2, 4], 'int32')) f.set_property('flag_meanings', 'a bb ccc') f.set_property('flag_masks', [2, 1, 0]) cm0 = cfdm.CellMethod(axes=axisX, method='mean', qualifiers={ 'interval': [cfdm.Data(1, 'day')], 'comment': 'ok' }) cm1 = cfdm.CellMethod(axes=[axisY], method='maximum', qualifiers={'where': 'sea'}) f.set_construct(cm0) f.set_construct(cm1) self.assertTrue(f.equals(f, verbose=verbose), "Field f not equal to itself") self.assertTrue(f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself") cfdm.write(f, self.filename, fmt='NETCDF3_CLASSIC', verbose=verbose) g = cfdm.read(self.filename, verbose=1) array = g[0].constructs.filter_by_identity( 'long_name=greek_letters').value().data.array self.assertEqual(array[1], b'beta', 'greek_letters = {!r}'.format(array)) self.assertEqual( len(g), 1, 'Read produced the wrong number of fields: {} != 1'.format(len(g))) g = g[0].squeeze() self.assertEqual( sorted(f.constructs), sorted(g.constructs), '\n\nf (created in memory)\n{}\n\n{}\n\ng ' '(read from disk)\n{}\n\n{}'.format(sorted(f.constructs), sorted(f.constructs.items()), sorted(g.constructs), sorted(g.constructs.items()))) self.assertTrue( f.equals(f, verbose=verbose), "Field f not equal to itself after having been written to disk") self.assertTrue( f.equals(f.copy(), verbose=verbose), "Field f not equal to a copy of itself after having been " "written to disk") self.assertTrue(g.equals(g.copy(), verbose=verbose), "Field g not equal to a copy of itself") self.assertTrue(g.equals(f, verbose=verbose), "Field (f) not equal to itself read back in (g)") x = g.dump(display=False) x = f.dump(display=False) g = cfdm.read(self.filename, verbose=verbose, extra='domain_ancillary', warnings=warnings)
a.data print("\n**Field creation**\n") print("\n**Stage 1:** The field construct is created without metadata\n") print("\n**Stage 2:** Metadata constructs are created independently.\n") print("\n**Stage 3:** The metadata constructs are inserted into the field\n") p = cfdm.Field(properties={'standard_name': 'precipitation_flux'}) p dc = cfdm.DimensionCoordinate(properties={'long_name': 'Longitude'}, data=cfdm.Data([0, 1, 2.])) dc fa = cfdm.FieldAncillary( properties={'standard_name': 'precipitation_flux status_flag'}, data=cfdm.Data(numpy.array([0, 0, 2], dtype='int8'))) fa p = cfdm.Field() p p.set_property('standard_name', 'precipitation_flux') p dc = cfdm.DimensionCoordinate() dc dc.set_property('long_name', 'Longitude') dc.set_data(cfdm.Data([1, 2, 3.])) dc fa = cfdm.FieldAncillary(
def test_DimensionCoordinate__init__(self): c = cfdm.DimensionCoordinate(source='qwerty')