bool StiffnessSolver::SolveSystem( SpMat &K, VX &D, VX &F, VX &R, int DoF, VXi &q, VXi &r, int verbose, int &info, double &rms_resid) { VX diag; /* diagonal vector of the L D L' decomp. */ diag.resize(DoF); //MX K_comp = K; int row = K.rows(), col = K.cols(); MX K_comp(row, col); K_comp.setZero(); for (int k = 0; k < K.outerSize(); ++k) { for (SpMat::InnerIterator it(K, k); it; ++it) { int r = it.row(); int c = it.col(); double v = it.value(); K_comp(r, c) = v; } } /* L D L' decomposition of K[q,q] into lower triangle of K[q,q] and diag[q] */ /* vectors F and D are unchanged */ /* not solving at this moment*/ LDLDecompPM(K_comp, DoF, diag, F, D, R, q, r, 1, 0, info); if (info < 0) { fprintf(stderr, "Stiffness Matrix is not positive definite: %d negative elements\n", info); fprintf(stderr, "found on decomp diagonal of K.\n"); fprintf(stderr, "The stucture may have mechanism and thus not stable in general\n"); fprintf(stderr, "Please Make sure that all six\n"); fprintf(stderr, "rigid body translations are restrained!\n"); return false; } else { /* LDL' back-substitution for D[q] and R[r] */ LDLDecompPM(K_comp, DoF, diag, F, D, R, q, r, 0, 1, info); if (verbose) { fprintf(stdout, " LDL' RMS residual:"); } rms_resid = info = 1; do { /* improve solution for D[q] and R[r] */ LDLImprovePM(K_comp, DoF, diag, F, D, R, q, r, rms_resid, info); if (verbose) { fprintf(stdout, "%9.2e", rms_resid); } } while (info); if (verbose) fprintf(stdout, "LDL^t Solving completed\n"); } return true; }