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