Actual source code: ex14.c
1: static char help[] = "Test DMClone_Stag()\n\n";
3: #include <petscdm.h>
4: #include <petscdmstag.h>
6: int main(int argc, char **argv)
7: {
8: DM dm, dm2;
9: PetscInt dim;
10: PetscBool flg, setSizes;
12: /* Create a DMStag object */
13: PetscFunctionBeginUser;
14: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
15: PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, &flg));
16: PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Supply -dim option with value 1, 2, or 3");
17: setSizes = PETSC_FALSE;
18: PetscCall(PetscOptionsGetBool(NULL, NULL, "-setsizes", &setSizes, NULL));
19: if (setSizes) {
20: PetscMPIInt size;
21: PetscInt lx[4] = {2, 3}, ranksx = 2, mx = 5;
22: PetscInt ly[3] = {3, 8, 2}, ranksy = 3, my = 13;
23: PetscInt lz[2] = {2, 4}, ranksz = 2, mz = 6;
25: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
26: switch (dim) {
27: case 1:
28: PetscCheck(size == ranksx, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 1 -setSizes", ranksx);
29: PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, mx, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, &dm));
30: break;
31: case 2:
32: PetscCheck(size == ranksx * ranksy, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 2 -setSizes", ranksx * ranksy);
33: PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, ranksx, ranksy, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, &dm));
34: break;
35: case 3:
36: PetscCheck(size == ranksx * ranksy * ranksz, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 3 -setSizes", ranksx * ranksy * ranksz);
37: PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, mz, ranksx, ranksy, ranksz, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, lz, &dm));
38: break;
39: default:
40: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "No support for dimension %" PetscInt_FMT, dim);
41: }
42: } else {
43: if (dim == 1) {
44: PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 2, 2, 3, DMSTAG_STENCIL_BOX, 1, NULL, &dm));
45: } else if (dim == 2) {
46: PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 2, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dm));
47: } else if (dim == 3) {
48: PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 2, 2, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, 5, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dm));
49: } else {
50: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Supply -dim option with value 1, 2, or 3\n"));
51: return 1;
52: }
53: }
54: PetscCall(DMSetFromOptions(dm));
55: PetscCall(DMSetUp(dm));
56: PetscCall(DMView(dm, PETSC_VIEWER_STDOUT_WORLD));
58: /* Create a cloned DMStag object */
59: PetscCall(DMClone(dm, &dm2));
60: PetscCall(DMView(dm2, PETSC_VIEWER_STDOUT_WORLD));
62: PetscCall(DMDestroy(&dm));
63: PetscCall(DMDestroy(&dm2));
64: PetscCall(PetscFinalize());
65: return 0;
66: }
68: /*TEST
70: test:
71: suffix: 1
72: nsize: 1
73: args: -dim 1
75: test:
76: suffix: 2
77: nsize: 4
78: args: -dim 2
80: test:
81: suffix: 3
82: nsize: 6
83: args: -dim 3 -stag_grid_x 3 -stag_grid_y 2 -stag_grid_z 1
85: test:
86: suffix: 4
87: nsize: 2
88: args: -dim 1 -setsizes
90: test:
91: suffix: 5
92: nsize: 6
93: args: -dim 2 -setsizes
95: test:
96: suffix: 6
97: nsize: 12
98: args: -dim 3 -setsizes
100: TEST*/