def test_electrostatics_not_excluded(self): from espressomd.electrostatics import P3M self.s.part.add(id=0, pos=[0, 0, 0], type=0, q=+1.) self.s.part.add(id=1, pos=[1, 0, 0], type=0, q=-1.) # Small alpha means large short-range contribution self.s.actors.add(P3M(prefactor=1, r_cut=3.0, accuracy=1e-3, mesh=32, cao=7, alpha=0.1, tune=False)) # Only short-range part of the coulomb energy pair_energy = self.s.analysis.energy()[('coulomb', 0)] self.assertGreater(abs(pair_energy), 0.) self.s.integrator.run(0) pair_force = self.s.part[0].f[0] self.assertGreater(abs(pair_force), 0.) self.assertAlmostEqual(self.s.part[1].f[0], -pair_force, places=7) pair_pressure = self.s.analysis.pressure()[('coulomb', 0)] self.assertGreater(abs(pair_pressure), 0.) self.s.part[0].exclusions = [1] # Force and energy should not be changed by the exclusion self.s.integrator.run(0) self.assertAlmostEqual(self.s.part[0].f[0], pair_force, places=7) self.assertAlmostEqual(self.s.part[1].f[0], -pair_force, places=7) self.assertAlmostEqual(self.s.analysis.energy()[('coulomb', 0)], pair_energy, places=7) self.assertAlmostEqual(self.s.analysis.pressure()[('coulomb', 0)], pair_pressure, places=7)
def setUp(self): from espressomd.electrostatics import P3M self.system.time_step = 0.01 self.system.cell_system.skin = 0.4 self.system.part.add(pos=[0, 0, 0], type=0, fix=[1, 1, 1], q=self.q1) self.system.part.add(pos=[2, 0, 0], type=0, fix=[1, 1, 1], q=self.q2) p3m = P3M( prefactor=COULOMB_PREFACTOR, accuracy=1e-6, mesh=3 * [52], cao=4) self.system.actors.add(p3m) self.system.non_bonded_inter[0, 0].thole.set_params( scaling_coeff=self.thole_s, q1q2=self.q1 * self.q2)
def setUp(self): from espressomd.electrostatics import P3M self.system.time_step = 0.01 self.system.cell_system.skin = 0.4 q1 = 1.0 q2 = -1.0 self.system.part.add(pos=[0, 0, 0], type=0, fix=[1, 1, 1], q=q1) self.system.part.add(pos=[2, 0, 0], type=0, fix=[1, 1, 1], q=q2) p3m = P3M(prefactor=1.0, accuracy=1e-6, mesh=[52, 52, 52], cao=4) self.system.actors.add(p3m) self.system.non_bonded_inter[0, 0].thole.set_params(scaling_coeff=1.0, q1q2=q1 * q2)
print("After: {:.2e}".format(system.analysis.energy()["total"])) # THERMOSTAT if not args.drude: system.thermostat.set_langevin(kT=temperature_com, gamma=gamma_com, seed=42) # ELECTROSTATICS if args.gpup3m: from espressomd.electrostatics import P3MGPU print("\n-->Tune P3M GPU") p3m = P3MGPU(prefactor=coulomb_prefactor, accuracy=1e-3) else: print("\n-->Tune P3M CPU") p3m = P3M(prefactor=coulomb_prefactor, accuracy=1e-3) system.actors.add(p3m) if args.drude: print("-->Adding Drude related bonds") thermalized_dist_bond = ThermalizedBond(temp_com=temperature_com, gamma_com=gamma_com, temp_distance=temperature_drude, gamma_distance=gamma_drude, r_cut=min(lj_sigmas.values()) * 0.5, seed=123) harmonic_bond = HarmonicBond(k=k_drude, r_0=0.0, r_cut=1.0) system.bonded_inter.add(thermalized_dist_bond) system.bonded_inter.add(harmonic_bond)
def runTest(self): from espressomd.electrostatics import P3M from espressomd.electrostatic_extensions import ICC S = espressomd.System(box_l=[1.0, 1.0, 1.0]) S.seed = S.cell_system.get_state()['n_nodes'] * [1234] # Parameters box_l = 20.0 nicc = 10 q_test = 10.0 q_dist = 5.0 # System S.box_l = [box_l, box_l, box_l + 5.0] S.cell_system.skin = 0.4 S.time_step = 0.01 # ICC particles nicc_per_electrode = nicc * nicc nicc_tot = 2 * nicc_per_electrode iccArea = box_l * box_l / nicc_per_electrode iccNormals = [] iccAreas = [] iccSigmas = [] iccEpsilons = [] l = box_l / nicc for xi in range(nicc): for yi in range(nicc): S.part.add(pos=[l * xi, l * yi, 0], q=-0.0001, fix=[1, 1, 1]) iccNormals.append([0, 0, 1]) for xi in range(nicc): for yi in range(nicc): S.part.add(pos=[l * xi, l * yi, box_l], q=0.0001, fix=[1, 1, 1]) iccNormals.append([0, 0, -1]) iccAreas.extend([iccArea] * nicc_tot) iccSigmas.extend([0] * nicc_tot) iccEpsilons.extend([10000000] * nicc_tot) # Test Dipole b2 = box_l * 0.5 S.part.add(pos=[b2, b2, b2 - q_dist / 2], q=q_test, fix=[1, 1, 1]) S.part.add(pos=[b2, b2, b2 + q_dist / 2], q=-q_test, fix=[1, 1, 1]) # Actors p3m = P3M(prefactor=1, mesh=32, cao=7, accuracy=1e-5) icc = ICC( n_icc=nicc_tot, convergence=1e-6, relaxation=0.75, ext_field=[0, 0, 0], max_iterations=100, first_id=0, eps_out=1, normals=iccNormals, areas=iccAreas, sigmas=iccSigmas, epsilons=iccEpsilons) S.actors.add(p3m) S.actors.add(icc) # Run S.integrator.run(0) # Analyze QL = sum(S.part[:nicc_per_electrode].q) QR = sum(S.part[nicc_per_electrode:nicc_tot].q) testcharge_dipole = q_test * q_dist induced_dipole = 0.5 * (abs(QL) + abs(QR)) * box_l # Result self.assertAlmostEqual(1, induced_dipole / testcharge_dipole, places=4)
def test_dipole_system(self): from espressomd.electrostatics import P3M from espressomd.electrostatic_extensions import ICC BOX_L = 20. BOX_SPACE = 5. self.tearDown() self.system.box_l = [BOX_L, BOX_L, BOX_L + BOX_SPACE] self.system.cell_system.skin = 0.4 self.system.time_step = 0.01 N_ICC_SIDE_LENGTH = 10 DIPOLE_DISTANCE = 5.0 DIPOLE_CHARGE = 10.0 part_slice_lower, normals_lower, areas_lower = self.add_icc_particles( N_ICC_SIDE_LENGTH, -0.0001, 0.) part_slice_upper, normals_upper, areas_upper = self.add_icc_particles( N_ICC_SIDE_LENGTH, 0.0001, BOX_L) assert (part_slice_upper.id[-1] - part_slice_lower.id[0] + 1) == 2 * N_ICC_SIDE_LENGTH**2, "ICC particles not continuous" normals = np.vstack((normals_lower, -normals_upper)) areas = np.hstack((areas_lower, areas_upper)) epsilons = np.full_like(areas, 1e8) sigmas = np.zeros_like(areas) icc = ICC(n_icc=2 * N_ICC_SIDE_LENGTH**2, normals=normals, areas=areas, epsilons=epsilons, sigmas=sigmas, convergence=1e-6, max_iterations=100, first_id=part_slice_lower.id[0], eps_out=1., relaxation=0.75, ext_field=[0, 0, 0]) # Dipole in the center of the simulation box BOX_L_HALF = BOX_L / 2 self.system.part.add( pos=[BOX_L_HALF, BOX_L_HALF, BOX_L_HALF - DIPOLE_DISTANCE / 2], q=DIPOLE_CHARGE, fix=[True, True, True]) self.system.part.add( pos=[BOX_L_HALF, BOX_L_HALF, BOX_L_HALF + DIPOLE_DISTANCE / 2], q=-DIPOLE_CHARGE, fix=[True, True, True]) p3m = P3M(prefactor=1, mesh=32, cao=7, accuracy=1e-5) self.system.actors.add(p3m) self.system.actors.add(icc) self.system.integrator.run(0) charge_lower = sum(part_slice_lower.q) charge_upper = sum(part_slice_upper.q) testcharge_dipole = DIPOLE_CHARGE * DIPOLE_DISTANCE induced_dipole = 0.5 * (abs(charge_lower) + abs(charge_upper)) * BOX_L self.assertAlmostEqual(1, induced_dipole / testcharge_dipole, places=4)
S.part.add(q=-q_test, pos=[5. + 0.7626110043028472, 5. + 1.1553602490158381, 5. + 1.5911379657603222]) S.part.add(q=+q_test, pos=[5. + 7.8821447099392721, 5. + 0.4034300711037871, 5. + 7.9059476944673319]) S.part.add(q=-q_test, pos=[5. + 5.9898074399584971, 5. + 4.0257560499252341, 5. + 2.2902743446550091]) S.part.add(q=+q_test, pos=[5. + 1.8279471451676890, 5. + 6.1426958405810366, 5. + 3.3186853428545273]) S.part.add(q=-q_test, pos=[5. + 6.0511459000884980, 5. + 9.6405139003326319, 5. + 3.7804022094052305]) S.part.add(q=+q_test, pos=[5. + 1.8438158015197290, 5. + 3.0007018828771095, 5. + 0.5416704812475205]) S.part.add(q=-q_test, pos=[5. + 1.4400805639476335, 5. + 0.1043669321614941, 5. + 8.8479965821355542]) S.part.add(q=+q_test, pos=[5. + 9.5797857731392480, 5. + 6.2586590985382529, 5. + 9.5556776221428787]) S.part.add(q=-q_test, pos=[5. + 6.3099270652140742, 5. + 0.3912234123714486, 5. + 3.5127712166987091]) S.part.add(q=+q_test, pos=[5. + 1.4632732155390766, 5. + 1.0601483109035978, 5. + 1.9741218834874423]) # Actors #p3m = P3M(prefactor=1, mesh=32, cao=7, accuracy=1e-7) p3m = P3M(prefactor=1, mesh=32, cao=7, accuracy=1e-5, alpha=1.112583061, r_cut=4.9, tune=False) icc = ICC( n_icc=nicc_tot, convergence=1e-6, relaxation=0.75, ext_field=[0, 0, 0], max_iterations=100, first_id=0, eps_out=1, normals=iccNormals, areas=iccAreas, sigmas=iccSigmas, epsilons=iccEpsilons) S.actors.add(p3m) S.actors.add(icc)