Actual source code: ex210.c

  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;

 12:   PetscFunctionBeginUser;
 13:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 14:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 15:   PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Only coded for one process");
 16:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 17:   PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 1, 2));
 18:   PetscCall(MatSetBlockSizes(A, 1, 2));
 19:   PetscCall(MatSetType(A, MATAIJ));
 20:   PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 2, 1, indices, PETSC_COPY_VALUES, &cmap));
 21:   PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 1, indices, PETSC_COPY_VALUES, &rmap));
 22:   PetscCall(MatSetLocalToGlobalMapping(A, rmap, cmap));
 23:   PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
 24:   PetscCall(MatSetSizes(B, PETSC_DECIDE, PETSC_DECIDE, 1, 1));
 25:   PetscCall(MatSetBlockSizes(A, 1, 1));
 26:   PetscCall(MatSetType(B, MATAIJ));
 27:   PetscCall(MatSetLocalToGlobalMapping(B, rmap, rmap));
 28:   PetscCall(ISLocalToGlobalMappingDestroy(&rmap));
 29:   PetscCall(ISLocalToGlobalMappingDestroy(&cmap));
 30:   PetscCall(MatSetUp(A));
 31:   PetscCall(MatSetUp(B));
 32:   mats[0] = A;
 33:   mats[1] = B;
 34:   PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 2, NULL, mats, &C));
 35:   PetscCall(MatSetUp(C));
 36:   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
 37:   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
 38:   PetscCall(MatView(C, NULL));
 39:   PetscCall(MatDestroy(&C));
 40:   PetscCall(MatDestroy(&B));
 41:   PetscCall(MatDestroy(&A));
 42:   PetscCall(PetscFinalize());
 43:   return 0;
 44: }

 46: /*TEST

 48:     test:

 50: TEST*/