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 @*/
PetscSFRegisterAll(void)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 @*/
PetscSFRegister(const char name[],PetscErrorCode (* create)(PetscSF))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