xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision 174dc0c8cee294b82b85e4dd3b331b29396264fc)
13da551e6SToby Isaac #include <petsc/private/dmfieldimpl.h> /*I  "petscdmfield.h"  I*/
23da551e6SToby Isaac 
33da551e6SToby Isaac PETSC_EXTERN PetscErrorCode DMFieldCreate_DA(DMField);
43da551e6SToby Isaac PETSC_EXTERN PetscErrorCode DMFieldCreate_DS(DMField);
53da551e6SToby Isaac PETSC_EXTERN PetscErrorCode DMFieldCreate_Shell(DMField);
63da551e6SToby Isaac 
73da551e6SToby Isaac PetscFunctionList DMFieldList;
83da551e6SToby Isaac 
93da551e6SToby Isaac /*@C
10dce8aebaSBarry Smith   DMFieldRegisterAll - Registers all the `DMField` implementations
113da551e6SToby Isaac 
123da551e6SToby Isaac   Not Collective
133da551e6SToby Isaac 
143da551e6SToby Isaac   Level: advanced
153da551e6SToby Isaac 
16dce8aebaSBarry Smith .seealso: `DMField`, `DMFieldRegisterDestroy()`
173da551e6SToby Isaac @*/
DMFieldRegisterAll(void)18d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegisterAll(void)
19d71ae5a4SJacob Faibussowitsch {
203da551e6SToby Isaac   PetscFunctionBegin;
213ba16761SJacob Faibussowitsch   if (DMFieldRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
223da551e6SToby Isaac   DMFieldRegisterAllCalled = PETSC_TRUE;
239566063dSJacob Faibussowitsch   PetscCall(DMFieldRegister(DMFIELDDA, DMFieldCreate_DA));
249566063dSJacob Faibussowitsch   PetscCall(DMFieldRegister(DMFIELDDS, DMFieldCreate_DS));
259566063dSJacob Faibussowitsch   PetscCall(DMFieldRegister(DMFIELDSHELL, DMFieldCreate_Shell));
263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
273da551e6SToby Isaac }
283da551e6SToby Isaac 
293da551e6SToby Isaac /*@C
30dce8aebaSBarry Smith   DMFieldRegister  - Adds an implementation of the `DMField` object.
313da551e6SToby Isaac 
32cc4c1da9SBarry Smith   Not collective, No Fortran Support
333da551e6SToby Isaac 
343da551e6SToby Isaac   Input Parameters:
352fe279fdSBarry Smith + sname    - name of a new user-defined implementation
362fe279fdSBarry Smith - function - routine to create method context
373da551e6SToby Isaac 
3860225df5SJacob Faibussowitsch   Example Usage:
393da551e6SToby Isaac .vb
403da551e6SToby Isaac    DMFieldRegister("my_impl",MyImplCreate);
413da551e6SToby Isaac .ve
423da551e6SToby Isaac 
433da551e6SToby Isaac   Then, this implementation can be chosen with the procedural interface via
44*b44f4de4SBarry Smith .vb
45*b44f4de4SBarry Smith   DMFieldSetType(tagger, "my_impl")
46*b44f4de4SBarry Smith .ve
473da551e6SToby Isaac 
483da551e6SToby Isaac   Level: advanced
493da551e6SToby Isaac 
50dce8aebaSBarry Smith   Note:
51dce8aebaSBarry Smith   `DMFieldRegister()` may be called multiple times to add several user-defined implementations.
52dce8aebaSBarry Smith 
53dce8aebaSBarry Smith .seealso: `DMField`, `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
543da551e6SToby Isaac @*/
DMFieldRegister(const char sname[],PetscErrorCode (* function)(DMField))55d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField))
56d71ae5a4SJacob Faibussowitsch {
573da551e6SToby Isaac   PetscFunctionBegin;
589566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
603da551e6SToby Isaac }
61