Actual source code: ex246.c

  1: static char help[] = "Test MatCreateSubMatrices\n\n";

  3: #include <petscis.h>
  4: #include <petscmat.h>

  6: int main(int argc,char **args)
  7: {
  8:   PetscErrorCode  ierr;
  9:   Mat             A,*submats,*submats2;
 10:   IS              *irow,*icol;
 11:   PetscInt        i,n;
 12:   PetscMPIInt     rank;
 13:   PetscViewer     matfd,rowfd,colfd;
 14:   PetscBool       same;
 15:   char            matfile[PETSC_MAX_PATH_LEN],rowfile[PETSC_MAX_PATH_LEN],colfile[PETSC_MAX_PATH_LEN];
 16:   char            rankstr[16]={0};

 18:   PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
 19:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);

 21:   PetscOptionsGetString(NULL,NULL,"-A",matfile,sizeof(matfile),NULL);
 22:   PetscOptionsGetString(NULL,NULL,"-row",rowfile,sizeof(rowfile),NULL);
 23:   PetscOptionsGetString(NULL,NULL,"-col",colfile,sizeof(colfile),NULL);

 25:   /* Each rank has its own files for row/col ISes */
 26:   PetscSNPrintf(rankstr,16,"-%d",rank);
 27:   PetscStrlcat(rowfile,rankstr,PETSC_MAX_PATH_LEN);
 28:   PetscStrlcat(colfile,rankstr,PETSC_MAX_PATH_LEN);

 30:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,matfile,FILE_MODE_READ,&matfd);
 31:   PetscViewerBinaryOpen(PETSC_COMM_SELF,rowfile,FILE_MODE_READ,&rowfd);
 32:   PetscViewerBinaryOpen(PETSC_COMM_SELF,colfile,FILE_MODE_READ,&colfd);

 34:   MatCreate(PETSC_COMM_WORLD,&A);
 35:   MatSetFromOptions(A);
 36:   MatLoad(A,matfd);

 38:   /* We stored the number of ISes at the beginning of rowfd */
 39:   PetscViewerBinaryRead(rowfd,&n,1,NULL,PETSC_INT);
 40:   PetscMalloc2(n,&irow,n,&icol);
 41:   for (i=0; i<n; i++) {
 42:     ISCreate(PETSC_COMM_SELF,&irow[i]);
 43:     ISCreate(PETSC_COMM_SELF,&icol[i]);
 44:     ISLoad(irow[i],rowfd);
 45:     ISLoad(icol[i],colfd);
 46:   }

 48:   PetscViewerDestroy(&matfd);
 49:   PetscViewerDestroy(&rowfd);
 50:   PetscViewerDestroy(&colfd);

 52:   /* Create submats for the first time */
 53:   MatCreateSubMatrices(A,n,irow,icol,MAT_INITIAL_MATRIX,&submats);

 55:   /* Dup submats to submats2 for later comparison */
 56:   PetscMalloc1(n,&submats2);
 57:   for (i=0; i<n; i++) {
 58:     MatDuplicate(submats[i],MAT_COPY_VALUES,&submats2[i]);
 59:   }

 61:   /* Create submats again */
 62:   MatCreateSubMatrices(A,n,irow,icol,MAT_REUSE_MATRIX,&submats);

 64:   /* Compare submats and submats2 */
 65:   for (i=0; i<n; i++) {
 66:     MatEqual(submats[i],submats2[i],&same);
 67:     if (!same) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"submatrix %d is not same\n",i);
 68:   }

 70:   MatDestroy(&A);
 71:   for (i=0; i<n; i++) {
 72:     ISDestroy(&irow[i]);
 73:     ISDestroy(&icol[i]);
 74:   }
 75:   MatDestroySubMatrices(n,&submats);
 76:   MatDestroyMatrices(n,&submats2);
 77:   PetscFree2(irow,icol);
 78:   PetscFinalize();
 79:   return ierr;
 80: }

 82: /*TEST

 84:    test:
 85:      suffix: 1
 86:      nsize: 2
 87:      requires: datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
 88:      args: -mat_type {{aij baij}} -A ${DATAFILESPATH}/matrices/CreateSubMatrices/A -row ${DATAFILESPATH}/matrices/CreateSubMatrices/row -col ${DATAFILESPATH}/matrices/CreateSubMatrices/col

 90: TEST*/