inline void eliminationOperators(SpMat& A, DynamicVector<size_t>& Cset, size_t fnode, DynamicVector<double>& q, SpMat& P, size_t& P_col, size_t P_row) { /* Inizializziamo la riga P_row con A.nonZeros(fnode) - 1 non nulli*/ double scalingFactor = 1.0; /* Riserviamo spazio in ciascuna colonna di P per un adeguato numero * di elementi. Il -1 c'è perché (il reciproco del)l'elemento in * diagonale lo mettiamo in q */ P.reserve(P_row, A.nonZeros(fnode) - 1); /* Per ciascuna f-riga prendo gli elementi in ogni c-colonna */ DynamicVector<size_t>::Iterator ccol = Cset.begin(); for (SpMat::Iterator frow = A.begin(fnode); frow != A.end(fnode); ++frow) { if (frow->index() == fnode) { //Elemento della diagonale q[P_row] = (1.0 / frow->value()); //Q ha elementi pari al numero di righe di R scalingFactor = -(q[P_row]); } else if (ccol != Cset.end()) { break; //Non ha senso andare avanti se abbiamo finito i ccol } else if (frow->index() == (*ccol)) { /* Elemento fuori della diagonale ed è anche un c-colonna */ P.append(P_row, P_col, frow->value()); P_col++; ccol++; } } P.finalize(P_row); //Finalizziamo la riga P_row /* Non dimentichiamo di scalare gli elementi della riga corrente * per -scalingFactor */ for (SpMat::Iterator it = P.begin(P_row); it != P.end(P_row); it++) it->value() *= -scalingFactor; }
bool LAMGLSSolver::isSparseOK(SpMat& m) { /* Sparsa è OK finchè non ha il 65%+ di nonZero */ return (((double) m.nonZeros() / (double) (m.rows() * m.columns())) <= 0.65); }