1c4762a1bSJed Brown static const char help[] = "Test MatGetLocalSubMatrix() with multiple levels of nesting.\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscmat.h> 4c4762a1bSJed Brown 5c4762a1bSJed Brown int main(int argc, char *argv[]) 6c4762a1bSJed Brown { 7c4762a1bSJed Brown IS is0a,is0b,is0,is1,isl0a,isl0b,isl0,isl1; 8c4762a1bSJed Brown Mat A,Aexplicit; 9c4762a1bSJed Brown PetscBool usenest; 10c4762a1bSJed Brown PetscMPIInt rank,size; 11c4762a1bSJed Brown PetscInt i,j; 12c4762a1bSJed Brown 13*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,NULL,help)); 145f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 155f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 16c4762a1bSJed Brown 17c4762a1bSJed Brown { 18c4762a1bSJed Brown PetscInt ix0a[1],ix0b[1],ix0[2],ix1[1]; 19c4762a1bSJed Brown 20c4762a1bSJed Brown ix0a[0] = rank*2+0; 21c4762a1bSJed Brown ix0b[0] = rank*2+1; 22c4762a1bSJed Brown ix0[0] = rank*3+0; ix0[1] = rank*3+1; 23c4762a1bSJed Brown ix1[0] = rank*3+2; 245f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PETSC_COMM_WORLD,1,ix0a,PETSC_COPY_VALUES,&is0a)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PETSC_COMM_WORLD,1,ix0b,PETSC_COPY_VALUES,&is0b)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PETSC_COMM_WORLD,2,ix0,PETSC_COPY_VALUES,&is0)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PETSC_COMM_WORLD,1,ix1,PETSC_COPY_VALUES,&is1)); 28c4762a1bSJed Brown } 29c4762a1bSJed Brown { 305f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateStride(PETSC_COMM_SELF,6,0,1,&isl0)); 315f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateStride(PETSC_COMM_SELF,3,0,1,&isl0a)); 325f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateStride(PETSC_COMM_SELF,3,3,1,&isl0b)); 335f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateStride(PETSC_COMM_SELF,3,6,1,&isl1)); 34c4762a1bSJed Brown } 35c4762a1bSJed Brown 36c4762a1bSJed Brown usenest = PETSC_FALSE; 375f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-nest",&usenest,NULL)); 38c4762a1bSJed Brown if (usenest) { 39c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 40c4762a1bSJed Brown PetscInt l2gind[3]; 41c4762a1bSJed Brown Mat B[9]; 42c4762a1bSJed Brown 43c4762a1bSJed Brown l2gind[0] = (rank-1+size)%size; l2gind[1] = rank; l2gind[2] = (rank+1)%size; 445f80ce2aSJacob Faibussowitsch CHKERRQ(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,1,3,l2gind,PETSC_COPY_VALUES,&l2g)); 45c4762a1bSJed Brown for (i=0; i<9; i++) { 465f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateAIJ(PETSC_COMM_WORLD,1,1,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,NULL,PETSC_DECIDE,NULL,&B[i])); 475f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(B[i])); 485f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetLocalToGlobalMapping(B[i],l2g,l2g)); 49c4762a1bSJed Brown } 50c4762a1bSJed Brown { 51c4762a1bSJed Brown IS isx[2]; 52c4762a1bSJed Brown Mat Bx00[4],Bx01[2],Bx10[2]; 53c4762a1bSJed Brown Mat B00,B01,B10; 54c4762a1bSJed Brown 55c4762a1bSJed Brown isx[0] = is0a; isx[1] = is0b; 56c4762a1bSJed Brown Bx00[0] = B[0]; Bx00[1] = B[1]; Bx00[2] = B[3]; Bx00[3] = B[4]; 57c4762a1bSJed Brown Bx01[0] = B[2]; Bx01[1] = B[5]; 58c4762a1bSJed Brown Bx10[0] = B[6]; Bx10[1] = B[7]; 59c4762a1bSJed Brown 605f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateNest(PETSC_COMM_WORLD,2,isx,2,isx,Bx00,&B00)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(B00)); 625f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateNest(PETSC_COMM_WORLD,2,isx,1,NULL,Bx01,&B01)); 635f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(B01)); 645f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateNest(PETSC_COMM_WORLD,1,NULL,2,isx,Bx10,&B10)); 655f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(B10)); 66c4762a1bSJed Brown { 67c4762a1bSJed Brown Mat By[4]; 68c4762a1bSJed Brown IS isy[2]; 69c4762a1bSJed Brown 70c4762a1bSJed Brown By[0] = B00; By[1] = B01; By[2] = B10; By[3] = B[8]; 71c4762a1bSJed Brown isy[0] = is0; isy[1] = is1; 72c4762a1bSJed Brown 735f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateNest(PETSC_COMM_WORLD,2,isy,2,isy,By,&A)); 745f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(A)); 75c4762a1bSJed Brown } 765f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B00)); 775f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B01)); 785f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&B10)); 79c4762a1bSJed Brown } 805f80ce2aSJacob Faibussowitsch for (i=0; i<9; i++) CHKERRQ(MatDestroy(&B[i])); 815f80ce2aSJacob Faibussowitsch CHKERRQ(ISLocalToGlobalMappingDestroy(&l2g)); 82c4762a1bSJed Brown } else { 83c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 84c4762a1bSJed Brown PetscInt l2gind[9]; 85c4762a1bSJed Brown for (i=0; i<3; i++) for (j=0; j<3; j++) l2gind[3*i+j] = ((rank-1+j+size) % size)*3 + i; 865f80ce2aSJacob Faibussowitsch CHKERRQ(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,1,9,l2gind,PETSC_COPY_VALUES,&l2g)); 875f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreateAIJ(PETSC_COMM_WORLD,3,3,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,NULL,PETSC_DECIDE,NULL,&A)); 885f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetLocalToGlobalMapping(A,l2g,l2g)); 895f80ce2aSJacob Faibussowitsch CHKERRQ(ISLocalToGlobalMappingDestroy(&l2g)); 90c4762a1bSJed Brown } 91c4762a1bSJed Brown 92c4762a1bSJed Brown { 93c4762a1bSJed Brown Mat A00,A11,A0a0a,A0a0b; 945f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetLocalSubMatrix(A,isl0,isl0,&A00)); 955f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetLocalSubMatrix(A,isl1,isl1,&A11)); 965f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetLocalSubMatrix(A00,isl0a,isl0a,&A0a0a)); 975f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetLocalSubMatrix(A00,isl0a,isl0b,&A0a0b)); 98c4762a1bSJed Brown 995f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A0a0a,0,0,100*rank+1,ADD_VALUES)); 1005f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A0a0a,0,1,100*rank+2,ADD_VALUES)); 1015f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A0a0a,2,2,100*rank+9,ADD_VALUES)); 102c4762a1bSJed Brown 1035f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A0a0b,1,1,100*rank+50+5,ADD_VALUES)); 104c4762a1bSJed Brown 1055f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A11,0,0,1000*(rank+1)+1,ADD_VALUES)); 1065f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetValueLocal(A11,1,2,1000*(rank+1)+6,ADD_VALUES)); 107c4762a1bSJed Brown 1085f80ce2aSJacob Faibussowitsch CHKERRQ(MatRestoreLocalSubMatrix(A00,isl0a,isl0a,&A0a0a)); 1095f80ce2aSJacob Faibussowitsch CHKERRQ(MatRestoreLocalSubMatrix(A00,isl0a,isl0b,&A0a0b)); 1105f80ce2aSJacob Faibussowitsch CHKERRQ(MatRestoreLocalSubMatrix(A,isl0,isl0,&A00)); 1115f80ce2aSJacob Faibussowitsch CHKERRQ(MatRestoreLocalSubMatrix(A,isl1,isl1,&A11)); 112c4762a1bSJed Brown } 1135f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 1145f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 115c4762a1bSJed Brown 1165f80ce2aSJacob Faibussowitsch CHKERRQ(MatComputeOperator(A,MATAIJ,&Aexplicit)); 1175f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(Aexplicit,PETSC_VIEWER_STDOUT_WORLD)); 118c4762a1bSJed Brown 1195f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 1205f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Aexplicit)); 1215f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is0a)); 1225f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is0b)); 1235f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is0)); 1245f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is1)); 1255f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&isl0a)); 1265f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&isl0b)); 1275f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&isl0)); 1285f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&isl1)); 129*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 130*b122ec5aSJacob Faibussowitsch return 0; 131c4762a1bSJed Brown } 132c4762a1bSJed Brown 133c4762a1bSJed Brown /*TEST 134c4762a1bSJed Brown 135c4762a1bSJed Brown test: 136c4762a1bSJed Brown nsize: 3 137c4762a1bSJed Brown 138c4762a1bSJed Brown test: 139c4762a1bSJed Brown suffix: nest 140c4762a1bSJed Brown nsize: 3 141c4762a1bSJed Brown args: -nest 142c4762a1bSJed Brown 143c4762a1bSJed Brown TEST*/ 144