419 const int NumPDEEqns)
423 long long NumGlobalRows = A.NumGlobalRows64();
424 long long NumGlobalCols = A.NumGlobalCols64();
425 long long MyBandwidth = 0, GlobalBandwidth;
426 long long MyLowerNonzeros = 0, MyUpperNonzeros = 0;
427 long long GlobalLowerNonzeros, GlobalUpperNonzeros;
428 long long MyDiagonallyDominant = 0, GlobalDiagonallyDominant;
429 long long MyWeaklyDiagonallyDominant = 0, GlobalWeaklyDiagonallyDominant;
430 double MyMin, MyAvg, MyMax;
431 double GlobalMin, GlobalAvg, GlobalMax;
432 long long GlobalStorage;
436 GlobalStorage =
sizeof(
int*) * NumGlobalRows +
437 sizeof(
int) * A.NumGlobalNonzeros64() +
438 sizeof(double) * A.NumGlobalNonzeros64();
443 print<const char*>(
"Label", A.
Label());
444 print<long long>(
"Global rows", NumGlobalRows);
445 print<long long>(
"Global columns", NumGlobalCols);
446 print<long long>(
"Stored nonzeros", A.NumGlobalNonzeros64());
447 print<long long>(
"Nonzeros / row", A.NumGlobalNonzeros64() / NumGlobalRows);
448 print<double>(
"Estimated storage (Mbytes)", 1.0e-6 * GlobalStorage);
451 long long NumMyActualNonzeros = 0, NumGlobalActualNonzeros;
452 long long NumMyEmptyRows = 0, NumGlobalEmptyRows;
453 long long NumMyDirichletRows = 0, NumGlobalDirichletRows;
461 RowSum.PutScalar(0.0);
463 for (
int i = 0 ; i < NumMyRows ; ++i) {
468 &colVal[0],&colInd[0]));
474 NumMyDirichletRows++;
476 for (
int j = 0 ; j < Nnz ; ++j) {
478 double v = colVal[j];
480 if (colVal[j] != 0.0)
481 NumMyActualNonzeros++;
492 else if (GCID > GRID)
494 long long b = GCID - GRID;
500 if (Diag[i] > RowSum[i])
501 MyDiagonallyDominant++;
503 if (Diag[i] >= RowSum[i])
504 MyWeaklyDiagonallyDominant++;
506 RowSum[i] += Diag[i];
513 A.
Comm().
SumAll(&MyDiagonallyDominant,&GlobalDiagonallyDominant,1);
514 A.
Comm().
SumAll(&MyWeaklyDiagonallyDominant,&GlobalWeaklyDiagonallyDominant,1);
515 A.
Comm().
SumAll(&NumMyActualNonzeros, &NumGlobalActualNonzeros, 1);
516 A.
Comm().
SumAll(&NumMyEmptyRows, &NumGlobalEmptyRows, 1);
517 A.
Comm().
SumAll(&NumMyDirichletRows, &NumGlobalDirichletRows, 1);
518 A.
Comm().
SumAll(&MyBandwidth, &GlobalBandwidth, 1);
519 A.
Comm().
SumAll(&MyLowerNonzeros, &GlobalLowerNonzeros, 1);
520 A.
Comm().
SumAll(&MyUpperNonzeros, &GlobalUpperNonzeros, 1);
521 A.
Comm().
SumAll(&MyDiagonallyDominant, &GlobalDiagonallyDominant, 1);
522 A.
Comm().
SumAll(&MyWeaklyDiagonallyDominant, &GlobalWeaklyDiagonallyDominant, 1);
526 double NormF = Ifpack_FrobeniusNorm(A);
530 print<long long>(
"Actual nonzeros", NumGlobalActualNonzeros);
531 print<long long>(
"Nonzeros in strict lower part", GlobalLowerNonzeros);
532 print<long long>(
"Nonzeros in strict upper part", GlobalUpperNonzeros);
534 print<long long>(
"Empty rows", NumGlobalEmptyRows,
535 100.0 * NumGlobalEmptyRows / NumGlobalRows);
536 print<long long>(
"Dirichlet rows", NumGlobalDirichletRows,
537 100.0 * NumGlobalDirichletRows / NumGlobalRows);
538 print<long long>(
"Diagonally dominant rows", GlobalDiagonallyDominant,
539 100.0 * GlobalDiagonallyDominant / NumGlobalRows);
540 print<long long>(
"Weakly diag. dominant rows",
541 GlobalWeaklyDiagonallyDominant,
542 100.0 * GlobalWeaklyDiagonallyDominant / NumGlobalRows);
544 print<long long>(
"Maximum bandwidth", GlobalBandwidth);
547 print(
"",
"one-norm",
"inf-norm",
"Frobenius",
false);
548 print(
"",
"========",
"========",
"=========",
false);
551 print<double>(
"A", NormOne, NormInf, NormF);
554 if (Cheap ==
false) {
561#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
563 for (
int i = 0 ; i < NumMyRows ; ++i) {
570 &colVal[0],&colInd[0]));
572 for (
int j = 0 ; j < Nnz ; ++j) {
577 double plus_val = colVal[j];
578 double minus_val = -colVal[j];
601#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
603 for (
int i = 0 ; i < NumMyRows ; ++i) {
610 &colVal[0],&colInd[0]));
612 for (
int j = 0 ; j < Nnz ; ++j) {
617 double plus_val = colVal[j];
618 double minus_val = -colVal[j];
641 throw "Ifpack_Analyze: GlobalIndices type unknown";
651 NormF = Ifpack_FrobeniusNorm(AplusAT);
654 print<double>(
"A + A^T", NormOne, NormInf, NormF);
659 NormF = Ifpack_FrobeniusNorm(AminusAT);
662 print<double>(
"A - A^T", NormOne, NormInf, NormF);
668 print<const char*>(
"",
"min",
"avg",
"max",
false);
669 print<const char*>(
"",
"===",
"===",
"===",
false);
676 for (
int i = 0 ; i < NumMyRows ; ++i) {
680 &colVal[0],&colInd[0]));
682 for (
int j = 0 ; j < Nnz ; ++j) {
684 if (colVal[j] > MyMax) MyMax = colVal[j];
685 if (colVal[j] < MyMin) MyMin = colVal[j];
692 GlobalAvg /= A.NumGlobalNonzeros64();
696 print<double>(
" A(i,j)", GlobalMin, GlobalAvg, GlobalMax);
703 for (
int i = 0 ; i < NumMyRows ; ++i) {
707 &colVal[0],&colInd[0]));
709 for (
int j = 0 ; j < Nnz ; ++j) {
710 double v = colVal[j];
713 if (colVal[j] > MyMax) MyMax = v;
714 if (colVal[j] < MyMin) MyMin = v;
721 GlobalAvg /= A.NumGlobalNonzeros64();
724 print<double>(
"|A(i,j)|", GlobalMin, GlobalAvg, GlobalMax);
737 print<double>(
" A(k,k)", GlobalMin, GlobalAvg, GlobalMax);
745 print<double>(
"|A(k,k)|", GlobalMin, GlobalAvg, GlobalMax);
752 if (NumPDEEqns > 1 ) {
754 if (verbose) print();
756 for (
int ie = 0 ; ie < NumPDEEqns ; ie++) {
762 for (
int i = ie ; i < Diag.
MyLength() ; i += NumPDEEqns) {
779 sprintf(str,
" A(k,k), eq %d", ie);
780 print<double>(str, GlobalMin, GlobalAvg, GlobalMax);
789 RowSum.MinValue(&GlobalMin);
790 RowSum.MaxValue(&GlobalMax);
791 RowSum.MeanValue(&GlobalAvg);
795 print<double>(
" sum_j A(k,j)", GlobalMin, GlobalAvg, GlobalMax);
802 if (NumPDEEqns > 1 ) {
804 if (verbose) print();
806 for (
int ie = 0 ; ie < NumPDEEqns ; ie++) {
812 for (
int i = ie ; i < Diag.
MyLength() ; i += NumPDEEqns) {
813 double d = RowSum[i];
829 sprintf(str,
" sum_j A(k,j), eq %d", ie);
830 print<double>(str, GlobalMin, GlobalAvg, GlobalMax);