def test(natoms = 40, boxl=4.): import pygmin.potentials.ljpshiftfast as ljpshift import pygmin.defaults as defaults from pygmin.utils.neighbor_list import makeBLJNeighborListPot ntypeA = int(natoms*0.8) ntypeB = natoms - ntypeA rcut = 2.5 freezelist = range(ntypeA/2) + range(ntypeA,ntypeA+ntypeB/2) nfrozen = len(freezelist) print "nfrozen", nfrozen coords = np.random.uniform(-1,1,natoms*3)*(natoms)**(1./3)/2 NLblj = ljpshift.LJpshift(natoms, ntypeA, rcut=rcut, boxl=boxl) blj = FreezePot(NLblj, freezelist) pot = makeBLJNeighborListPotFreeze(natoms, freezelist, ntypeA=ntypeA, rcut=rcut, boxl=boxl) #pot = FreezePot(NLpot, freezelist) eblj = blj.getEnergy(coords) print "blj energy", eblj epot = pot.getEnergy(coords) print "mcpot energy", epot print "difference", (epot - eblj)/eblj ret1 = defaults.quenchRoutine(coords, blj.getEnergyGradient, iprint=-11) np.savetxt("out.coords", ret1[0]) print "energy from quench1", ret1[1] ret2 = defaults.quenchRoutine(coords, pot.getEnergyGradient, iprint=-1) print "energy from quench2", ret2[1] print "ret1 evaluated in both potentials", pot.getEnergy(ret1[0]), blj.getEnergy(ret1[0]) print "ret2 evaluated in both potentials", pot.getEnergy(ret2[0]), blj.getEnergy(ret2[0]) coords = ret1[0] e1, g1 = blj.getEnergyGradient(coords) e2, g2 = pot.getEnergyGradient(coords) print "energy difference from getEnergyGradient", (e2 - e1) print "largest gradient difference", np.max(np.abs(g2-g1)) print "rms gradients", np.linalg.norm(g1)/np.sqrt(len(g1)), np.linalg.norm(g2)/np.sqrt(len(g1)) if True: for subpot in pot.pot.potentials: nl = subpot print "number of times neighbor list was remade:", nl.buildcount, "out of", nl.count if False: try: import pygmin.utils.pymolwrapper as pym pym.start() pym.draw_spheres(np.reshape(coords,[-1,3]), "A", 1) pym.draw_spheres(np.reshape(ret1[0],[-1,3]), "A", 2) pym.draw_spheres(np.reshape(ret2[0],[-1,3]), "A", 3) except ImportError: print "Could not draw using pymol, skipping this step"
def testBLJ(self): import pygmin.defaults as defaults X1 = np.copy(self.X1) X2 = np.random.uniform(-1,1,[self.natoms*3])*(float(self.natoms))**(1./3)/2 #run a quench so the structure is not crazy ret = defaults.quenchRoutine(X2, self.pot.getEnergyGradient) X2 = ret[0] self.runtest(X1, X2, findBestPermutation)
def testLJ_hungarian(self): """test findBestPermutationListOPTIM""" import pygmin.defaults as defaults X1 = np.copy(self.X1) X2 = np.random.uniform(-1,1,[self.natoms*3])*(float(self.natoms))**(1./3)/2 #run a quench so the structure is not crazy ret = defaults.quenchRoutine(X2, self.pot.getEnergyGradient) X2 = ret[0] self.runtest(X1, X2, findBestPermutationListHungarian, atomlist=self.permlist[0])
def setUp(self): from pygmin.potentials.ljpshiftfast import LJpshift as BLJ from pygmin import defaults self.natoms = 15 self.ntypeA = int(self.natoms * .8) self.pot = BLJ(self.natoms, self.ntypeA) self.permlist = [range(self.ntypeA), range(self.ntypeA, self.natoms)] self.X1 = np.random.uniform(-1,1,[self.natoms*3])*(float(self.natoms))**(1./3)/2 ret = defaults.quenchRoutine(self.X1, self.pot.getEnergyGradient, tol=.1) self.X1 = ret[0]
def setUp(self): from pygmin.potentials import LJ from pygmin import defaults from pygmin.mindist import CoMToOrigin self.natoms = 15 self.pot = LJ(self.natoms) self.permlist = [range(self.natoms)] self.X1 = np.random.uniform(-1,1,[self.natoms*3])*(float(self.natoms))**(1./3)/2 ret = defaults.quenchRoutine(self.X1, self.pot.getEnergyGradient, tol=.1) self.X1 = ret[0] self.X1 = CoMToOrigin(self.X1)
def setUp(self): from pygmin.potentials.ljpshiftfast import LJpshift as BLJ from pygmin import defaults self.natoms = 25 self.ntypeA = int(self.natoms * .8) self.pot = BLJ(self.natoms, self.ntypeA) self.permlist = [range(self.ntypeA), range(self.ntypeA, self.natoms)] self.X1 = np.random.uniform(-1,1,[self.natoms*3])*(float(self.natoms))**(1./3)/2 #run a quench so the structure is not crazy ret = defaults.quenchRoutine(self.X1, self.pot.getEnergyGradient, **defaults.quenchParams) self.X1 = ret[0]
def setUp(self): from pygmin.potentials.ljpshiftfast import LJpshift as BLJ from pygmin import defaults self.natoms = 25 self.ntypeA = int(self.natoms * .8) self.pot = BLJ(self.natoms, self.ntypeA) self.permlist = [range(self.ntypeA), range(self.ntypeA, self.natoms)] self.X1 = np.random.uniform(-1, 1, [self.natoms * 3]) * (float( self.natoms))**(1. / 3) / 2 #run a quench so the structure is not crazy ret = defaults.quenchRoutine(self.X1, self.pot.getEnergyGradient, **defaults.quenchParams) self.X1 = ret[0]
def _optimizePermRot(X1, X2, niter, permlist, verbose=False, use_quench=True): if use_quench: pot = MinPermDistPotential(X1, X2.copy(), permlist=permlist) distbest = getDistxyz(X1, X2) mxbest = np.identity(3) X20 = X2.copy() for i in range(niter): #get and apply a random rotation aa = random_aa() if not use_quench: mx = aa2mx(aa) mxtot = mx #print "X2.shape", X2.shape else: #optimize the rotation using a permutationally invariand distance metric ret = defaults.quenchRoutine(aa, pot.getEnergyGradient, tol=0.01) aa1 = ret[0] mx1 = aa2mx(aa1) mxtot = mx1 X2 = applyRotation(mxtot, X20) #optimize the permutations dist, X1, X2 = findBestPermutation(X1, X2, permlist) if verbose: print "dist", dist, "distbest", distbest #print "X2.shape", X2.shape #optimize the rotation dist, Q2 = getAlignRotation(X1, X2) # print "dist", dist, "Q2", Q2 mx2 = q2mx(Q2) mxtot = np.dot(mx2, mxtot) if dist < distbest: distbest = dist mxbest = mxtot return distbest, mxbest
def getRandomCoords(pot, natoms): import numpy as np coords = np.random.uniform(-1,1,natoms*3)*natoms**(1./3)*1.5 ret = defaults.quenchRoutine(coords, pot.getEnergyGradient) return ret
boxl = 4 natoms = len(coords) /3 ntypeA = int(natoms*0.8) rcut = 2.5 print "natoms", natoms, "ntypea", ntypeA bljslow = ljpshift.LJpshift(natoms, ntypeA, rcut=rcut, boxl=boxl) blj = LJpshift(natoms, ntypeA, rcut=rcut, boxl=boxl) ebljslow = bljslow.getEnergy(coords) print "blj energy slow", ebljslow eblj = blj.getEnergy(coords) print "blj energy ", eblj print "quenching coords" ret1 = defaults.quenchRoutine(coords, blj.getEnergyGradient, iprint=-11) coords = ret1[0] ebljslow = bljslow.getEnergy(coords) print "blj energy slow", ebljslow eblj = blj.getEnergy(coords) print "blj energy ", eblj