xref: /petsc/src/dm/impls/swarm/tests/ex3.c (revision 6a5217c03994f2d95bb2e6dbd8bed42381aeb015)
1d0c080abSJoseph Pusztay static char help[] = "Example usage of extracting single cells with their associated fields from a swarm and putting it in a new swarm object\n";
2d0c080abSJoseph Pusztay 
3d0c080abSJoseph Pusztay #include <petscdmplex.h>
4d0c080abSJoseph Pusztay #include <petscdmswarm.h>
5d0c080abSJoseph Pusztay #include <petscts.h>
6d0c080abSJoseph Pusztay 
7d0c080abSJoseph Pusztay typedef struct {
8d0c080abSJoseph Pusztay   PetscInt particlesPerCell; /* The number of partices per cell */
9d0c080abSJoseph Pusztay } AppCtx;
10d0c080abSJoseph Pusztay 
11d0c080abSJoseph Pusztay static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
12d0c080abSJoseph Pusztay {
13d0c080abSJoseph Pusztay   PetscErrorCode ierr;
14d0c080abSJoseph Pusztay 
15d0c080abSJoseph Pusztay   PetscFunctionBeginUser;
16d0c080abSJoseph Pusztay   options->particlesPerCell = 1;
1730602db0SMatthew G. Knepley 
189566063dSJacob Faibussowitsch   ierr = PetscOptionsBegin(comm, "", "CellSwarm Options", "DMSWARM");PetscCall(ierr);
199566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-particles_per_cell", "Number of particles per cell", "ex3.c", options->particlesPerCell, &options->particlesPerCell, NULL));
209566063dSJacob Faibussowitsch   ierr = PetscOptionsEnd();PetscCall(ierr);
21d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
22d0c080abSJoseph Pusztay }
23d0c080abSJoseph Pusztay 
24d0c080abSJoseph Pusztay static PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm, AppCtx *user)
25d0c080abSJoseph Pusztay {
26d0c080abSJoseph Pusztay   PetscFunctionBeginUser;
279566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dm));
289566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dm, DMPLEX));
299566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(*dm));
309566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
31d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
32d0c080abSJoseph Pusztay }
33d0c080abSJoseph Pusztay 
34d0c080abSJoseph Pusztay static PetscErrorCode CreateParticles(DM dm, DM *sw, AppCtx *user)
35d0c080abSJoseph Pusztay {
36d0c080abSJoseph Pusztay   PetscInt      *cellid;
37d0c080abSJoseph Pusztay   PetscInt       dim, cStart, cEnd, c, Np = user->particlesPerCell, p;
38d0c080abSJoseph Pusztay 
39d0c080abSJoseph Pusztay   PetscFunctionBeginUser;
409566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
419566063dSJacob Faibussowitsch   PetscCall(DMCreate(PetscObjectComm((PetscObject) dm), sw));
429566063dSJacob Faibussowitsch   PetscCall(DMSetType(*sw, DMSWARM));
439566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(*sw, dim));
449566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetType(*sw, DMSWARM_PIC));
459566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetCellDM(*sw, dm));
469566063dSJacob Faibussowitsch   PetscCall(DMSwarmRegisterPetscDatatypeField(*sw, "kinematics", 2, PETSC_REAL));
479566063dSJacob Faibussowitsch   PetscCall(DMSwarmFinalizeFieldRegister(*sw));
489566063dSJacob Faibussowitsch   PetscCall(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd));
499566063dSJacob Faibussowitsch   PetscCall(DMSwarmSetLocalSizes(*sw, (cEnd - cStart) * Np, 0));
509566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(*sw));
519566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetField(*sw, DMSwarmPICField_cellid, NULL, NULL, (void **) &cellid));
52d0c080abSJoseph Pusztay   for (c = cStart; c < cEnd; ++c) {
53d0c080abSJoseph Pusztay     for (p = 0; p < Np; ++p) {
54d0c080abSJoseph Pusztay       const PetscInt n = c*Np + p;
55d0c080abSJoseph Pusztay 
56d0c080abSJoseph Pusztay       cellid[n] = c;
57d0c080abSJoseph Pusztay     }
58d0c080abSJoseph Pusztay   }
599566063dSJacob Faibussowitsch   PetscCall(DMSwarmRestoreField(*sw, DMSwarmPICField_cellid, NULL, NULL, (void **) &cellid));
609566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject) *sw, "Particles"));
619566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(*sw, NULL, "-sw_view"));
62d0c080abSJoseph Pusztay   PetscFunctionReturn(0);
63d0c080abSJoseph Pusztay }
64d0c080abSJoseph Pusztay 
65d0c080abSJoseph Pusztay int main(int argc,char **argv)
66d0c080abSJoseph Pusztay {
67d0c080abSJoseph Pusztay   DM             dm, sw, cellsw; /* Mesh and particle managers */
68d0c080abSJoseph Pusztay   MPI_Comm       comm;
69d0c080abSJoseph Pusztay   AppCtx         user;
70d0c080abSJoseph Pusztay 
719566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
72d0c080abSJoseph Pusztay   comm = PETSC_COMM_WORLD;
739566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(comm, &user));
749566063dSJacob Faibussowitsch   PetscCall(CreateMesh(comm, &dm, &user));
759566063dSJacob Faibussowitsch   PetscCall(CreateParticles(dm, &sw, &user));
769566063dSJacob Faibussowitsch   PetscCall(DMSetApplicationContext(sw, &user));
779566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, &cellsw));
78*6a5217c0SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject) cellsw, "SubParticles"));
799566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetCellSwarm(sw, 1, cellsw));
809566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(cellsw, NULL, "-subswarm_view"));
819566063dSJacob Faibussowitsch   PetscCall(DMSwarmRestoreCellSwarm(sw, 1, cellsw));
829566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&sw));
839566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
849566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&cellsw));
859566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
86b122ec5aSJacob Faibussowitsch   return 0;
87d0c080abSJoseph Pusztay }
88d0c080abSJoseph Pusztay 
89d0c080abSJoseph Pusztay /*TEST
90d0c080abSJoseph Pusztay    build:
91d0c080abSJoseph Pusztay      requires: triangle !single !complex
92d0c080abSJoseph Pusztay    test:
93d0c080abSJoseph Pusztay      suffix: 1
94d0c080abSJoseph Pusztay      args: -particles_per_cell 2 -dm_plex_box_faces 2,1 -dm_view -sw_view -subswarm_view
95d0c080abSJoseph Pusztay TEST*/
96