Actual source code: ex159.c
1: static const char help[] = "Test MatGetLocalSubMatrix() with multiple levels of nesting.\n\n";
3: #include <petscmat.h>
5: int main(int argc, char *argv[])
6: {
8: IS is0a,is0b,is0,is1,isl0a,isl0b,isl0,isl1;
9: Mat A,Aexplicit;
10: PetscBool usenest;
11: PetscMPIInt rank,size;
12: PetscInt i,j;
14: PetscInitialize(&argc,&argv,PETSC_NULL,help);
15: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
16: MPI_Comm_size(PETSC_COMM_WORLD,&size);
18: {
19: const PetscInt ix0a[] = {rank*2+0},ix0b[] = {rank*2+1},ix0[] = {rank*3+0,rank*3+1},ix1[] = {rank*3+2};
20: ISCreateGeneral(PETSC_COMM_WORLD,1,ix0a,PETSC_COPY_VALUES,&is0a);
21: ISCreateGeneral(PETSC_COMM_WORLD,1,ix0b,PETSC_COPY_VALUES,&is0b);
22: ISCreateGeneral(PETSC_COMM_WORLD,2,ix0,PETSC_COPY_VALUES,&is0);
23: ISCreateGeneral(PETSC_COMM_WORLD,1,ix1,PETSC_COPY_VALUES,&is1);
24: }
25: {
26: ISCreateStride(PETSC_COMM_SELF,6,0,1,&isl0);
27: ISCreateStride(PETSC_COMM_SELF,3,0,1,&isl0a);
28: ISCreateStride(PETSC_COMM_SELF,3,3,1,&isl0b);
29: ISCreateStride(PETSC_COMM_SELF,3,6,1,&isl1);
30: }
32: usenest = PETSC_FALSE;
33: PetscOptionsGetBool(PETSC_NULL,"-nest",&usenest,PETSC_NULL);
34: if (usenest) {
35: ISLocalToGlobalMapping l2g;
36: const PetscInt l2gind[3] = {(rank-1+size)%size,rank,(rank+1)%size};
37: Mat B[9];
38: ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,3,l2gind,PETSC_COPY_VALUES,&l2g);
39: for (i=0; i<9; i++) {
40: MatCreateMPIAIJ(PETSC_COMM_WORLD,1,1,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_NULL,PETSC_DECIDE,PETSC_NULL,&B[i]);
41: MatSetLocalToGlobalMapping(B[i],l2g,l2g);
42: }
43: {
44: const IS isx[] = {is0a,is0b};
45: const Mat Bx00[] = {B[0],B[1],B[3],B[4]},Bx01[] = {B[2],B[5]},Bx10[] = {B[6],B[7]};
46: Mat B00,B01,B10;
47: MatCreateNest(PETSC_COMM_WORLD,2,isx,2,isx,Bx00,&B00);
48: MatCreateNest(PETSC_COMM_WORLD,2,isx,1,PETSC_NULL,Bx01,&B01);
49: MatCreateNest(PETSC_COMM_WORLD,1,PETSC_NULL,2,isx,Bx10,&B10);
50: {
51: Mat By[] = {B00,B01,B10,B[8]};
52: IS isy[] = {is0,is1};
53: MatCreateNest(PETSC_COMM_WORLD,2,isy,2,isy,By,&A);
54: }
55: MatDestroy(&B00);
56: MatDestroy(&B01);
57: MatDestroy(&B10);
58: }
59: for (i=0; i<9; i++) {MatDestroy(&B[i]);}
60: ISLocalToGlobalMappingDestroy(&l2g);
61: } else {
62: ISLocalToGlobalMapping l2g;
63: PetscInt l2gind[9];
64: for (i=0; i<3; i++) for (j=0; j<3; j++) l2gind[3*i+j] = ((rank-1+j+size) % size)*3 + i;
65: ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,9,l2gind,PETSC_COPY_VALUES,&l2g);
66: MatCreateMPIAIJ(PETSC_COMM_WORLD,3,3,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_NULL,PETSC_DECIDE,PETSC_NULL,&A);
67: MatSetLocalToGlobalMapping(A,l2g,l2g);
68: ISLocalToGlobalMappingDestroy(&l2g);
69: }
71: {
72: Mat A00,A11,A0a0a,A0a0b;
73: MatGetLocalSubMatrix(A,isl0,isl0,&A00);
74: MatGetLocalSubMatrix(A,isl1,isl1,&A11);
75: MatGetLocalSubMatrix(A00,isl0a,isl0a,&A0a0a);
76: MatGetLocalSubMatrix(A00,isl0a,isl0b,&A0a0b);
78: MatSetValueLocal(A0a0a,0,0,100*rank+1,ADD_VALUES);
79: MatSetValueLocal(A0a0a,0,1,100*rank+2,ADD_VALUES);
80: MatSetValueLocal(A0a0a,2,2,100*rank+9,ADD_VALUES);
82: MatSetValueLocal(A0a0b,1,1,100*rank+50+5,ADD_VALUES);
84: MatSetValueLocal(A11,0,0,1000*(rank+1)+1,ADD_VALUES);
85: MatSetValueLocal(A11,1,2,1000*(rank+1)+6,ADD_VALUES);
87: MatRestoreLocalSubMatrix(A00,isl0a,isl0a,&A0a0a);
88: MatRestoreLocalSubMatrix(A00,isl0a,isl0b,&A0a0b);
89: MatRestoreLocalSubMatrix(A,isl0,isl0,&A00);
90: MatRestoreLocalSubMatrix(A,isl1,isl1,&A11);
91: }
92: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
93: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
95: MatComputeExplicitOperator(A,&Aexplicit);
96: MatView(Aexplicit,PETSC_VIEWER_STDOUT_WORLD);
98: MatDestroy(&A);
99: MatDestroy(&Aexplicit);
100: ISDestroy(&is0a);
101: ISDestroy(&is0b);
102: ISDestroy(&is0);
103: ISDestroy(&is1);
104: ISDestroy(&isl0a);
105: ISDestroy(&isl0b);
106: ISDestroy(&isl0);
107: ISDestroy(&isl1);
108: PetscFinalize();
109: return 0;
110: }