1 2 #ifndef __DATA_EXCHANGER_H__ 3 #define __DATA_EXCHANGER_H__ 4 5 6 #include <petsc.h> 7 #include <petscvec.h> 8 #include <petscmat.h> 9 10 typedef enum { DEOBJECT_INITIALIZED=0, DEOBJECT_FINALIZED, DEOBJECT_STATE_UNKNOWN } DEObjectState; 11 12 typedef struct _p_DataEx* DataEx; 13 struct _p_DataEx { 14 PetscInt instance; 15 MPI_Comm comm; 16 PetscMPIInt rank; 17 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 int *send_tags, *recv_tags; 29 PetscInt total_pack_cnt; 30 PetscInt *pack_cnt; /* [n_neighbour_procs] */ 31 DEObjectState topology_status; 32 DEObjectState message_lengths_status; 33 DEObjectState packer_status; 34 DEObjectState communication_status; 35 36 MPI_Status *_stats; 37 MPI_Request *_requests; 38 }; 39 40 41 /* OBJECT_STATUS */ 42 /* #define OBJECT_INITIALIZED 0 */ 43 /* #define OBJECT_FINALIZED 1 */ 44 /* #define OBJECT_STATE_UNKNOWN 2 */ 45 46 extern const char *status_names[]; 47 48 PetscErrorCode DataExCreate(MPI_Comm comm,const PetscInt count, DataEx *); 49 PetscErrorCode DataExView(DataEx d); 50 PetscErrorCode DataExDestroy(DataEx d); 51 PetscErrorCode DataExTopologyInitialize(DataEx d); 52 PetscErrorCode DataExTopologyAddNeighbour(DataEx d,const PetscMPIInt proc_id); 53 PetscErrorCode DataExTopologyFinalize(DataEx d); 54 PetscErrorCode DataExInitializeSendCount(DataEx de); 55 PetscErrorCode DataExAddToSendCount(DataEx de,const PetscMPIInt proc_id,const PetscInt count); 56 PetscErrorCode DataExFinalizeSendCount(DataEx de); 57 PetscErrorCode DataExPackInitialize(DataEx de,size_t unit_message_size); 58 PetscErrorCode DataExPackData(DataEx de,PetscMPIInt proc_id,PetscInt n,void *data); 59 PetscErrorCode DataExPackFinalize(DataEx de); 60 PetscErrorCode DataExBegin(DataEx de); 61 PetscErrorCode DataExEnd(DataEx de); 62 PetscErrorCode DataExGetSendData(DataEx de,PetscInt *length,void **send); 63 PetscErrorCode DataExGetRecvData(DataEx de,PetscInt *length,void **recv); 64 PetscErrorCode DataExTopologyGetNeighbours(DataEx de,PetscMPIInt *n,PetscMPIInt *neigh[]); 65 66 67 #endif 68 69