Date: 2013-07-02T14:49:33+00:00

Actual source code: snesshell.c
petsc-3.4.2 2013-07-02

      1: #include <petsc-private/snesimpl.h>             /*I   "petscsnes.h"   I*/

      3: typedef struct {PetscErrorCode (*solve)(SNES,Vec);void *ctx;} SNES_Shell;

      7: /*@C
      8:    SNESShellSetSolve - Sets routine to apply as solver

     10:    Logically Collective on SNES

     12:    Input Parameters:
     13: +  snes - the nonlinear solver context
     14: -  apply - the application-provided solver routine

     16:    Calling sequence of solve:
     17: .vb
     18:    PetscErrorCode apply (SNES snes,Vec xout)
     19: .ve

     21: +  snes - the preconditioner, get the application context with SNESShellGetContext()
     22: -  xout - solution vector

     24:    Notes: the function MUST return an error code of 0 on success and nonzero on failure.

     26:    Level: advanced

     28: .keywords: SNES, shell, set, apply, user-provided

     30: .seealso: SNESSHELL, SNESShellSetContext(), SNESShellGetContext()
     31: @*/
     32: PetscErrorCode  SNESShellSetSolve(SNES snes,PetscErrorCode (*solve)(SNES,Vec))
     33: {

     38:   PetscTryMethod(snes,"SNESShellSetSolve_C",(SNES,PetscErrorCode (*)(SNES,Vec)),(snes,solve));
     39:   return(0);
     40: }

     44: PetscErrorCode SNESReset_Shell(SNES snes)
     45: {
     47:   return(0);
     48: }

     52: PetscErrorCode SNESDestroy_Shell(SNES snes)
     53: {

     57:   SNESReset_Shell(snes);
     58:   PetscFree(snes->data);
     59:   return(0);
     60: }

     64: PetscErrorCode SNESSetUp_Shell(SNES snes)
     65: {
     67:   return(0);
     68: }

     72: PetscErrorCode SNESSetFromOptions_Shell(SNES snes)
     73: {

     77:   PetscOptionsHead("SNES Shell options");
     78:   return(0);
     79: }

     83: PetscErrorCode SNESView_Shell(SNES snes, PetscViewer viewer)
     84: {
     86:   return(0);
     87: }

     91: /*@
     92:     SNESShellGetContext - Returns the user-provided context associated with a shell SNES

     94:     Not Collective

     96:     Input Parameter:
     97: .   snes - should have been created with SNESSetType(snes,SNESSHELL);

     99:     Output Parameter:
    100: .   ctx - the user provided context

    102:     Level: advanced

    104:     Notes:
    105:     This routine is intended for use within various shell routines

    107: .keywords: SNES, shell, get, context

    109: .seealso: SNESCreateShell(), SNESShellSetContext()
    110: @*/
    111: PetscErrorCode  SNESShellGetContext(SNES snes,void **ctx)
    112: {
    114:   PetscBool      flg;

    119:   PetscObjectTypeCompare((PetscObject)snes,SNESSHELL,&flg);
    120:   if (!flg) *ctx = 0;
    121:   else      *ctx = ((SNES_Shell*)(snes->data))->ctx;
    122:   return(0);
    123: }

    127: /*@
    128:     SNESShellSetContext - sets the context for a shell SNES

    130:    Logically Collective on SNES

    132:     Input Parameters:
    133: +   snes - the shell SNES
    134: -   ctx - the context

    136:    Level: advanced

    138:    Fortran Notes: The context can only be an integer or a PetscObject
    139:       unfortunately it cannot be a Fortran array or derived type.

    142: .seealso: SNESCreateShell(), SNESShellGetContext()
    143: @*/
    144: PetscErrorCode  SNESShellSetContext(SNES snes,void *ctx)
    145: {
    146:   SNES_Shell     *shell = (SNES_Shell*)snes->data;
    148:   PetscBool      flg;

    152:   PetscObjectTypeCompare((PetscObject)snes,SNESSHELL,&flg);
    153:   if (flg) shell->ctx = ctx;
    154:   return(0);
    155: }

    159: PetscErrorCode SNESSolve_Shell(SNES snes)
    160: {
    161:   SNES_Shell     *shell = (SNES_Shell*) snes->data;

    165:   if (!shell->solve) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_ARG_WRONGSTATE,"Must call SNESShellSetSolve() first");
    166:   snes->reason = SNES_CONVERGED_ITS;
    167:   (*shell->solve)(snes,snes->vec_sol);
    168:   return(0);
    169: }

    173: PetscErrorCode  SNESShellSetSolve_Shell(SNES snes,PetscErrorCode (*solve)(SNES,Vec))
    174: {
    175:   SNES_Shell *shell = (SNES_Shell*)snes->data;

    178:   shell->solve = solve;
    179:   return(0);
    180: }

    182: /*MC
    183:   SNESSHELL - a user provided nonlinear solver

    185:    Level: advanced

    187: .seealso: SNESCreate(), SNES, SNESSetType(), SNESType (for list of available types)
    188: M*/

    192: PETSC_EXTERN PetscErrorCode SNESCreate_Shell(SNES snes)
    193: {
    194:   SNES_Shell     *shell;

    198:   snes->ops->destroy        = SNESDestroy_Shell;
    199:   snes->ops->setup          = SNESSetUp_Shell;
    200:   snes->ops->setfromoptions = SNESSetFromOptions_Shell;
    201:   snes->ops->view           = SNESView_Shell;
    202:   snes->ops->solve          = SNESSolve_Shell;
    203:   snes->ops->reset          = SNESReset_Shell;

    205:   snes->usesksp = PETSC_FALSE;
    206:   snes->usespc  = PETSC_FALSE;

    208:   PetscNewLog(snes, SNES_Shell, &shell);
    209:   snes->data = (void*) shell;
    210:   PetscObjectComposeFunction((PetscObject)snes,"SNESShellSetSolve_C",SNESShellSetSolve_Shell);
    211:   return(0);
    212: }