xref: /petsc/src/dm/tutorials/swarm_ex2.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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++) {
36       array[p] = 11.1 + p*0.1 + rank*100.0;
37     }
38     PetscCall(DMSwarmRestoreField(dms,"viscosity",&bs,NULL,(void**)&array));
39   }
40 
41   {
42     PetscReal *array;
43     PetscCall(DMSwarmGetField(dms,"strain",&bs,NULL,(void**)&array));
44     for (p=0; p<nlocal; p++) {
45       array[bs*p+0] = 2.0e-2 + p*0.001 + rank*1.0;
46       array[bs*p+1] = 2.0e-2 + p*0.002 + rank*1.0;
47       array[bs*p+2] = 2.0e-2 + p*0.003 + rank*1.0;
48     }
49     PetscCall(DMSwarmRestoreField(dms,"strain",&bs,NULL,(void**)&array));
50   }
51 
52   PetscCall(DMSwarmCreateGlobalVectorFromField(dms,"viscosity",&x));
53   PetscCall(VecView(x,PETSC_VIEWER_STDOUT_WORLD));
54   PetscCall(DMSwarmDestroyGlobalVectorFromField(dms,"viscosity",&x));
55 
56   PetscCall(DMSwarmCreateGlobalVectorFromField(dms,"strain",&x));
57   PetscCall(VecView(x,PETSC_VIEWER_STDOUT_WORLD));
58   PetscCall(DMSwarmDestroyGlobalVectorFromField(dms,"strain",&x));
59 
60   PetscCall(DMSwarmVectorDefineField(dms,"strain"));
61   PetscCall(DMCreateGlobalVector(dms,&x));
62   PetscCall(VecView(x,PETSC_VIEWER_STDOUT_WORLD));
63   PetscCall(VecDestroy(&x));
64   PetscCall(DMDestroy(&dms));
65   PetscFunctionReturn(0);
66 }
67 
68 int main(int argc,char **argv)
69 {
70 
71   PetscFunctionBeginUser;
72   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
73   PetscCall(ex2_1());
74   PetscCall(PetscFinalize());
75   return 0;
76 }
77 
78 /*TEST
79 
80    test:
81       requires: !complex double
82       nsize: 3
83       filter: grep -v atomic
84       filter_output: grep -v atomic
85 
86 TEST*/
87