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) && defined(PETSC_HAVE_MPI_TYPE_DUP) 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 PetscErrorCode ierr; 31 32 PetscFunctionBegin; 33 if (PetscSFRegisterAllCalled) PetscFunctionReturn(0); 34 PetscSFRegisterAllCalled = PETSC_TRUE; 35 ierr = PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic);CHKERRQ(ierr); 36 #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP) 37 ierr = PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window);CHKERRQ(ierr); 38 #endif 39 ierr = PetscSFRegister(PETSCSFALLGATHERV,PetscSFCreate_Allgatherv);CHKERRQ(ierr); 40 ierr = PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather);CHKERRQ(ierr); 41 ierr = PetscSFRegister(PETSCSFGATHERV, PetscSFCreate_Gatherv);CHKERRQ(ierr); 42 ierr = PetscSFRegister(PETSCSFGATHER, PetscSFCreate_Gather);CHKERRQ(ierr); 43 ierr = PetscSFRegister(PETSCSFALLTOALL, PetscSFCreate_Alltoall);CHKERRQ(ierr); 44 #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES) 45 ierr = PetscSFRegister(PETSCSFNEIGHBOR, PetscSFCreate_Neighbor);CHKERRQ(ierr); 46 #endif 47 PetscFunctionReturn(0); 48 } 49 50 /*@C 51 PetscSFRegister - Adds an implementation of the PetscSF communication protocol. 52 53 Not collective 54 55 Input Parameters: 56 + name - name of a new user-defined implementation 57 - create - routine to create method context 58 59 Notes: 60 PetscSFRegister() may be called multiple times to add several user-defined implementations. 61 62 Sample usage: 63 .vb 64 PetscSFRegister("my_impl",MyImplCreate); 65 .ve 66 67 Then, this implementation can be chosen with the procedural interface via 68 $ PetscSFSetType(sf,"my_impl") 69 or at runtime via the option 70 $ -sf_type my_impl 71 72 Level: advanced 73 74 .seealso: PetscSFRegisterAll(), PetscSFInitializePackage() 75 @*/ 76 PetscErrorCode PetscSFRegister(const char name[],PetscErrorCode (*create)(PetscSF)) 77 { 78 PetscErrorCode ierr; 79 80 PetscFunctionBegin; 81 ierr = PetscSFInitializePackage();CHKERRQ(ierr); 82 ierr = PetscFunctionListAdd(&PetscSFList,name,create);CHKERRQ(ierr); 83 PetscFunctionReturn(0); 84 } 85