PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc func, void *ctx)Not Collective
linesearch | - SNESLineSearch context | |
func | - function implementing the linesearch shell. | |
ctx | - context for func |
linesearch | - the linesearch instance | |
ctx | - the above mentioned context |
PetscErrorCode shellfunc(SNESLineSearch linesearch,void * ctx)
{
Vec X,Y,F,W,G;
SNES snes;
PetscFunctionBegin;
PetscCall(SNESLineSearchGetSNES(linesearch,&snes));
PetscCall(SNESLineSearchSetReason(linesearch,SNES_LINESEARCH_SUCCEEDED));
PetscCall(SNESLineSearchGetVecs(linesearch,&X,&F,&Y,&W,&G));
.. determine lambda using W and G as work vecs..
PetscCall(VecAXPY(X,-lambda,Y));
PetscCall(SNESComputeFunction(snes,X,F));
PetscCall(SNESLineSearchComputeNorms(linesearch));
PetscFunctionReturn(0);
}
...
PetscCall(SNESGetLineSearch(snes, &linesearch));
PetscCall(SNESLineSearchSetType(linesearch, SNESLINESEARCHSHELL));
PetscCall(SNESLineSearchShellSetUserFunc(linesearch, shellfunc, NULL));
.seealso: SNESLineSearchShellGetUserFunc(), SNESLINESEARCHSHELL