public void GetForceElements(Vector[] coords , ForceField.INonbonded ffnonbond , double nonbonds_maxdist , out Tuple <int[], Vector[]>[] frcnonbond , out Tuple <int[], Vector[]>[] frcnonbond14 ) { double energy = 0; MatrixByArr[,] lhess = null; //lfrcfld = new List<ForceField.IForceField>(); lfrcfld.Add(new ForceField.MindyNonbondedLennardJones(false)); //lfrcfld = new List<ForceField.IForceField>(); lfrcfld.Add(new ForceField.MindyNonbondedElectrostatic()); List <Tuple <int[], Vector[]> > _frcnonbond = new List <Tuple <int[], Vector[]> >(); List <Tuple <int[], Vector[]> > _frcnonbond14 = new List <Tuple <int[], Vector[]> >(); { //List<ForceField.IForceField> frcfld_nonbondeds = new List<ForceField.IForceField>(); //frcfld_nonbondeds.Add(new ForceField.MindyNonbondedLennardJones(false)); //frcfld_nonbondeds.Add(new ForceField.MindyNonbondedElectrostatic()); Universe.Nonbondeds_v1 nonbondeds = new Universe.Nonbondeds_v1(atoms, size, nonbonds_maxdist); nonbondeds.UpdateNonbondeds(coords, 0); foreach (Universe.Nonbonded nonbond in nonbondeds) { int[] ids = new int[2]; Vector[] lcoords = new Vector[2]; ids[0] = nonbond.atoms[0].ID; lcoords[0] = coords[ids[0]]; ids[1] = nonbond.atoms[1].ID; lcoords[1] = coords[ids[1]]; Vector[] lforces = new Vector[2] { new double[3], new double[3] }; ffnonbond.Compute(nonbond, lcoords, ref energy, ref lforces, ref lhess); //if((lforces[0].Dist2 == 0) || (lforces[1].Dist2 == 0)) // continue; _frcnonbond.Add(new Tuple <int[], Vector[]>(ids, lforces)); } foreach (Universe.Nonbonded14 nonbond in nonbonded14s) { int[] ids = new int[2]; Vector[] lcoords = new Vector[2]; ids[0] = nonbond.atoms[0].ID; lcoords[0] = coords[ids[0]]; ids[1] = nonbond.atoms[1].ID; lcoords[1] = coords[ids[1]]; Vector[] lforces = new Vector[2] { new double[3], new double[3] }; ffnonbond.Compute(nonbond, lcoords, ref energy, ref lforces, ref lhess); //if((lforces[0].Dist2 == 0) || (lforces[1].Dist2 == 0)) // continue; _frcnonbond14.Add(new Tuple <int[], Vector[]>(ids, lforces)); } } frcnonbond = _frcnonbond.ToArray(); frcnonbond14 = _frcnonbond14.ToArray(); }
public static HessMatrix GetHess(Universe univ) { Vector[] coords = univ.GetCoords(); HessMatrix hessian_spr = HessMatrixSparse.ZerosSparse(univ.size * 3, univ.size * 3); Universe.Nonbondeds_v1 nonbondeds = new Universe.Nonbondeds_v1(univ.atoms, univ.size, 12); nonbondeds.UpdateNonbondeds(coords, 0); hessian_spr = STeM.GetHessBond(coords, univ.bonds, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with bond")); hessian_spr = STeM.GetHessAngle(coords, univ.angles, true, null, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with angle")); hessian_spr = STeM.GetHessImproper(coords, univ.impropers, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with improper")); hessian_spr = STeM.GetHessDihedral(coords, univ.dihedrals, null, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with dihedral")); hessian_spr = STeM.GetHessVdw(coords, univ.nonbonded14s.GetEnumerable(), null, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with vdw14")); hessian_spr = STeM.GetHessElec(coords, univ.nonbonded14s.GetEnumerable(), hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with elec14")); hessian_spr = STeM.GetHessVdw(coords, nonbondeds.GetEnumerable(), null, null, hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with vdw")); hessian_spr = STeM.GetHessElec(coords, nonbondeds.GetEnumerable(), hessian: hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr with elec")); //hessian_spr = GetHessSprElec(coords, nonbondeds , hessian: hessian_spr); Debug.Verify(Hess.CheckHessDiag(hessian_spr)); //hessian_spr = GetHessSprVdw(coords, nonbondeds , hessian: hessian_spr); Debug.Verify(Hess.CheckHessDiag(hessian_spr)); hessian_spr = Hess.CorrectHessDiag(hessian_spr); HDebug.Verify(Hess.CheckHessDiag(hessian_spr, 0.000001, "non-computable exception while generating STeM hess_spr")); return(hessian_spr); }