1 static char help[] = "Test MatCreateSubMatrices\n\n"; 2 3 #include <petscis.h> 4 #include <petscmat.h> 5 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}; 17 18 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 19 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 20 21 ierr = PetscOptionsGetString(NULL,NULL,"-A",matfile,sizeof(matfile),NULL);CHKERRQ(ierr); 22 ierr = PetscOptionsGetString(NULL,NULL,"-row",rowfile,sizeof(rowfile),NULL);CHKERRQ(ierr); 23 ierr = PetscOptionsGetString(NULL,NULL,"-col",colfile,sizeof(colfile),NULL);CHKERRQ(ierr); 24 25 /* Each rank has its own files for row/col ISes */ 26 ierr = PetscSNPrintf(rankstr,16,"-%d",rank);CHKERRQ(ierr); 27 ierr = PetscStrlcat(rowfile,rankstr,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 28 ierr = PetscStrlcat(colfile,rankstr,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 29 30 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,matfile,FILE_MODE_READ,&matfd);CHKERRQ(ierr); 31 ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,rowfile,FILE_MODE_READ,&rowfd);CHKERRQ(ierr); 32 ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,colfile,FILE_MODE_READ,&colfd);CHKERRQ(ierr); 33 34 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 35 ierr = MatSetFromOptions(A);CHKERRQ(ierr); 36 ierr = MatLoad(A,matfd);CHKERRQ(ierr); 37 38 /* We stored the number of ISes at the beginning of rowfd */ 39 ierr = PetscViewerBinaryRead(rowfd,&n,1,NULL,PETSC_INT);CHKERRQ(ierr); 40 ierr = PetscMalloc2(n,&irow,n,&icol);CHKERRQ(ierr); 41 for (i=0; i<n; i++) { 42 ierr = ISCreate(PETSC_COMM_SELF,&irow[i]);CHKERRQ(ierr); 43 ierr = ISCreate(PETSC_COMM_SELF,&icol[i]);CHKERRQ(ierr); 44 ierr = ISLoad(irow[i],rowfd);CHKERRQ(ierr); 45 ierr = ISLoad(icol[i],colfd);CHKERRQ(ierr); 46 } 47 48 ierr = PetscViewerDestroy(&matfd);CHKERRQ(ierr); 49 ierr = PetscViewerDestroy(&rowfd);CHKERRQ(ierr); 50 ierr = PetscViewerDestroy(&colfd);CHKERRQ(ierr); 51 52 /* Create submats for the first time */ 53 ierr = MatCreateSubMatrices(A,n,irow,icol,MAT_INITIAL_MATRIX,&submats);CHKERRQ(ierr); 54 55 /* Dup submats to submats2 for later comparison */ 56 ierr = PetscMalloc1(n,&submats2);CHKERRQ(ierr); 57 for (i=0; i<n; i++) { 58 ierr = MatDuplicate(submats[i],MAT_COPY_VALUES,&submats2[i]);CHKERRQ(ierr); 59 } 60 61 /* Create submats again */ 62 ierr = MatCreateSubMatrices(A,n,irow,icol,MAT_REUSE_MATRIX,&submats);CHKERRQ(ierr); 63 64 /* Compare submats and submats2 */ 65 for (i=0; i<n; i++) { 66 ierr = MatEqual(submats[i],submats2[i],&same);CHKERRQ(ierr); 67 if (!same) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"submatrix %d is not same\n",i); 68 } 69 70 ierr = MatDestroy(&A);CHKERRQ(ierr); 71 for (i=0; i<n; i++) { 72 ierr = ISDestroy(&irow[i]);CHKERRQ(ierr); 73 ierr = ISDestroy(&icol[i]);CHKERRQ(ierr); 74 } 75 ierr = MatDestroySubMatrices(n,&submats);CHKERRQ(ierr); 76 ierr = MatDestroyMatrices(n,&submats2);CHKERRQ(ierr); 77 ierr = PetscFree2(irow,icol);CHKERRQ(ierr); 78 ierr = PetscFinalize(); 79 return ierr; 80 } 81 82 /*TEST 83 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 89 90 TEST*/ 91