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:   MatGetBlockSizes(mat, &rbs, &cbs);
 11:   PetscViewerBinaryGetInfoPointer(viewer, &info);
 12:   MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank);
 13:   if (rank == 0 && info) {
 14:     if (rbs != cbs) PetscFPrintf(PETSC_COMM_SELF, info, "-matload_block_size %" PetscInt_FMT ",%" PetscInt_FMT "\n", rbs, cbs);
 15:     else PetscFPrintf(PETSC_COMM_SELF, info, "-matload_block_size %" PetscInt_FMT "\n", rbs);
 16:   }
 17:   return 0;
 18: }

 20: PetscErrorCode MatLoad_Binary_BlockSizes(Mat mat, PetscViewer viewer)
 21: {
 22:   PetscInt  rbs, cbs, bs[2], n = 2;
 23:   PetscBool set;

 25:   /* get current block sizes */
 26:   MatGetBlockSizes(mat, &rbs, &cbs);
 27:   bs[0] = rbs;
 28:   bs[1] = cbs;
 29:   /* get block sizes from the options database */
 30:   PetscOptionsBegin(PetscObjectComm((PetscObject)viewer), NULL, "Options for loading matrix block size", "Mat");
 31:   PetscOptionsIntArray("-matload_block_size", "Set the block size used to store the matrix", "MatLoad", bs, &n, &set);
 32:   PetscOptionsEnd();
 33:   if (!set) return 0;
 34:   if (n == 1) bs[1] = bs[0]; /* to support -matload_block_size <bs> */
 35:   /* set matrix block sizes */
 36:   if (bs[0] > 0) rbs = bs[0];
 37:   if (bs[1] > 0) cbs = bs[1];
 38:   MatSetBlockSizes(mat, rbs, cbs);
 39:   return 0;
 40: }