system = System.from_hdf5(f_res) ff = ForceField.generate(system, 'pars.txt', rcut=15*angstrom, alpha_scale=3.2, gcut_scale=1.5, smooth_ei=True) # Replace non-covalent part with LAMMPS for part in ff.parts: if part.name=='valence': part_valence = part elif part.name=='pair_ei': part_ei = part # Write LAMMPS system file write_lammps_data(system) nlist = BondedNeighborList(system) pair_pot = PairPotEI(system.charges, 0.0, part_ei.pair_pot.rcut, tr=Switch3(part_ei.pair_pot.get_truncation().width), radii=system.radii) scalings = Scalings(system, scale1=1.0, scale2=1.0, scale3=0.0) pair_gauss = ForcePartPair(system,nlist,scalings,pair_pot) pair_lammps = ForcePartLammps(system, pppm_accuracy=1e-6,fn_table='lammps_smoothei2.table', comm=comm, scalings=[0.0,0.0,1.0,0.0,0.0,1.0],fn_log='none') ff = ForceField(system,[part_valence,pair_lammps,pair_gauss],nlist) dof = StrainCellDOF(ff, gpos_rms=1e-8, dpos_rms=1e-6, gcell_rms=1e-8, dcell_rms=1e-6, do_frozen=False) # Only write output from process 0 if rank==0: f = h5py.File('traj_9.h5', mode='w') hdf = HDF5Writer(f, step=1000, flush=10) g = h5py.File('restart_9.h5',mode='w') hdf_restart = RestartWriter(g, step=100000,flush=1) vsl = VerletScreenLog(step=5000) # Only write output from process 0 if rank==0: log.set_level(log.medium)
def write_lammps_table_jelle(ff): from yaff import NeighborList, PairPotEI, Switch3, ForcePartPair, Scalings,\ PairPotMM3 nffa = ff.system.ffatypes.shape[0] numbers = [] for i in xrange(nffa): index0 = np.where(ff.system.ffatype_ids == i)[0][0] if np.sum(ff.system.ffatype_ids == i) > 1: index1 = np.where(ff.system.ffatype_ids == i)[0][1] numbers.append([index0, index1]) for j in xrange(i + 1, nffa): index1 = np.where(ff.system.ffatype_ids == j)[0][0] numbers.append([index0, index1]) part_names = [part.name for part in ff.parts] print part_names ftab = open('lammps_smoothei2.table', 'w') ftab.write("# LAMMPS tabulated potential generated by Yaff\n") ftab.write("# All quantities in atomic units\n") ftab.write( "# The names of the tables refer to the ffatypes that have to be used in the Yaff system\n" ) ftab.write("#%4s %13s %21s %21s\n" % ("i", "d", "V", "F")) for number in numbers: pos = np.zeros((2, 3)) pos[1, 2] = 1.0 smallsys = System(system.numbers[number], pos, charges=system.charges[number], radii=system.radii[number]) smallsys_noradii = System(system.numbers[number], pos, charges=system.charges[number]) idx_ei = -1 idx_mm3 = -1 for idx, part in enumerate(ff.parts): if part.name == 'pair_ei': idx_ei = idx elif part.name == 'pair_mm3': idx_mm3 = idx tr = ff.parts[idx_ei].pair_pot.get_truncation() rcut = ff.parts[idx_ei].pair_pot.rcut alpha = ff.parts[idx_ei].pair_pot.alpha nlist = NeighborList(smallsys) pair_pot = PairPotEI(smallsys.charges, alpha, rcut, tr=Switch3(tr.width), radii=smallsys.radii) # pair_pot = PairPotEI(smallsys.charges, 0.0, rcut, tr=None, radii=smallsys.radii) scalings = Scalings(smallsys, scale1=1.0, scale2=1.0, scale3=1.0) part0 = ForcePartPair(smallsys, nlist, scalings, pair_pot) ff0 = ForceField(smallsys, [part0], nlist) ff0.compute() nlist1 = NeighborList(smallsys_noradii) # pair_pot = PairPotEI(smallsys_noradii.charges, alpha, rcut, tr=Switch3(tr.width)) pair_pot = PairPotEI(smallsys_noradii.charges, alpha, rcut, tr=None) scalings = Scalings(smallsys_noradii, scale1=1.0, scale2=1.0, scale3=1.0) part1 = ForcePartPair(smallsys_noradii, nlist1, scalings, pair_pot) ff1 = ForceField(smallsys_noradii, [part1], nlist1) ff1.compute() tr = ff.parts[idx_mm3].pair_pot.get_truncation() rcut = ff.parts[idx_mm3].pair_pot.rcut nlist2 = NeighborList(smallsys) pair_pot = PairPotMM3(ff.parts[idx_mm3].pair_pot.sigmas[number], ff.parts[idx_mm3].pair_pot.epsilons[number], ff.parts[idx_mm3].pair_pot.onlypaulis[number], rcut, Switch3(tr.width)) scalings = Scalings(smallsys, scale1=1.0, scale2=1.0, scale3=1.0) part2 = ForcePartPair(smallsys, nlist, scalings, pair_pot) ff2 = ForceField(smallsys, [part2], nlist) ff2.nlist.nneigh = 1 ff2.compute() distances = np.linspace(0.5 * angstrom, rcut, 5000) energies = [] toplot = [] for d in distances: gposnn0 = np.zeros(ff0.system.pos.shape, float) ff0.nlist.neighs[0] = (0, 1, d, 0.0, 0.0, d, 0, 0, 0) energy0 = ff0.compute(gpos=gposnn0) gposnn1 = np.zeros(ff1.system.pos.shape, float) ff1.nlist.neighs[0] = (0, 1, d, 0.0, 0.0, d, 0, 0, 0) energy1 = ff1.compute(gpos=gposnn1) gposnn2 = np.zeros(ff2.system.pos.shape, float) ff2.nlist.neighs[0] = (0, 1, d, 0.0, 0.0, d, 0, 0, 0) energy2 = ff2.compute(gpos=gposnn2) toplot.append([d, energy0, energy1, energy2]) row = [ d, energy0 - energy1 + energy2, gposnn0[0, 2] - gposnn1[0, 2] + gposnn2[0, 2] ] # row = [d, energy2, gposnn2[0,2]] energies.append(row) energies = np.asarray(energies) toplot = np.asarray(toplot) ffa0 = ff.system.ffatypes[ff.system.ffatype_ids[number[0]]] ffa1 = ff.system.ffatypes[ff.system.ffatype_ids[number[1]]] if ffa0 > ffa1: name = '%s-%s' % (ffa0, ffa1) else: name = '%s-%s' % (ffa1, ffa0) ftab.write("%s\nN %d R %f %f\n\n" % (name, energies.shape[0], distances[0], distances[-1])) for irow, row in enumerate(energies): ftab.write("%05d %+13.8f %+21.12f %+21.12f\n" % (irow + 1, row[0], row[1], row[2])) print name