Actual source code: snesshell.c
  1: #include <petsc/private/snesimpl.h>
  3: typedef struct {PetscErrorCode (*solve)(SNES,Vec);void *ctx;} SNES_Shell;
  5: /*@C
  6:    SNESShellSetSolve - Sets routine to apply as solver
  8:    Logically Collective on SNES
 10:    Input Parameters:
 11: +  snes - the nonlinear solver context
 12: -  apply - the application-provided solver routine
 14:    Calling sequence of solve:
 15: .vb
 16:    PetscErrorCode apply (SNES snes,Vec xout)
 17: .ve
 19: +  snes - the preconditioner, get the application context with SNESShellGetContext()
 20: -  xout - solution vector
 22:    Notes:
 23:     the function MUST return an error code of 0 on success and nonzero on failure.
 25:    Level: advanced
 27: .seealso: SNESSHELL, SNESShellSetContext(), SNESShellGetContext()
 28: @*/
 29: PetscErrorCode  SNESShellSetSolve(SNES snes,PetscErrorCode (*solve)(SNES,Vec))
 30: {
 35:   PetscTryMethod(snes,"SNESShellSetSolve_C",(SNES,PetscErrorCode (*)(SNES,Vec)),(snes,solve));
 36:   return(0);
 37: }
 39: PetscErrorCode SNESReset_Shell(SNES snes)
 40: {
 42:   return(0);
 43: }
 45: PetscErrorCode SNESDestroy_Shell(SNES snes)
 46: {
 50:   SNESReset_Shell(snes);
 51:   PetscFree(snes->data);
 52:   return(0);
 53: }
 55: PetscErrorCode SNESSetUp_Shell(SNES snes)
 56: {
 58:   return(0);
 59: }
 61: PetscErrorCode SNESSetFromOptions_Shell(PetscOptionItems *PetscOptionsObject,SNES snes)
 62: {
 66:   PetscOptionsHead(PetscOptionsObject,"SNES Shell options");
 67:   return(0);
 68: }
 70: PetscErrorCode SNESView_Shell(SNES snes, PetscViewer viewer)
 71: {
 73:   return(0);
 74: }
 76: /*@
 77:     SNESShellGetContext - Returns the user-provided context associated with a shell SNES
 79:     Not Collective
 81:     Input Parameter:
 82: .   snes - should have been created with SNESSetType(snes,SNESSHELL);
 84:     Output Parameter:
 85: .   ctx - the user provided context
 87:     Level: advanced
 89:     Notes:
 90:     This routine is intended for use within various shell routines
 92: .seealso: SNESCreateShell(), SNESShellSetContext()
 93: @*/
 94: PetscErrorCode  SNESShellGetContext(SNES snes,void **ctx)
 95: {
 97:   PetscBool      flg;
102:   PetscObjectTypeCompare((PetscObject)snes,SNESSHELL,&flg);
103:   if (!flg) *ctx = NULL;
104:   else      *ctx = ((SNES_Shell*)(snes->data))->ctx;
105:   return(0);
106: }
108: /*@
109:     SNESShellSetContext - sets the context for a shell SNES
111:    Logically Collective on SNES
113:     Input Parameters:
114: +   snes - the shell SNES
115: -   ctx - the context
117:    Level: advanced
119:    Fortran Notes:
120:     The context can only be an integer or a PetscObject
121:       unfortunately it cannot be a Fortran array or derived type.
124: .seealso: SNESCreateShell(), SNESShellGetContext()
125: @*/
126: PetscErrorCode  SNESShellSetContext(SNES snes,void *ctx)
127: {
128:   SNES_Shell     *shell = (SNES_Shell*)snes->data;
130:   PetscBool      flg;
134:   PetscObjectTypeCompare((PetscObject)snes,SNESSHELL,&flg);
135:   if (flg) shell->ctx = ctx;
136:   return(0);
137: }
139: PetscErrorCode SNESSolve_Shell(SNES snes)
140: {
141:   SNES_Shell     *shell = (SNES_Shell*) snes->data;
145:   if (!shell->solve) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_WRONGSTATE,"Must call SNESShellSetSolve() first");
146:   snes->reason = SNES_CONVERGED_ITS;
147:   (*shell->solve)(snes,snes->vec_sol);
148:   return(0);
149: }
151: PetscErrorCode  SNESShellSetSolve_Shell(SNES snes,PetscErrorCode (*solve)(SNES,Vec))
152: {
153:   SNES_Shell *shell = (SNES_Shell*)snes->data;
156:   shell->solve = solve;
157:   return(0);
158: }
160: /*MC
161:   SNESSHELL - a user provided nonlinear solver
163:    Level: advanced
165: .seealso: SNESCreate(), SNES, SNESSetType(), SNESType (for list of available types)
166: M*/
168: PETSC_EXTERN PetscErrorCode SNESCreate_Shell(SNES snes)
169: {
170:   SNES_Shell     *shell;
174:   snes->ops->destroy        = SNESDestroy_Shell;
175:   snes->ops->setup          = SNESSetUp_Shell;
176:   snes->ops->setfromoptions = SNESSetFromOptions_Shell;
177:   snes->ops->view           = SNESView_Shell;
178:   snes->ops->solve          = SNESSolve_Shell;
179:   snes->ops->reset          = SNESReset_Shell;
181:   snes->usesksp = PETSC_FALSE;
182:   snes->usesnpc = PETSC_FALSE;
184:   snes->alwayscomputesfinalresidual = PETSC_FALSE;
186:   PetscNewLog(snes,&shell);
187:   snes->data = (void*) shell;
188:   PetscObjectComposeFunction((PetscObject)snes,"SNESShellSetSolve_C",SNESShellSetSolve_Shell);
189:   return(0);
190: }