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 dmf, dmc;
8: Vec gf, gc, lf, lc;
9: PetscInt dim, size;
10: PetscReal norm;
12: PetscFunctionBeginUser;
13: PetscCall(PetscInitialize(&argc, &argv, NULL, 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, 4, 2, 3, DMSTAG_STENCIL_BOX, 1, NULL, &dmc));
19: break;
20: case 2:
21: PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 4, 8, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dmc));
22: break;
23: case 3:
24: PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 4, 6, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, 3, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dmc));
25: break;
26: default:
27: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Not Implemented!");
28: }
29: PetscCall(DMSetFromOptions(dmc));
30: PetscCall(DMSetUp(dmc));
31: PetscCall(DMRefine(dmc, MPI_COMM_NULL, &dmf));
33: PetscCall(DMCreateGlobalVector(dmf, &gf));
34: PetscCall(VecSet(gf, 1.0));
35: PetscCall(DMCreateLocalVector(dmf, &lf));
36: PetscCall(DMGlobalToLocal(dmf, gf, INSERT_VALUES, lf));
38: PetscCall(DMCreateGlobalVector(dmc, &gc));
39: PetscCall(DMCreateLocalVector(dmc, &lc));
41: PetscCall(DMStagRestrictSimple(dmf, lf, dmc, lc));
43: PetscCall(DMLocalToGlobal(dmc, lc, INSERT_VALUES, gc));
45: PetscCall(VecGetSize(gc, &size));
46: PetscCall(VecNorm(gc, NORM_1, &norm));
47: PetscCheck((norm - size) / (PetscReal)size <= PETSC_MACHINE_EPSILON * 10.0, PetscObjectComm((PetscObject)dmc), PETSC_ERR_PLIB, "Numerical test failed");
48: PetscCall(VecDestroy(&gc));
49: PetscCall(VecDestroy(&gf));
50: PetscCall(VecDestroy(&lc));
51: PetscCall(VecDestroy(&lf));
52: PetscCall(DMDestroy(&dmc));
53: PetscCall(DMDestroy(&dmf));
54: PetscCall(PetscFinalize());
55: return 0;
56: }
58: /*TEST
60: test:
61: suffix: 1d
62: nsize: 1
63: args: -dim 1
64: output_file: output/empty.out
66: test:
67: suffix: 1d_par
68: nsize: 4
69: args: -dim 1
70: output_file: output/empty.out
72: test:
73: suffix: 1d_ratio
74: nsize: 1
75: args: -dim 1 -stag_refine_x 3
76: output_file: output/empty.out
78: test:
79: suffix: 2d
80: nsize: 1
81: args: -dim 2
82: output_file: output/empty.out
84: test:
85: suffix: 2d_par
86: nsize: 2
87: args: -dim 2
88: output_file: output/empty.out
90: test:
91: suffix: 2d_par_2
92: nsize: 8
93: args: -dim 2
94: output_file: output/empty.out
96: test:
97: suffix: 2d_ratio
98: nsize: 1
99: args: -dim 2 -stag_refine_x 3 -stag_refine_y 4
100: output_file: output/empty.out
102: test:
103: suffix: 3d
104: nsize: 1
105: args: -dim 3
106: output_file: output/empty.out
108: test:
109: suffix: 3d_par
110: nsize: 2
111: args: -dim 3
112: output_file: output/empty.out
114: test:
115: suffix: 3d_ratio
116: nsize: 1
117: args: -dim 3 -stag_refine_x 3 -stag_refine_y 4 -stag_refine_z 5
118: output_file: output/empty.out
119: TEST*/