xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision 174dc0c8cee294b82b85e4dd3b331b29396264fc)
1af0996ceSBarry Smith #include <petsc/private/sfimpl.h> /*I  "petscsf.h"  I*/
295fce210SBarry Smith 
3027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Basic(PetscSF);
4eb58dee7SJunchao Zhang #if defined(PETSC_HAVE_MPI_WIN_CREATE)
5027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Window(PetscSF);
6027eff8aSJunchao Zhang #endif
7dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Allgatherv(PetscSF);
8dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Allgather(PetscSF);
9dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Gatherv(PetscSF);
10dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Gather(PetscSF);
11dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Alltoall(PetscSF);
12027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
13027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Neighbor(PetscSF);
1495fce210SBarry Smith #endif
1595fce210SBarry Smith 
16adc40e5bSBarry Smith PetscFunctionList PetscSFList;
1729046d53SLisandro Dalcin PetscBool         PetscSFRegisterAllCalled;
1895fce210SBarry Smith 
1995fce210SBarry Smith /*@C
20cab54364SBarry Smith   PetscSFRegisterAll - Registers all the `PetscSF` communication implementations
2195fce210SBarry Smith 
2295fce210SBarry Smith   Not Collective
2395fce210SBarry Smith 
2495fce210SBarry Smith   Level: advanced
2595fce210SBarry Smith 
26cab54364SBarry Smith .seealso: `PetscSF`, `PetscSFRegister()`, `PetscSFRegisterDestroy()`
2795fce210SBarry Smith @*/
PetscSFRegisterAll(void)28d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSFRegisterAll(void)
29d71ae5a4SJacob Faibussowitsch {
3095fce210SBarry Smith   PetscFunctionBegin;
313ba16761SJacob Faibussowitsch   if (PetscSFRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
3295fce210SBarry Smith   PetscSFRegisterAllCalled = PETSC_TRUE;
339566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic));
34eb58dee7SJunchao Zhang #if defined(PETSC_HAVE_MPI_WIN_CREATE)
359566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window));
3695fce210SBarry Smith #endif
379566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFALLGATHERV, PetscSFCreate_Allgatherv));
389566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather));
399566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFGATHERV, PetscSFCreate_Gatherv));
409566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFGATHER, PetscSFCreate_Gather));
419566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFALLTOALL, PetscSFCreate_Alltoall));
42027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
439566063dSJacob Faibussowitsch   PetscCall(PetscSFRegister(PETSCSFNEIGHBOR, PetscSFCreate_Neighbor));
44027eff8aSJunchao Zhang #endif
453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4695fce210SBarry Smith }
4795fce210SBarry Smith 
4895fce210SBarry Smith /*@C
49cab54364SBarry Smith   PetscSFRegister  - Adds an implementation of the `PetscSF` communication protocol.
501c84c290SBarry Smith 
51cc4c1da9SBarry Smith   Not Collective, No Fortran Support
521c84c290SBarry Smith 
531c84c290SBarry Smith   Input Parameters:
5429046d53SLisandro Dalcin + name   - name of a new user-defined implementation
5529046d53SLisandro Dalcin - create - routine to create method context
561c84c290SBarry Smith 
5738b5cf2dSJacob Faibussowitsch   Example Usage:
581c84c290SBarry Smith .vb
59bdf89e91SBarry Smith    PetscSFRegister("my_impl", MyImplCreate);
601c84c290SBarry Smith .ve
611c84c290SBarry Smith 
621c84c290SBarry Smith   Then, this implementation can be chosen with the procedural interface via
63*b44f4de4SBarry Smith .vb
64*b44f4de4SBarry Smith   PetscSFSetType(sf, "my_impl")
65*b44f4de4SBarry Smith .ve
661c84c290SBarry Smith   or at runtime via the option
67*b44f4de4SBarry Smith .vb
68*b44f4de4SBarry Smith   -sf_type my_impl
69*b44f4de4SBarry Smith .ve
7095fce210SBarry Smith 
7195fce210SBarry Smith   Level: advanced
721c84c290SBarry Smith 
73cab54364SBarry Smith   Note:
74cab54364SBarry Smith   `PetscSFRegister()` may be called multiple times to add several user-defined implementations.
75cab54364SBarry Smith 
7620662ed9SBarry Smith .seealso: `PetscSF`, `PetscSFType`, `PetscSFRegisterAll()`, `PetscSFInitializePackage()`
7795fce210SBarry Smith @*/
PetscSFRegister(const char name[],PetscErrorCode (* create)(PetscSF))78d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSFRegister(const char name[], PetscErrorCode (*create)(PetscSF))
79d71ae5a4SJacob Faibussowitsch {
8095fce210SBarry Smith   PetscFunctionBegin;
819566063dSJacob Faibussowitsch   PetscCall(PetscSFInitializePackage());
829566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscSFList, name, create));
833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8495fce210SBarry Smith }
85