xref: /petsc/include/petsc/private/dmswarmimpl.h (revision 5962854d720b7b8d98c62edd758f00bbb980e600)
1 #pragma once
2 
3 #include <petscvec.h>     /*I "petscvec.h" I*/
4 #include <petscmat.h>     /*I      "petscmat.h"          I*/
5 #include <petscdmswarm.h> /*I      "petscdmswarm.h"    I*/
6 #include <petsc/private/dmimpl.h>
7 
8 PETSC_EXTERN PetscBool  SwarmProjcite;
9 PETSC_EXTERN const char SwarmProjCitation[];
10 
11 PETSC_EXTERN PetscLogEvent DMSWARM_Migrate;
12 PETSC_EXTERN PetscLogEvent DMSWARM_SetSizes;
13 PETSC_EXTERN PetscLogEvent DMSWARM_AddPoints;
14 PETSC_EXTERN PetscLogEvent DMSWARM_RemovePoints;
15 PETSC_EXTERN PetscLogEvent DMSWARM_Sort;
16 PETSC_EXTERN PetscLogEvent DMSWARM_DataExchangerTopologySetup;
17 PETSC_EXTERN PetscLogEvent DMSWARM_DataExchangerBegin;
18 PETSC_EXTERN PetscLogEvent DMSWARM_DataExchangerEnd;
19 PETSC_EXTERN PetscLogEvent DMSWARM_DataExchangerSendCount;
20 PETSC_EXTERN PetscLogEvent DMSWARM_DataExchangerPack;
21 
22 /*
23  Error checking to ensure the swarm type is correct and that a cell DM has been set
24 */
25 #define DMSWARMPICVALID(dm) \
26   do { \
27     DM_Swarm *_swarm = (DM_Swarm *)(dm)->data; \
28     PetscCheck(_swarm->swarm_type == DMSWARM_PIC, PetscObjectComm((PetscObject)(dm)), PETSC_ERR_SUP, "Valid only for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"); \
29     PetscCheck(_swarm->dmcell, PetscObjectComm((PetscObject)(dm)), PETSC_ERR_SUP, "Valid only for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM(dm,celldm)"); \
30   } while (0)
31 
32 typedef struct {
33   DMSwarmDataBucket db;
34   PetscInt          refct;
35   PetscBool         field_registration_initialized;
36   PetscBool         field_registration_finalized;
37   /* DMSwarmProjectMethod *swarm_project;*/ /* swarm, geometry, result */
38 
39   /* PetscInt overlap; */
40   /* PetscErrorCode (*update_overlap)(void); */
41 
42   char      vec_field_name[PETSC_MAX_PATH_LEN];
43   PetscBool vec_field_set;
44   PetscInt  vec_field_bs, vec_field_nlocal;
45 
46   PetscBool          issetup;
47   DMSwarmType        swarm_type;
48   DMSwarmMigrateType migrate_type;
49   DMSwarmCollectType collect_type;
50 
51   DM dmcell;
52 
53   PetscBool migrate_error_on_missing_point;
54 
55   PetscBool   collect_view_active;
56   PetscInt    collect_view_reset_nlocal;
57   DMSwarmSort sort_context;
58 
59   /* Support for PIC */
60   PetscInt Ns; /* The number of particle species */
61 
62   PetscSimplePointFunc coordFunc; /* Function to set particle coordinates */
63   PetscSimplePointFunc velFunc;   /* Function to set particle velocities */
64 } DM_Swarm;
65 
66 typedef struct {
67   PetscInt point_index;
68   PetscInt cell_index;
69 } SwarmPoint;
70 
71 struct _p_DMSwarmSort {
72   PetscBool   isvalid;
73   PetscInt    ncells, npoints;
74   PetscInt   *pcell_offsets;
75   SwarmPoint *list;
76 };
77 
78 PETSC_INTERN PetscErrorCode DMSwarmMigrate_Push_Basic(DM, PetscBool);
79 PETSC_INTERN PetscErrorCode DMSwarmMigrate_CellDMScatter(DM, PetscBool);
80 PETSC_INTERN PetscErrorCode DMSwarmMigrate_CellDMExact(DM, PetscBool);
81