Actual source code: ex32.c

  1: static char help[] = "Test DMStagRestrictSimple()\n\n";

  3: #include <petscdmstag.h>

  5: int main(int argc, char **argv)
  6: {
  7:   DM        dm, dm_coarse;
  8:   Vec       vec, vec_coarse, vec_local, vec_local_coarse;
  9:   PetscInt  dim, size_coarse;
 10:   PetscReal norm;

 12:   PetscFunctionBeginUser;
 13:   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
 14:   dim = 2;
 15:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL));
 16:   switch (dim) {
 17:   case 1:
 18:     PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 8, 2, 3, DMSTAG_STENCIL_BOX, 1, NULL, &dm));
 19:     break;
 20:   case 2:
 21:     PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 8, 16, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dm));
 22:     break;
 23:   case 3:
 24:     PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 4, 8, 12, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, 3, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dm));
 25:     break;
 26:   default:
 27:     SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Not Implemented!");
 28:   }
 29:   PetscCall(DMSetFromOptions(dm));
 30:   PetscCall(DMSetUp(dm));
 31:   PetscCall(DMCoarsen(dm, MPI_COMM_NULL, &dm_coarse));

 33:   PetscCall(DMCreateGlobalVector(dm, &vec));
 34:   PetscCall(VecSet(vec, 1.0));
 35:   PetscCall(DMCreateLocalVector(dm, &vec_local));
 36:   PetscCall(DMGlobalToLocal(dm, vec, INSERT_VALUES, vec_local));

 38:   PetscCall(DMCreateGlobalVector(dm_coarse, &vec_coarse));
 39:   PetscCall(DMCreateLocalVector(dm_coarse, &vec_local_coarse));

 41:   PetscCall(DMStagRestrictSimple(dm, vec_local, dm_coarse, vec_local_coarse));

 43:   PetscCall(DMLocalToGlobal(dm_coarse, vec_local_coarse, INSERT_VALUES, vec_coarse));

 45:   PetscCall(VecGetSize(vec_coarse, &size_coarse));
 46:   PetscCall(VecNorm(vec_coarse, NORM_1, &norm));
 47:   PetscCheck((norm - size_coarse) / ((PetscReal)size_coarse) <= PETSC_MACHINE_EPSILON * 10.0, PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Numerical test failed");
 48:   PetscCall(VecDestroy(&vec_coarse));
 49:   PetscCall(VecDestroy(&vec));
 50:   PetscCall(VecDestroy(&vec_local_coarse));
 51:   PetscCall(VecDestroy(&vec_local));
 52:   PetscCall(DMDestroy(&dm_coarse));
 53:   PetscCall(DMDestroy(&dm));
 54:   PetscCall(PetscFinalize());
 55:   return 0;
 56: }

 58: /*TEST

 60:    test:
 61:       suffix: 1d
 62:       nsize: 1
 63:       args: -dim 1

 65:    test:
 66:       suffix: 1d_par
 67:       nsize: 4
 68:       args: -dim 1

 70:    test:
 71:       suffix: 2d
 72:       nsize: 1
 73:       args: -dim 2

 75:    test:
 76:       suffix: 2d_par
 77:       nsize: 2
 78:       args: -dim 2

 80:    test:
 81:       suffix: 2d_par_2
 82:       nsize: 8
 83:       args: -dim 2
 84:    test:
 85:       suffix: 3d
 86:       nsize: 1
 87:       args: -dim 3

 89:    test:
 90:       suffix: 3d_par
 91:       nsize: 2
 92:       args: -dim 3
 93: TEST*/