Actual source code: sfregi.c
1: #include <petsc/private/sfimpl.h>
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
16: PetscFunctionList PetscSFList;
17: PetscBool PetscSFRegisterAllCalled;
19: /*@C
20: PetscSFRegisterAll - Registers all the `PetscSF` communication implementations
22: Not Collective
24: Level: advanced
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: }
48: /*@C
49: PetscSFRegister - Adds an implementation of the `PetscSF` communication protocol.
51: Not Collective
53: Input Parameters:
54: + name - name of a new user-defined implementation
55: - create - routine to create method context
57: Example Usage:
58: .vb
59: PetscSFRegister("my_impl", MyImplCreate);
60: .ve
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
67: Level: advanced
69: Note:
70: `PetscSFRegister()` may be called multiple times to add several user-defined implementations.
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: }