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: `PetscSFRegisterDestroy()` 27 @*/ 28 PetscErrorCode PetscSFRegisterAll(void) 29 { 30 PetscFunctionBegin; 31 if (PetscSFRegisterAllCalled) PetscFunctionReturn(0); 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(0); 46 } 47 48 /*@C 49 PetscSFRegister - Adds an implementation of the PetscSF communication protocol. 50 51 Not collective 52 53 Input Parameters: 54 + name - name of a new user-defined implementation 55 - create - routine to create method context 56 57 Notes: 58 PetscSFRegister() may be called multiple times to add several user-defined implementations. 59 60 Sample usage: 61 .vb 62 PetscSFRegister("my_impl",MyImplCreate); 63 .ve 64 65 Then, this implementation can be chosen with the procedural interface via 66 $ PetscSFSetType(sf,"my_impl") 67 or at runtime via the option 68 $ -sf_type my_impl 69 70 Level: advanced 71 72 .seealso: `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(0); 80 } 81