16a388c36SPeter Brune #include <private/linesearchimpl.h> 26a388c36SPeter Brune #include <private/snesimpl.h> 36a388c36SPeter Brune 4f40b411bSPeter Brune 56a388c36SPeter Brune typedef struct { 66188f407SPeter Brune PetscLineSearchUserFunc func; 76a388c36SPeter Brune void *ctx; 86188f407SPeter Brune } PetscLineSearch_Shell; 96a388c36SPeter Brune 106a388c36SPeter Brune #undef __FUNCT__ 116188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc" 12f40b411bSPeter Brune /*@C 136188f407SPeter Brune PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation. 14f40b411bSPeter Brune 15f40b411bSPeter Brune Not Collective 16f40b411bSPeter Brune 17f40b411bSPeter Brune Level: advanced 18f40b411bSPeter Brune 196188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 20f40b411bSPeter Brune 216188f407SPeter Brune .seealso: PetscLineSearchShellGetUserFunc() 22f40b411bSPeter Brune @*/ 236188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) { 246a388c36SPeter Brune 256a388c36SPeter Brune PetscErrorCode ierr; 266a388c36SPeter Brune PetscBool flg; 276188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 286a388c36SPeter Brune PetscFunctionBegin; 296188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 306188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__ 406188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc" 41f40b411bSPeter Brune /*@C 426188f407SPeter Brune PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 43f40b411bSPeter Brune 44f40b411bSPeter Brune Not Collective 45f40b411bSPeter Brune 46f40b411bSPeter Brune Level: advanced 47f40b411bSPeter Brune 486188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 49f40b411bSPeter Brune 506188f407SPeter Brune .seealso: PetscLineSearchShellSetUserFunc() 51f40b411bSPeter Brune @*/ 526188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) { 536a388c36SPeter Brune 546a388c36SPeter Brune PetscErrorCode ierr; 556a388c36SPeter Brune PetscBool flg; 566188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 576a388c36SPeter Brune PetscFunctionBegin; 586188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 596a388c36SPeter Brune if (func) PetscValidPointer(func,2); 606a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 616188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__ 716188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell" 72*954494b2SJed Brown static PetscErrorCode PetscLineSearchApply_Shell(PetscLineSearch linesearch) 736a388c36SPeter Brune { 746188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_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 { 836188f407SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc"); 846a388c36SPeter Brune } 856a388c36SPeter Brune PetscFunctionReturn(0); 866a388c36SPeter Brune } 876a388c36SPeter Brune 886a388c36SPeter Brune #undef __FUNCT__ 896188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell" 90*954494b2SJed Brown static PetscErrorCode PetscLineSearchDestroy_Shell(PetscLineSearch linesearch) 916a388c36SPeter Brune { 926188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_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__ 1016188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell" 102*954494b2SJed Brown /*MC 103*954494b2SJed Brown 104*954494b2SJed Brown PETSCLINESEARCHSHELL - Provides context for a user-provided line search routine. 105*954494b2SJed Brown 106*954494b2SJed Brown The user routine has one argument, the PetscLineSearch context. The user uses the interface to 107*954494b2SJed Brown extract line search parameters and set them accordingly when the computation is finished. 108*954494b2SJed Brown 109*954494b2SJed Brown Any of the other line searches may serve as a guide to how this is to be done. 110*954494b2SJed Brown 111*954494b2SJed Brown Level: advanced 112*954494b2SJed Brown 113*954494b2SJed Brown M*/ 114*954494b2SJed Brown PETSC_EXTERN_C PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch) 1156a388c36SPeter Brune { 1166a388c36SPeter Brune 1176188f407SPeter Brune PetscLineSearch_Shell *shell; 1186a388c36SPeter Brune PetscErrorCode ierr; 1196a388c36SPeter Brune 1206a388c36SPeter Brune PetscFunctionBegin; 1216a388c36SPeter Brune 1226188f407SPeter Brune linesearch->ops->apply = PetscLineSearchApply_Shell; 1236188f407SPeter Brune linesearch->ops->destroy = PetscLineSearchDestroy_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 1296188f407SPeter Brune ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr); 1306a388c36SPeter Brune linesearch->data = (void*) shell; 1316a388c36SPeter Brune PetscFunctionReturn(0); 1326a388c36SPeter Brune } 133