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)
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)
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)
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)
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()
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)
# 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])
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)
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
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')
#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')
''' @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)
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
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,
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):