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