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 PetscSFunctionList; 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 PetscSFRegisterAllCalled = PETSC_TRUE; 29 #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP) 30 ierr = PetscSFRegister(PETSCSFWINDOW, "PetscSFCreate_Window", PetscSFCreate_Window);CHKERRQ(ierr); 31 #endif 32 ierr = PetscSFRegister(PETSCSFBASIC, "PetscSFCreate_Basic", PetscSFCreate_Basic);CHKERRQ(ierr); 33 PetscFunctionReturn(0); 34 } 35 36 #undef __FUNCT__ 37 #define __FUNCT__ "PetscSFRegister" 38 /*@C 39 PetscSFRegister - Adds an implementation of the PetscSF communication protocol. 40 41 Not collective 42 43 Input Parameters: 44 + name_impl - name of a new user-defined implementation 45 . name_create - name of routine to create method context 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",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[],const char name[],PetscErrorCode (*function)(PetscSF)) 68 { 69 PetscErrorCode ierr; 70 71 PetscFunctionBegin; 72 ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscSFunctionList,sname,name,(void (*)(void))function);CHKERRQ(ierr); 73 PetscFunctionReturn(0); 74 } 75 76 #undef __FUNCT__ 77 #define __FUNCT__ "PetscSFRegisterDestroy" 78 /*@ 79 PetscSFRegisterDestroy - Frees the list of communication implementations registered by PetscSFRegister() 80 81 Not Collective 82 83 Level: advanced 84 85 .keywords: PetscSF, register, destroy 86 87 .seealso: PetscSFRegisterAll() 88 @*/ 89 PetscErrorCode PetscSFRegisterDestroy(void) 90 { 91 PetscErrorCode ierr; 92 93 PetscFunctionBegin; 94 ierr = PetscFunctionListDestroy(&PetscSFunctionList);CHKERRQ(ierr); 95 96 PetscSFRegisterAllCalled = PETSC_FALSE; 97 PetscFunctionReturn(0); 98 } 99