예제 #1
0
        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();
        }
예제 #2
0
            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);
            }