def test_force_field(self): h = np.array([.8, .8, .8]) box = np.array([10., 10., 10.]) scaling = 2.6 field_data = constraints.ForceField.field_from_fn(box, h, self.force) F = constraints.ForceField(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.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 = np.array(F.call_method("_eval_field", x=x)) np.testing.assert_allclose(f_val, self.force(x)) p.pos = x self.system.integrator.run(0) np.testing.assert_allclose(scaling * f_val, np.copy(p.f))
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)
def test_force_field(self): h = np.array([.2, .2, .2]) box = np.array([10., 10., 10.]) scaling = 2.6 field_data = constraints.ForceField.field_from_fn(box, h, self.force) F = constraints.ForceField(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 = np.array(F.call_method("_eval_field", x=x)) np.testing.assert_allclose(f_val, self.force(x)) p.pos = x self.system.integrator.run(0) np.testing.assert_allclose(scaling * f_val, np.copy(p.f))
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)) if 'LB.OFF' in modes: # set thermostat if 'THERM.LANGEVIN' in modes: system.thermostat.set_langevin(kT=1.0, gamma=2.0, seed=42) elif 'THERM.BD' in modes: system.thermostat.set_brownian(kT=1.0, gamma=2.0, seed=42) elif 'THERM.NPT' in modes and has_features('NPT'):