Actual source code: ex12.c

  1: static char help[] = "Test periodic DMDA for DMSwarm point location.\n";

  3: #include <petscdmda.h>
  4: #include <petscdmswarm.h>

  6: typedef struct {
  7:   PetscInt dim; // Mesh dimension
  8:   PetscInt Np;  // Number of particles along each dimension
  9: } UserContext;

 11: static PetscErrorCode ProcessOptions(UserContext *options)
 12: {
 13:   PetscFunctionBeginUser;
 14:   options->dim = 3;
 15:   options->Np  = -1;

 17:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &options->dim, NULL));
 18:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-np", &options->Np, NULL));
 19:   PetscFunctionReturn(PETSC_SUCCESS);
 20: }

 22: static PetscErrorCode CreateMesh(DM *da, UserContext *user)
 23: {
 24:   PetscReal gmin[3] = {0, 0., 0.}, gmax[3] = {0, 0., 0.};

 26:   PetscFunctionBeginUser;
 27:   PetscCall(DMDACreate(PETSC_COMM_WORLD, da));
 28:   PetscCall(DMSetDimension(*da, user->dim));
 29:   PetscCall(DMDASetSizes(*da, 7, 7, 7));
 30:   PetscCall(DMDASetBoundaryType(*da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
 31:   PetscCall(DMDASetDof(*da, 2));
 32:   PetscCall(DMDASetStencilType(*da, DMDA_STENCIL_BOX));
 33:   PetscCall(DMDASetStencilWidth(*da, 1));
 34:   PetscCall(DMDASetElementType(*da, DMDA_ELEMENT_Q1));
 35:   PetscCall(DMSetFromOptions(*da));
 36:   PetscCall(DMSetUp(*da));
 37:   PetscCall(DMDASetUniformCoordinates(*da, 0., 1., 0., 1., 0., 1.));
 38:   PetscCall(DMSetApplicationContext(*da, user));
 39:   PetscCall(DMView(*da, PETSC_VIEWER_STDOUT_WORLD));
 40:   PetscCall(DMGetBoundingBox(*da, gmin, gmax));
 41:   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:   PetscFunctionReturn(PETSC_SUCCESS);
 43: }

 45: static PetscErrorCode CreateSwarm(DM mesh, DM *swarm, UserContext *user)
 46: {
 47:   MPI_Comm    comm;
 48:   PetscMPIInt size;
 49:   PetscInt    dim;

 51:   PetscFunctionBeginUser;
 52:   PetscCall(PetscObjectGetComm((PetscObject)mesh, &comm));
 53:   PetscCallMPI(MPI_Comm_size(comm, &size));
 54:   PetscCall(DMCreate(comm, swarm));
 55:   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)(*swarm), "pic_"));
 56:   PetscCall(DMSetType(*swarm, DMSWARM));
 57:   PetscCall(PetscObjectSetName((PetscObject)*swarm, "ions"));
 58:   PetscCall(DMGetDimension(mesh, &dim));
 59:   PetscCall(DMSetDimension(*swarm, dim));
 60:   PetscCall(DMSwarmSetType(*swarm, DMSWARM_PIC));
 61:   PetscCall(DMSwarmSetCellDM(*swarm, mesh));
 62:   PetscCall(DMSwarmInitializeFieldRegister(*swarm));
 63:   PetscCall(DMSwarmFinalizeFieldRegister(*swarm));
 64:   PetscCall(DMSwarmSetLocalSizes(*swarm, user->Np / size, 0));
 65:   PetscFunctionReturn(PETSC_SUCCESS);
 66: }

 68: static PetscErrorCode InitializeParticles(DM sw, UserContext *user)
 69: {
 70:   DM        da;
 71:   PetscReal gmin[3], gmax[3];
 72:   PetscInt  ndir[3];

 74:   PetscFunctionBeginUser;
 75:   PetscCall(DMSwarmGetCellDM(sw, &da));
 76:   PetscCall(DMGetBoundingBox(da, gmin, gmax));
 77:   ndir[0] = user->Np;
 78:   ndir[1] = user->Np;
 79:   ndir[2] = user->Np;
 80:   PetscCall(DMSwarmSetPointsUniformCoordinates(sw, gmin, gmax, ndir, INSERT_VALUES));
 81:   PetscFunctionReturn(PETSC_SUCCESS);
 82: }

 84: int main(int argc, char **args)
 85: {
 86:   DM          dm, sw;
 87:   UserContext user;

 89:   PetscFunctionBeginUser;
 90:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 91:   PetscCall(ProcessOptions(&user));
 92:   PetscCall(CreateMesh(&dm, &user));
 93:   PetscCall(CreateSwarm(dm, &sw, &user));

 95:   PetscCall(InitializeParticles(sw, &user));
 96:   PetscCall(DMSwarmMigrate(sw, PETSC_TRUE));
 97:   PetscCall(DMViewFromOptions(sw, NULL, "-sw_view"));

 99:   PetscCall(DMDestroy(&dm));
100:   PetscCall(DMDestroy(&sw));
101:   PetscCall(PetscFinalize());
102:   return 0;
103: }

105: // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 0
106: // ./dmswarm-coords -nx 8 -ny 8 -np 4 -pic_sw_view -dim 2 -periodic 1
107: // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 0
108: // ./dmswarm-coords -nx 8 -ny 8 -nz 8 -np 4 -pic_sw_view -dim 3 -periodic 1

110: /*TEST

112:   build:
113:     requires: double !complex

115:   testset:
116:     suffix: 2d
117:     args: -dim 2 -da_grid_x 8 -da_grid_y 8 -np 4 -da_bd_all {{none periodic}} -pic_sw_view

119:     test:
120:       suffix: p1

122:     test:
123:       suffix: p2
124:       nsize: 2

126:     test:
127:       suffix: p4
128:       nsize: 4

130:   testset:
131:     suffix: 3d
132:     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

134:     test:
135:       suffix: p1

137:     test:
138:       suffix: p2
139:       nsize: 2

141:     test:
142:       suffix: p4
143:       nsize: 4

145: TEST*/