Actual source code: taoshell.c
petsc-3.14.6 2021-03-30
1: #include <petsc/private/taoimpl.h>
3: typedef struct _n_TaoShell Tao_Shell;
5: struct _n_TaoShell
6: {
7: PetscErrorCode (*solve)(Tao);
8: void *ctx;
9: };
11: /*@C
12: TaoShellSetSolve - Sets routine to apply as solver
14: Logically Collective on Tao
16: Input Parameters:
17: + tao - the nonlinear solver context
18: - solve - the application-provided solver routine
20: Calling sequence of solve:
21: .vb
22: PetscErrorCode solve (Tao tao)
23: .ve
25: . tao - the optimizer, get the application context with TaoShellGetContext()
27: Notes:
28: the function MUST return an error code of 0 on success and nonzero on failure.
30: Level: advanced
32: .seealso: TAOSHELL, TaoShellSetContext(), TaoShellGetContext()
33: @*/
34: PetscErrorCode TaoShellSetSolve(Tao tao, PetscErrorCode (*solve) (Tao))
35: {
36: Tao_Shell *shell = (Tao_Shell*)tao->data;
40: shell->solve = solve;
41: return(0);
42: }
44: /*@
45: TaoShellGetContext - Returns the user-provided context associated with a shell Tao
47: Not Collective
49: Input Parameter:
50: . tao - should have been created with TaoSetType(tao,TAOSHELL);
52: Output Parameter:
53: . ctx - the user provided context
55: Level: advanced
57: Notes:
58: This routine is intended for use within various shell routines
60: .seealso: TaoCreateShell(), TaoShellSetContext()
61: @*/
62: PetscErrorCode TaoShellGetContext(Tao tao,void **ctx)
63: {
65: PetscBool flg;
70: PetscObjectTypeCompare((PetscObject)tao,TAOSHELL,&flg);
71: if (!flg) *ctx = NULL;
72: else *ctx = ((Tao_Shell*)(tao->data))->ctx;
73: return(0);
74: }
76: /*@
77: TaoShellSetContext - sets the context for a shell Tao
79: Logically Collective on Tao
81: Input Parameters:
82: + tao - the shell Tao
83: - ctx - the context
85: Level: advanced
87: Fortran Notes:
88: The context can only be an integer or a PetscObject
89: unfortunately it cannot be a Fortran array or derived type.
92: .seealso: TaoCreateShell(), TaoShellGetContext()
93: @*/
94: PetscErrorCode TaoShellSetContext(Tao tao,void *ctx)
95: {
96: Tao_Shell *shell = (Tao_Shell*)tao->data;
98: PetscBool flg;
102: PetscObjectTypeCompare((PetscObject)tao,TAOSHELL,&flg);
103: if (flg) shell->ctx = ctx;
104: return(0);
105: }
107: static PetscErrorCode TaoSolve_Shell(Tao tao)
108: {
109: Tao_Shell *shell = (Tao_Shell*)tao->data;
110: PetscErrorCode ierr;
113: if (!shell->solve) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"Must call TaoShellSetSolve() first");
114: tao->reason = TAO_CONVERGED_USER;
115: (*(shell->solve)) (tao);
116: return(0);
117: }
119: PetscErrorCode TaoDestroy_Shell(Tao tao)
120: {
124: PetscFree(tao->data);
125: return(0);
126: }
128: PetscErrorCode TaoSetUp_Shell(Tao tao)
129: {
131: return(0);
132: }
134: PetscErrorCode TaoSetFromOptions_Shell(PetscOptionItems *PetscOptionsObject,Tao tao)
135: {
137: return(0);
138: }
140: PetscErrorCode TaoView_Shell(Tao tao, PetscViewer viewer)
141: {
143: return(0);
144: }
146: /*MC
147: TAOSHELL - a user provided nonlinear solver
149: Level: advanced
151: .seealso: TaoCreate(), Tao, TaoSetType(), TaoType (for list of available types)
152: M*/
153: PETSC_EXTERN PetscErrorCode TaoCreate_Shell(Tao tao)
154: {
155: Tao_Shell *shell;
159: tao->ops->destroy = TaoDestroy_Shell;
160: tao->ops->setup = TaoSetUp_Shell;
161: tao->ops->setfromoptions = TaoSetFromOptions_Shell;
162: tao->ops->view = TaoView_Shell;
163: tao->ops->solve = TaoSolve_Shell;
165: PetscNewLog(tao,&shell);
166: tao->data = (void*)shell;
167: return(0);
168: }