xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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
103da551e6SToby Isaac    DMFieldRegisterAll - Registers all the DMField implementations
113da551e6SToby Isaac 
123da551e6SToby Isaac    Not Collective
133da551e6SToby Isaac 
143da551e6SToby Isaac    Level: advanced
153da551e6SToby Isaac 
16db781477SPatrick Sanan .seealso: `DMFieldRegisterDestroy()`
173da551e6SToby Isaac @*/
18*d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegisterAll(void)
19*d71ae5a4SJacob 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
303da551e6SToby Isaac   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    Notes:
393da551e6SToby Isaac    DMFieldRegister() may be called multiple times to add several user-defined implementations.
403da551e6SToby Isaac 
413da551e6SToby Isaac    Sample usage:
423da551e6SToby Isaac .vb
433da551e6SToby Isaac    DMFieldRegister("my_impl",MyImplCreate);
443da551e6SToby Isaac .ve
453da551e6SToby Isaac 
463da551e6SToby Isaac    Then, this implementation can be chosen with the procedural interface via
473da551e6SToby Isaac $     DMFieldSetType(tagger,"my_impl")
483da551e6SToby Isaac 
493da551e6SToby Isaac    Level: advanced
503da551e6SToby Isaac 
51db781477SPatrick Sanan .seealso: `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
523da551e6SToby Isaac @*/
53*d71ae5a4SJacob Faibussowitsch PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField))
54*d71ae5a4SJacob Faibussowitsch {
553da551e6SToby Isaac   PetscFunctionBegin;
569566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
573da551e6SToby Isaac   PetscFunctionReturn(0);
583da551e6SToby Isaac }
59