Actual source code: taoshell.c

      1: #include <petsc/private/taoimpl.h>

      3: typedef struct _n_TaoShell Tao_Shell;

      5: struct _n_TaoShell {
      6:   PetscErrorCode (*solve)(Tao);
      7:   void *ctx;
      8: };

     10: /*@C
     11:   TaoShellSetSolve - Sets routine to apply as solver

     13:   Logically Collective

     15:   Input Parameters:
     16: + tao   - the nonlinear solver context
     17: - solve - the application-provided solver routine

     19:   Calling sequence of `solve`:
     20: . tao - the optimizer, get the application context with `TaoShellGetContext()`

     22:   Level: advanced

     24: .seealso: `Tao`, `TAOSHELL`, `TaoShellSetContext()`, `TaoShellGetContext()`
     25: @*/
     26: PetscErrorCode TaoShellSetSolve(Tao tao, PetscErrorCode (*solve)(Tao))
     27: {
     28:   Tao_Shell *shell = (Tao_Shell *)tao->data;

     30:   PetscFunctionBegin;
     32:   shell->solve = solve;
     33:   PetscFunctionReturn(PETSC_SUCCESS);
     34: }

     36: /*@
     37:   TaoShellGetContext - Returns the user-provided context associated with a `TAOSHELL`

     39:   Not Collective

     41:   Input Parameter:
     42: . tao - should have been created with `TaoSetType`(tao,`TAOSHELL`);

     44:   Output Parameter:
     45: . ctx - the user provided context

     47:   Level: advanced

     49:   Note:
     50:   This routine is intended for use within various shell routines

     52: .seealso: `Tao`, `TAOSHELL`, `TaoShellSetContext()`
     53: @*/
     54: PetscErrorCode TaoShellGetContext(Tao tao, void *ctx)
     55: {
     56:   PetscBool flg;

     58:   PetscFunctionBegin;
     60:   PetscAssertPointer(ctx, 2);
     61:   PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOSHELL, &flg));
     62:   if (!flg) *(void **)ctx = NULL;
     63:   else *(void **)ctx = ((Tao_Shell *)tao->data)->ctx;
     64:   PetscFunctionReturn(PETSC_SUCCESS);
     65: }

     67: /*@
     68:   TaoShellSetContext - sets the context for a `TAOSHELL`

     70:   Logically Collective

     72:   Input Parameters:
     73: + tao - the shell Tao
     74: - ctx - the context

     76:   Level: advanced

     78:   Fortran Notes:
     79:   The context can only be an integer or a `PetscObject`

     81: .seealso: `Tao`, `TAOSHELL`, `TaoShellGetContext()`
     82: @*/
     83: PetscErrorCode TaoShellSetContext(Tao tao, void *ctx)
     84: {
     85:   Tao_Shell *shell = (Tao_Shell *)tao->data;
     86:   PetscBool  flg;

     88:   PetscFunctionBegin;
     90:   PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOSHELL, &flg));
     91:   if (flg) shell->ctx = ctx;
     92:   PetscFunctionReturn(PETSC_SUCCESS);
     93: }

     95: static PetscErrorCode TaoSolve_Shell(Tao tao)
     96: {
     97:   Tao_Shell *shell = (Tao_Shell *)tao->data;

     99:   PetscFunctionBegin;
    100:   PetscCheck(shell->solve, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Must call TaoShellSetSolve() first");
    101:   tao->reason = TAO_CONVERGED_USER;
    102:   PetscCall((*shell->solve)(tao));
    103:   PetscFunctionReturn(PETSC_SUCCESS);
    104: }

    106: static PetscErrorCode TaoDestroy_Shell(Tao tao)
    107: {
    108:   PetscFunctionBegin;
    109:   PetscCall(PetscFree(tao->data));
    110:   PetscFunctionReturn(PETSC_SUCCESS);
    111: }

    113: static PetscErrorCode TaoSetUp_Shell(Tao tao)
    114: {
    115:   PetscFunctionBegin;
    116:   PetscFunctionReturn(PETSC_SUCCESS);
    117: }

    119: static PetscErrorCode TaoSetFromOptions_Shell(Tao tao, PetscOptionItems *PetscOptionsObject)
    120: {
    121:   PetscFunctionBegin;
    122:   PetscFunctionReturn(PETSC_SUCCESS);
    123: }

    125: static PetscErrorCode TaoView_Shell(Tao tao, PetscViewer viewer)
    126: {
    127:   PetscFunctionBegin;
    128:   PetscFunctionReturn(PETSC_SUCCESS);
    129: }

    131: /*MC
    132:   TAOSHELL - a user provided optimizer

    134:    Level: advanced

    136: .seealso: `TaoCreate()`, `Tao`, `TaoSetType()`, `TaoType`
    137: M*/
    138: PETSC_EXTERN PetscErrorCode TaoCreate_Shell(Tao tao)
    139: {
    140:   Tao_Shell *shell;

    142:   PetscFunctionBegin;
    143:   tao->ops->destroy        = TaoDestroy_Shell;
    144:   tao->ops->setup          = TaoSetUp_Shell;
    145:   tao->ops->setfromoptions = TaoSetFromOptions_Shell;
    146:   tao->ops->view           = TaoView_Shell;
    147:   tao->ops->solve          = TaoSolve_Shell;

    149:   PetscCall(TaoParametersInitialize(tao));

    151:   PetscCall(PetscNew(&shell));
    152:   tao->data = (void *)shell;
    153:   PetscFunctionReturn(PETSC_SUCCESS);
    154: }