Actual source code: dmswarmimpl.h

  1: #pragma once

  3: #include <petscvec.h>
  4: #include <petscmat.h>
  5: #include <petscdmswarm.h>
  6: #include <petsc/private/dmimpl.h>

  8: PETSC_EXTERN PetscBool  SwarmProjcite;
  9: PETSC_EXTERN const char SwarmProjCitation[];

 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;

 22: typedef struct _p_CellDMInfo *CellDMInfo;
 23: struct _p_CellDMInfo {
 24:   DM         dm;         // The cell DM
 25:   PetscInt   Nf;         // The number of DM fields
 26:   char     **dmFields;   // Swarm fields defining this DM
 27:   char      *coordField; // Swarm field for coordinates on this DM
 28:   CellDMInfo next;       // Next struct down in the stack
 29: };

 31: /*
 32:  Error checking to ensure the swarm type is correct and that a cell DM has been set
 33: */
 34: #define DMSWARMPICVALID(obj) \
 35:   do { \
 36:     DM_Swarm *_swarm = (DM_Swarm *)(obj)->data; \
 37:     PetscCheck(_swarm->swarm_type == DMSWARM_PIC, PetscObjectComm((PetscObject)(dm)), PETSC_ERR_SUP, "Valid only for DMSwarm-PIC. You must call DMSwarmSetType(dm,DMSWARM_PIC)"); \
 38:     PetscCheck(_swarm->cellinfo && _swarm->cellinfo[0].dm, PetscObjectComm((PetscObject)(dm)), PETSC_ERR_SUP, "Valid only for DMSwarmPIC if the cell DM is set. You must call DMSwarmSetCellDM() or DMSwarmPushCellDM()"); \
 39:   } while (0)

 41: typedef struct {
 42:   DMSwarmDataBucket db;
 43:   PetscInt          refct;
 44:   PetscBool         field_registration_initialized;
 45:   PetscBool         field_registration_finalized;
 46:   /* DMSwarmProjectMethod *swarm_project;*/ /* swarm, geometry, result */

 48:   /* PetscInt overlap; */
 49:   /* PetscErrorCode (*update_overlap)(void); */

 51:   const char **vec_field_names;
 52:   PetscInt     vec_field_num;
 53:   PetscInt     vec_field_bs, vec_field_nlocal;
 54:   const char  *coord_name;

 56:   PetscBool          issetup;
 57:   DMSwarmType        swarm_type;
 58:   DMSwarmMigrateType migrate_type;
 59:   DMSwarmCollectType collect_type;

 61:   CellDMInfo cellinfo; // The stack of cell DMs

 63:   PetscBool migrate_error_on_missing_point;

 65:   PetscBool   collect_view_active;
 66:   PetscInt    collect_view_reset_nlocal;
 67:   DMSwarmSort sort_context;

 69:   /* Support for PIC */
 70:   PetscInt Ns; /* The number of particle species */

 72:   PetscSimplePointFn *coordFunc; /* Function to set particle coordinates */
 73:   PetscSimplePointFn *velFunc;   /* Function to set particle velocities */

 75:   /* Debugging */
 76:   PetscInt printCoords;
 77:   PetscInt printWeights;
 78: } DM_Swarm;

 80: typedef struct {
 81:   PetscInt point_index;
 82:   PetscInt cell_index;
 83: } SwarmPoint;

 85: struct _p_DMSwarmSort {
 86:   PetscBool   isvalid;
 87:   PetscInt    ncells, npoints;
 88:   PetscInt   *pcell_offsets;
 89:   SwarmPoint *list;
 90: };

 92: PETSC_INTERN PetscErrorCode DMSwarmMigrate_Push_Basic(DM, PetscBool);
 93: PETSC_INTERN PetscErrorCode DMSwarmMigrate_CellDMScatter(DM, PetscBool);
 94: PETSC_INTERN PetscErrorCode DMSwarmMigrate_CellDMExact(DM, PetscBool);

 96: PETSC_EXTERN PetscErrorCode DMSwarmReplace_Internal(DM, DM *);