xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
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)
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: `PetscSF`, `PetscSFRegister()`, `PetscSFRegisterDestroy()`
27 @*/
28 PetscErrorCode PetscSFRegisterAll(void)
29 {
30   PetscFunctionBegin;
31   if (PetscSFRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
32   PetscSFRegisterAllCalled = PETSC_TRUE;
33   PetscCall(PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic));
34 #if defined(PETSC_HAVE_MPI_WIN_CREATE)
35   PetscCall(PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window));
36 #endif
37   PetscCall(PetscSFRegister(PETSCSFALLGATHERV, PetscSFCreate_Allgatherv));
38   PetscCall(PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather));
39   PetscCall(PetscSFRegister(PETSCSFGATHERV, PetscSFCreate_Gatherv));
40   PetscCall(PetscSFRegister(PETSCSFGATHER, PetscSFCreate_Gather));
41   PetscCall(PetscSFRegister(PETSCSFALLTOALL, PetscSFCreate_Alltoall));
42 #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
43   PetscCall(PetscSFRegister(PETSCSFNEIGHBOR, PetscSFCreate_Neighbor));
44 #endif
45   PetscFunctionReturn(PETSC_SUCCESS);
46 }
47 
48 /*@C
49   PetscSFRegister  - Adds an implementation of the `PetscSF` communication protocol.
50 
51   Not Collective
52 
53   Input Parameters:
54 + name   - name of a new user-defined implementation
55 - create - routine to create method context
56 
57   Example Usage:
58 .vb
59    PetscSFRegister("my_impl", MyImplCreate);
60 .ve
61 
62   Then, this implementation can be chosen with the procedural interface via
63 $     PetscSFSetType(sf, "my_impl")
64   or at runtime via the option
65 $     -sf_type my_impl
66 
67   Level: advanced
68 
69   Note:
70   `PetscSFRegister()` may be called multiple times to add several user-defined implementations.
71 
72 .seealso: `PetscSF`, `PetscSFType`, `PetscSFRegisterAll()`, `PetscSFInitializePackage()`
73 @*/
74 PetscErrorCode PetscSFRegister(const char name[], PetscErrorCode (*create)(PetscSF))
75 {
76   PetscFunctionBegin;
77   PetscCall(PetscSFInitializePackage());
78   PetscCall(PetscFunctionListAdd(&PetscSFList, name, create));
79   PetscFunctionReturn(PETSC_SUCCESS);
80 }
81