13ea6fe3dSLisandro Dalcin #include <petscviewer.h> 23ea6fe3dSLisandro Dalcin #include <petsc/private/matimpl.h> 33ea6fe3dSLisandro Dalcin 43ea6fe3dSLisandro Dalcin PetscErrorCode MatView_Binary_BlockSizes(Mat mat,PetscViewer viewer) 53ea6fe3dSLisandro Dalcin { 63ea6fe3dSLisandro Dalcin FILE *info; 73ea6fe3dSLisandro Dalcin PetscMPIInt rank; 83ea6fe3dSLisandro Dalcin PetscInt rbs,cbs; 93ea6fe3dSLisandro Dalcin PetscErrorCode ierr; 103ea6fe3dSLisandro Dalcin 113ea6fe3dSLisandro Dalcin PetscFunctionBegin; 123ea6fe3dSLisandro Dalcin ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); 133ea6fe3dSLisandro Dalcin ierr = PetscViewerBinaryGetInfoPointer(viewer,&info);CHKERRQ(ierr); 14ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRMPI(ierr); 15*dd400576SPatrick Sanan if (rank == 0 && info) { 163ea6fe3dSLisandro Dalcin if (rbs != cbs) {ierr = PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %D,%D\n",rbs,cbs);CHKERRQ(ierr);} 173ea6fe3dSLisandro Dalcin else {ierr = PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %D\n",rbs);CHKERRQ(ierr);} 183ea6fe3dSLisandro Dalcin } 193ea6fe3dSLisandro Dalcin PetscFunctionReturn(0); 203ea6fe3dSLisandro Dalcin } 213ea6fe3dSLisandro Dalcin 223ea6fe3dSLisandro Dalcin PetscErrorCode MatLoad_Binary_BlockSizes(Mat mat,PetscViewer viewer) 233ea6fe3dSLisandro Dalcin { 243ea6fe3dSLisandro Dalcin PetscInt rbs,cbs,bs[2],n = 2; 253ea6fe3dSLisandro Dalcin PetscBool set; 263ea6fe3dSLisandro Dalcin PetscErrorCode ierr; 273ea6fe3dSLisandro Dalcin 283ea6fe3dSLisandro Dalcin PetscFunctionBegin; 293ea6fe3dSLisandro Dalcin /* get current block sizes */ 303ea6fe3dSLisandro Dalcin ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); 313ea6fe3dSLisandro Dalcin bs[0] = rbs; bs[1] = cbs; 323ea6fe3dSLisandro Dalcin /* get block sizes from the options database */ 333ea6fe3dSLisandro Dalcin ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)viewer),NULL,"Options for loading matrix block size","Mat");CHKERRQ(ierr); 343ea6fe3dSLisandro Dalcin ierr = PetscOptionsIntArray("-matload_block_size","Set the block size used to store the matrix","MatLoad",bs,&n,&set);CHKERRQ(ierr); 353ea6fe3dSLisandro Dalcin ierr = PetscOptionsEnd();CHKERRQ(ierr); 363ea6fe3dSLisandro Dalcin if (!set) PetscFunctionReturn(0); 373ea6fe3dSLisandro Dalcin if (n == 1) bs[1] = bs[0]; /* to support -matload_block_size <bs> */ 383ea6fe3dSLisandro Dalcin /* set matrix block sizes */ 393ea6fe3dSLisandro Dalcin if (bs[0] > 0) rbs = bs[0]; 403ea6fe3dSLisandro Dalcin if (bs[1] > 0) cbs = bs[1]; 413ea6fe3dSLisandro Dalcin ierr = MatSetBlockSizes(mat,rbs,cbs);CHKERRQ(ierr); 423ea6fe3dSLisandro Dalcin PetscFunctionReturn(0); 433ea6fe3dSLisandro Dalcin } 44