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, No Fortran Support

 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: }