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