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: if (PetscSFRegisterAllCalled) return 0;
31: PetscSFRegisterAllCalled = PETSC_TRUE;
32: PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic);
33: #if defined(PETSC_HAVE_MPI_WIN_CREATE)
34: PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window);
35: #endif
36: PetscSFRegister(PETSCSFALLGATHERV, PetscSFCreate_Allgatherv);
37: PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather);
38: PetscSFRegister(PETSCSFGATHERV, PetscSFCreate_Gatherv);
39: PetscSFRegister(PETSCSFGATHER, PetscSFCreate_Gather);
40: PetscSFRegister(PETSCSFALLTOALL, PetscSFCreate_Alltoall);
41: #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
42: PetscSFRegister(PETSCSFNEIGHBOR, PetscSFCreate_Neighbor);
43: #endif
44: return 0;
45: }
47: /*@C
48: PetscSFRegister - Adds an implementation of the `PetscSF` communication protocol.
50: Not collective
52: Input Parameters:
53: + name - name of a new user-defined implementation
54: - create - routine to create method context
56: Sample usage:
57: .vb
58: PetscSFRegister("my_impl",MyImplCreate);
59: .ve
61: Then, this implementation can be chosen with the procedural interface via
62: $ PetscSFSetType(sf,"my_impl")
63: or at runtime via the option
64: $ -sf_type my_impl
66: Level: advanced
68: Note:
69: `PetscSFRegister()` may be called multiple times to add several user-defined implementations.
71: .seealso: `PetscSF`, `PetscSFRegisterAll()`, `PetscSFInitializePackage()`
72: @*/
73: PetscErrorCode PetscSFRegister(const char name[], PetscErrorCode (*create)(PetscSF))
74: {
75: PetscSFInitializePackage();
76: PetscFunctionListAdd(&PetscSFList, name, create);
77: return 0;
78: }