SquareMatrix SqMRO_LUBackSubstitution::operator()(RowVector &indx, RowVector &b) const { SquareMatrix a(*m_thisMatrix); int n, i, j, ip, ii = -1; double sum; n = a.getRows(); for (i = 0; i < n; i++) { ip = (int)indx(i); sum = b.element(ip); b.element(ip) = b.element(i); if (ii != -1) { for (j = ii; j < i; j++) { sum -= a.element(i,j) * b.element(j); } } else if (sum) { ii = i; } b.element(i) = sum; } for (i = (n - 1); i >= 0; i--) { sum = b.element(i); for (j = (i + 1); j < n; j++) { sum -= a.element(i,j) * b.element(j); } b.element(i) = sum / a.element(i,i); } return a; }
void SpinAdapted::Wavefunction::CollectFrom (const RowVector& C) { int flatIndex = 0; for (int lQ = 0; lQ < nrows (); ++lQ) for (int rQ = 0; rQ < ncols (); ++rQ) if (allowedQuantaMatrix (lQ, rQ)) for (int lQState = 0; lQState < operator_element(lQ, rQ).Nrows (); ++lQState) for (int rQState = 0; rQState < operator_element(lQ, rQ).Ncols (); ++rQState) { operator_element(lQ, rQ).element (lQState, rQState) = C.element (flatIndex); ++flatIndex; } }
SquareMatrix SqMRO_LUDecomposition::operator()(RowVector &indx, double *d) const { SquareMatrix a(*m_thisMatrix); int n, i, imax, j, k; double big, dum, sum, temp; RowVector vv(a.getRows()); n = a.getRows(); // No row interchanges yet *d = 1.0; // Loop over rows to get implicit scaling information for (i = 0; i < n; i++) { big = 0.0; for (j = 0; j < n; j++) { temp = fabs(a.element(i,j)); if (temp > big) { big = temp; } } if (big == 0.0) { error("SquareMatrixAlias::luDecomp : MatrixAlias is rank defficient\n\n"); return a; } vv(i) = 1 / big; } // Loop over columns (Crout's method) for (j = 0; j < n; j++) { for (i = 0; i < j; i++) { sum = a.element(i,j); for (k = 0; k < i; k++) { sum -= a.element(i,k) * a.element(k,j); } a.element(i,j) = sum; } big = 0; for (i = j; i < n; i++) { sum = a.element(i,j); for (k = 0; k < j; k++) { sum -= a.element(i,k) * a.element(k,j); } a.element(i,j) = sum; dum = vv(i) * fabs(sum); if (dum >= big) { big = dum; imax = i; } } if (j != imax) { for (k = 0; k < n; k++) { dum = a.element(imax,k); a.element(imax,k) = a.element(j,k); a.element(j,k) = dum; } *d = -(*d); vv(imax) = vv(j); } indx.element(j) = imax; // Singularity may arise as aresult of rounding errors // Substitute in small values for zeros if (a.element(j,j) == 0) { error("SquareMatrixAlias::luDecomp : MatrixAlias is rank defficient\n\n"); a.element(j,j) = 1e-100; } if (j != n) { dum = 1 / a.element(j,j); for (i = j+1; i < n; i++) { a.element(i,j) *= dum; } } } return a; }