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