1 #include <petsc/private/sfimpl.h>     /*I  "petscsf.h"  I*/
2 
3 PETSC_INTERN PetscErrorCode PetscSFCreate_Basic(PetscSF);
4 #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP)
5 PETSC_INTERN PetscErrorCode PetscSFCreate_Window(PetscSF);
6 #endif
7 PETSC_INTERN PetscErrorCode PetscSFCreate_Allgatherv(PetscSF);
8 PETSC_INTERN PetscErrorCode PetscSFCreate_Allgather(PetscSF);
9 PETSC_INTERN PetscErrorCode PetscSFCreate_Gatherv(PetscSF);
10 PETSC_INTERN PetscErrorCode PetscSFCreate_Gather(PetscSF);
11 PETSC_INTERN PetscErrorCode PetscSFCreate_Alltoall(PetscSF);
12 #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
13 PETSC_INTERN PetscErrorCode PetscSFCreate_Neighbor(PetscSF);
14 #endif
15 
16 PetscFunctionList PetscSFList;
17 PetscBool         PetscSFRegisterAllCalled;
18 
19 /*@C
20    PetscSFRegisterAll - Registers all the PetscSF communication implementations
21 
22    Not Collective
23 
24    Level: advanced
25 
26 .seealso:  PetscSFRegisterDestroy()
27 @*/
PetscSFRegisterAll(void)28 PetscErrorCode  PetscSFRegisterAll(void)
29 {
30   PetscErrorCode ierr;
31 
32   PetscFunctionBegin;
33   if (PetscSFRegisterAllCalled) PetscFunctionReturn(0);
34   PetscSFRegisterAllCalled = PETSC_TRUE;
35   ierr = PetscSFRegister(PETSCSFBASIC,  PetscSFCreate_Basic);CHKERRQ(ierr);
36 #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP)
37   ierr = PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window);CHKERRQ(ierr);
38 #endif
39   ierr = PetscSFRegister(PETSCSFALLGATHERV,PetscSFCreate_Allgatherv);CHKERRQ(ierr);
40   ierr = PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather);CHKERRQ(ierr);
41   ierr = PetscSFRegister(PETSCSFGATHERV,   PetscSFCreate_Gatherv);CHKERRQ(ierr);
42   ierr = PetscSFRegister(PETSCSFGATHER,    PetscSFCreate_Gather);CHKERRQ(ierr);
43   ierr = PetscSFRegister(PETSCSFALLTOALL,  PetscSFCreate_Alltoall);CHKERRQ(ierr);
44 #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
45   ierr = PetscSFRegister(PETSCSFNEIGHBOR,  PetscSFCreate_Neighbor);CHKERRQ(ierr);
46 #endif
47   PetscFunctionReturn(0);
48 }
49 
50 /*@C
51   PetscSFRegister  - Adds an implementation of the PetscSF communication protocol.
52 
53    Not collective
54 
55    Input Parameters:
56 +  name - name of a new user-defined implementation
57 -  create - routine to create method context
58 
59    Notes:
60    PetscSFRegister() may be called multiple times to add several user-defined implementations.
61 
62    Sample usage:
63 .vb
64    PetscSFRegister("my_impl",MyImplCreate);
65 .ve
66 
67    Then, this implementation can be chosen with the procedural interface via
68 $     PetscSFSetType(sf,"my_impl")
69    or at runtime via the option
70 $     -sf_type my_impl
71 
72    Level: advanced
73 
74 .seealso: PetscSFRegisterAll(), PetscSFInitializePackage()
75 @*/
PetscSFRegister(const char name[],PetscErrorCode (* create)(PetscSF))76 PetscErrorCode  PetscSFRegister(const char name[],PetscErrorCode (*create)(PetscSF))
77 {
78   PetscErrorCode ierr;
79 
80   PetscFunctionBegin;
81   ierr = PetscSFInitializePackage();CHKERRQ(ierr);
82   ierr = PetscFunctionListAdd(&PetscSFList,name,create);CHKERRQ(ierr);
83   PetscFunctionReturn(0);
84 }
85