Example #1
0
            public static double[] GetRotAngles(Universe univ
                                                , Vector[] coords
                                                , Vector[] dcoords
                                                , MatrixByArr J
                                                , ILinAlg ila
                                                )
            {
                Vector dangles;

                using (ila.NewDisposables())
                {
                    Vector R      = Vector.FromBlockvector(dcoords);
                    Vector M      = univ.GetMasses(3);
                    var    RR     = ila.ToILMat(R).AddDisposable();
                    var    MM     = ila.ToILMat(M).Diag().AddDisposable();
                    var    JJ     = ila.ToILMat(J).AddDisposable();
                    var    invJMJ = ila.Inv(JJ.Tr * MM * JJ).AddDisposable();
                    var    AA     = invJMJ * JJ.Tr * MM * RR;
                    dangles = AA.ToArray().HToArray1D();
                }

                if (HDebug.False && HDebug.IsDebuggerAttached)
                {
                    Vector tdangles = GetRotAngles(univ, coords, dcoords, J);

                    HDebug.Assert(0.9999 < (tdangles.Dist / dangles.Dist), (tdangles.Dist / dangles.Dist) < 1.0001);
                    HDebug.Assert(LinAlg.DotProd(tdangles, dangles) / (tdangles.Dist * dangles.Dist) > 0.9999);
                    HDebug.Assert((tdangles - dangles).Dist / tdangles.Dist < 0.0001);
                }

                return(dangles);
            }