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