1af0996ceSBarry Smith #include <petsc/private/sfimpl.h> /*I "petscsf.h" I*/ 295fce210SBarry Smith 3027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Basic(PetscSF); 4eb58dee7SJunchao Zhang #if defined(PETSC_HAVE_MPI_WIN_CREATE) 5027eff8aSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreate_Window(PetscSF); 6027eff8aSJunchao 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); 12027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES) 13027eff8aSJunchao 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 20cab54364SBarry Smith PetscSFRegisterAll - Registers all the `PetscSF` communication implementations 2195fce210SBarry Smith 2295fce210SBarry Smith Not Collective 2395fce210SBarry Smith 2495fce210SBarry Smith Level: advanced 2595fce210SBarry Smith 26cab54364SBarry Smith .seealso: `PetscSF`, `PetscSFRegister()`, `PetscSFRegisterDestroy()` 2795fce210SBarry Smith @*/ 28d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSFRegisterAll(void) 29d71ae5a4SJacob Faibussowitsch { 3095fce210SBarry Smith PetscFunctionBegin; 313ba16761SJacob Faibussowitsch if (PetscSFRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 3295fce210SBarry Smith PetscSFRegisterAllCalled = PETSC_TRUE; 339566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFBASIC, PetscSFCreate_Basic)); 34eb58dee7SJunchao Zhang #if defined(PETSC_HAVE_MPI_WIN_CREATE) 359566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFWINDOW, PetscSFCreate_Window)); 3695fce210SBarry Smith #endif 379566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFALLGATHERV, PetscSFCreate_Allgatherv)); 389566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFALLGATHER, PetscSFCreate_Allgather)); 399566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFGATHERV, PetscSFCreate_Gatherv)); 409566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFGATHER, PetscSFCreate_Gather)); 419566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFALLTOALL, PetscSFCreate_Alltoall)); 42027eff8aSJunchao Zhang #if defined(PETSC_HAVE_MPI_NEIGHBORHOOD_COLLECTIVES) 439566063dSJacob Faibussowitsch PetscCall(PetscSFRegister(PETSCSFNEIGHBOR, PetscSFCreate_Neighbor)); 44027eff8aSJunchao Zhang #endif 453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4695fce210SBarry Smith } 4795fce210SBarry Smith 4895fce210SBarry Smith /*@C 49cab54364SBarry Smith PetscSFRegister - Adds an implementation of the `PetscSF` communication protocol. 501c84c290SBarry Smith 51cc4c1da9SBarry Smith Not Collective, No Fortran Support 521c84c290SBarry Smith 531c84c290SBarry Smith Input Parameters: 5429046d53SLisandro Dalcin + name - name of a new user-defined implementation 5529046d53SLisandro Dalcin - create - routine to create method context 561c84c290SBarry Smith 5738b5cf2dSJacob Faibussowitsch Example Usage: 581c84c290SBarry Smith .vb 59bdf89e91SBarry Smith PetscSFRegister("my_impl", MyImplCreate); 601c84c290SBarry Smith .ve 611c84c290SBarry Smith 621c84c290SBarry Smith Then, this implementation can be chosen with the procedural interface via 63*b44f4de4SBarry Smith .vb 64*b44f4de4SBarry Smith PetscSFSetType(sf, "my_impl") 65*b44f4de4SBarry Smith .ve 661c84c290SBarry Smith or at runtime via the option 67*b44f4de4SBarry Smith .vb 68*b44f4de4SBarry Smith -sf_type my_impl 69*b44f4de4SBarry Smith .ve 7095fce210SBarry Smith 7195fce210SBarry Smith Level: advanced 721c84c290SBarry Smith 73cab54364SBarry Smith Note: 74cab54364SBarry Smith `PetscSFRegister()` may be called multiple times to add several user-defined implementations. 75cab54364SBarry Smith 7620662ed9SBarry Smith .seealso: `PetscSF`, `PetscSFType`, `PetscSFRegisterAll()`, `PetscSFInitializePackage()` 7795fce210SBarry Smith @*/ 78d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSFRegister(const char name[], PetscErrorCode (*create)(PetscSF)) 79d71ae5a4SJacob Faibussowitsch { 8095fce210SBarry Smith PetscFunctionBegin; 819566063dSJacob Faibussowitsch PetscCall(PetscSFInitializePackage()); 829566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscSFList, name, create)); 833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8495fce210SBarry Smith } 85