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 @*/ 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 Sample usage: 58 .vb 59 PetscSFRegister("my_impl",MyImplCreate); 60 .ve 61 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 66 67 Level: advanced 68 69 Note: 70 `PetscSFRegister()` may be called multiple times to add several user-defined implementations. 71 72 .seealso: `PetscSF`, `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