xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision df4cd43f92eaa320656440c40edb1046daee8f75) !
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    Sample 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