xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision 58d68138c660dfb4e9f5b03334792cd4f2ffd7cc)
1 #include <petsc/private/dmfieldimpl.h> /*I  "petscdmfield.h"  I*/
2 
3 PETSC_EXTERN PetscErrorCode DMFieldCreate_DA(DMField);
4 PETSC_EXTERN PetscErrorCode DMFieldCreate_DS(DMField);
5 PETSC_EXTERN PetscErrorCode DMFieldCreate_Shell(DMField);
6 
7 PetscFunctionList DMFieldList;
8 
9 /*@C
10    DMFieldRegisterAll - Registers all the DMField implementations
11 
12    Not Collective
13 
14    Level: advanced
15 
16 .seealso: `DMFieldRegisterDestroy()`
17 @*/
18 PetscErrorCode DMFieldRegisterAll(void) {
19   PetscFunctionBegin;
20   if (DMFieldRegisterAllCalled) PetscFunctionReturn(0);
21   DMFieldRegisterAllCalled = PETSC_TRUE;
22   PetscCall(DMFieldRegister(DMFIELDDA, DMFieldCreate_DA));
23   PetscCall(DMFieldRegister(DMFIELDDS, DMFieldCreate_DS));
24   PetscCall(DMFieldRegister(DMFIELDSHELL, DMFieldCreate_Shell));
25   PetscFunctionReturn(0);
26 }
27 
28 /*@C
29   DMFieldRegister  - Adds an implementation of the DMField object.
30 
31    Not collective
32 
33    Input Parameters:
34 +  name_impl - name of a new user-defined implementation
35 -  routine_create - routine to create method context
36 
37    Notes:
38    DMFieldRegister() may be called multiple times to add several user-defined implementations.
39 
40    Sample usage:
41 .vb
42    DMFieldRegister("my_impl",MyImplCreate);
43 .ve
44 
45    Then, this implementation can be chosen with the procedural interface via
46 $     DMFieldSetType(tagger,"my_impl")
47 
48    Level: advanced
49 
50 .seealso: `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
51 @*/
52 PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField)) {
53   PetscFunctionBegin;
54   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
55   PetscFunctionReturn(0);
56 }
57