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: }