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 15 PetscMPIInt n_neighbour_procs; 16 PetscMPIInt *neighbour_procs; /* [n_neighbour_procs] */ 17 PetscInt *messages_to_be_sent; /* [n_neighbour_procs] */ 18 PetscInt *message_offsets; /* [n_neighbour_procs] */ 19 PetscInt *messages_to_be_recvieved; /* [n_neighbour_procs] */ 20 size_t unit_message_size; 21 void *send_message; 22 PetscInt send_message_length; 23 void *recv_message; 24 PetscInt recv_message_length; 25 int *send_tags, *recv_tags; 26 PetscInt total_pack_cnt; 27 PetscInt *pack_cnt; /* [n_neighbour_procs] */ 28 DEObjectState topology_status; 29 DEObjectState message_lengths_status; 30 DEObjectState packer_status; 31 DEObjectState communication_status; 32 33 MPI_Status *_stats; 34 MPI_Request *_requests; 35 }; 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 PetscErrorCode DataExCreate(MPI_Comm comm,const PetscInt count, DataEx *); 46 PetscErrorCode DataExView(DataEx d); 47 PetscErrorCode DataExDestroy(DataEx d); 48 PetscErrorCode DataExTopologyInitialize(DataEx d); 49 PetscErrorCode DataExTopologyAddNeighbour(DataEx d,const PetscMPIInt proc_id); 50 PetscErrorCode DataExTopologyFinalize(DataEx d); 51 PetscErrorCode DataExInitializeSendCount(DataEx de); 52 PetscErrorCode DataExAddToSendCount(DataEx de,const PetscMPIInt proc_id,const PetscInt count); 53 PetscErrorCode DataExFinalizeSendCount(DataEx de); 54 PetscErrorCode DataExPackInitialize(DataEx de,size_t unit_message_size); 55 PetscErrorCode DataExPackData(DataEx de,PetscMPIInt proc_id,PetscInt n,void *data); 56 PetscErrorCode DataExPackFinalize(DataEx de); 57 PetscErrorCode DataExBegin(DataEx de); 58 PetscErrorCode DataExEnd(DataEx de); 59 PetscErrorCode DataExGetSendData(DataEx de,PetscInt *length,void **send); 60 PetscErrorCode DataExGetRecvData(DataEx de,PetscInt *length,void **recv); 61 PetscErrorCode DataExTopologyGetNeighbours(DataEx de,PetscMPIInt *n,PetscMPIInt *neigh[]); 62 63 64 #endif 65 66