xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision e0b7e82fd3cf27fce84cc3e37e8d70a5c36a2d4e)
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 $     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