Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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)
Esempio n. 4
0
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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
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)