xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision 2ff79c18c26c94ed8cb599682f680f231dca6444)
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, No Fortran Support
33 
34   Input Parameters:
35 + sname    - name of a new user-defined implementation
36 - function - routine to create method context
37 
38   Example Usage:
39 .vb
40    DMFieldRegister("my_impl",MyImplCreate);
41 .ve
42 
43   Then, this implementation can be chosen with the procedural interface via
44 .vb
45   DMFieldSetType(tagger, "my_impl")
46 .ve
47 
48   Level: advanced
49 
50   Note:
51   `DMFieldRegister()` may be called multiple times to add several user-defined implementations.
52 
53 .seealso: `DMField`, `DMFieldRegisterAll()`, `DMFieldRegisterDestroy()`
54 @*/
55 PetscErrorCode DMFieldRegister(const char sname[], PetscErrorCode (*function)(DMField))
56 {
57   PetscFunctionBegin;
58   PetscCall(PetscFunctionListAdd(&DMFieldList, sname, function));
59   PetscFunctionReturn(PETSC_SUCCESS);
60 }
61