1*3ea6fe3dSLisandro Dalcin #include <petscviewer.h> 2*3ea6fe3dSLisandro Dalcin #include <petsc/private/matimpl.h> 3*3ea6fe3dSLisandro Dalcin 4*3ea6fe3dSLisandro Dalcin PetscErrorCode MatView_Binary_BlockSizes(Mat mat,PetscViewer viewer) 5*3ea6fe3dSLisandro Dalcin { 6*3ea6fe3dSLisandro Dalcin FILE *info; 7*3ea6fe3dSLisandro Dalcin PetscMPIInt rank; 8*3ea6fe3dSLisandro Dalcin PetscInt rbs,cbs; 9*3ea6fe3dSLisandro Dalcin PetscErrorCode ierr; 10*3ea6fe3dSLisandro Dalcin 11*3ea6fe3dSLisandro Dalcin PetscFunctionBegin; 12*3ea6fe3dSLisandro Dalcin ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); 13*3ea6fe3dSLisandro Dalcin ierr = PetscViewerBinaryGetInfoPointer(viewer,&info);CHKERRQ(ierr); 14*3ea6fe3dSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 15*3ea6fe3dSLisandro Dalcin if (!rank && info) { 16*3ea6fe3dSLisandro Dalcin if (rbs != cbs) {ierr = PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %D,%D\n",rbs,cbs);CHKERRQ(ierr);} 17*3ea6fe3dSLisandro Dalcin else {ierr = PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %D\n",rbs);CHKERRQ(ierr);} 18*3ea6fe3dSLisandro Dalcin } 19*3ea6fe3dSLisandro Dalcin PetscFunctionReturn(0); 20*3ea6fe3dSLisandro Dalcin } 21*3ea6fe3dSLisandro Dalcin 22*3ea6fe3dSLisandro Dalcin PetscErrorCode MatLoad_Binary_BlockSizes(Mat mat,PetscViewer viewer) 23*3ea6fe3dSLisandro Dalcin { 24*3ea6fe3dSLisandro Dalcin PetscInt rbs,cbs,bs[2],n = 2; 25*3ea6fe3dSLisandro Dalcin PetscBool set; 26*3ea6fe3dSLisandro Dalcin PetscErrorCode ierr; 27*3ea6fe3dSLisandro Dalcin 28*3ea6fe3dSLisandro Dalcin PetscFunctionBegin; 29*3ea6fe3dSLisandro Dalcin /* get current block sizes */ 30*3ea6fe3dSLisandro Dalcin ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); 31*3ea6fe3dSLisandro Dalcin bs[0] = rbs; bs[1] = cbs; 32*3ea6fe3dSLisandro Dalcin /* get block sizes from the options database */ 33*3ea6fe3dSLisandro Dalcin ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)viewer),NULL,"Options for loading matrix block size","Mat");CHKERRQ(ierr); 34*3ea6fe3dSLisandro Dalcin ierr = PetscOptionsIntArray("-matload_block_size","Set the block size used to store the matrix","MatLoad",bs,&n,&set);CHKERRQ(ierr); 35*3ea6fe3dSLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 36*3ea6fe3dSLisandro Dalcin if (!set) PetscFunctionReturn(0); 37*3ea6fe3dSLisandro Dalcin if (n == 1) bs[1] = bs[0]; /* to support -matload_block_size <bs> */ 38*3ea6fe3dSLisandro Dalcin /* set matrix block sizes */ 39*3ea6fe3dSLisandro Dalcin if (bs[0] > 0) rbs = bs[0]; 40*3ea6fe3dSLisandro Dalcin if (bs[1] > 0) cbs = bs[1]; 41*3ea6fe3dSLisandro Dalcin ierr = MatSetBlockSizes(mat,rbs,cbs);CHKERRQ(ierr); 42*3ea6fe3dSLisandro Dalcin PetscFunctionReturn(0); 43*3ea6fe3dSLisandro Dalcin } 44