xref: /petsc/src/vec/is/sf/impls/basic/sfbasic.h (revision 40e23c03978c13ac666c3a9a3d12ba4068b9b111)
1*40e23c03SJunchao Zhang #if !defined(__SFBASIC_H)
2*40e23c03SJunchao Zhang #define __SFBASIC_H
3*40e23c03SJunchao Zhang 
4*40e23c03SJunchao Zhang #include <../src/vec/is/sf/impls/basic/sfpack.h>
5*40e23c03SJunchao Zhang 
6*40e23c03SJunchao Zhang typedef enum {PETSCSF_LEAF2ROOT_REDUCE=0, PETSCSF_ROOT2LEAF_BCAST=1} PetscSFDirection;
7*40e23c03SJunchao Zhang 
8*40e23c03SJunchao Zhang typedef struct _n_PetscSFPack_Basic *PetscSFPack_Basic;
9*40e23c03SJunchao Zhang 
10*40e23c03SJunchao Zhang #define SPPACKBASICHEADER \
11*40e23c03SJunchao Zhang   SFPACKHEADER;                                                                                                                    \
12*40e23c03SJunchao Zhang   char          **root;         /* Packed root data, indexed by leaf rank */                                                       \
13*40e23c03SJunchao Zhang   char          **leaf;         /* Packed leaf data, indexed by root rank */                                                       \
14*40e23c03SJunchao Zhang   PetscMPIInt   half;           /* Number of MPI_Requests used for either leaf2root or root2leaf communication */                  \
15*40e23c03SJunchao Zhang   MPI_Request   *requests       /* [2*half] requests arranged in this order: leaf2root root/leaf reqs, root2leaf root/leaf reqs */
16*40e23c03SJunchao Zhang 
17*40e23c03SJunchao Zhang struct _n_PetscSFPack_Basic {
18*40e23c03SJunchao Zhang   SPPACKBASICHEADER;
19*40e23c03SJunchao Zhang   PetscBool     initialized[2]; /* Is the communcation pattern in each direction initialized? [0] for leaf2root, [1] for root2leaf */
20*40e23c03SJunchao Zhang };
21*40e23c03SJunchao Zhang 
22*40e23c03SJunchao Zhang #define SFBASICHEADER \
23*40e23c03SJunchao Zhang   PetscMPIInt      niranks;     /* Number of incoming ranks (ranks accessing my roots) */                                      \
24*40e23c03SJunchao Zhang   PetscMPIInt      ndiranks;    /* Number of incoming ranks (ranks accessing my roots) in distinguished set */                 \
25*40e23c03SJunchao Zhang   PetscMPIInt      *iranks;     /* Array of ranks that reference my roots */                                                   \
26*40e23c03SJunchao Zhang   PetscInt         itotal;      /* Total number of graph edges referencing my roots */                                         \
27*40e23c03SJunchao Zhang   PetscInt         *ioffset;    /* Array of length niranks+1 holding offset in irootloc[] for each rank */                     \
28*40e23c03SJunchao Zhang   PetscInt         *irootloc;   /* Incoming roots referenced by ranks starting at ioffset[rank] */                             \
29*40e23c03SJunchao Zhang   PetscSFPackOpt   rootpackopt; /* Optimization plans to (un)pack roots based on patterns in irootloc[]. NULL for no plans */  \
30*40e23c03SJunchao Zhang   PetscSFPack      avail;       /* One or more entries per MPI Datatype, lazily constructed */                                 \
31*40e23c03SJunchao Zhang   PetscSFPack      inuse        /* Buffers being used for transactions that have not yet completed */
32*40e23c03SJunchao Zhang 
33*40e23c03SJunchao Zhang typedef struct {
34*40e23c03SJunchao Zhang   SFBASICHEADER;
35*40e23c03SJunchao Zhang } PetscSF_Basic;
36*40e23c03SJunchao Zhang 
37*40e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf,PetscInt *nrootranks,PetscInt *ndrootranks,const PetscMPIInt **rootranks,const PetscInt **rootoffset,const PetscInt **rootloc)
38*40e23c03SJunchao Zhang {
39*40e23c03SJunchao Zhang   PetscSF_Basic *bas = (PetscSF_Basic*)sf->data;
40*40e23c03SJunchao Zhang 
41*40e23c03SJunchao Zhang   PetscFunctionBegin;
42*40e23c03SJunchao Zhang   if (nrootranks)  *nrootranks  = bas->niranks;
43*40e23c03SJunchao Zhang   if (ndrootranks) *ndrootranks = bas->ndiranks;
44*40e23c03SJunchao Zhang   if (rootranks)   *rootranks   = bas->iranks;
45*40e23c03SJunchao Zhang   if (rootoffset)  *rootoffset  = bas->ioffset;
46*40e23c03SJunchao Zhang   if (rootloc)     *rootloc     = bas->irootloc;
47*40e23c03SJunchao Zhang   PetscFunctionReturn(0);
48*40e23c03SJunchao Zhang }
49*40e23c03SJunchao Zhang 
50*40e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFGetLeafInfo_Basic(PetscSF sf,PetscInt *nleafranks,PetscInt *ndleafranks,const PetscMPIInt **leafranks,const PetscInt **leafoffset,const PetscInt **leafloc,const PetscInt **leafrremote)
51*40e23c03SJunchao Zhang {
52*40e23c03SJunchao Zhang   PetscFunctionBegin;
53*40e23c03SJunchao Zhang   if (nleafranks)  *nleafranks  = sf->nranks;
54*40e23c03SJunchao Zhang   if (ndleafranks) *ndleafranks = sf->ndranks;
55*40e23c03SJunchao Zhang   if (leafranks)   *leafranks   = sf->ranks;
56*40e23c03SJunchao Zhang   if (leafoffset)  *leafoffset  = sf->roffset;
57*40e23c03SJunchao Zhang   if (leafloc)     *leafloc     = sf->rmine;
58*40e23c03SJunchao Zhang   if (leafrremote) *leafrremote = sf->rremote;
59*40e23c03SJunchao Zhang   PetscFunctionReturn(0);
60*40e23c03SJunchao Zhang }
61*40e23c03SJunchao Zhang 
62*40e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFPackWaitall_Basic(PetscSFPack_Basic link,PetscSFDirection direction)
63*40e23c03SJunchao Zhang {
64*40e23c03SJunchao Zhang   PetscErrorCode ierr;
65*40e23c03SJunchao Zhang   MPI_Request    *requests = (direction == PETSCSF_LEAF2ROOT_REDUCE) ? link->requests : link->requests  + link->half;
66*40e23c03SJunchao Zhang 
67*40e23c03SJunchao Zhang   PetscFunctionBegin;
68*40e23c03SJunchao Zhang   ierr = MPI_Waitall(link->half,requests,MPI_STATUSES_IGNORE);CHKERRQ(ierr);
69*40e23c03SJunchao Zhang   PetscFunctionReturn(0);
70*40e23c03SJunchao Zhang }
71*40e23c03SJunchao Zhang 
72*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF);
73*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF,PetscViewer);
74*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF);
75*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF);
76*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastAndOpEnd_Basic(PetscSF,MPI_Datatype,const void*,void*,MPI_Op);
77*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic(PetscSF,MPI_Datatype,const void*,void*,MPI_Op);
78*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF,MPI_Datatype,void*,const void*,void*,MPI_Op);
79*40e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF,PetscInt*,const PetscMPIInt**,const PetscInt**,const PetscInt**);
80*40e23c03SJunchao Zhang #endif
81