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