xref: /petsc/src/mat/tests/ex249.c (revision 544b287a8b413c50c25ea86b158d336aee640540)
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