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); }