Actual source code: taotermregi.c
1: #include <petsc/private/taoimpl.h>
3: PetscBool TaoTermRegisterAllCalled = PETSC_FALSE;
4: PetscFunctionList TaoTermList = NULL;
6: PETSC_INTERN PetscErrorCode TaoTermCreate_Callbacks(TaoTerm);
7: PETSC_INTERN PetscErrorCode TaoTermCreate_Shell(TaoTerm);
8: PETSC_INTERN PetscErrorCode TaoTermCreate_Sum(TaoTerm);
9: PETSC_INTERN PetscErrorCode TaoTermCreate_Halfl2squared(TaoTerm);
10: PETSC_INTERN PetscErrorCode TaoTermCreate_L1(TaoTerm);
11: PETSC_INTERN PetscErrorCode TaoTermCreate_Quadratic(TaoTerm);
13: /*@C
14: TaoTermRegister - Register an implementation of `TaoTerm`
16: Not Collective, No Fortran Support
18: Input Parameters:
19: + sname - name of a new user-defined term
20: - func - routine to create the context for the `TaoTermType`
22: Example Usage:
23: .vb
24: TaoTermRegister("my_term", MyTermCreate);
25: .ve
27: Then, your term can be chosen with the procedural interface via
28: $ TaoTermSetType(term, "my_term")
29: or at runtime via the option
30: $ -tao_term_type my_term
32: Level: advanced
34: Note:
35: `TaoTermRegister()` may be called multiple times to add multiple new `TaoTermType`.
37: .seealso: [](sec_tao_term), `TaoTerm`, `TaoTermSetType()`
38: @*/
39: PetscErrorCode TaoTermRegister(const char sname[], PetscErrorCode (*func)(TaoTerm))
40: {
41: PetscFunctionBegin;
42: PetscCall(TaoInitializePackage());
43: PetscCall(PetscFunctionListAdd(&TaoTermList, sname, (void (*)(void))func));
44: PetscFunctionReturn(PETSC_SUCCESS);
45: }
47: PETSC_INTERN PetscErrorCode TaoTermRegisterAll(void)
48: {
49: PetscFunctionBegin;
50: if (TaoTermRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
51: TaoTermRegisterAllCalled = PETSC_TRUE;
52: PetscCall(TaoTermRegister(TAOTERMCALLBACKS, TaoTermCreate_Callbacks));
53: PetscCall(TaoTermRegister(TAOTERMSHELL, TaoTermCreate_Shell));
54: PetscCall(TaoTermRegister(TAOTERMSUM, TaoTermCreate_Sum));
55: PetscCall(TaoTermRegister(TAOTERMHALFL2SQUARED, TaoTermCreate_Halfl2squared));
56: PetscCall(TaoTermRegister(TAOTERML1, TaoTermCreate_L1));
57: PetscCall(TaoTermRegister(TAOTERMQUADRATIC, TaoTermCreate_Quadratic));
58: PetscFunctionReturn(PETSC_SUCCESS);
59: }