Actual source code: ex156.c

  1: static char help[] = "Tests resetting preallocation after filling the full sparsity pattern";

  3: #include <petscmat.h>

  5: PetscErrorCode Assemble(Mat mat)
  6: {
  7:   PetscInt    idx[4], i;
  8:   PetscScalar vals[16];
  9:   int         rank;

 11:   PetscFunctionBegin;
 12:   MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
 13:   for (i = 0; i < 16; ++i) vals[i] = 1;
 14:   if (rank == 0) {
 15:     // element 0
 16:     idx[0] = 0;
 17:     idx[1] = 1;
 18:     idx[2] = 2;
 19:     idx[3] = 3;
 20:     PetscCall(MatSetValues(mat, 4, idx, 4, idx, vals, ADD_VALUES));
 21:     // element 1
 22:     idx[0] = 3;
 23:     idx[1] = 2;
 24:     idx[2] = 4;
 25:     idx[3] = 5;
 26:     PetscCall(MatSetValues(mat, 4, idx, 4, idx, vals, ADD_VALUES));
 27:   } else {
 28:     // element 2
 29:     idx[0] = 6;
 30:     idx[1] = 0;
 31:     idx[2] = 3;
 32:     idx[3] = 7;
 33:     PetscCall(MatSetValues(mat, 4, idx, 4, idx, vals, ADD_VALUES));
 34:     // element 3
 35:     idx[0] = 7;
 36:     idx[1] = 3;
 37:     idx[2] = 5;
 38:     idx[3] = 8;
 39:     PetscCall(MatSetValues(mat, 4, idx, 4, idx, vals, ADD_VALUES));
 40:   }
 41:   PetscCall(MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY));
 42:   PetscCall(MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY));
 43:   PetscFunctionReturn(PETSC_SUCCESS);
 44: }

 46: int main(int argc, char **argv)
 47: {
 48:   Mat mat;
 49:   int rank;

 51:   PetscFunctionBeginUser;
 52:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 53:   MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
 54:   PetscCall(MatCreate(PETSC_COMM_WORLD, &mat));
 55:   if (rank == 0) PetscCall(MatSetSizes(mat, 6, 6, PETSC_DETERMINE, PETSC_DETERMINE));
 56:   else PetscCall(MatSetSizes(mat, 3, 3, PETSC_DETERMINE, PETSC_DETERMINE));
 57:   PetscCall(MatSetFromOptions(mat));
 58:   if (rank == 0) {
 59:     PetscInt ndz[6], noz[6];
 60:     ndz[0] = 4;
 61:     noz[0] = 2;
 62:     ndz[1] = 4;
 63:     noz[1] = 0;
 64:     ndz[2] = 6;
 65:     noz[2] = 0;
 66:     ndz[3] = 6;
 67:     noz[3] = 3;
 68:     ndz[4] = 4;
 69:     noz[4] = 0;
 70:     ndz[5] = 4;
 71:     noz[5] = 2;
 72:     PetscCall(MatMPIAIJSetPreallocation(mat, 0, ndz, 0, noz));
 73:   } else {
 74:     PetscInt ndz[3], noz[3];
 75:     ndz[0] = 2;
 76:     noz[0] = 2;
 77:     ndz[1] = 3;
 78:     noz[1] = 3;
 79:     ndz[2] = 2;
 80:     noz[2] = 2;
 81:     PetscCall(MatMPIAIJSetPreallocation(mat, 0, ndz, 0, noz));
 82:   }
 83:   PetscCall(MatSetUp(mat));
 84:   PetscCall(Assemble(mat));
 85:   PetscCall(MatView(mat, NULL));
 86:   PetscCall(MatResetPreallocation(mat));
 87:   PetscCall(Assemble(mat));
 88:   PetscCall(MatView(mat, NULL));
 89:   PetscCall(MatDestroy(&mat));
 90:   PetscCall(PetscFinalize());
 91:   return 0;
 92: }

 94: /*TEST

 96:    test:
 97:       suffix: 1
 98:       nsize: 2

100: TEST*/