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