xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision 174dc0c8cee294b82b85e4dd3b331b29396264fc)
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 @*/
PetscSFRegisterAll(void)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, No Fortran Support
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 .vb
64   PetscSFSetType(sf, "my_impl")
65 .ve
66   or at runtime via the option
67 .vb
68   -sf_type my_impl
69 .ve
70 
71   Level: advanced
72 
73   Note:
74   `PetscSFRegister()` may be called multiple times to add several user-defined implementations.
75 
76 .seealso: `PetscSF`, `PetscSFType`, `PetscSFRegisterAll()`, `PetscSFInitializePackage()`
77 @*/
PetscSFRegister(const char name[],PetscErrorCode (* create)(PetscSF))78 PetscErrorCode PetscSFRegister(const char name[], PetscErrorCode (*create)(PetscSF))
79 {
80   PetscFunctionBegin;
81   PetscCall(PetscSFInitializePackage());
82   PetscCall(PetscFunctionListAdd(&PetscSFList, name, create));
83   PetscFunctionReturn(PETSC_SUCCESS);
84 }
85