xref: /petsc/src/mat/utils/matio.c (revision 9566063d113dddea24716c546802770db7481bc0)
13ea6fe3dSLisandro Dalcin #include <petscviewer.h>
23ea6fe3dSLisandro Dalcin #include <petsc/private/matimpl.h>
33ea6fe3dSLisandro Dalcin 
43ea6fe3dSLisandro Dalcin PetscErrorCode MatView_Binary_BlockSizes(Mat mat,PetscViewer viewer)
53ea6fe3dSLisandro Dalcin {
63ea6fe3dSLisandro Dalcin   FILE           *info;
73ea6fe3dSLisandro Dalcin   PetscMPIInt    rank;
83ea6fe3dSLisandro Dalcin   PetscInt       rbs,cbs;
93ea6fe3dSLisandro Dalcin 
103ea6fe3dSLisandro Dalcin   PetscFunctionBegin;
11*9566063dSJacob Faibussowitsch   PetscCall(MatGetBlockSizes(mat,&rbs,&cbs));
12*9566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetInfoPointer(viewer,&info));
13*9566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank));
14dd400576SPatrick Sanan   if (rank == 0 && info) {
15*9566063dSJacob Faibussowitsch     if (rbs != cbs) PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %" PetscInt_FMT ",%" PetscInt_FMT "\n",rbs,cbs));
16*9566063dSJacob Faibussowitsch     else            PetscCall(PetscFPrintf(PETSC_COMM_SELF,info,"-matload_block_size %" PetscInt_FMT "\n",rbs));
173ea6fe3dSLisandro Dalcin   }
183ea6fe3dSLisandro Dalcin   PetscFunctionReturn(0);
193ea6fe3dSLisandro Dalcin }
203ea6fe3dSLisandro Dalcin 
213ea6fe3dSLisandro Dalcin PetscErrorCode MatLoad_Binary_BlockSizes(Mat mat,PetscViewer viewer)
223ea6fe3dSLisandro Dalcin {
233ea6fe3dSLisandro Dalcin   PetscInt       rbs,cbs,bs[2],n = 2;
243ea6fe3dSLisandro Dalcin   PetscBool      set;
253ea6fe3dSLisandro Dalcin   PetscErrorCode ierr;
263ea6fe3dSLisandro Dalcin 
273ea6fe3dSLisandro Dalcin   PetscFunctionBegin;
283ea6fe3dSLisandro Dalcin   /* get current block sizes */
29*9566063dSJacob Faibussowitsch   PetscCall(MatGetBlockSizes(mat,&rbs,&cbs));
303ea6fe3dSLisandro Dalcin   bs[0] = rbs; bs[1] = cbs;
313ea6fe3dSLisandro Dalcin   /* get block sizes from the options database */
32*9566063dSJacob Faibussowitsch   ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)viewer),NULL,"Options for loading matrix block size","Mat");PetscCall(ierr);
33*9566063dSJacob Faibussowitsch   PetscCall(PetscOptionsIntArray("-matload_block_size","Set the block size used to store the matrix","MatLoad",bs,&n,&set));
34*9566063dSJacob Faibussowitsch   ierr = PetscOptionsEnd();PetscCall(ierr);
353ea6fe3dSLisandro Dalcin   if (!set) PetscFunctionReturn(0);
363ea6fe3dSLisandro Dalcin   if (n == 1) bs[1] = bs[0]; /* to support -matload_block_size <bs> */
373ea6fe3dSLisandro Dalcin   /* set matrix block sizes */
383ea6fe3dSLisandro Dalcin   if (bs[0] > 0) rbs = bs[0];
393ea6fe3dSLisandro Dalcin   if (bs[1] > 0) cbs = bs[1];
40*9566063dSJacob Faibussowitsch   PetscCall(MatSetBlockSizes(mat,rbs,cbs));
413ea6fe3dSLisandro Dalcin   PetscFunctionReturn(0);
423ea6fe3dSLisandro Dalcin }
43