1 #ifndef __DATA_EXCHANGER_H__ 2 #define __DATA_EXCHANGER_H__ 3 4 #include <petscvec.h> 5 #include <petscmat.h> 6 7 typedef enum { DEOBJECT_INITIALIZED=0, DEOBJECT_FINALIZED, DEOBJECT_STATE_UNKNOWN } DEObjectState; 8 9 typedef struct _p_DataEx* DataEx; 10 struct _p_DataEx { 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 DEObjectState topology_status; 28 DEObjectState message_lengths_status; 29 DEObjectState packer_status; 30 DEObjectState communication_status; 31 MPI_Status *_stats; 32 MPI_Request *_requests; 33 }; 34 35 36 /* OBJECT_STATUS */ 37 /* #define OBJECT_INITIALIZED 0 */ 38 /* #define OBJECT_FINALIZED 1 */ 39 /* #define OBJECT_STATE_UNKNOWN 2 */ 40 41 extern const char *status_names[]; 42 43 PetscErrorCode DataExCreate(MPI_Comm,const PetscInt, DataEx *); 44 PetscErrorCode DataExView(DataEx); 45 PetscErrorCode DataExDestroy(DataEx); 46 PetscErrorCode DataExTopologyInitialize(DataEx); 47 PetscErrorCode DataExTopologyAddNeighbour(DataEx,const PetscMPIInt); 48 PetscErrorCode DataExTopologyFinalize(DataEx); 49 PetscErrorCode DataExInitializeSendCount(DataEx); 50 PetscErrorCode DataExAddToSendCount(DataEx,const PetscMPIInt,const PetscInt); 51 PetscErrorCode DataExFinalizeSendCount(DataEx); 52 PetscErrorCode DataExPackInitialize(DataEx,size_t); 53 PetscErrorCode DataExPackData(DataEx,PetscMPIInt,PetscInt,void*); 54 PetscErrorCode DataExPackFinalize(DataEx); 55 PetscErrorCode DataExBegin(DataEx); 56 PetscErrorCode DataExEnd(DataEx); 57 PetscErrorCode DataExGetSendData(DataEx,PetscInt*,void**); 58 PetscErrorCode DataExGetRecvData(DataEx,PetscInt*,void**); 59 PetscErrorCode DataExTopologyGetNeighbours(DataEx,PetscMPIInt*,PetscMPIInt *[]); 60 61 62 #endif 63 64