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