xref: /petsc/src/dm/impls/stag/tests/ex14.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
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