xref: /petsc/src/dm/impls/swarm/tests/ex12.c (revision 72d38120aa45e7312def2a059212cb0038fbd18e)
1*72d38120SMatthew G. Knepley static char help[] = "Test periodic DMDA for DMSwarm point location.\n";
2*72d38120SMatthew G. Knepley 
3*72d38120SMatthew G. Knepley #include <petscdmda.h>
4*72d38120SMatthew G. Knepley #include <petscdmswarm.h>
5*72d38120SMatthew G. Knepley 
6*72d38120SMatthew G. Knepley typedef struct {
7*72d38120SMatthew G. Knepley   PetscInt dim; // Mesh dimension
8*72d38120SMatthew G. Knepley   PetscInt Np;  // Number of particles along each dimension
9*72d38120SMatthew G. Knepley } UserContext;
10*72d38120SMatthew G. Knepley 
11*72d38120SMatthew G. Knepley static PetscErrorCode ProcessOptions(UserContext *options)
12*72d38120SMatthew G. Knepley {
13*72d38120SMatthew G. Knepley   PetscFunctionBeginUser;
14*72d38120SMatthew G. Knepley   options->dim = 3;
15*72d38120SMatthew G. Knepley   options->Np  = -1;
16*72d38120SMatthew G. Knepley 
17*72d38120SMatthew G. Knepley   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &options->dim, NULL));
18*72d38120SMatthew G. Knepley   PetscCall(PetscOptionsGetInt(NULL, NULL, "-np", &options->Np, NULL));
19*72d38120SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
20*72d38120SMatthew G. Knepley }
21*72d38120SMatthew G. Knepley 
22*72d38120SMatthew G. Knepley static PetscErrorCode CreateMesh(DM *da, UserContext *user)
23*72d38120SMatthew G. Knepley {
24*72d38120SMatthew G. Knepley   PetscReal gmin[3] = {0, 0., 0.}, gmax[3] = {0, 0., 0.};
25*72d38120SMatthew G. Knepley 
26*72d38120SMatthew G. Knepley   PetscFunctionBeginUser;
27*72d38120SMatthew G. Knepley   PetscCall(DMDACreate(PETSC_COMM_WORLD, da));
28*72d38120SMatthew G. Knepley   PetscCall(DMSetDimension(*da, user->dim));
29*72d38120SMatthew G. Knepley   PetscCall(DMDASetSizes(*da, 7, 7, 7));
30*72d38120SMatthew G. Knepley   PetscCall(DMDASetBoundaryType(*da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
31*72d38120SMatthew G. Knepley   PetscCall(DMDASetDof(*da, 2));
32*72d38120SMatthew G. Knepley   PetscCall(DMDASetStencilType(*da, DMDA_STENCIL_BOX));
33*72d38120SMatthew G. Knepley   PetscCall(DMDASetStencilWidth(*da, 1));
34*72d38120SMatthew G. Knepley   PetscCall(DMDASetElementType(*da, DMDA_ELEMENT_Q1));
35*72d38120SMatthew G. Knepley   PetscCall(DMSetFromOptions(*da));
36*72d38120SMatthew G. Knepley   PetscCall(DMSetUp(*da));
37*72d38120SMatthew G. Knepley   PetscCall(DMDASetUniformCoordinates(*da, 0., 1., 0., 1., 0., 1.));
38*72d38120SMatthew G. Knepley   PetscCall(DMSetApplicationContext(*da, user));
39*72d38120SMatthew G. Knepley   PetscCall(DMView(*da, PETSC_VIEWER_STDOUT_WORLD));
40*72d38120SMatthew G. Knepley   PetscCall(DMGetBoundingBox(*da, gmin, gmax));
41*72d38120SMatthew G. Knepley   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "min: (%g, %g, %g) max: (%g, %g, %g)\n", gmin[0], gmin[1], gmin[2], gmax[0], gmax[1], gmax[2]));
42*72d38120SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
43*72d38120SMatthew G. Knepley }
44*72d38120SMatthew G. Knepley 
45*72d38120SMatthew G. Knepley static PetscErrorCode CreateSwarm(DM mesh, DM *swarm, UserContext *user)
46*72d38120SMatthew G. Knepley {
47*72d38120SMatthew G. Knepley   MPI_Comm    comm;
48*72d38120SMatthew G. Knepley   PetscMPIInt size;
49*72d38120SMatthew G. Knepley   PetscInt    dim;
50*72d38120SMatthew G. Knepley 
51*72d38120SMatthew G. Knepley   PetscFunctionBeginUser;
52*72d38120SMatthew G. Knepley   PetscCall(PetscObjectGetComm((PetscObject)mesh, &comm));
53*72d38120SMatthew G. Knepley   PetscCallMPI(MPI_Comm_size(comm, &size));
54*72d38120SMatthew G. Knepley   PetscCall(DMCreate(comm, swarm));
55*72d38120SMatthew G. Knepley   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)(*swarm), "pic_"));
56*72d38120SMatthew G. Knepley   PetscCall(DMSetType(*swarm, DMSWARM));
57*72d38120SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)*swarm, "ions"));
58*72d38120SMatthew G. Knepley   PetscCall(DMGetDimension(mesh, &dim));
59*72d38120SMatthew G. Knepley   PetscCall(DMSetDimension(*swarm, dim));
60*72d38120SMatthew G. Knepley   PetscCall(DMSwarmSetType(*swarm, DMSWARM_PIC));
61*72d38120SMatthew G. Knepley   PetscCall(DMSwarmSetCellDM(*swarm, mesh));
62*72d38120SMatthew G. Knepley   PetscCall(DMSwarmInitializeFieldRegister(*swarm));
63*72d38120SMatthew G. Knepley   PetscCall(DMSwarmFinalizeFieldRegister(*swarm));
64*72d38120SMatthew G. Knepley   PetscCall(DMSwarmSetLocalSizes(*swarm, user->Np / size, 0));
65*72d38120SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
66*72d38120SMatthew G. Knepley }
67*72d38120SMatthew G. Knepley 
68*72d38120SMatthew G. Knepley static PetscErrorCode InitializeParticles(DM sw, UserContext *user)
69*72d38120SMatthew G. Knepley {
70*72d38120SMatthew G. Knepley   DM        da;
71*72d38120SMatthew G. Knepley   PetscReal gmin[3], gmax[3];
72*72d38120SMatthew G. Knepley   PetscInt  ndir[3];
73*72d38120SMatthew G. Knepley 
74*72d38120SMatthew G. Knepley   PetscFunctionBeginUser;
75*72d38120SMatthew G. Knepley   PetscCall(DMSwarmGetCellDM(sw, &da));
76*72d38120SMatthew G. Knepley   PetscCall(DMGetBoundingBox(da, gmin, gmax));
77*72d38120SMatthew G. Knepley   ndir[0] = user->Np;
78*72d38120SMatthew G. Knepley   ndir[1] = user->Np;
79*72d38120SMatthew G. Knepley   ndir[2] = user->Np;
80*72d38120SMatthew G. Knepley   PetscCall(DMSwarmSetPointsUniformCoordinates(sw, gmin, gmax, ndir, INSERT_VALUES));
81*72d38120SMatthew G. Knepley   PetscFunctionReturn(PETSC_SUCCESS);
82*72d38120SMatthew G. Knepley }
83*72d38120SMatthew G. Knepley 
84*72d38120SMatthew G. Knepley int main(int argc, char **args)
85*72d38120SMatthew G. Knepley {
86*72d38120SMatthew G. Knepley   DM          dm, sw;
87*72d38120SMatthew G. Knepley   UserContext user;
88*72d38120SMatthew G. Knepley 
89*72d38120SMatthew G. Knepley   PetscFunctionBeginUser;
90*72d38120SMatthew G. Knepley   PetscCall(PetscInitialize(&argc, &args, NULL, help));
91*72d38120SMatthew G. Knepley   PetscCall(ProcessOptions(&user));
92*72d38120SMatthew G. Knepley   PetscCall(CreateMesh(&dm, &user));
93*72d38120SMatthew G. Knepley   PetscCall(CreateSwarm(dm, &sw, &user));
94*72d38120SMatthew G. Knepley 
95*72d38120SMatthew G. Knepley   PetscCall(InitializeParticles(sw, &user));
96*72d38120SMatthew G. Knepley   PetscCall(DMSwarmMigrate(sw, PETSC_TRUE));
97*72d38120SMatthew G. Knepley   PetscCall(DMViewFromOptions(sw, NULL, "-sw_view"));
98*72d38120SMatthew G. Knepley 
99*72d38120SMatthew G. Knepley   PetscCall(DMDestroy(&dm));
100*72d38120SMatthew G. Knepley   PetscCall(DMDestroy(&sw));
101*72d38120SMatthew G. Knepley   PetscCall(PetscFinalize());
102*72d38120SMatthew G. Knepley   return 0;
103*72d38120SMatthew G. Knepley }
104*72d38120SMatthew G. Knepley 
105*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 0
106*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 1
107*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 0
108*72d38120SMatthew G. Knepley // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 1
109*72d38120SMatthew G. Knepley 
110*72d38120SMatthew G. Knepley /*TEST
111*72d38120SMatthew G. Knepley 
112*72d38120SMatthew G. Knepley   build:
113*72d38120SMatthew G. Knepley     requires: double !complex
114*72d38120SMatthew G. Knepley 
115*72d38120SMatthew G. Knepley   testset:
116*72d38120SMatthew G. Knepley     suffix: 2d
117*72d38120SMatthew G. Knepley     args: -dim 2 -da_grid_x 8 -da_grid_y 8 -np 4 -da_bd_all {{none periodic}} -pic_sw_view
118*72d38120SMatthew G. Knepley 
119*72d38120SMatthew G. Knepley     test:
120*72d38120SMatthew G. Knepley       suffix: p1
121*72d38120SMatthew G. Knepley 
122*72d38120SMatthew G. Knepley     test:
123*72d38120SMatthew G. Knepley       suffix: p2
124*72d38120SMatthew G. Knepley       nsize: 2
125*72d38120SMatthew G. Knepley 
126*72d38120SMatthew G. Knepley     test:
127*72d38120SMatthew G. Knepley       suffix: p4
128*72d38120SMatthew G. Knepley       nsize: 4
129*72d38120SMatthew G. Knepley 
130*72d38120SMatthew G. Knepley   testset:
131*72d38120SMatthew G. Knepley     suffix: 3d
132*72d38120SMatthew G. Knepley     args: -dim 3 -da_grid_x 8 -da_grid_y 8 -da_grid_z 8 -np 4 -da_bd_all {{none periodic}} -pic_sw_view
133*72d38120SMatthew G. Knepley 
134*72d38120SMatthew G. Knepley     test:
135*72d38120SMatthew G. Knepley       suffix: p1
136*72d38120SMatthew G. Knepley 
137*72d38120SMatthew G. Knepley     test:
138*72d38120SMatthew G. Knepley       suffix: p2
139*72d38120SMatthew G. Knepley       nsize: 2
140*72d38120SMatthew G. Knepley 
141*72d38120SMatthew G. Knepley     test:
142*72d38120SMatthew G. Knepley       suffix: p4
143*72d38120SMatthew G. Knepley       nsize: 4
144*72d38120SMatthew G. Knepley 
145*72d38120SMatthew G. Knepley TEST*/
146