1 #pragma once 2 3 #include <petscvec.h> 4 #include <petscmat.h> 5 6 typedef enum { 7 DEOBJECT_INITIALIZED = 0, 8 DEOBJECT_FINALIZED, 9 DEOBJECT_STATE_UNKNOWN 10 } DMSwarmDEObjectState; 11 12 typedef struct _p_DMSwarmDataEx *DMSwarmDataEx; 13 struct _p_DMSwarmDataEx { 14 PetscInt instance; 15 MPI_Comm comm; 16 PetscMPIInt rank; 17 PetscMPIInt n_neighbour_procs; 18 PetscMPIInt *neighbour_procs; /* [n_neighbour_procs] */ 19 PetscInt *messages_to_be_sent; /* [n_neighbour_procs] */ 20 PetscInt *message_offsets; /* [n_neighbour_procs] */ 21 PetscInt *messages_to_be_recvieved; /* [n_neighbour_procs] */ 22 size_t unit_message_size; 23 void *send_message; 24 PetscInt send_message_length; 25 void *recv_message; 26 PetscInt recv_message_length; 27 PetscMPIInt *send_tags, *recv_tags; 28 PetscInt total_pack_cnt; 29 PetscInt *pack_cnt; /* [n_neighbour_procs] */ 30 DMSwarmDEObjectState topology_status; 31 DMSwarmDEObjectState message_lengths_status; 32 DMSwarmDEObjectState packer_status; 33 DMSwarmDEObjectState communication_status; 34 MPI_Status *_stats; 35 MPI_Request *_requests; 36 }; 37 38 /* OBJECT_STATUS */ 39 /* #define OBJECT_INITIALIZED 0 */ 40 /* #define OBJECT_FINALIZED 1 */ 41 /* #define OBJECT_STATE_UNKNOWN 2 */ 42 43 extern const char *status_names[]; 44 45 PETSC_INTERN PetscErrorCode DMSwarmDataExCreate(MPI_Comm, const PetscInt, DMSwarmDataEx *); 46 PETSC_INTERN PetscErrorCode DMSwarmDataExView(DMSwarmDataEx); 47 PETSC_INTERN PetscErrorCode DMSwarmDataExDestroy(DMSwarmDataEx); 48 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyInitialize(DMSwarmDataEx); 49 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyAddNeighbour(DMSwarmDataEx, const PetscMPIInt); 50 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyFinalize(DMSwarmDataEx); 51 PETSC_INTERN PetscErrorCode DMSwarmDataExInitializeSendCount(DMSwarmDataEx); 52 PETSC_INTERN PetscErrorCode DMSwarmDataExAddToSendCount(DMSwarmDataEx, const PetscMPIInt, const PetscInt); 53 PETSC_INTERN PetscErrorCode DMSwarmDataExFinalizeSendCount(DMSwarmDataEx); 54 PETSC_INTERN PetscErrorCode DMSwarmDataExPackInitialize(DMSwarmDataEx, size_t); 55 PETSC_INTERN PetscErrorCode DMSwarmDataExPackData(DMSwarmDataEx, PetscMPIInt, PetscInt, void *); 56 PETSC_INTERN PetscErrorCode DMSwarmDataExPackFinalize(DMSwarmDataEx); 57 PETSC_INTERN PetscErrorCode DMSwarmDataExBegin(DMSwarmDataEx); 58 PETSC_INTERN PetscErrorCode DMSwarmDataExEnd(DMSwarmDataEx); 59 PETSC_INTERN PetscErrorCode DMSwarmDataExGetSendData(DMSwarmDataEx, PetscInt *, void **); 60 PETSC_INTERN PetscErrorCode DMSwarmDataExGetRecvData(DMSwarmDataEx, PetscInt *, void **); 61 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyGetNeighbours(DMSwarmDataEx, PetscMPIInt *, PetscMPIInt *[]); 62