xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision df4cd43f92eaa320656440c40edb1046daee8f75)
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: `DMField`, `DMFieldRegisterDestroy()`
17 @*/
18 PetscErrorCode DMFieldRegisterAll(void)
19 {
20   PetscFunctionBegin;
21   if (DMFieldRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
22   DMFieldRegisterAllCalled = PETSC_TRUE;
23   PetscCall(DMFieldRegister(DMFIELDDA, DMFieldCreate_DA));
24   PetscCall(DMFieldRegister(DMFIELDDS, DMFieldCreate_DS));
25   PetscCall(DMFieldRegister(DMFIELDSHELL, DMFieldCreate_Shell));
26   PetscFunctionReturn(PETSC_SUCCESS);
27 }
28 
29 /*@C
30   DMFieldRegister  - Adds an implementation of the `DMField` object.
31 
32    Not collective
33 
34    Input Parameters:
35 +  name_impl - name of a new user-defined implementation
36 -  routine_create - routine to create method context
37 
38    Sample usage:
39 .vb
40    DMFieldRegister("my_impl",MyImplCreate);
41 .ve
42 
43    Then, this implementation can be chosen with the procedural interface via
44 $     DMFieldSetType(tagger,"my_impl")
45 
46    Level: advanced
47 
48    Note:
49    `DMFieldRegister()` may be called multiple times to add several user-defined implementations.
50 
51 .seealso: `DMField`, `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
52 @*/
53 PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField))
54 {
55   PetscFunctionBegin;
56   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
57   PetscFunctionReturn(PETSC_SUCCESS);
58 }
59