コード例 #1
0
def test_force_coulomb():
    '''Ensure the correctness of Coulomb force calculation by the testing if the potentials from direct calculation and
    from numerical integration of force are the same.
    '''
    n_dim = 3
    l_box = np.array([3., 3., 3.])
    n_particles = 2
    q = np.array([[0., 0., 0.], [1., 0., 0.]])
    charge_vector = np.array([-1., 1.])
    # simu_config = es.SimuConfig(n_dim=q.shape[1], n_particles=q.shape[0], l_box=l_box, l_cell=l_box[0], neighbour=True)
    simu_config = es.SimuConfig(n_dim=q.shape[1], n_particles=q.shape[0], l_box=l_box, l_cell=l_box[0], PBC=True, neighbour=False)
コード例 #2
0
def test_potential_neighbour(x, epsilon_lj, sigma_lj, switch_start_lj,
                             cutoff_lj, l_box, l_cell):
    simu_config = es.SimuConfig(n_dim=x.shape[1],
                                n_particles=x.shape[0],
                                l_box=l_box,
                                l_cell=l_cell,
                                switch_start_lj=switch_start_lj,
                                cutoff_lj=cutoff_lj,
                                neighbour=True)
    distance_vectors = es.distances.DistanceVectors(simu_config)
    lennard_jones = es.potentials.LennardJones(simu_config)
    potential1 = lennard_jones.calc_potential(distance_vectors(x, 0))
    distance_vectors.neighbour_flag = False
    potential2 = lennard_jones.calc_potential(distance_vectors(x, 0))
    np.testing.assert_allclose(potential1, potential2)
コード例 #3
0
def test_potential(x):
    test_config = es.SimuConfig(
        l_box=[10.] * x.shape[1],
        PBC=True,
        particle_info=[0] * x.shape[0],
        n_steps=2000,
        timestep=0.001,
        temp=30,
        phys_world=dummy_world,
    )
    pot = es.potentials.LJ(test_config, 2.5, 3.5)
    pot.set_positions(x)
    potential1 = pot.pot
    # legacy potential implementaton, requires sigma, epsilon = 1
    # and a switch region of 2.5 to 3.5
    potential2 = es.potentials.lj_potential_total(x)
    np.testing.assert_allclose(potential1, potential2)
コード例 #4
0
def test_gradient(n_points, start, end, epsilon_lj, sigma_lj, switch_start,
                  cutoff):
    # initiate classes
    simu_config = es.SimuConfig(
        n_dim=2,
        n_particles=2,
        cutoff=cutoff,
        switch_start=switch_start,
        lj_flag=True,
        PBC=False,
    )
    calc_potential = es.potentials.CalcPotential(simu_config, [])
    calc_force = es.potentials.CalcForce(simu_config, [])

    # define distances array
    distances = np.linspace(start, end, n_points)

    # calculate lj potential corresponding to one particle at origin and one at
    # d for every element in distances
    potential = np.zeros(len(distances))
    for i in range(len(distances)):
        potential[i] = calc_potential(np.array([[distances[i], 0], [0, 0]]))

    # calculate the corresponding gradient by interpolation, mult by -1
    gradient_np = -1 * np.gradient(potential, distances)

    # caculate the force for one particle at origin and one particle at d acting
    # on second particle with force methond from lennard_jones.py
    gradient_calc = np.zeros(len(distances))
    for i in range(len(distances)):
        gradient_calc[i] = calc_force(np.array([[0, 0], [distances[i], 0]]))[1,
                                                                             0]

    # test both gradients
    np.testing.assert_allclose(gradient_np,
                               gradient_calc,
                               rtol=1E-2,
                               atol=1E-2)
コード例 #5
0
    return pot_func, force_func


def StupidInitializer3(box_size, n_particles):
    # need to return a tuple of four vectors
    # masses, charges, q_0 and p_0
    q_0 = np.array([[0., 0.], [0., 1.]]) + box_size / 2
    #v_0 = np.array([[0.5, 0.866], [-0.8, 0.6]])
    v_0 = np.array([[0., 0.], [0., 0.]])
    return q_0, v_0


test_config = es.SimuConfig(l_box=(8., 8.),
                            PBC=True,
                            particle_info=[0, 0],
                            n_steps=10000,
                            timestep=0.001,
                            temp=30,
                            phys_world=dummy_world)
test_md = es.MD(test_config, StupidInitializer3,
                es.step_runners.Langevin(damping=0.01))
test_md.add_potential(HarmonicTrap(test_config, 100., [4., 4.]))
#test_md.add_potential(es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs() % 8.
plt.plot(qs[:, 0, 0], qs[:, 0, 1])
plt.plot(qs[:, 1, 0], qs[:, 1, 1])
plt.show()
コード例 #6
0

q_opt = np.load("optimized.npy")


def langevin_init_N_108_l_box_6(box_size, n_particles):
    n_dim = len(box_size)
    q_0 = q_opt
    v_0 = np.zeros((n_particles, n_dim))
    return q_0, v_0


test_config = es.SimuConfig(l_box=(6., 6., 6.),
                            PBC=True,
                            neighbor_list=False,
                            particle_info=[0] * 108,
                            n_steps=8000,
                            timestep=0.001,
                            temp=0.5,
                            phys_world=dummy_world)
test_md = es.MD(test_config, random_initiliazer, es.step_runners.MMC(step=0.1))
test_md.add_potential(
    es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))

test_md.run_all()
print("simu_done")
qs = test_md.traj.get_qs()
#np.save("optimized.npy",qs[-1])

Gr = es.observables.RadDistFunc(test_config, 40, [108, 0, 0])
g_r, radii = Gr.calc_radial_dist(qs, 500, 1)
コード例 #7
0
    # 3.104 is for correct liquid water density at 300 K
    l_box = 7. * np.array([2 * n, n, n])
    grid=_grid([n, n, n])
    q_0 = 7. * grid
    #init_directions = []
    q = (q_0[:, None, :] + water_shape[None, :, :]).reshape(-1, 3)
    v = np.zeros((3 * n_mol, n_dim))
    mol_list = []
    for i in range(n_mol):
        mol_list.append((0, [3 * i, 3 * i + 1, 3 * i + 2]))
    particle_info = np.tile([1, 2, 2], n_mol)
    return q, v, particle_info, l_box, mol_list

q, v, particle_info, l_box, mol_list = _intializer_WaterBox(3)
steps = 5000
test_config = es.SimuConfig(l_box=l_box, PBC=True, neighbor_list=False, particle_info=particle_info, mol_list=mol_list, n_steps=steps, timestep=1e-3, temp=500)
init = lambda x,y: (q, v)
test_md = es.MD(test_config, init, es.step_runners.GradientDescent())
test_md.add_potential(es.potentials.Water(test_config))
test_md.add_potential(es.potentials.LJ(test_config, switch_start=5., cutoff=7.))
test_md.add_potential(es.potentials.Coulomb(test_config))
print(es.potentials.Coulomb(test_config))
#test_md.add_potential(HarmonicTrap(test_config, 100., [4., 4.]))
#test_md.add_potential(es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()
pdb = es.observables.PdbWriter(test_config, 'water_opt2.pdb')
for i in range(int(steps/100)):
   pdb.write_frame(qs[i * 100])
コード例 #8
0

q_opt = np.load("optimized.npy")


def langevin_init_N_108_l_box_6(box_size, n_particles):
    n_dim = len(box_size)
    q_0 = q_opt
    v_0 = np.zeros((n_particles, n_dim))
    return q_0, v_0


test_config = es.SimuConfig(l_box=(17.5, 17.5, 17.5),
                            PBC=True,
                            neighbor_list=True,
                            particle_info=np.asarray([0] * 100),
                            n_steps=100000,
                            timestep=0.001,
                            temp=100)
test_md = es.MD(test_config, random_initiliazer, es.step_runners.MMC(step=0.5))
test_md.add_potential(
    es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
#test_md.add_potential(es.potentials.Coulomb(test_config))

test_md.run_all()
print("simu_done")
qs = test_md.traj.get_qs()
#np.save("optimized.npy",qs[-1])

Gr = es.observables.RadDistFunc(test_config, 100)
g_r, radii, name_list = Gr.calc_radial_dist(qs, 100, 100000, 50)
コード例 #9
0
def grid_initializer_2d(l_box, n_particles):
    x = np.linspace(0., l_box[0], 3, endpoint=False)
    y = np.linspace(0., l_box[1], 3, endpoint=False)
    masses = np.array([1.] * 9)
    charges = np.array([0.] * 9)
    q_0 = np.array(np.meshgrid(x, x)).T.reshape(9,2)
    v_0 = np.array([[0., 0.]] * 9)
    return masses, charges, q_0, v_0 * masses[:, None]

N_particles = 9
l_box = (8., 8.)
test_config = es.SimuConfig(n_dim = 2,
                            l_box = l_box,
                            n_particles = N_particles,
                            n_steps = 3000,
                            timestep = 0.001,
                            temp = 100,
                            PBC = True,
                            neighbour = False,
                            lj_flag = True,
                            )
test_md = es.MD(es.PhysWorld(), test_config, grid_initializer_2d, es.step_runners.Langevin(damping=0.1))
#test_md.add_global_potential(HarmonicPotential(1.))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()
#plt.plot(qs[:, 0, 0]%3., qs[:, 0, 1]%3.)
#plt.plot(qs[:, 1, 0]%3., qs[:, 1, 1]%3.)
#plt.show()

import matplotlib.animation as manimation
コード例 #10
0
    q_0 = np.array([[0., 0., -0.064609], [0., -0.81649, 0.51275],
                    [0., 0.81649, 0.51275]])
    q = np.vstack((q_0, q_0 + box_size / 5 * 2))
    #v_0 = np.array([[0.5, 0.866], [-0.8, 0.6]])
    v_0 = np.array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
    v = np.vstack((v_0, v_0))
    return q, v


particle_info = [1, 2, 2, 1, 2, 2]
mol_list = [(0, [0, 1, 2]), (0, [3, 4, 5])]

test_config = es.SimuConfig(l_box=(8., 8., 8.),
                            PBC=True,
                            particle_info=particle_info,
                            mol_list=mol_list,
                            n_steps=1000,
                            timestep=0.02,
                            temp=300)
test_md = es.MD(test_config, StupidInitializerWater,
                es.step_runners.Langevin(damping=0.05))
test_md.add_potential(es.potentials.Water(test_config))
test_md.add_potential(es.potentials.LJ(test_config, switch_start=5.,
                                       cutoff=7.))
test_md.add_potential(es.potentials.Coulomb(test_config))
#test_md.add_potential(HarmonicTrap(test_config, 100., [4., 4.]))
#test_md.add_potential(es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()
pdb = es.observables.PdbWriter(test_config, 'water_dimer.pdb')
コード例 #11
0
    #init_directions = []
    q = (q_0[:, None, :] + water_shape[None, :, :]).reshape(-1, 3)
    v = np.zeros((3 * n_mol, n_dim))
    mol_list = []
    for i in range(n_mol):
        mol_list.append((0, [3 * i, 3 * i + 1, 3 * i + 2]))
    particle_info = np.tile([1, 2, 2], n_mol)
    return q, v, particle_info, l_box, mol_list


q, v, particle_info, l_box, mol_list = _intializer_WaterBox(6)
steps = 2000
test_config = es.SimuConfig(l_box=l_box,
                            PBC=True,
                            particle_info=particle_info,
                            mol_list=mol_list,
                            n_steps=steps,
                            timestep=0.01,
                            temp=500)
init = lambda x, y: (q, v)
test_md = es.MD(test_config, init, es.step_runners.Langevin(damping=0.05))
test_md.add_potential(es.potentials.Water(test_config))
test_md.add_potential(es.potentials.LJ(test_config, switch_start=5.,
                                       cutoff=7.))
test_md.add_potential(es.potentials.Coulomb(test_config))
#test_md.add_potential(HarmonicTrap(test_config, 100., [4., 4.]))
#test_md.add_potential(es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()
pdb = es.observables.PdbWriter(test_config, 'water_gas.pdb')
コード例 #12
0
'''
@njit
def func(pair, dv):
    return dv[1]
'''
def func(Coeff):
    @njit
    def pot_func(pair, dv):
        return Coeff * exp(-dv[1])
    @njit
    def force_func(pair, dv):
        return dv[0] * Coeff
    return pot_func, force_func

q, charge_vector, l_box = _intializer_NaCl(3)
simu_config = es.SimuConfig(n_dim=q.shape[1], n_particles=q.shape[0], l_box=l_box, PBC=True)
# simu_config.charges = charge_vector
distance_vectors = PWNumba(simu_config, func(2.), 1.)
distance_vectors.set_positions(q)
# print(distance_vectors.get_particles_in_cutoff(0))
print("MULTI:", distance_vectors.MULTI)
#for pair in distance_vectors.pairs:
#    print(pair)
print(distance_vectors.pot)
print(distance_vectors.forces)
print()
print(distance_vectors.pots)
print(distance_vectors.forces)
print()
distance_vectors.set_positions(q)
print(distance_vectors.pots)
コード例 #13
0
    X = np.vstack([v.reshape(-1) for v in xx]).T
    return X

def _intializer_NaCl(n):
    n_particles = n * n * n
    n_dim = 3
    l_box = 10. * np.array([n, n, n])
    grid=_grid([n, n, n])
    q = 10. * grid
    v = np.zeros((n_particles, n_dim))
    particle_info = grid.sum(axis=1)%2+3
    return q, v, particle_info, l_box

q, v, particle_info, l_box = _intializer_NaCl(4)
steps = 2000
test_config = es.SimuConfig(l_box=l_box, PBC=True, particle_info=particle_info, n_steps=steps, timestep=0.2, temp=1400)
init = lambda x,y: (q, v)
test_md = es.MD(test_config, init, es.step_runners.Langevin(damping=0.1))
#test_md.add_potential(es.potentials.Water(test_config))
test_md.add_potential(es.potentials.LJ(test_config, switch_start=5., cutoff=7.))
test_md.add_potential(es.potentials.Coulomb(test_config))

test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()

Gr = es.observables.RadDistFunc(test_config, 100)
g_r, radii, name_list = Gr.calc_radial_dist(qs, 1000,2000, 1)
print(np.asarray(g_r).shape,np.asarray(radii).shape, np.asarray(name_list).shape)

import matplotlib.pyplot as plt
コード例 #14
0
n_particles_along_axis = 8
n_particles = n_particles_along_axis**3
n_dim = 3
resolution = 6
l_box = np.array([n_particles_along_axis] * 3)
# grid=np.array(list(product(range(0,3), repeat=n_dim)))
# x = 1. * grid
x = particle_init_regular_grid_2_kinds_3d(1, n_particles_along_axis)
charge_vector = x.sum(axis=1) % 2 * 2 - 1
# Madelung = -1.74756459463
# pot_ref = -447.37653622528
# pot_real_ref = -159.04160026039025

simu_config = es.SimuConfig(n_dim=x.shape[1],
                            n_particles=x.shape[0],
                            l_box=l_box,
                            l_cell=l_box[0],
                            neighbour=True)
simu_config.charges = charge_vector
distance_vectors = es.distances.DistanceVectors(simu_config)
coulomb = es.potentials.Coulomb(simu_config)
force_calc = coulomb.calc_force(x, distance_vectors(x, 0))

print(force_calc)

simu_config = es.SimuConfig(
    n_dim=x.shape[1],
    n_particles=x.shape[0],
    l_box=l_box,
    l_cell=l_box[0],
    neighbour=False,
コード例 #15
0
def _intializer_NaCl(n):
    n_particles = n * n * n
    n_dim = 3
    l_box = 10. * np.array([2 * n, n, n])
    grid = _grid([n, n, n])
    q = 10. * grid
    v = np.zeros((n_particles, n_dim))
    particle_info = grid.sum(axis=1) % 2 + 3
    return q, v, particle_info, l_box


q, v, particle_info, l_box = _intializer_NaCl(4)
steps = 1000
test_config = es.SimuConfig(l_box=l_box,
                            PBC=True,
                            particle_info=particle_info[1:-1],
                            n_steps=steps,
                            timestep=200,
                            temp=2000)
init = lambda x, y: (q[1:-1], v[1:-1])
test_md = es.MD(test_config, init, es.step_runners.Langevin(damping=0.1))
#test_md.add_potential(es.potentials.Water(test_config))
test_md.add_potential(es.potentials.LJ(test_config, switch_start=5.,
                                       cutoff=7.))
test_md.add_potential(es.potentials.Coulomb(test_config))
#test_md.add_potential(HarmonicTrap(test_config, 100., [4., 4.]))
#test_md.add_potential(es.potentials.LJ(test_config, switch_start=2.5, cutoff=3.5))
test_md.run_all()
#print(test_md.traj.get_qs())
qs = test_md.traj.get_qs()
pdb = es.observables.PdbWriter(test_config, 'NaCl7.pdb', put_in_box=True)
for i in range(steps // 8):