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*/