xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
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
10*dce8aebaSBarry Smith    DMFieldRegisterAll - Registers all the `DMField` implementations
113da551e6SToby Isaac 
123da551e6SToby Isaac    Not Collective
133da551e6SToby Isaac 
143da551e6SToby Isaac    Level: advanced
153da551e6SToby Isaac 
16*dce8aebaSBarry Smith .seealso: `DMField`, `DMFieldRegisterDestroy()`
173da551e6SToby Isaac @*/
18d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegisterAll(void)
19d71ae5a4SJacob Faibussowitsch {
203da551e6SToby Isaac   PetscFunctionBegin;
213da551e6SToby Isaac   if (DMFieldRegisterAllCalled) PetscFunctionReturn(0);
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));
263da551e6SToby Isaac   PetscFunctionReturn(0);
273da551e6SToby Isaac }
283da551e6SToby Isaac 
293da551e6SToby Isaac /*@C
30*dce8aebaSBarry Smith   DMFieldRegister  - Adds an implementation of the `DMField` object.
313da551e6SToby Isaac 
323da551e6SToby Isaac    Not collective
333da551e6SToby Isaac 
343da551e6SToby Isaac    Input Parameters:
353da551e6SToby Isaac +  name_impl - name of a new user-defined implementation
363da551e6SToby Isaac -  routine_create - routine to create method context
373da551e6SToby Isaac 
383da551e6SToby Isaac    Sample 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
443da551e6SToby Isaac $     DMFieldSetType(tagger,"my_impl")
453da551e6SToby Isaac 
463da551e6SToby Isaac    Level: advanced
473da551e6SToby Isaac 
48*dce8aebaSBarry Smith    Note:
49*dce8aebaSBarry Smith    `DMFieldRegister()` may be called multiple times to add several user-defined implementations.
50*dce8aebaSBarry Smith 
51*dce8aebaSBarry Smith .seealso: `DMField`, `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
523da551e6SToby Isaac @*/
53d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField))
54d71ae5a4SJacob Faibussowitsch {
553da551e6SToby Isaac   PetscFunctionBegin;
569566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
573da551e6SToby Isaac   PetscFunctionReturn(0);
583da551e6SToby Isaac }
59