xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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: `PetscSFRegisterDestroy()`
27 @*/
28 PetscErrorCode PetscSFRegisterAll(void)
29 {
30   PetscFunctionBegin;
31   if (PetscSFRegisterAllCalled) PetscFunctionReturn(0);
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(0);
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    Notes:
58    PetscSFRegister() may be called multiple times to add several user-defined implementations.
59 
60    Sample usage:
61 .vb
62    PetscSFRegister("my_impl",MyImplCreate);
63 .ve
64 
65    Then, this implementation can be chosen with the procedural interface via
66 $     PetscSFSetType(sf,"my_impl")
67    or at runtime via the option
68 $     -sf_type my_impl
69 
70    Level: advanced
71 
72 .seealso: `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(0);
80 }
81