15627991aSBarry Smith #if !defined(DMSWARM_DATA_EXCHANGER_H__) 25627991aSBarry Smith #define DMSWARM_DATA_EXCHANGER_H__ 3095059a4SDave May 4095059a4SDave May #include <petscvec.h> 5095059a4SDave May #include <petscmat.h> 6095059a4SDave May 7*9371c9d4SSatish Balay typedef enum { 8*9371c9d4SSatish Balay DEOBJECT_INITIALIZED = 0, 9*9371c9d4SSatish Balay DEOBJECT_FINALIZED, 10*9371c9d4SSatish Balay DEOBJECT_STATE_UNKNOWN 11*9371c9d4SSatish Balay } DMSwarmDEObjectState; 12095059a4SDave May 1377048351SPatrick Sanan typedef struct _p_DMSwarmDataEx *DMSwarmDataEx; 1477048351SPatrick Sanan struct _p_DMSwarmDataEx { 15095059a4SDave May PetscInt instance; 16095059a4SDave May MPI_Comm comm; 17095059a4SDave May PetscMPIInt rank; 18095059a4SDave May PetscMPIInt n_neighbour_procs; 19095059a4SDave May PetscMPIInt *neighbour_procs; /* [n_neighbour_procs] */ 20095059a4SDave May PetscInt *messages_to_be_sent; /* [n_neighbour_procs] */ 21095059a4SDave May PetscInt *message_offsets; /* [n_neighbour_procs] */ 22095059a4SDave May PetscInt *messages_to_be_recvieved; /* [n_neighbour_procs] */ 23095059a4SDave May size_t unit_message_size; 24095059a4SDave May void *send_message; 25095059a4SDave May PetscInt send_message_length; 26095059a4SDave May void *recv_message; 27095059a4SDave May PetscInt recv_message_length; 28e4fbd051SBarry Smith PetscMPIInt *send_tags, *recv_tags; 29095059a4SDave May PetscInt total_pack_cnt; 30095059a4SDave May PetscInt *pack_cnt; /* [n_neighbour_procs] */ 3177048351SPatrick Sanan DMSwarmDEObjectState topology_status; 3277048351SPatrick Sanan DMSwarmDEObjectState message_lengths_status; 3377048351SPatrick Sanan DMSwarmDEObjectState packer_status; 3477048351SPatrick Sanan DMSwarmDEObjectState communication_status; 35095059a4SDave May MPI_Status *_stats; 36095059a4SDave May MPI_Request *_requests; 37095059a4SDave May }; 38095059a4SDave May 39095059a4SDave May /* OBJECT_STATUS */ 40d2ebda5dSSatish Balay /* #define OBJECT_INITIALIZED 0 */ 41d2ebda5dSSatish Balay /* #define OBJECT_FINALIZED 1 */ 42d2ebda5dSSatish Balay /* #define OBJECT_STATE_UNKNOWN 2 */ 43095059a4SDave May 44095059a4SDave May extern const char *status_names[]; 45095059a4SDave May 4677048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExCreate(MPI_Comm, const PetscInt, DMSwarmDataEx *); 4777048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExView(DMSwarmDataEx); 4877048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExDestroy(DMSwarmDataEx); 4977048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyInitialize(DMSwarmDataEx); 5077048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyAddNeighbour(DMSwarmDataEx, const PetscMPIInt); 5177048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyFinalize(DMSwarmDataEx); 5277048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExInitializeSendCount(DMSwarmDataEx); 5377048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExAddToSendCount(DMSwarmDataEx, const PetscMPIInt, const PetscInt); 5477048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExFinalizeSendCount(DMSwarmDataEx); 5577048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExPackInitialize(DMSwarmDataEx, size_t); 5677048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExPackData(DMSwarmDataEx, PetscMPIInt, PetscInt, void *); 5777048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExPackFinalize(DMSwarmDataEx); 5877048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExBegin(DMSwarmDataEx); 5977048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExEnd(DMSwarmDataEx); 6077048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExGetSendData(DMSwarmDataEx, PetscInt *, void **); 6177048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExGetRecvData(DMSwarmDataEx, PetscInt *, void **); 6277048351SPatrick Sanan PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyGetNeighbours(DMSwarmDataEx, PetscMPIInt *, PetscMPIInt *[]); 63095059a4SDave May 64095059a4SDave May #endif 65