xref: /petsc/src/dm/tutorials/swarm_ex2.c (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
1 static char help[] = "Tests DMSwarm\n\n";
2 
3 #include <petscdm.h>
4 #include <petscdmda.h>
5 #include <petscdmswarm.h>
6 
7 /*
8  Checks for variable blocksize
9 */
10 PetscErrorCode ex2_1(void)
11 {
12   DM          dms;
13   Vec         x;
14   PetscMPIInt rank;
15   PetscInt    p, bs, nlocal;
16 
17   PetscFunctionBegin;
18   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
19 
20   PetscCall(DMCreate(PETSC_COMM_WORLD, &dms));
21   PetscCall(DMSetType(dms, DMSWARM));
22   PetscCall(PetscObjectSetName((PetscObject)dms, "Particles"));
23   PetscCall(DMSwarmInitializeFieldRegister(dms));
24   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "viscosity", 1, PETSC_REAL));
25   PetscCall(DMSwarmRegisterPetscDatatypeField(dms, "strain", 3, PETSC_REAL));
26   PetscCall(DMSwarmFinalizeFieldRegister(dms));
27   PetscCall(DMSwarmSetLocalSizes(dms, 5 + rank, 4));
28   PetscCall(DMView(dms, PETSC_VIEWER_STDOUT_WORLD));
29   PetscCall(DMSwarmGetLocalSize(dms, &nlocal));
30 
31   {
32     PetscReal *array;
33     PetscCall(DMSwarmGetField(dms, "viscosity", &bs, NULL, (void **)&array));
34     for (p = 0; p < nlocal; p++) array[p] = 11.1 + p * 0.1 + rank * 100.0;
35     PetscCall(DMSwarmRestoreField(dms, "viscosity", &bs, NULL, (void **)&array));
36   }
37 
38   {
39     PetscReal *array;
40     PetscCall(DMSwarmGetField(dms, "strain", &bs, NULL, (void **)&array));
41     for (p = 0; p < nlocal; p++) {
42       array[bs * p + 0] = 2.0e-2 + p * 0.001 + rank * 1.0;
43       array[bs * p + 1] = 2.0e-2 + p * 0.002 + rank * 1.0;
44       array[bs * p + 2] = 2.0e-2 + p * 0.003 + rank * 1.0;
45     }
46     PetscCall(DMSwarmRestoreField(dms, "strain", &bs, NULL, (void **)&array));
47   }
48 
49   PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "viscosity", &x));
50   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
51   PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "viscosity", &x));
52 
53   PetscCall(DMSwarmCreateGlobalVectorFromField(dms, "strain", &x));
54   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
55   PetscCall(DMSwarmDestroyGlobalVectorFromField(dms, "strain", &x));
56 
57   PetscCall(DMSwarmVectorDefineField(dms, "strain"));
58   PetscCall(DMCreateGlobalVector(dms, &x));
59   PetscCall(VecView(x, PETSC_VIEWER_STDOUT_WORLD));
60   PetscCall(VecDestroy(&x));
61   PetscCall(DMDestroy(&dms));
62   PetscFunctionReturn(PETSC_SUCCESS);
63 }
64 
65 int main(int argc, char **argv)
66 {
67   PetscFunctionBeginUser;
68   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
69   PetscCall(ex2_1());
70   PetscCall(PetscFinalize());
71   return 0;
72 }
73 
74 /*TEST
75 
76    test:
77       requires: !complex double
78       nsize: 3
79       filter: grep -v atomic
80       filter_output: grep -v atomic
81 
82 TEST*/
83