int Ifpack_AnalyzeVectorElements(const Epetra_Vector& Diagonal, const bool abs, const int steps) { bool verbose = (Diagonal.Comm().MyPID() == 0); double min_val = DBL_MAX; double max_val = -DBL_MAX; for (int i = 0 ; i < Diagonal.MyLength() ; ++i) { double v = Diagonal[i]; if (abs) if (v < 0) v = -v; if (v > max_val) max_val = v; if (v < min_val) min_val = v; } if (verbose) { cout << endl; Ifpack_PrintLine(); cout << "Vector label = " << Diagonal.Label() << endl; cout << endl; } double delta = (max_val - min_val) / steps; for (int k = 0 ; k < steps ; ++k) { double below = delta * k + min_val; double above = below + delta; int MyBelow = 0, GlobalBelow; for (int i = 0 ; i < Diagonal.MyLength() ; ++i) { double v = Diagonal[i]; if (v < 0) v = -v; if (v >= below && v < above) MyBelow++; } Diagonal.Comm().SumAll(&MyBelow, &GlobalBelow, 1); if (verbose) { printf("Elements in [%+7e, %+7e) = %10d ( = %5.2f %%)\n", below, above, GlobalBelow, 100.0 * GlobalBelow / Diagonal.GlobalLength64()); } } if (verbose) { Ifpack_PrintLine(); cout << endl; } return(0); }