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