/// <summary> /// If the matrices stored in this object have already been calculated, they will be reused even if the original /// free-free stiffness matrix has changed. To avoid that, this method must be called. /// </summary> public void Clear() { inverseKff = null; RigidBodyModes = null; inverseKii = null; inverseKiiDiagonal = null; Kbb = null; Kbi = null; //linearSystem.Matrix = null; // DO NOT DO THAT!!! The analyzer manages that. }
/// <summary> /// Will do nothing if it was already called. To perform this for a different stiffness matrix, first call /// <see cref="Clear"/>. /// </summary> public void InvertKff(double factorizationTolerance, bool inPlace) { if (RigidBodyModes != null) { return; } inverseKff = linearSystem.Matrix.FactorSemidefiniteCholesky(inPlace, factorizationTolerance); RigidBodyModes = new List <Vector>(); foreach (double[] rbm in inverseKff.NullSpaceBasis) { RigidBodyModes.Add(Vector.CreateFromArray(rbm, false)); } }