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