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