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: /*
     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)

     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 */

     39:   /* PetscInt overlap; */
     40:   /* PetscErrorCode (*update_overlap)(void); */

     42:   char      vec_field_name[PETSC_MAX_PATH_LEN];
     43:   PetscBool vec_field_set;
     44:   PetscInt  vec_field_bs, vec_field_nlocal;

     46:   PetscBool          issetup;
     47:   DMSwarmType        swarm_type;
     48:   DMSwarmMigrateType migrate_type;
     49:   DMSwarmCollectType collect_type;

     51:   DM dmcell;

     53:   PetscBool migrate_error_on_missing_point;

     55:   PetscBool   collect_view_active;
     56:   PetscInt    collect_view_reset_nlocal;
     57:   DMSwarmSort sort_context;

     59:   /* Support for PIC */
     60:   PetscInt Ns; /* The number of particle species */

     62:   PetscSimplePointFn *coordFunc; /* Function to set particle coordinates */
     63:   PetscSimplePointFn *velFunc;   /* Function to set particle velocities */
     64: } DM_Swarm;

     66: typedef struct {
     67:   PetscInt point_index;
     68:   PetscInt cell_index;
     69: } SwarmPoint;

     71: struct _p_DMSwarmSort {
     72:   PetscBool   isvalid;
     73:   PetscInt    ncells, npoints;
     74:   PetscInt   *pcell_offsets;
     75:   SwarmPoint *list;
     76: };

     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);