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