xref: /petsc/src/mat/utils/matio.c (revision 4e278199b78715991f5c71ebbd945c1489263e6c)
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 && 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