public void Compute(Universe.Angle angle, Vector[] coords, ref double energy, ref Vector[] forces, ref MatrixByArr[,] hessian, double[,] pwfrc = null, double[,] pwspr = null) { double Ktheta = angle.Ktheta; Ktheta = sprcstRgdbdy; Ktheta = angle.Ktheta * scaleSpring; double Theta0 = angle.Theta0; double Kub = angle.Kub; double S0 = angle.S0; MindyAngle.Compute(coords, ref energy, ref forces, ref hessian, Ktheta, Theta0, Kub, S0, pwfrc, pwspr); }
public void BuildHess4PwIntrAct(Universe.AtomPack info, Vector[] coords, out Pair <int, int>[] pwidxs, out PwIntrActInfo[] pwhessinfos) { Universe.Improper improper = (Universe.Improper)info; double Kchi = improper.Kpsi; int n = improper.n; double delta = improper.psi0; //Vector pos1 = coords[0]; // const Vector *pos1 = coords + angle->atom1; //Vector pos2 = coords[1]; // const Vector *pos2 = coords + angle->atom2; //Vector pos3 = coords[2]; // const Vector *pos3 = coords + angle->atom3; //double a = (pos2-pos1).Dist; //double b = (pos3-pos2).Dist; //double c = (pos3-pos1).Dist; //Pair<double,double> fij_kij = GetFijKij(a, b, c, Ktheta, Theta0); //double fij = fij_kij.first; //double kij = fij_kij.second; /// A /// / B /// a .../. c / /// \ / / \ / /// \ / /\ /// \ / / \ /// b ..... d /// /// a /// |\ / /// | \ /T /// | \ ----- A ----+---- /// | \ / /// | \ B /// p l / /// | \ \ / /// |T \ \ /// | \ \ /// \ \ /// \\ /// d /// /// A = (b-a) x (c-b) /// B = (c-b) x (d-c) /// (A x B) ⊥ (Δ adp) /// p ∈ bc /// T + ∠apd = π /// /// V = K0 (T - T0)^2 /// F = dV/dT = 2 K0 (T - T0) /// K = (d^2 V)/(d T^2) = 2 K0 /// return { dV/dl, (d^2 V)/(d l^2) } Vector a = coords[0]; Vector b = coords[1]; Vector c = coords[2]; Vector d = coords[3]; Vector A = LinAlg.CrossProd(a - b, b - c); Vector B = LinAlg.CrossProd(b - c, c - d); Vector AxB = LinAlg.CrossProd(A, B); double ad = (a - d).Dist; Vector p = Geometry.Point4LinePlaneIntersect(a, d, a + A, b, c); double ap = (a - p).Dist; double pd = (p - d).Dist; ValueTuple <double, double> fij_kij = MindyAngle.GetFijKij(ap, pd, ad, Kchi, delta, -1, +1, -1); double fij = fij_kij.Item1; double kij = fij_kij.Item2; HDebug.Assert(coords.Length == 4); pwidxs = new Pair <int, int> [1]; pwidxs[0] = new Pair <int, int>(0, 3); pwhessinfos = new PwIntrActInfo[1]; pwhessinfos[0] = new PwIntrActInfo(kij, fij); }