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