xref: /petsc/src/dm/impls/swarm/data_ex.h (revision 095059a4a9da3c077576069a1cce327c884bb767)
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