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