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*/