00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static char const Id[] = "$Id: matviewstruct.c 2962 2010-02-04 19:50:44Z scholz $\n\n";
00025 static char const Td[] = "$Today: " __FILE__ " " __DATE__ " " __TIME__ " $\n\n";
00026
00027 #include "util.h"
00028
00029 int matviewstruct(MPI_Comm comm,Mat mat)
00030 {
00031 MagparFunctionLogBegin;
00032
00033 int rank,size;
00034 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
00035 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
00036
00037 PetscInt m,n;
00038 ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr);
00039
00040 ierr = PetscViewerSetFormat(PETSC_VIEWER_STDOUT_SELF,PETSC_VIEWER_ASCII_INFO);CHKERRQ(ierr);
00041 ierr = MatView(mat,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);
00042
00043 if (m!=n) {
00044 PetscPrintf(PETSC_COMM_WORLD,"Matrix not square, cannot calculate bandwidth.\n");
00045 MagparFunctionLogReturn(0);
00046 }
00047
00048
00049
00050
00051
00052
00053
00054
00055 #if 0
00056
00057 Mat matloc;
00058 IS isrow,iscol;
00059 ierr = MatGetSubMatrix(mat,isrow,iscol,n,MAT_INITIAL_MATRIX,&matloc);CHKERRQ(ierr);
00060 #elif 0
00061
00062 PetscInt from,to;
00063 ierr = MatGetOwnershipRange(mat,&from,&to);CHKERRQ(ierr);
00064
00065 IS isrow,iscol;
00066 ierr = ISCreateStride(PETSC_COMM_WORLD,to-from,from,1,&isrow);CHKERRQ(ierr);
00067 ierr = ISCreateStride(PETSC_COMM_WORLD,n,1,1,&iscol);CHKERRQ(ierr);
00068
00069 Mat matloc;
00070 MatConvert(mat,MATSEQAIJ,MAT_INITIAL_MATRIX,&matloc);
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 ierr = ISDestroy(isrow);CHKERRQ(ierr);
00081 ierr = ISDestroy(iscol);CHKERRQ(ierr);
00082 #elif 0
00083
00084 Mat matloc;
00085 ierr = MatGetLocalMat(mat,MAT_INITIAL_MATRIX,&matloc);CHKERRQ(ierr);
00086
00087
00088
00089
00090 #else
00091 PetscInt from,to;
00092 ierr = MatGetOwnershipRange(mat,&from,&to);CHKERRQ(ierr);
00093
00094 IS isrow,iscol;
00095 ierr = ISCreateStride(comm,to-from,from,1,&isrow);CHKERRQ(ierr);
00096 ierr = ISCreateStride(comm,n,1,1,&iscol);CHKERRQ(ierr);
00097
00098 Mat *submatloc;
00099 ierr = MatGetSubMatrices(mat,1,&isrow,&iscol,MAT_INITIAL_MATRIX,&submatloc);CHKERRQ(ierr);
00100
00101 ierr = ISDestroy(isrow);CHKERRQ(ierr);
00102 ierr = ISDestroy(iscol);CHKERRQ(ierr);
00103
00104 Mat matloc;
00105 matloc=submatloc[0];
00106 #endif
00107
00108
00109
00110 PetscInt *ia,*ja;
00111 PetscTruth done;
00112 ierr = MatGetRowIJ(matloc,0,PETSC_TRUE,PETSC_FALSE,&from,&ia,&ja,&done);CHKERRQ(ierr);
00113
00114
00115
00116
00117
00118
00119 int cmin,cmax,bw,bwmax;
00120 bwmax=0;
00121 for (int i=0;i<m;i++) {
00122 cmin=m;
00123 cmax=0;
00124 for (int j=0;j<(ia[i+1]-ia[i]);j++) {
00125 cmin=PetscMin(cmin,ja[ia[i]+j]);
00126 cmax=PetscMax(cmax,ja[ia[i]+j]);
00127 }
00128 bw=cmax-cmin+1;
00129 if (bw > bwmax) {
00130 bwmax=bw;
00131 n=i;
00132 }
00133 }
00134 PetscPrintf(comm,"max. bandwidth: %i in row %i (of %i)\n",bwmax,n,m);
00135
00136 ierr = MatRestoreRowIJ(matloc,0,PETSC_TRUE,PETSC_FALSE,&from,&ia,&ja,&done);CHKERRQ(ierr);
00137
00138 #ifdef PETSC_HAVE_X11
00139 if (!rank) ierr = MatView(matloc,PETSC_VIEWER_DRAW_SELF);CHKERRQ(ierr);
00140 #endif
00141
00142 ierr = MatDestroyMatrices(1,&submatloc);CHKERRQ(ierr);
00143
00144 MagparFunctionLogReturn(0);
00145 }
00146