1 #if !defined(__DMSWARM_DATA_EXCHANGER_H__)
2 #define __DMSWARM_DATA_EXCHANGER_H__
3 
4 #include <petscvec.h>
5 #include <petscmat.h>
6 
7 typedef enum { DEOBJECT_INITIALIZED=0, DEOBJECT_FINALIZED, DEOBJECT_STATE_UNKNOWN } DMSwarmDEObjectState;
8 
9 typedef struct _p_DMSwarmDataEx* DMSwarmDataEx;
10 struct  _p_DMSwarmDataEx {
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         DMSwarmDEObjectState  topology_status;
28         DMSwarmDEObjectState  message_lengths_status;
29         DMSwarmDEObjectState  packer_status;
30         DMSwarmDEObjectState  communication_status;
31         MPI_Status            *_stats;
32         MPI_Request           *_requests;
33 };
34 
35 /* OBJECT_STATUS */
36 /* #define OBJECT_INITIALIZED    0 */
37 /* #define OBJECT_FINALIZED      1 */
38 /* #define OBJECT_STATE_UNKNOWN  2 */
39 
40 extern const char *status_names[];
41 
42 PETSC_INTERN PetscErrorCode DMSwarmDataExCreate(MPI_Comm,const PetscInt, DMSwarmDataEx *);
43 PETSC_INTERN PetscErrorCode DMSwarmDataExView(DMSwarmDataEx);
44 PETSC_INTERN PetscErrorCode DMSwarmDataExDestroy(DMSwarmDataEx);
45 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyInitialize(DMSwarmDataEx);
46 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyAddNeighbour(DMSwarmDataEx,const PetscMPIInt);
47 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyFinalize(DMSwarmDataEx);
48 PETSC_INTERN PetscErrorCode DMSwarmDataExInitializeSendCount(DMSwarmDataEx);
49 PETSC_INTERN PetscErrorCode DMSwarmDataExAddToSendCount(DMSwarmDataEx,const PetscMPIInt,const PetscInt);
50 PETSC_INTERN PetscErrorCode DMSwarmDataExFinalizeSendCount(DMSwarmDataEx);
51 PETSC_INTERN PetscErrorCode DMSwarmDataExPackInitialize(DMSwarmDataEx,size_t);
52 PETSC_INTERN PetscErrorCode DMSwarmDataExPackData(DMSwarmDataEx,PetscMPIInt,PetscInt,void*);
53 PETSC_INTERN PetscErrorCode DMSwarmDataExPackFinalize(DMSwarmDataEx);
54 PETSC_INTERN PetscErrorCode DMSwarmDataExBegin(DMSwarmDataEx);
55 PETSC_INTERN PetscErrorCode DMSwarmDataExEnd(DMSwarmDataEx);
56 PETSC_INTERN PetscErrorCode DMSwarmDataExGetSendData(DMSwarmDataEx,PetscInt*,void**);
57 PETSC_INTERN PetscErrorCode DMSwarmDataExGetRecvData(DMSwarmDataEx,PetscInt*,void**);
58 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyGetNeighbours(DMSwarmDataEx,PetscMPIInt*,PetscMPIInt *[]);
59 
60 #endif
61