13ea6fe3dSLisandro Dalcin #include <petscviewer.h>
23ea6fe3dSLisandro Dalcin #include <petsc/private/matimpl.h>
33ea6fe3dSLisandro Dalcin
MatView_Binary_BlockSizes(Mat mat,PetscViewer viewer)4d71ae5a4SJacob Faibussowitsch PetscErrorCode MatView_Binary_BlockSizes(Mat mat, PetscViewer viewer)
5d71ae5a4SJacob Faibussowitsch {
63ea6fe3dSLisandro Dalcin FILE *info;
73ea6fe3dSLisandro Dalcin PetscMPIInt rank;
83ea6fe3dSLisandro Dalcin PetscInt rbs, cbs;
9*a5040014SStefano Zampini PetscBool skip;
103ea6fe3dSLisandro Dalcin
113ea6fe3dSLisandro Dalcin PetscFunctionBegin;
12*a5040014SStefano Zampini PetscCall(PetscViewerBinaryGetSkipInfo(viewer, &skip));
13*a5040014SStefano Zampini if (skip) PetscFunctionReturn(PETSC_SUCCESS);
149566063dSJacob Faibussowitsch PetscCall(MatGetBlockSizes(mat, &rbs, &cbs));
159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryGetInfoPointer(viewer, &info));
169566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
17dd400576SPatrick Sanan if (rank == 0 && info) {
189566063dSJacob Faibussowitsch if (rbs != cbs) PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "-matload_block_size %" PetscInt_FMT ",%" PetscInt_FMT "\n", rbs, cbs));
199566063dSJacob Faibussowitsch else PetscCall(PetscFPrintf(PETSC_COMM_SELF, info, "-matload_block_size %" PetscInt_FMT "\n", rbs));
203ea6fe3dSLisandro Dalcin }
213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
223ea6fe3dSLisandro Dalcin }
233ea6fe3dSLisandro Dalcin
MatLoad_Binary_BlockSizes(Mat mat,PetscViewer viewer)24d71ae5a4SJacob Faibussowitsch PetscErrorCode MatLoad_Binary_BlockSizes(Mat mat, PetscViewer viewer)
25d71ae5a4SJacob Faibussowitsch {
263ea6fe3dSLisandro Dalcin PetscInt rbs, cbs, bs[2], n = 2;
273ea6fe3dSLisandro Dalcin PetscBool set;
283ea6fe3dSLisandro Dalcin
293ea6fe3dSLisandro Dalcin PetscFunctionBegin;
303ea6fe3dSLisandro Dalcin /* get current block sizes */
319566063dSJacob Faibussowitsch PetscCall(MatGetBlockSizes(mat, &rbs, &cbs));
329371c9d4SSatish Balay bs[0] = rbs;
339371c9d4SSatish Balay bs[1] = cbs;
343ea6fe3dSLisandro Dalcin /* get block sizes from the options database */
35d0609cedSBarry Smith PetscOptionsBegin(PetscObjectComm((PetscObject)viewer), NULL, "Options for loading matrix block size", "Mat");
369566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray("-matload_block_size", "Set the block size used to store the matrix", "MatLoad", bs, &n, &set));
37d0609cedSBarry Smith PetscOptionsEnd();
383ba16761SJacob Faibussowitsch if (!set) PetscFunctionReturn(PETSC_SUCCESS);
393ea6fe3dSLisandro Dalcin if (n == 1) bs[1] = bs[0]; /* to support -matload_block_size <bs> */
403ea6fe3dSLisandro Dalcin /* set matrix block sizes */
413ea6fe3dSLisandro Dalcin if (bs[0] > 0) rbs = bs[0];
423ea6fe3dSLisandro Dalcin if (bs[1] > 0) cbs = bs[1];
439566063dSJacob Faibussowitsch PetscCall(MatSetBlockSizes(mat, rbs, cbs));
443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
453ea6fe3dSLisandro Dalcin }
46