def test_localization_perturbed_3d(periodic): """tests localization of perturbed 3d droplets""" size = 8 pos = np.random.uniform(-2, 2, size=3) radius = np.random.uniform(2, 3) width = np.random.uniform(0.5, 1.5) ampls = np.random.uniform(-0.01, 0.01, size=3) d1 = PerturbedDroplet3D(pos, radius, interface_width=width, amplitudes=ampls) a = np.random.random(3) - size / 2 b = np.random.random(3) + size / 2 grid = CartesianGrid(np.c_[a, b], 2 * size, periodic=periodic) assert grid.dim == 3 field = d1.get_phase_field(grid) emulsion = image_analysis.locate_droplets(field, refine=True, modes=d1.modes) assert len(emulsion) == 1 d2 = emulsion[0] msg = "size=%d, periodic=%s, %s != %s" % (size, periodic, d1, d2) np.testing.assert_almost_equal(d1.position, d2.position, decimal=1, err_msg=msg) assert d1.radius == pytest.approx(d2.radius, rel=1e-4) assert d1.interface_width == pytest.approx(d2.interface_width, rel=1e-3) np.testing.assert_allclose( d1.amplitudes[3:], d2.amplitudes[3:], rtol=0.5, err_msg=msg )
def test_localization_spherical(): """tests simple droplets localization in spherical grid""" radius = np.random.uniform(2, 3) width = np.random.uniform(0.5, 1.5) d1 = DiffuseDroplet((0, 0, 0), radius, interface_width=width) grid_radius = 6 + 2 * np.random.random() grid = SphericalSymGrid(grid_radius, 16) field = d1.get_phase_field(grid) emulsion = image_analysis.locate_droplets(field, refine=True) assert len(emulsion) == 1 d2 = emulsion[0] np.testing.assert_almost_equal(d1.position, d2.position, decimal=5) assert d1.radius == pytest.approx(d2.radius, rel=1e-5) assert d1.interface_width == pytest.approx(d2.interface_width, rel=1e-5) emulsion = image_analysis.locate_droplets(ScalarField(grid)) assert len(emulsion) == 0
def test_localization_cylindrical(periodic): """tests simple droplets localization in cylindrical grid""" pos = (0, 0, np.random.uniform(-4, 4)) radius = np.random.uniform(2, 3) width = np.random.uniform(0.5, 1.5) d1 = DiffuseDroplet(pos, radius, interface_width=width) grid_radius = 6 + 2 * np.random.random() bounds_z = np.random.uniform(1, 2, size=2) * np.array([-4, 4]) grid = CylindricalSymGrid(grid_radius, bounds_z, (16, 32), periodic_z=periodic) field = d1.get_phase_field(grid) emulsion = image_analysis.locate_droplets(field, refine=True) assert len(emulsion) == 1 d2 = emulsion[0] np.testing.assert_almost_equal(d1.position, d2.position, decimal=5) assert d1.radius == pytest.approx(d2.radius, rel=1e-5) assert d1.interface_width == pytest.approx(d2.interface_width) emulsion = image_analysis.locate_droplets(ScalarField(grid)) assert len(emulsion) == 0
def test_localization_sym_unit(size, periodic): """tests simple droplets localization in 2d""" pos = np.random.random(2) * size radius = np.random.uniform(2, 5) width = np.random.uniform(1, 2) d1 = DiffuseDroplet(pos, radius, interface_width=width) grid = UnitGrid((size, size), periodic=periodic) field = d1.get_phase_field(grid) emulsion = image_analysis.locate_droplets(field, refine=True) assert len(emulsion) == 1 d2 = emulsion[0] np.testing.assert_almost_equal(d1.position, d2.position) assert d1.radius == pytest.approx(d2.radius, rel=1e-4) assert d1.interface_width == pytest.approx(d2.interface_width) emulsion = image_analysis.locate_droplets(field, minimal_radius=size) assert len(emulsion) == 0 emulsion = image_analysis.locate_droplets(ScalarField(grid)) assert len(emulsion) == 0
def test_localization_sym_rect(periodic): """tests simple droplets localization in 2d with a rectangular grid""" size = 16 pos = np.random.uniform(-4, 4, size=2) radius = np.random.uniform(2, 5) width = np.random.uniform(0.5, 1.5) d1 = DiffuseDroplet(pos, radius, interface_width=width) a = np.random.random(2) - size / 2 b = np.random.random(2) + size / 2 grid = CartesianGrid(np.c_[a, b], 3 * size, periodic=periodic) field = d1.get_phase_field(grid) emulsion = image_analysis.locate_droplets(field, refine=True) assert len(emulsion) == 1 d2 = emulsion[0] np.testing.assert_almost_equal(d1.position, d2.position) assert d1.radius == pytest.approx(d2.radius, rel=1e-5) assert d1.interface_width == pytest.approx(d2.interface_width) emulsion = image_analysis.locate_droplets(ScalarField(grid)) assert len(emulsion) == 0
def test_emulsion_processing(): """test identifying emulsions in phase fields""" grid = UnitGrid([32, 32], periodic=True) e1 = Emulsion( [ DiffuseDroplet(position=[5, 6], radius=9, interface_width=1), DiffuseDroplet(position=[20, 19], radius=8, interface_width=1), ], grid=grid, ) field = e1.get_phasefield() e2 = image_analysis.locate_droplets(field, refine=True) np.testing.assert_allclose( structured_to_unstructured(e1.data), structured_to_unstructured(e2.data), rtol=0.02, )
def test_localization_threshold(): """tests different localization thresholds""" pos = np.random.random(2) * 16 radius = np.random.uniform(2, 5) width = np.random.uniform(1, 2) d1 = DiffuseDroplet(pos, radius, interface_width=width) grid = UnitGrid((16, 16), periodic=False) field = d1.get_phase_field(grid) for threshold in [0.25, 0.75, "auto"]: emulsion = image_analysis.locate_droplets( field, threshold=threshold, refine=True ) assert len(emulsion) == 1 d2 = emulsion[0] np.testing.assert_almost_equal(d1.position, d2.position) assert d1.radius == pytest.approx(d2.radius, rel=1e-4) assert d1.interface_width == pytest.approx(d2.interface_width)