419 const int NumPDEEqns)
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 +
443 print<const char*>(
"Label", A.
Label());
444 print<long long>(
"Global rows", NumGlobalRows);
445 print<long long>(
"Global columns", NumGlobalCols);
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;
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;
501 MyDiagonallyDominant++;
504 MyWeaklyDiagonallyDominant++;
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);
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];
580 if (AplusAT.SumIntoGlobalValues(1,&GRID,1,&GCID,&plus_val) != 0) {
581 IFPACK_CHK_ERR(AplusAT.InsertGlobalValues(1,&GRID,1,&GCID,&plus_val));
584 if (AplusAT.SumIntoGlobalValues(1,&GCID,1,&GRID,&plus_val) != 0) {
585 IFPACK_CHK_ERR(AplusAT.InsertGlobalValues(1,&GCID,1,&GRID,&plus_val));
588 if (AminusAT.SumIntoGlobalValues(1,&GRID,1,&GCID,&plus_val) != 0) {
589 IFPACK_CHK_ERR(AminusAT.InsertGlobalValues(1,&GRID,1,&GCID,&plus_val));
592 if (AminusAT.SumIntoGlobalValues(1,&GCID,1,&GRID,&minus_val) != 0) {
593 IFPACK_CHK_ERR(AminusAT.InsertGlobalValues(1,&GCID,1,&GRID,&minus_val));
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];
620 if (AplusAT.SumIntoGlobalValues(1,&GRID,1,&GCID,&plus_val) != 0) {
621 IFPACK_CHK_ERR(AplusAT.InsertGlobalValues(1,&GRID,1,&GCID,&plus_val));
624 if (AplusAT.SumIntoGlobalValues(1,&GCID,1,&GRID,&plus_val) != 0) {
625 IFPACK_CHK_ERR(AplusAT.InsertGlobalValues(1,&GCID,1,&GRID,&plus_val));
628 if (AminusAT.SumIntoGlobalValues(1,&GRID,1,&GCID,&plus_val) != 0) {
629 IFPACK_CHK_ERR(AminusAT.InsertGlobalValues(1,&GRID,1,&GCID,&plus_val));
632 if (AminusAT.SumIntoGlobalValues(1,&GCID,1,&GRID,&minus_val) != 0) {
633 IFPACK_CHK_ERR(AminusAT.InsertGlobalValues(1,&GCID,1,&GRID,&minus_val));
641 throw "Ifpack_Analyze: GlobalIndices type unknown";
643 AplusAT.FillComplete();
644 AminusAT.FillComplete();
649 NormOne = AplusAT.NormOne();
650 NormInf = AplusAT.NormInf();
654 print<double>(
"A + A^T", NormOne, NormInf, NormF);
657 NormOne = AminusAT.NormOne();
658 NormInf = AminusAT.NormInf();
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];
689 A.
Comm().MaxAll(&MyMax, &GlobalMax, 1);
690 A.
Comm().MinAll(&MyMin, &GlobalMin, 1);
691 A.
Comm().SumAll(&MyAvg, &GlobalAvg, 1);
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;
718 A.
Comm().MaxAll(&MyMax, &GlobalMax, 1);
719 A.
Comm().MinAll(&MyMin, &GlobalMin, 1);
720 A.
Comm().SumAll(&MyAvg, &GlobalAvg, 1);
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 ) {
756 for (
int ie = 0 ; ie < NumPDEEqns ; ie++) {
762 for (
int i = ie ; i < Diag.
MyLength() ; i += NumPDEEqns) {
770 A.
Comm().MinAll(&MyMin, &GlobalMin, 1);
771 A.
Comm().MaxAll(&MyMax, &GlobalMax, 1);
772 A.
Comm().SumAll(&MyAvg, &GlobalAvg, 1);
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 ) {
806 for (
int ie = 0 ; ie < NumPDEEqns ; ie++) {
812 for (
int i = ie ; i < Diag.
MyLength() ; i += NumPDEEqns) {
820 A.
Comm().MinAll(&MyMin, &GlobalMin, 1);
821 A.
Comm().MaxAll(&MyMax, &GlobalMax, 1);
822 A.
Comm().SumAll(&MyAvg, &GlobalAvg, 1);
829 sprintf(str,
" sum_j A(k,j), eq %d", ie);
830 print<double>(str, GlobalMin, GlobalAvg, GlobalMax);
976 const int NumPDEEqns)
980 long long m,nc,nr,maxdim;
981 double lrmrgn,botmrgn,xtit,ytit,ytitof,fnstit,siz = 0.0;
982 double xl,xr, yb,yt, scfct,u2dot,frlw,delt,paperx;
993 long long NumGlobalRows;
994 long long NumGlobalCols;
1004 if (strlen(A.
Label()) != 0)
1005 strcpy(title, A.
Label());
1007 sprintf(title,
"%s",
"matrix");
1009 if (InputFileName == 0)
1010 sprintf(FileName,
"%s.ps", title);
1012 strcpy(FileName, InputFileName);
1014 MyPID = Comm.
MyPID();
1023 if (NumGlobalRows != NumGlobalCols)
1027 maxdim = (NumGlobalRows>NumGlobalCols)?NumGlobalRows:NumGlobalCols;
1028 maxdim /= NumPDEEqns;
1031 nr = NumGlobalRows / NumPDEEqns + 1;
1032 nc = NumGlobalCols / NumPDEEqns + 1;
1047 lrmrgn = (paperx-siz)/2.0;
1053 scfct = siz*u2dot/m;
1063 ltit = strlen(title);
1069 ytit = botmrgn+siz*nr/m + ytitof;
1071 xl = lrmrgn*u2dot - scfct*frlw/2;
1072 xr = (lrmrgn+siz)*u2dot + scfct*frlw/2;
1073 yb = botmrgn*u2dot - scfct*frlw/2;
1074 yt = (botmrgn+siz*nr/m)*u2dot + scfct*frlw/2;
1076 yt = yt + (ytitof+fnstit*0.70)*u2dot;
1086 if ((ptitle == 0) && (ltit == 0)) {
1087 ytit = botmrgn + fnstit*0.3;
1088 botmrgn = botmrgn + ytitof + fnstit*0.7;
1095 fp = fopen(FileName,
"w");
1097 fprintf(fp,
"%s",
"%%!PS-Adobe-2.0\n");
1098 fprintf(fp,
"%s",
"%%Creator: IFPACK\n");
1099 fprintf(fp,
"%%%%BoundingBox: %f %f %f %f\n",
1101 fprintf(fp,
"%s",
"%%EndComments\n");
1102 fprintf(fp,
"%s",
"/cm {72 mul 2.54 div} def\n");
1103 fprintf(fp,
"%s",
"/mc {72 div 2.54 mul} def\n");
1104 fprintf(fp,
"%s",
"/pnum { 72 div 2.54 mul 20 std::string ");
1105 fprintf(fp,
"%s",
"cvs print ( ) print} def\n");
1106 fprintf(fp,
"%s",
"/Cshow {dup stringwidth pop -2 div 0 rmoveto show} def\n");
1110 fprintf(fp,
"%s",
"gsave\n");
1112 fprintf(fp,
"/Helvetica findfont %e cm scalefont setfont\n",
1114 fprintf(fp,
"%f cm %f cm moveto\n",
1116 fprintf(fp,
"(%s) Cshow\n", title);
1117 fprintf(fp,
"%f cm %f cm translate\n",
1120 fprintf(fp,
"%f cm %d div dup scale \n",
1124 fprintf(fp,
"%f setlinewidth\n",
1126 fprintf(fp,
"%s",
"newpath\n");
1127 fprintf(fp,
"%s",
"0 0 moveto ");
1129 printf(
"------------------- %d\n", (
int) m);
1130 fprintf(fp,
"%d %d lineto\n",
1132 fprintf(fp,
"%d %d lineto\n",
1134 fprintf(fp,
"%d %d lineto\n",
1138 fprintf(fp,
"%d %d lineto\n",
1140 fprintf(fp,
"%d %d lineto\n",
1141 (
int) nc, (
int) nr);
1142 fprintf(fp,
"%d %d lineto\n",
1145 fprintf(fp,
"%s",
"closepath stroke\n");
1149 fprintf(fp,
"%s",
"1 1 translate\n");
1150 fprintf(fp,
"%s",
"0.8 setlinewidth\n");
1151 fprintf(fp,
"%s",
"/p {moveto 0 -.40 rmoveto \n");
1152 fprintf(fp,
"%s",
" 0 .80 rlineto stroke} def\n");
1158 std::vector<int> Indices(MaxEntries);
1159 std::vector<double> Values(MaxEntries);
1161 for (
int pid = 0 ; pid < NumProc ; ++pid) {
1165 fp = fopen(FileName,
"a");
1166 TEUCHOS_ASSERT(fp != NULL);
1168 for (
int i = 0 ; i < NumMyRows ; ++i) {
1170 if (i % NumPDEEqns)
continue;
1177 for (
int j = 0 ; j < Nnz ; ++j) {
1178 int col = Indices[j];
1179 if (col % NumPDEEqns == 0) {
1183 fprintf(fp,
"%lld %lld p\n",
1184 gcol, NumGlobalRows - grow - 1);
1189 fprintf(fp,
"%s",
"%end of data for this process\n");
1191 if( pid == NumProc - 1 )
1192 fprintf(fp,
"%s",
"showpage\n");