1 #include <petsc/private/sfimpl.h> /*I "petscsf.h" I*/ 2 3 #if defined(PETSC_HAVE_MPI_WIN_CREATE) 4 PETSC_EXTERN PetscErrorCode PetscSFCreate_Window(PetscSF); 5 #endif 6 PETSC_EXTERN PetscErrorCode PetscSFCreate_Basic(PetscSF); 7 8 PetscFunctionList PetscSFList; 9 10 #undef __FUNCT__ 11 #define __FUNCT__ "PetscSFRegisterAll" 12 /*@C 13 PetscSFRegisterAll - Registers all the PetscSF communication implementations 14 15 Not Collective 16 17 Level: advanced 18 19 .keywords: PetscSF, register, all 20 21 .seealso: PetscSFRegisterDestroy() 22 @*/ 23 PetscErrorCode PetscSFRegisterAll(void) 24 { 25 PetscErrorCode ierr; 26 27 PetscFunctionBegin; 28 if (PetscSFRegisterAllCalled) PetscFunctionReturn(0); 29 PetscSFRegisterAllCalled = PETSC_TRUE; 30 #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP) 31 ierr = PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window);CHKERRQ(ierr); 32 #endif 33 ierr = PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic);CHKERRQ(ierr); 34 PetscFunctionReturn(0); 35 } 36 37 #undef __FUNCT__ 38 #define __FUNCT__ "PetscSFRegister" 39 /*@C 40 PetscSFRegister - Adds an implementation of the PetscSF communication protocol. 41 42 Not collective 43 44 Input Parameters: 45 + name_impl - name of a new user-defined implementation 46 - routine_create - routine to create method context 47 48 Notes: 49 PetscSFRegister() may be called multiple times to add several user-defined implementations. 50 51 Sample usage: 52 .vb 53 PetscSFRegister("my_impl",MyImplCreate); 54 .ve 55 56 Then, this implementation can be chosen with the procedural interface via 57 $ PetscSFSetType(sf,"my_impl") 58 or at runtime via the option 59 $ -snes_type my_solver 60 61 Level: advanced 62 63 .keywords: PetscSF, register 64 65 .seealso: PetscSFRegisterAll(), PetscSFRegisterDestroy() 66 @*/ 67 PetscErrorCode PetscSFRegister(const char sname[],PetscErrorCode (*function)(PetscSF)) 68 { 69 PetscErrorCode ierr; 70 71 PetscFunctionBegin; 72 ierr = PetscFunctionListAdd(&PetscSFList,sname,function);CHKERRQ(ierr); 73 PetscFunctionReturn(0); 74 } 75 76