예제 #1
0
    def test_potential_field(self):
        h = np.array([.2, .2, .2])
        box = np.array([10., 10., 10.])
        scaling = 2.6

        field_data = constraints.PotentialField.field_from_fn(
            box, h, self.potential)

        F = constraints.PotentialField(field=field_data,
                                       grid_spacing=h,
                                       default_scale=scaling)

        p = self.system.part.add(pos=[0, 0, 0])
        self.system.constraints.add(F)

        for i in product(*map(range, 3 * [10])):
            x = (h * i)
            f_val = F.call_method("_eval_field", x=x)
            np.testing.assert_allclose(f_val, self.potential(x), rtol=1e-3)
            p.pos = x

            self.system.integrator.run(0)
            self.assertAlmostEqual(
                self.system.analysis.energy()['total'], scaling * f_val, places=5)
            np.testing.assert_allclose(
                np.copy(p.f), scaling * self.force(x), rtol=1e-5)
예제 #2
0
    def test_potential_field(self):
        h = np.array([.2, .2, .2])
        box = np.array([10., 10., 10.])
        scaling = 2.6

        field_data = constraints.PotentialField.field_from_fn(
            box, h, self.potential)

        F = constraints.PotentialField(field=field_data, grid_spacing=h,
                                       particle_scales={1: 0.0},
                                       default_scale=scaling)

        p = self.system.part.add(pos=[0, 0, 0])
        self.system.part.add(pos=[1, 0, 0])
        self.system.constraints.add(F)
        self.assertAlmostEqual(F.default_scale, scaling, delta=1e-9)
        self.assertEqual(F.particle_scales, {1: 0.0})
        with self.assertRaisesRegex(RuntimeError, 'Parameter default_scale is read-only'):
            F.default_scale = 2.0
        with self.assertRaisesRegex(RuntimeError, 'Parameter particle_scales is read-only'):
            F.particle_scales = {0: 0.0}

        for i in itertools.product(*map(range, 3 * [10])):
            x = (h * i)
            f_val = F.call_method("_eval_field", x=x)
            np.testing.assert_allclose(f_val, self.potential(x), rtol=1e-3)
            p.pos = x

            self.system.integrator.run(0)
            self.assertAlmostEqual(self.system.analysis.energy()['total'],
                                   scaling * f_val, places=5)
            np.testing.assert_allclose(
                np.copy(p.f), scaling * self.force(x), rtol=1e-5)
예제 #3
0
    def test_constraints(self):
        from espressomd import constraints
        self.assertEqual(
            len(system.constraints),
            8 - int(not espressomd.has_features("ELECTROSTATICS")))
        c = system.constraints
        ref_shape = self.ref_box_l.astype(int) + 2

        self.assertIsInstance(c[0].shape, Sphere)
        self.assertAlmostEqual(c[0].shape.radius, 0.1, delta=1E-10)
        self.assertEqual(c[0].particle_type, 17)

        self.assertIsInstance(c[1].shape, Wall)
        np.testing.assert_allclose(np.copy(c[1].shape.normal),
                                   [1. / np.sqrt(3)] * 3)

        self.assertIsInstance(c[2], constraints.Gravity)
        np.testing.assert_allclose(np.copy(c[2].g), [1., 2., 3.])

        self.assertIsInstance(c[3], constraints.HomogeneousMagneticField)
        np.testing.assert_allclose(np.copy(c[3].H), [1., 2., 3.])

        self.assertIsInstance(c[4], constraints.HomogeneousFlowField)
        np.testing.assert_allclose(np.copy(c[4].u), [1., 2., 3.])
        self.assertAlmostEqual(c[4].gamma, 2.3, delta=1E-10)

        self.assertIsInstance(c[5], constraints.PotentialField)
        self.assertEqual(c[5].field.shape, tuple(list(ref_shape) + [1]))
        self.assertAlmostEqual(c[5].default_scale, 1.6, delta=1E-10)
        self.assertAlmostEqual(c[5].particle_scales[5], 6.0, delta=1E-10)
        np.testing.assert_allclose(np.copy(c[5].origin), [-0.5, -0.5, -0.5])
        np.testing.assert_allclose(np.copy(c[5].grid_spacing), np.ones(3))
        ref_pot = constraints.PotentialField(field=pot_field_data,
                                             grid_spacing=np.ones(3),
                                             default_scale=1.6)
        np.testing.assert_allclose(np.copy(c[5].field),
                                   np.copy(ref_pot.field),
                                   atol=1e-10)

        self.assertIsInstance(c[6], constraints.ForceField)
        self.assertEqual(c[6].field.shape, tuple(list(ref_shape) + [3]))
        self.assertAlmostEqual(c[6].default_scale, 1.4, delta=1E-10)
        np.testing.assert_allclose(np.copy(c[6].origin), [-0.5, -0.5, -0.5])
        np.testing.assert_allclose(np.copy(c[6].grid_spacing), np.ones(3))
        ref_vec = constraints.ForceField(field=vec_field_data,
                                         grid_spacing=np.ones(3),
                                         default_scale=1.4)
        np.testing.assert_allclose(np.copy(c[6].field),
                                   np.copy(ref_vec.field),
                                   atol=1e-10)

        if espressomd.has_features("ELECTROSTATICS"):
            self.assertIsInstance(c[7], constraints.ElectricPlaneWave)
            np.testing.assert_allclose(np.copy(c[7].E0), [1., -2., 3.])
            np.testing.assert_allclose(np.copy(c[7].k), [-.1, .2, .3])
            self.assertAlmostEqual(c[7].omega, 5., delta=1E-10)
            self.assertAlmostEqual(c[7].phi, 1.4, delta=1E-10)
예제 #4
0
system.auto_update_accumulators.add(acc_correlator)

# constraints
system.constraints.add(shape=Sphere(center=system.box_l / 2, radius=0.1),
                       particle_type=17)
system.constraints.add(shape=Wall(normal=[1. / np.sqrt(3)] * 3, dist=0.5))
system.constraints.add(constraints.Gravity(g=[1., 2., 3.]))
system.constraints.add(constraints.HomogeneousMagneticField(H=[1., 2., 3.]))
system.constraints.add(
    constraints.HomogeneousFlowField(u=[1., 2., 3.], gamma=2.3))
pot_field_data = constraints.ElectricPotential.field_from_fn(
    system.box_l, np.ones(3), lambda x: np.linalg.norm(10 * np.ones(3) - x))
checkpoint.register("pot_field_data")
system.constraints.add(
    constraints.PotentialField(field=pot_field_data,
                               grid_spacing=np.ones(3),
                               default_scale=1.6))
vec_field_data = constraints.ForceField.field_from_fn(
    system.box_l, np.ones(3), lambda x: 10 * np.ones(3) - x)
checkpoint.register("vec_field_data")
system.constraints.add(
    constraints.ForceField(field=vec_field_data,
                           grid_spacing=np.ones(3),
                           default_scale=1.4))
if espressomd.has_features("ELECTROSTATICS"):
    system.constraints.add(
        constraints.ElectricPlaneWave(E0=[1., -2., 3.],
                                      k=[-.1, .2, .3],
                                      omega=5.,
                                      phi=1.4))
예제 #5
0
system.auto_update_accumulators.add(acc_correlator)

# constraints
system.constraints.add(shape=Sphere(center=system.box_l / 2, radius=0.1),
                       particle_type=17)
system.constraints.add(shape=Wall(normal=[1. / np.sqrt(3)] * 3, dist=0.5))
system.constraints.add(constraints.Gravity(g=[1., 2., 3.]))
system.constraints.add(constraints.HomogeneousMagneticField(H=[1., 2., 3.]))
system.constraints.add(
    constraints.HomogeneousFlowField(u=[1., 2., 3.], gamma=2.3))
pot_field_data = constraints.ElectricPotential.field_from_fn(
    system.box_l, np.ones(3), lambda x: np.linalg.norm(10 * np.ones(3) - x))
checkpoint.register("pot_field_data")
system.constraints.add(
    constraints.PotentialField(field=pot_field_data,
                               grid_spacing=np.ones(3),
                               default_scale=1.6,
                               particle_scales={5: 6.0}))
vec_field_data = constraints.ForceField.field_from_fn(
    system.box_l, np.ones(3), lambda x: 10 * np.ones(3) - x)
checkpoint.register("vec_field_data")
system.constraints.add(
    constraints.ForceField(field=vec_field_data,
                           grid_spacing=np.ones(3),
                           default_scale=1.4))
if espressomd.has_features("ELECTROSTATICS"):
    system.constraints.add(
        constraints.ElectricPlaneWave(E0=[1., -2., 3.],
                                      k=[-.1, .2, .3],
                                      omega=5.,
                                      phi=1.4))