xref: /petsc/src/dm/impls/swarm/data_ex.h (revision 21e3ffae2f3b73c0bd738cf6d0a809700fc04bb0)
1 #ifndef PETSC_DMSWARM_DATA_EXCHANGER_H
2 #define PETSC_DMSWARM_DATA_EXCHANGER_H
3 
4 #include <petscvec.h>
5 #include <petscmat.h>
6 
7 typedef enum {
8   DEOBJECT_INITIALIZED = 0,
9   DEOBJECT_FINALIZED,
10   DEOBJECT_STATE_UNKNOWN
11 } DMSwarmDEObjectState;
12 
13 typedef struct _p_DMSwarmDataEx *DMSwarmDataEx;
14 struct _p_DMSwarmDataEx {
15   PetscInt             instance;
16   MPI_Comm             comm;
17   PetscMPIInt          rank;
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   PetscMPIInt         *send_tags, *recv_tags;
29   PetscInt             total_pack_cnt;
30   PetscInt            *pack_cnt; /* [n_neighbour_procs] */
31   DMSwarmDEObjectState topology_status;
32   DMSwarmDEObjectState message_lengths_status;
33   DMSwarmDEObjectState packer_status;
34   DMSwarmDEObjectState communication_status;
35   MPI_Status          *_stats;
36   MPI_Request         *_requests;
37 };
38 
39 /* OBJECT_STATUS */
40 /* #define OBJECT_INITIALIZED    0 */
41 /* #define OBJECT_FINALIZED      1 */
42 /* #define OBJECT_STATE_UNKNOWN  2 */
43 
44 extern const char *status_names[];
45 
46 PETSC_INTERN PetscErrorCode DMSwarmDataExCreate(MPI_Comm, const PetscInt, DMSwarmDataEx *);
47 PETSC_INTERN PetscErrorCode DMSwarmDataExView(DMSwarmDataEx);
48 PETSC_INTERN PetscErrorCode DMSwarmDataExDestroy(DMSwarmDataEx);
49 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyInitialize(DMSwarmDataEx);
50 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyAddNeighbour(DMSwarmDataEx, const PetscMPIInt);
51 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyFinalize(DMSwarmDataEx);
52 PETSC_INTERN PetscErrorCode DMSwarmDataExInitializeSendCount(DMSwarmDataEx);
53 PETSC_INTERN PetscErrorCode DMSwarmDataExAddToSendCount(DMSwarmDataEx, const PetscMPIInt, const PetscInt);
54 PETSC_INTERN PetscErrorCode DMSwarmDataExFinalizeSendCount(DMSwarmDataEx);
55 PETSC_INTERN PetscErrorCode DMSwarmDataExPackInitialize(DMSwarmDataEx, size_t);
56 PETSC_INTERN PetscErrorCode DMSwarmDataExPackData(DMSwarmDataEx, PetscMPIInt, PetscInt, void *);
57 PETSC_INTERN PetscErrorCode DMSwarmDataExPackFinalize(DMSwarmDataEx);
58 PETSC_INTERN PetscErrorCode DMSwarmDataExBegin(DMSwarmDataEx);
59 PETSC_INTERN PetscErrorCode DMSwarmDataExEnd(DMSwarmDataEx);
60 PETSC_INTERN PetscErrorCode DMSwarmDataExGetSendData(DMSwarmDataEx, PetscInt *, void **);
61 PETSC_INTERN PetscErrorCode DMSwarmDataExGetRecvData(DMSwarmDataEx, PetscInt *, void **);
62 PETSC_INTERN PetscErrorCode DMSwarmDataExTopologyGetNeighbours(DMSwarmDataEx, PetscMPIInt *, PetscMPIInt *[]);
63 
64 #endif // PETSC_DMSWARM_DATA_EXCHANGER_H
65