def test_vlist_quartz_bend_angle(): system = get_system_quartz() dlist = DeltaList(system) iclist = InternalCoordinateList(dlist) vlist = ValenceList(iclist) angles = [] for i1 in xrange(system.natom): for i0 in system.neighs1[i1]: for i2 in system.neighs1[i1]: if i0 > i2: vlist.add_term( Harmonic(1.5, 2.0 + 0.01 * i2, BendAngle(i0, i1, i2))) angles.append((i0, i1, i2)) dlist.forward() iclist.forward() energy = vlist.forward() # compute energy manually check_energy = 0.0 for row, (i0, i1, i2) in enumerate(angles): delta0 = system.pos[i0] - system.pos[i1] system.cell.mic(delta0) delta2 = system.pos[i2] - system.pos[i1] system.cell.mic(delta2) angle = bend_angle([delta0, np.zeros(3, float), delta2])[0] check_energy += 0.5 * 1.5 * (angle - (2.0 + 0.01 * i2))**2 assert abs(energy - check_energy) < 1e-8
def test_vlist_quartz_bend_angle(): system = get_system_quartz() dlist = DeltaList(system) iclist = InternalCoordinateList(dlist) vlist = ValenceList(iclist) angles = [] for i1 in range(system.natom): for i0 in system.neighs1[i1]: for i2 in system.neighs1[i1]: if i0 > i2: vlist.add_term(Harmonic(1.5, 2.0+0.01*i2, BendAngle(i0, i1, i2))) angles.append((i0, i1, i2)) dlist.forward() iclist.forward() energy = vlist.forward() # compute energy manually check_energy = 0.0 for row, (i0, i1, i2) in enumerate(angles): delta0 = system.pos[i0] - system.pos[i1] system.cell.mic(delta0) delta2 = system.pos[i2] - system.pos[i1] system.cell.mic(delta2) angle = bend_angle([delta0, np.zeros(3, float), delta2])[0] check_energy += 0.5*1.5*(angle-(2.0+0.01*i2))**2 assert abs(energy - check_energy) < 1e-8
def test_bias_multiple_terms(): system = get_system_quartz() part = ForcePartBias(system) # Harmonic volume bias cv0 = CVVolume(system) K, q0 = 0.4, 0.9 * system.cell.volume bias0 = HarmonicBias(K, q0, cv0) part.add_term(bias0) # Cosine of bending angle cv1 = BendAngle(0, 1, 2) m, a, phi0 = 1, 2.0, np.pi / 4.0 bias1 = Cosine(m, a, phi0, cv1) part.add_term(bias1) # Check energy e = part.compute() contributions = part.get_term_energies() assert np.abs(e - np.sum(contributions)) < 1e-5 assert contributions[0] == bias0.compute() # Check derivatives check_gpos_part(system, part) check_vtens_part(system, part) # Check collective variable values cv_values0 = part.get_term_cv_values(0) assert cv_values0.shape[0] == 1 assert cv_values0[0] == cv0.compute() cv_values1 = part.get_term_cv_values(1) assert cv_values1.shape[0] == 1 delta0 = system.pos[1] - system.pos[0] system.cell.mic(delta0) delta2 = system.pos[1] - system.pos[2] system.cell.mic(delta2) phi = bend_angle([delta0, np.zeros(3, float), delta2])[0] assert np.abs(cv_values1[0] - phi) < 1e-5
def test_iclist_quartz_bend_angle(): system = get_system_quartz() dlist = DeltaList(system) iclist = InternalCoordinateList(dlist) angles = [] for i1 in xrange(system.natom): for i0 in system.neighs1[i1]: for i2 in system.neighs1[i1]: if i0 > i2: iclist.add_ic(BendAngle(i0, i1, i2)) angles.append((i0, i1, i2)) dlist.forward() iclist.forward() for row, (i0, i1, i2) in enumerate(angles): delta0 = system.pos[i1] - system.pos[i0] system.cell.mic(delta0) delta2 = system.pos[i1] - system.pos[i2] system.cell.mic(delta2) assert abs(iclist.ictab[row]['value'] - bend_angle([delta0, np.zeros(3, float), delta2])[0]) < 1e-5
def test_iclist_quartz_bend_angle(): system = get_system_quartz() dlist = DeltaList(system) iclist = InternalCoordinateList(dlist) angles = [] for i1 in range(system.natom): for i0 in system.neighs1[i1]: for i2 in system.neighs1[i1]: if i0 > i2: iclist.add_ic(BendAngle(i0, i1, i2)) angles.append((i0, i1, i2)) dlist.forward() iclist.forward() for row, (i0, i1, i2) in enumerate(angles): delta0 = system.pos[i1] - system.pos[i0] system.cell.mic(delta0) delta2 = system.pos[i1] - system.pos[i2] system.cell.mic(delta2) assert abs(iclist.ictab[row]['value'] - bend_angle([delta0, np.zeros(3, float), delta2])[0]) < 1e-5
#!/usr/bin/env python import argparse import molmod as mm import numpy as np import mdtraj as md def eval_pplane(atoms_xyz): return mm.opbend_dist(atoms_xyz)[0] / mm.angstrom CV_KIND_DICT = { 'BOND': lambda atoms_xyz: mm.bond_length(atoms_xyz)[0] / mm.angstrom, 'ANGLE': lambda atoms_xyz: mm.bend_angle(atoms_xyz)[0] / mm.deg, 'DIHEDRAL': lambda atoms_xyz: mm.dihed_angle(atoms_xyz)[0] / mm.deg, 'PPLANE': lambda atoms_xyz: eval_pplane(np.roll(atoms_xyz, -3)) } MULTICV_KIND_DICT = {'MBOND': (2, 'BOND'), 'MANGLE': (3, 'ANGLE'), 'MDIHEDRAL': (4, 'DIHEDRAL'), 'MPPLANE': (4, 'PPLANE')} def get_center(xyz, indices): return np.mean(np.take(xyz, indices, axis=0), axis=0) def get_centers(xyz, centers):