Actual source code: ex210.c
petsc-3.13.6 2020-09-29
1: static char help[] = "Test MatCreateNest with block sizes.\n";
3: #include <petscmat.h>
5: int main(int argc, char **argv)
6: {
7: Mat A, B, C, mats[2];
8: ISLocalToGlobalMapping cmap, rmap;
9: const PetscInt indices[1] = {0};
10: PetscMPIInt size;
11: PetscErrorCode ierr;
13: PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr;
14: MPI_Comm_size(PETSC_COMM_WORLD, &size);
15: if (size > 1) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,"Only coded for one process");
16: MatCreate(PETSC_COMM_WORLD, &A);
17: MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 1, 2);
18: MatSetBlockSizes(A, 1, 2);
19: MatSetType(A,MATAIJ);
20: ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 2, 1, indices,PETSC_COPY_VALUES, &cmap);
21: ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 1, indices,PETSC_COPY_VALUES, &rmap);
22: MatSetLocalToGlobalMapping(A, rmap, cmap);
23: MatCreate(PETSC_COMM_WORLD, &B);
24: MatSetSizes(B, PETSC_DECIDE, PETSC_DECIDE, 1, 1);
25: MatSetBlockSizes(A, 1, 1);
26: MatSetType(B,MATAIJ);
27: MatSetLocalToGlobalMapping(B, rmap, rmap);
28: ISLocalToGlobalMappingDestroy(&rmap);
29: ISLocalToGlobalMappingDestroy(&cmap);
30: MatSetUp(A);
31: MatSetUp(B);
32: mats[0] = A;
33: mats[1] = B;
34: MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 2, NULL, mats,&C);
35: MatSetUp(C);
36: MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY);
37: MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY);
38: MatView(C, NULL);
39: MatDestroy(&C);
40: MatDestroy(&B);
41: MatDestroy(&A);
42: PetscFinalize();
43: return ierr;
44: }
46: /*TEST
48: test:
50: TEST*/