1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> 2b45d2f2cSJed Brown #include <petsc-private/snesimpl.h> 36a388c36SPeter Brune 4f40b411bSPeter Brune 56a388c36SPeter Brune typedef struct { 6f1c6b773SPeter Brune SNESLineSearchUserFunc func; 76a388c36SPeter Brune void *ctx; 8f1c6b773SPeter Brune } SNESLineSearch_Shell; 96a388c36SPeter Brune 106a388c36SPeter Brune #undef __FUNCT__ 11f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellSetUserFunc" 12f40b411bSPeter Brune /*@C 13f1c6b773SPeter Brune SNESLineSearchShellSetUserFunc - Sets the user function for the SNESLineSearch Shell implementation. 14f40b411bSPeter Brune 15f40b411bSPeter Brune Not Collective 16f40b411bSPeter Brune 17cd7522eaSPeter Brune Input Parameters: 18cd7522eaSPeter Brune + linesearch - SNESLineSearch context 19cd7522eaSPeter Brune . func - function implementing the linesearch shell. 20cd7522eaSPeter Brune - ctx - context for func 21cd7522eaSPeter Brune 22cd7522eaSPeter Brune Calling sequence of func: 23cd7522eaSPeter Brune + linesearch - the linesearch instance 24cd7522eaSPeter Brune - ctx - the above mentioned context 25cd7522eaSPeter Brune 26cd7522eaSPeter Brune Usage: 27cd7522eaSPeter Brune 28cd7522eaSPeter Brune $ PetscErrorCode shellfunc(SNESLineSearch linesearch, void * ctx) { 29*78bcb3b5SPeter Brune $ Vec X, Y, F, W, G; 30*78bcb3b5SPeter Brune $ SNES snes; 31cd7522eaSPeter Brune $ PetscFunctionBegin; 32*78bcb3b5SPeter Brune $ ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 33cd7522eaSPeter Brune $ ierr = SNESLineSearchSetSuccess(linesearch, PETSC_TRUE);CHKERRQ(ierr); 34*78bcb3b5SPeter Brune $ ierr = SNESLineSearchGetVecs(linesearch, X, Y, F, W, G);CHKERRQ(ierr); 35*78bcb3b5SPeter Brune $ .. determine lambda using W and G as work vecs.. 36*78bcb3b5SPeter Brune $ ierr = VecAXPY(X, -lambda, Y);CHKERRQ(ierr); 37*78bcb3b5SPeter Brune $ ierr = SNESComputeFunction(snes, X, F);CHKERRQ(ierr); 38cd7522eaSPeter Brune $ ierr = SNESLineSearchComputeNorms(linesearch);CHKERRQ(ierr); 39cd7522eaSPeter Brune $ PetscFunctionReturn(0); 40cd7522eaSPeter Brune $ } 41cd7522eaSPeter Brune $ 42cd7522eaSPeter Brune $ ... 43cd7522eaSPeter Brune $ 44cd7522eaSPeter Brune $ ierr = SNESGetSNESLineSearch(snes, &linesearch);CHKERRQ(ierr); 45cd7522eaSPeter Brune $ ierr = SNESLineSearchSetType(linesearch, SNES_LINESEARCH_SHELL);CHKERRQ(ierr); 46cd7522eaSPeter Brune $ ierr = SNESLineSearchShellSetUserFunc(linesearch, shellfunc, PETSC_NULL);CHKERRQ(ierr); 47cd7522eaSPeter Brune 48f40b411bSPeter Brune Level: advanced 49f40b411bSPeter Brune 50*78bcb3b5SPeter Brune .keywords: SNESLineSearch, Shell, user, function, set 51f40b411bSPeter Brune 52*78bcb3b5SPeter Brune .seealso: SNESLineSearchShellGetUserFunc(), SNES_LINESEARCH_SHELL 53f40b411bSPeter Brune @*/ 54f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc func, void *ctx) { 556a388c36SPeter Brune 566a388c36SPeter Brune PetscErrorCode ierr; 576a388c36SPeter Brune PetscBool flg; 58f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 596a388c36SPeter Brune PetscFunctionBegin; 60f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1); 61f1c6b773SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&flg);CHKERRQ(ierr); 626a388c36SPeter Brune if (flg) { 636a388c36SPeter Brune shell->ctx = ctx; 649e764e56SPeter Brune shell->func = func; 656a388c36SPeter Brune } 666a388c36SPeter Brune PetscFunctionReturn(0); 676a388c36SPeter Brune } 686a388c36SPeter Brune 696a388c36SPeter Brune 706a388c36SPeter Brune #undef __FUNCT__ 71f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellGetUserFunc" 72f40b411bSPeter Brune /*@C 73f1c6b773SPeter Brune SNESLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 74f40b411bSPeter Brune 75f40b411bSPeter Brune Not Collective 76f40b411bSPeter Brune 77f40b411bSPeter Brune Level: advanced 78f40b411bSPeter Brune 79*78bcb3b5SPeter Brune .keywords: SNESLineSearch, get, Shell, user, function 80f40b411bSPeter Brune 81f1c6b773SPeter Brune .seealso: SNESLineSearchShellSetUserFunc() 82f40b411bSPeter Brune @*/ 83f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellGetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc *func, void **ctx) { 846a388c36SPeter Brune 856a388c36SPeter Brune PetscErrorCode ierr; 866a388c36SPeter Brune PetscBool flg; 87f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 886a388c36SPeter Brune PetscFunctionBegin; 89f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1); 906a388c36SPeter Brune if (func) PetscValidPointer(func,2); 916a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 92f1c6b773SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&flg);CHKERRQ(ierr); 936a388c36SPeter Brune if (flg) { 946a388c36SPeter Brune *ctx = shell->ctx; 956a388c36SPeter Brune *func = shell->func; 966a388c36SPeter Brune } 976a388c36SPeter Brune PetscFunctionReturn(0); 986a388c36SPeter Brune } 996a388c36SPeter Brune 1006a388c36SPeter Brune 1016a388c36SPeter Brune #undef __FUNCT__ 102f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply_Shell" 103f1c6b773SPeter Brune static PetscErrorCode SNESLineSearchApply_Shell(SNESLineSearch linesearch) 1046a388c36SPeter Brune { 105f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 1066a388c36SPeter Brune PetscErrorCode ierr; 1076a388c36SPeter Brune 1086a388c36SPeter Brune PetscFunctionBegin; 1096a388c36SPeter Brune 1106a388c36SPeter Brune /* apply the user function */ 1116a388c36SPeter Brune if (shell->func) { 1126a388c36SPeter Brune ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 1136a388c36SPeter Brune } else { 114f1c6b773SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "SNESLineSearchShell needs to have a shell function set with SNESLineSearchShellSetUserFunc"); 1156a388c36SPeter Brune } 1166a388c36SPeter Brune PetscFunctionReturn(0); 1176a388c36SPeter Brune } 1186a388c36SPeter Brune 1196a388c36SPeter Brune #undef __FUNCT__ 120f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy_Shell" 121f1c6b773SPeter Brune static PetscErrorCode SNESLineSearchDestroy_Shell(SNESLineSearch linesearch) 1226a388c36SPeter Brune { 123f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 1246a388c36SPeter Brune PetscErrorCode ierr; 1256a388c36SPeter Brune 1266a388c36SPeter Brune PetscFunctionBegin; 1276a388c36SPeter Brune ierr = PetscFree(shell);CHKERRQ(ierr); 1286a388c36SPeter Brune PetscFunctionReturn(0); 1296a388c36SPeter Brune } 1306a388c36SPeter Brune 1316a388c36SPeter Brune #undef __FUNCT__ 132f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate_Shell" 133954494b2SJed Brown /*MC 134954494b2SJed Brown 135f1c6b773SPeter Brune SNES_LINESEARCH_SHELL - Provides context for a user-provided line search routine. 136954494b2SJed Brown 137f1c6b773SPeter Brune The user routine has one argument, the SNESLineSearch context. The user uses the interface to 138954494b2SJed Brown extract line search parameters and set them accordingly when the computation is finished. 139954494b2SJed Brown 140cd7522eaSPeter Brune Any of the other line searches may serve as a guide to how this is to be done. There is also a basic 141cd7522eaSPeter Brune template in the documentation for SNESLineSearchShellSetUserFunc(). 142954494b2SJed Brown 143954494b2SJed Brown Level: advanced 144954494b2SJed Brown 145954494b2SJed Brown M*/ 146f1c6b773SPeter Brune PETSC_EXTERN_C PetscErrorCode SNESLineSearchCreate_Shell(SNESLineSearch linesearch) 1476a388c36SPeter Brune { 1486a388c36SPeter Brune 149f1c6b773SPeter Brune SNESLineSearch_Shell *shell; 1506a388c36SPeter Brune PetscErrorCode ierr; 1516a388c36SPeter Brune 1526a388c36SPeter Brune PetscFunctionBegin; 1536a388c36SPeter Brune 154f1c6b773SPeter Brune linesearch->ops->apply = SNESLineSearchApply_Shell; 155f1c6b773SPeter Brune linesearch->ops->destroy = SNESLineSearchDestroy_Shell; 1566a388c36SPeter Brune linesearch->ops->setfromoptions = PETSC_NULL; 1576a388c36SPeter Brune linesearch->ops->reset = PETSC_NULL; 1586a388c36SPeter Brune linesearch->ops->view = PETSC_NULL; 1596a388c36SPeter Brune linesearch->ops->setup = PETSC_NULL; 1606a388c36SPeter Brune 161f1c6b773SPeter Brune ierr = PetscNewLog(linesearch, SNESLineSearch_Shell, &shell);CHKERRQ(ierr); 1626a388c36SPeter Brune linesearch->data = (void*) shell; 1636a388c36SPeter Brune PetscFunctionReturn(0); 1646a388c36SPeter Brune } 165