1 static char help[] = "Test DMClone_Stag()\n\n";
2
3 #include <petscdm.h>
4 #include <petscdmstag.h>
5
main(int argc,char ** argv)6 int main(int argc, char **argv)
7 {
8 DM dm, dm2;
9 PetscInt dim;
10 PetscBool flg, setSizes;
11
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;
24
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));
57
58 /* Create a cloned DMStag object */
59 PetscCall(DMClone(dm, &dm2));
60 PetscCall(DMView(dm2, PETSC_VIEWER_STDOUT_WORLD));
61
62 PetscCall(DMDestroy(&dm));
63 PetscCall(DMDestroy(&dm2));
64 PetscCall(PetscFinalize());
65 return 0;
66 }
67
68 /*TEST
69
70 test:
71 suffix: 1
72 nsize: 1
73 args: -dim 1
74
75 test:
76 suffix: 2
77 nsize: 4
78 args: -dim 2
79
80 test:
81 suffix: 3
82 nsize: 6
83 args: -dim 3 -stag_grid_x 3 -stag_grid_y 2 -stag_grid_z 1
84
85 test:
86 suffix: 4
87 nsize: 2
88 args: -dim 1 -setsizes
89
90 test:
91 suffix: 5
92 nsize: 6
93 args: -dim 2 -setsizes
94
95 test:
96 suffix: 6
97 nsize: 12
98 args: -dim 3 -setsizes
99
100 TEST*/
101