xref: /petsc/src/vec/is/sf/interface/sfregi.c (revision 027eff8a9df6fe73ec06201294b3c9eebc561839)
1af0996ceSBarry Smith #include <petsc/private/sfimpl.h>     /*I  "petscsf.h"  I*/
295fce210SBarry Smith 
3*027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Basic(PetscSF);
429046d53SLisandro Dalcin #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP)
5*027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Window(PetscSF);
6*027eff8aSJunchao Zhang #endif
7dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Allgatherv(PetscSF);
8dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Allgather(PetscSF);
9dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Gatherv(PetscSF);
10dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Gather(PetscSF);
11dd5b3ca6SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Alltoall(PetscSF);
12*027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
13*027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Neighbor(PetscSF);
1495fce210SBarry Smith #endif
1595fce210SBarry Smith 
16adc40e5bSBarry Smith PetscFunctionList PetscSFList;
1729046d53SLisandro Dalcin PetscBool         PetscSFRegisterAllCalled;
1895fce210SBarry Smith 
1995fce210SBarry Smith /*@C
2095fce210SBarry Smith    PetscSFRegisterAll - Registers all the PetscSF communication implementations
2195fce210SBarry Smith 
2295fce210SBarry Smith    Not Collective
2395fce210SBarry Smith 
2495fce210SBarry Smith    Level: advanced
2595fce210SBarry Smith 
2695fce210SBarry Smith .seealso:  PetscSFRegisterDestroy()
2795fce210SBarry Smith @*/
28607a6623SBarry Smith PetscErrorCode  PetscSFRegisterAll(void)
2995fce210SBarry Smith {
3095fce210SBarry Smith   PetscErrorCode ierr;
3195fce210SBarry Smith 
3295fce210SBarry Smith   PetscFunctionBegin;
330f51fdf8SToby Isaac   if (PetscSFRegisterAllCalled) PetscFunctionReturn(0);
3495fce210SBarry Smith   PetscSFRegisterAllCalled = PETSC_TRUE;
3529046d53SLisandro Dalcin   ierr = PetscSFRegister(PETSCSFBASIC,  PetscSFCreate_Basic);CHKERRQ(ierr);
36c01091c8SJed Brown #if defined(PETSC_HAVE_MPI_WIN_CREATE) && defined(PETSC_HAVE_MPI_TYPE_DUP)
37bdf89e91SBarry Smith   ierr = PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window);CHKERRQ(ierr);
3895fce210SBarry Smith #endif
39dd5b3ca6SJunchao Zhang   ierr = PetscSFRegister(PETSCSFALLGATHERV,PetscSFCreate_Allgatherv);CHKERRQ(ierr);
40dd5b3ca6SJunchao Zhang   ierr = PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather);CHKERRQ(ierr);
41dd5b3ca6SJunchao Zhang   ierr = PetscSFRegister(PETSCSFGATHERV,   PetscSFCreate_Gatherv);CHKERRQ(ierr);
42dd5b3ca6SJunchao Zhang   ierr = PetscSFRegister(PETSCSFGATHER,    PetscSFCreate_Gather);CHKERRQ(ierr);
43dd5b3ca6SJunchao Zhang   ierr = PetscSFRegister(PETSCSFALLTOALL,  PetscSFCreate_Alltoall);CHKERRQ(ierr);
44*027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES)
45*027eff8aSJunchao Zhang   ierr = PetscSFRegister(PETSCSFNEIGHBOR,  PetscSFCreate_Neighbor);CHKERRQ(ierr);
46*027eff8aSJunchao Zhang #endif
4795fce210SBarry Smith   PetscFunctionReturn(0);
4895fce210SBarry Smith }
4995fce210SBarry Smith 
5095fce210SBarry Smith /*@C
511c84c290SBarry Smith   PetscSFRegister  - Adds an implementation of the PetscSF communication protocol.
521c84c290SBarry Smith 
531c84c290SBarry Smith    Not collective
541c84c290SBarry Smith 
551c84c290SBarry Smith    Input Parameters:
5629046d53SLisandro Dalcin +  name - name of a new user-defined implementation
5729046d53SLisandro Dalcin -  create - routine to create method context
581c84c290SBarry Smith 
591c84c290SBarry Smith    Notes:
601c84c290SBarry Smith    PetscSFRegister() may be called multiple times to add several user-defined implementations.
611c84c290SBarry Smith 
621c84c290SBarry Smith    Sample usage:
631c84c290SBarry Smith .vb
64bdf89e91SBarry Smith    PetscSFRegister("my_impl",MyImplCreate);
651c84c290SBarry Smith .ve
661c84c290SBarry Smith 
671c84c290SBarry Smith    Then, this implementation can be chosen with the procedural interface via
681c84c290SBarry Smith $     PetscSFSetType(sf,"my_impl")
691c84c290SBarry Smith    or at runtime via the option
7029046d53SLisandro Dalcin $     -sf_type my_impl
7195fce210SBarry Smith 
7295fce210SBarry Smith    Level: advanced
731c84c290SBarry Smith 
7429046d53SLisandro Dalcin .seealso: PetscSFRegisterAll(), PetscSFInitializePackage()
7595fce210SBarry Smith @*/
7629046d53SLisandro Dalcin PetscErrorCode  PetscSFRegister(const char name[],PetscErrorCode (*create)(PetscSF))
7795fce210SBarry Smith {
7895fce210SBarry Smith   PetscErrorCode ierr;
7995fce210SBarry Smith 
8095fce210SBarry Smith   PetscFunctionBegin;
811d36bdfdSBarry Smith   ierr = PetscSFInitializePackage();CHKERRQ(ierr);
8229046d53SLisandro Dalcin   ierr = PetscFunctionListAdd(&PetscSFList,name,create);CHKERRQ(ierr);
8395fce210SBarry Smith   PetscFunctionReturn(0);
8495fce210SBarry Smith }
85