def test_smoothing(): """test smoothing on different grids""" for grid in [ CartesianGrid([[-2, 3]], 4), UnitGrid(7, periodic=False), UnitGrid(7, periodic=True), ]: f1 = ScalarField.random_uniform(grid) sigma = 0.5 + np.random.random() # this assumes that the grid periodicity is the same for all axes mode = "wrap" if grid.periodic[0] else "reflect" s = sigma / grid.typical_discretization expected = ndimage.gaussian_filter(f1.data, sigma=s, mode=mode) out = f1.smooth(sigma) np.testing.assert_allclose(out.data, expected) out.data = 0 # reset data f1.smooth(sigma, out=out).data np.testing.assert_allclose(out.data, expected) # test one simple higher order smoothing tf = Tensor2Field.random_uniform(grid) assert tf.data.shape == tf.smooth(1).data.shape # test in-place smoothing g = UnitGrid([8, 8]) f1 = ScalarField.random_normal(g) f2 = f1.smooth(3) f1.smooth(3, out=f1) np.testing.assert_allclose(f1.data, f2.data)
def test_storing_collection(tmp_path): """ test methods specific to FieldCollections in memory storage """ grid = UnitGrid([2, 2]) f1 = ScalarField.random_uniform(grid, 0.1, 0.4, label="a") f2 = VectorField.random_uniform(grid, 0.1, 0.4, label="b") f3 = Tensor2Field.random_uniform(grid, 0.1, 0.4, label="c") fc = FieldCollection([f1, f2, f3]) storage_classes = {"MemoryStorage": MemoryStorage} if module_available("h5py"): file_path = tmp_path / "test_storage_write.hdf5" storage_classes["FileStorage"] = functools.partial( FileStorage, file_path) for storage_cls in storage_classes.values(): # store some data storage = storage_cls() storage.start_writing(fc) storage.append(fc, 0) storage.append(fc, 1) storage.end_writing() assert storage.has_collection assert storage.extract_field(0)[0] == f1 assert storage.extract_field(1)[0] == f2 assert storage.extract_field(2)[0] == f3 assert storage.extract_field(0)[0].label == "a" assert storage.extract_field(0, label="new label")[0].label == "new label" assert storage.extract_field(0)[0].label == "a" # do not alter label assert storage.extract_field("a")[0] == f1 assert storage.extract_field("b")[0] == f2 assert storage.extract_field("c")[0] == f3 with pytest.raises(ValueError): storage.extract_field("nonsense")
def test_simple_plotting(example_grid): """test simple plotting of various fields on various grids""" vf = VectorField.random_uniform(example_grid) tf = Tensor2Field.random_uniform(example_grid) sf = tf[0, 0] # test extraction of fields fc = FieldCollection([sf, vf]) for f in [sf, vf, tf, fc]: f.plot(action="close") f.plot(kind="line", action="close") if example_grid.dim >= 2: f.plot(kind="image", action="close") if isinstance(f, VectorField) and example_grid.dim == 2: f.plot(kind="quiver", action="close") f.plot(kind="streamplot", action="close")
def test_writing_images(tmp_path): """test writing and reading files""" from matplotlib.pyplot import imread grid = UnitGrid([4, 4]) s = ScalarField.random_uniform(grid, label="scalar") v = VectorField.random_uniform(grid, label="vector") t = Tensor2Field.random_uniform(grid, label="tensor") path = tmp_path / "test_writing_images.png" for f in [s, v, t]: f.to_file(path) # try reading the file with path.open("br") as fp: imread(fp)
def test_hdf_input_output(tmp_path): """test writing and reading files""" grid = UnitGrid([4, 4]) s = ScalarField.random_uniform(grid, label="scalar") v = VectorField.random_uniform(grid, label="vector") t = Tensor2Field.random_uniform(grid, label="tensor") col = FieldCollection([s, v, t], label="collection") path = tmp_path / "test_hdf_input_output.hdf5" for f in [s, v, t, col]: f.to_file(path) f2 = FieldBase.from_file(path) assert f == f2 assert f.label == f2.label assert isinstance(str(f), str) assert isinstance(repr(f), str)
def test_dot_product(): """test dot products between vectors and tensors""" g = UnitGrid([3, 2]) vf = VectorField.random_normal(g) tf = Tensor2Field.random_normal(g) v_dot = vf.make_dot_operator() t_dot = tf.make_dot_operator() expected = np.einsum("i...,i...->...", vf.data, vf.data) np.testing.assert_allclose((vf @ vf).data, expected) np.testing.assert_allclose(v_dot(vf.data, vf.data), expected) expected = np.einsum("i...,i...->...", vf.data, tf.data) np.testing.assert_allclose((vf @ tf).data, expected) np.testing.assert_allclose(v_dot(vf.data, tf.data), expected) expected = np.einsum("ji...,i...->j...", tf.data, vf.data) np.testing.assert_allclose((tf @ vf).data, expected) np.testing.assert_allclose(t_dot(tf.data, vf.data), expected) expected = np.einsum("ij...,jk...->ik...", tf.data, tf.data) np.testing.assert_allclose((tf @ tf).data, expected) np.testing.assert_allclose(t_dot(tf.data, tf.data), expected)