140e23c03SJunchao Zhang #if !defined(__SFBASIC_H) 240e23c03SJunchao Zhang #define __SFBASIC_H 340e23c03SJunchao Zhang 4cd620004SJunchao Zhang #include <petsc/private/sfimpl.h> /*I "petscsf.h" I*/ 5cd620004SJunchao Zhang 6cd620004SJunchao Zhang typedef struct _n_PetscSFLink* PetscSFLink; 740e23c03SJunchao Zhang 840e23c03SJunchao Zhang #define SFBASICHEADER \ 940e23c03SJunchao Zhang PetscMPIInt niranks; /* Number of incoming ranks (ranks accessing my roots) */ \ 1040e23c03SJunchao Zhang PetscMPIInt ndiranks; /* Number of incoming ranks (ranks accessing my roots) in distinguished set */ \ 1140e23c03SJunchao Zhang PetscMPIInt *iranks; /* Array of ranks that reference my roots */ \ 1240e23c03SJunchao Zhang PetscInt itotal; /* Total number of graph edges referencing my roots */ \ 1340e23c03SJunchao Zhang PetscInt *ioffset; /* Array of length niranks+1 holding offset in irootloc[] for each rank */ \ 1440e23c03SJunchao Zhang PetscInt *irootloc; /* Incoming roots referenced by ranks starting at ioffset[rank] */ \ 15cd620004SJunchao Zhang PetscInt *irootloc_d[2]; /* A copy of irootloc[local/remote] in device memory if needed */ \ 16cd620004SJunchao Zhang PetscInt rootbuflen[2]; /* Length (in unit) of root buffers, in layout of [PETSCSF_LOCAL/REMOTE] */ \ 17cd620004SJunchao Zhang PetscBool rootcontig[2]; /* True means the local/remote segments of indices in irootloc[] are contiguous ... */ \ 18cd620004SJunchao Zhang PetscInt rootstart[2]; /* ... and start from rootstart[0] and rootstart[1] respectively */ \ 19cd620004SJunchao Zhang PetscSFPackOpt rootpackopt[2]; /* Pack optimization plans based on patterns in irootloc[]. NULL for no optimizations */ \ 20*fcc7397dSJunchao Zhang PetscSFPackOpt rootpackopt_d[2];/* Copy of rootpackopt[] on device if needed */ \ 21cd620004SJunchao Zhang PetscBool rootdups[2]; /* Indices of roots in irootloc[local/remote] have dups. Used for data-race test */ \ 22cd620004SJunchao Zhang PetscInt nrootreqs; /* Number of MPI reqests */ \ 23cd620004SJunchao Zhang PetscSFLink avail; /* One or more entries per MPI Datatype, lazily constructed */ \ 24cd620004SJunchao Zhang PetscSFLink inuse /* Buffers being used for transactions that have not yet completed */ 2540e23c03SJunchao Zhang 2640e23c03SJunchao Zhang typedef struct { 2740e23c03SJunchao Zhang SFBASICHEADER; 2840e23c03SJunchao Zhang } PetscSF_Basic; 2940e23c03SJunchao Zhang 3040e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf,PetscInt *nrootranks,PetscInt *ndrootranks,const PetscMPIInt **rootranks,const PetscInt **rootoffset,const PetscInt **rootloc) 3140e23c03SJunchao Zhang { 3240e23c03SJunchao Zhang PetscSF_Basic *bas = (PetscSF_Basic*)sf->data; 3340e23c03SJunchao Zhang 3440e23c03SJunchao Zhang PetscFunctionBegin; 3540e23c03SJunchao Zhang if (nrootranks) *nrootranks = bas->niranks; 3640e23c03SJunchao Zhang if (ndrootranks) *ndrootranks = bas->ndiranks; 3740e23c03SJunchao Zhang if (rootranks) *rootranks = bas->iranks; 3840e23c03SJunchao Zhang if (rootoffset) *rootoffset = bas->ioffset; 3940e23c03SJunchao Zhang if (rootloc) *rootloc = bas->irootloc; 4040e23c03SJunchao Zhang PetscFunctionReturn(0); 4140e23c03SJunchao Zhang } 4240e23c03SJunchao Zhang 4340e23c03SJunchao 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) 4440e23c03SJunchao Zhang { 4540e23c03SJunchao Zhang PetscFunctionBegin; 4640e23c03SJunchao Zhang if (nleafranks) *nleafranks = sf->nranks; 4740e23c03SJunchao Zhang if (ndleafranks) *ndleafranks = sf->ndranks; 4840e23c03SJunchao Zhang if (leafranks) *leafranks = sf->ranks; 4940e23c03SJunchao Zhang if (leafoffset) *leafoffset = sf->roffset; 5040e23c03SJunchao Zhang if (leafloc) *leafloc = sf->rmine; 5140e23c03SJunchao Zhang if (leafrremote) *leafrremote = sf->rremote; 5240e23c03SJunchao Zhang PetscFunctionReturn(0); 5340e23c03SJunchao Zhang } 5440e23c03SJunchao Zhang 5540e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF); 5640e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF,PetscViewer); 5740e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF); 5840e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF); 5900816365SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastAndOpEnd_Basic (PetscSF,MPI_Datatype,const void*,void*,MPI_Op); 6000816365SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic (PetscSF,MPI_Datatype,const void*,void*,MPI_Op); 61eb02082bSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF,MPI_Datatype,PetscMemType,void*,PetscMemType,const void*,void*,MPI_Op); 62f659e5c7SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreateEmbeddedSF_Basic(PetscSF,PetscInt,const PetscInt*,PetscSF*); 6340e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF,PetscInt*,const PetscMPIInt**,const PetscInt**,const PetscInt**); 6440e23c03SJunchao Zhang #endif 65