16a388c36SPeter Brune #include <private/linesearchimpl.h> 26a388c36SPeter Brune #include <private/snesimpl.h> 36a388c36SPeter Brune 4f40b411bSPeter Brune 56a388c36SPeter Brune typedef struct { 6*f1c6b773SPeter Brune SNESLineSearchUserFunc func; 76a388c36SPeter Brune void *ctx; 8*f1c6b773SPeter Brune } SNESLineSearch_Shell; 96a388c36SPeter Brune 106a388c36SPeter Brune #undef __FUNCT__ 11*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellSetUserFunc" 12f40b411bSPeter Brune /*@C 13*f1c6b773SPeter Brune SNESLineSearchShellSetUserFunc - Sets the user function for the SNESLineSearch Shell implementation. 14f40b411bSPeter Brune 15f40b411bSPeter Brune Not Collective 16f40b411bSPeter Brune 17f40b411bSPeter Brune Level: advanced 18f40b411bSPeter Brune 19*f1c6b773SPeter Brune .keywords: SNESLineSearch, SNESLineSearchShell, Shell 20f40b411bSPeter Brune 21*f1c6b773SPeter Brune .seealso: SNESLineSearchShellGetUserFunc() 22f40b411bSPeter Brune @*/ 23*f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc func, void *ctx) { 246a388c36SPeter Brune 256a388c36SPeter Brune PetscErrorCode ierr; 266a388c36SPeter Brune PetscBool flg; 27*f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 286a388c36SPeter Brune PetscFunctionBegin; 29*f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1); 30*f1c6b773SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&flg);CHKERRQ(ierr); 316a388c36SPeter Brune if (flg) { 326a388c36SPeter Brune shell->ctx = ctx; 339e764e56SPeter Brune shell->func = func; 346a388c36SPeter Brune } 356a388c36SPeter Brune PetscFunctionReturn(0); 366a388c36SPeter Brune } 376a388c36SPeter Brune 386a388c36SPeter Brune 396a388c36SPeter Brune #undef __FUNCT__ 40*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellGetUserFunc" 41f40b411bSPeter Brune /*@C 42*f1c6b773SPeter Brune SNESLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 43f40b411bSPeter Brune 44f40b411bSPeter Brune Not Collective 45f40b411bSPeter Brune 46f40b411bSPeter Brune Level: advanced 47f40b411bSPeter Brune 48*f1c6b773SPeter Brune .keywords: SNESLineSearch, SNESLineSearchShell, Shell 49f40b411bSPeter Brune 50*f1c6b773SPeter Brune .seealso: SNESLineSearchShellSetUserFunc() 51f40b411bSPeter Brune @*/ 52*f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellGetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc *func, void **ctx) { 536a388c36SPeter Brune 546a388c36SPeter Brune PetscErrorCode ierr; 556a388c36SPeter Brune PetscBool flg; 56*f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 576a388c36SPeter Brune PetscFunctionBegin; 58*f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1); 596a388c36SPeter Brune if (func) PetscValidPointer(func,2); 606a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 61*f1c6b773SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&flg);CHKERRQ(ierr); 626a388c36SPeter Brune if (flg) { 636a388c36SPeter Brune *ctx = shell->ctx; 646a388c36SPeter Brune *func = shell->func; 656a388c36SPeter Brune } 666a388c36SPeter Brune PetscFunctionReturn(0); 676a388c36SPeter Brune } 686a388c36SPeter Brune 696a388c36SPeter Brune 706a388c36SPeter Brune #undef __FUNCT__ 71*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply_Shell" 72*f1c6b773SPeter Brune static PetscErrorCode SNESLineSearchApply_Shell(SNESLineSearch linesearch) 736a388c36SPeter Brune { 74*f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 756a388c36SPeter Brune PetscErrorCode ierr; 766a388c36SPeter Brune 776a388c36SPeter Brune PetscFunctionBegin; 786a388c36SPeter Brune 796a388c36SPeter Brune /* apply the user function */ 806a388c36SPeter Brune if (shell->func) { 816a388c36SPeter Brune ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 826a388c36SPeter Brune } else { 83*f1c6b773SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "SNESLineSearchShell needs to have a shell function set with SNESLineSearchShellSetUserFunc"); 846a388c36SPeter Brune } 856a388c36SPeter Brune PetscFunctionReturn(0); 866a388c36SPeter Brune } 876a388c36SPeter Brune 886a388c36SPeter Brune #undef __FUNCT__ 89*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy_Shell" 90*f1c6b773SPeter Brune static PetscErrorCode SNESLineSearchDestroy_Shell(SNESLineSearch linesearch) 916a388c36SPeter Brune { 92*f1c6b773SPeter Brune SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data; 936a388c36SPeter Brune PetscErrorCode ierr; 946a388c36SPeter Brune 956a388c36SPeter Brune PetscFunctionBegin; 966a388c36SPeter Brune ierr = PetscFree(shell);CHKERRQ(ierr); 976a388c36SPeter Brune PetscFunctionReturn(0); 986a388c36SPeter Brune } 996a388c36SPeter Brune 1006a388c36SPeter Brune #undef __FUNCT__ 101*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate_Shell" 102954494b2SJed Brown /*MC 103954494b2SJed Brown 104*f1c6b773SPeter Brune SNES_LINESEARCH_SHELL - Provides context for a user-provided line search routine. 105954494b2SJed Brown 106*f1c6b773SPeter Brune The user routine has one argument, the SNESLineSearch context. The user uses the interface to 107954494b2SJed Brown extract line search parameters and set them accordingly when the computation is finished. 108954494b2SJed Brown 109954494b2SJed Brown Any of the other line searches may serve as a guide to how this is to be done. 110954494b2SJed Brown 111954494b2SJed Brown Level: advanced 112954494b2SJed Brown 113954494b2SJed Brown M*/ 114*f1c6b773SPeter Brune PETSC_EXTERN_C PetscErrorCode SNESLineSearchCreate_Shell(SNESLineSearch linesearch) 1156a388c36SPeter Brune { 1166a388c36SPeter Brune 117*f1c6b773SPeter Brune SNESLineSearch_Shell *shell; 1186a388c36SPeter Brune PetscErrorCode ierr; 1196a388c36SPeter Brune 1206a388c36SPeter Brune PetscFunctionBegin; 1216a388c36SPeter Brune 122*f1c6b773SPeter Brune linesearch->ops->apply = SNESLineSearchApply_Shell; 123*f1c6b773SPeter Brune linesearch->ops->destroy = SNESLineSearchDestroy_Shell; 1246a388c36SPeter Brune linesearch->ops->setfromoptions = PETSC_NULL; 1256a388c36SPeter Brune linesearch->ops->reset = PETSC_NULL; 1266a388c36SPeter Brune linesearch->ops->view = PETSC_NULL; 1276a388c36SPeter Brune linesearch->ops->setup = PETSC_NULL; 1286a388c36SPeter Brune 129*f1c6b773SPeter Brune ierr = PetscNewLog(linesearch, SNESLineSearch_Shell, &shell);CHKERRQ(ierr); 1306a388c36SPeter Brune linesearch->data = (void*) shell; 1316a388c36SPeter Brune PetscFunctionReturn(0); 1326a388c36SPeter Brune } 133