xref: /petsc/src/dm/field/interface/dmfieldregi.c (revision 503c0ea9b45bcfbcebbb1ea5341243bbc69f0bea)
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 {
20   PetscFunctionBegin;
21   if (DMFieldRegisterAllCalled) PetscFunctionReturn(0);
22   DMFieldRegisterAllCalled = PETSC_TRUE;
23   PetscCall(DMFieldRegister(DMFIELDDA,    DMFieldCreate_DA));
24   PetscCall(DMFieldRegister(DMFIELDDS,    DMFieldCreate_DS));
25   PetscCall(DMFieldRegister(DMFIELDSHELL, DMFieldCreate_Shell));
26   PetscFunctionReturn(0);
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    Notes:
39    DMFieldRegister() may be called multiple times to add several user-defined implementations.
40 
41    Sample usage:
42 .vb
43    DMFieldRegister("my_impl",MyImplCreate);
44 .ve
45 
46    Then, this implementation can be chosen with the procedural interface via
47 $     DMFieldSetType(tagger,"my_impl")
48 
49    Level: advanced
50 
51 .seealso: DMFieldRegisterAll(), DMFieldRegisterDestroy()
52 @*/
53 PetscErrorCode  DMFieldRegister(const char sname[],PetscErrorCode (*function)(DMField))
54 {
55   PetscFunctionBegin;
56   PetscCall(PetscFunctionListAdd(&DMFieldList,sname,function));
57   PetscFunctionReturn(0);
58 }
59