16a388c36SPeter Brune #include <private/linesearchimpl.h> 26a388c36SPeter Brune #include <private/snesimpl.h> 36a388c36SPeter Brune 4*f40b411bSPeter Brune /*MC 5*f40b411bSPeter Brune 6*f40b411bSPeter Brune LineSearchShell - Provides context for a user-provided line search routine. 7*f40b411bSPeter Brune 8*f40b411bSPeter Brune The user routine has one argument, the LineSearch context. The user uses the interface to 9*f40b411bSPeter Brune extract line search parameters and set them accordingly when the computation is finished. 10*f40b411bSPeter Brune 11*f40b411bSPeter Brune Any of the other line searches may serve as a guide to how this is to be done. 12*f40b411bSPeter Brune 13*f40b411bSPeter Brune Level: advanced 14*f40b411bSPeter Brune 15*f40b411bSPeter Brune M*/ 16*f40b411bSPeter Brune 176a388c36SPeter Brune typedef struct { 186a388c36SPeter Brune LineSearchUserFunc func; 196a388c36SPeter Brune void *ctx; 206a388c36SPeter Brune } LineSearch_Shell; 216a388c36SPeter Brune 226a388c36SPeter Brune #undef __FUNCT__ 236a388c36SPeter Brune #define __FUNCT__ "LineSearchShellSetUserFunc" 24*f40b411bSPeter Brune /*@C 25*f40b411bSPeter Brune LineSearchShellSetUserFunc - Sets the user function for the LineSearch Shell implementation. 26*f40b411bSPeter Brune 27*f40b411bSPeter Brune Not Collective 28*f40b411bSPeter Brune 29*f40b411bSPeter Brune Level: advanced 30*f40b411bSPeter Brune 31*f40b411bSPeter Brune .keywords: LineSearch, LineSearchShell, Shell 32*f40b411bSPeter Brune 33*f40b411bSPeter Brune .seealso: LineSearchShellGetUserFunc() 34*f40b411bSPeter Brune @*/ 35*f40b411bSPeter Brune 366a388c36SPeter Brune PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) { 376a388c36SPeter Brune 386a388c36SPeter Brune PetscErrorCode ierr; 396a388c36SPeter Brune PetscBool flg; 406a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 416a388c36SPeter Brune PetscFunctionBegin; 426a388c36SPeter Brune PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 436a388c36SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 446a388c36SPeter Brune if (flg) { 456a388c36SPeter Brune shell->ctx = ctx; 466a388c36SPeter Brune } 476a388c36SPeter Brune PetscFunctionReturn(0); 486a388c36SPeter Brune } 496a388c36SPeter Brune 506a388c36SPeter Brune 516a388c36SPeter Brune #undef __FUNCT__ 526a388c36SPeter Brune #define __FUNCT__ "LineSearchShellGetUserFunc" 53*f40b411bSPeter Brune /*@C 54*f40b411bSPeter Brune LineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 55*f40b411bSPeter Brune 56*f40b411bSPeter Brune Not Collective 57*f40b411bSPeter Brune 58*f40b411bSPeter Brune Level: advanced 59*f40b411bSPeter Brune 60*f40b411bSPeter Brune .keywords: LineSearch, LineSearchShell, Shell 61*f40b411bSPeter Brune 62*f40b411bSPeter Brune .seealso: LineSearchShellSetUserFunc() 63*f40b411bSPeter Brune @*/ 646a388c36SPeter Brune PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) { 656a388c36SPeter Brune 666a388c36SPeter Brune PetscErrorCode ierr; 676a388c36SPeter Brune PetscBool flg; 686a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 696a388c36SPeter Brune PetscFunctionBegin; 706a388c36SPeter Brune PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 716a388c36SPeter Brune if (func) PetscValidPointer(func,2); 726a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 736a388c36SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 746a388c36SPeter Brune if (flg) { 756a388c36SPeter Brune *ctx = shell->ctx; 766a388c36SPeter Brune *func = shell->func; 776a388c36SPeter Brune } 786a388c36SPeter Brune PetscFunctionReturn(0); 796a388c36SPeter Brune } 806a388c36SPeter Brune 816a388c36SPeter Brune 826a388c36SPeter Brune #undef __FUNCT__ 836a388c36SPeter Brune #define __FUNCT__ "LineSearchApply_Shell" 846a388c36SPeter Brune PetscErrorCode LineSearchApply_Shell(LineSearch linesearch) 856a388c36SPeter Brune { 866a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 876a388c36SPeter Brune PetscErrorCode ierr; 886a388c36SPeter Brune 896a388c36SPeter Brune PetscFunctionBegin; 906a388c36SPeter Brune 916a388c36SPeter Brune /* apply the user function */ 926a388c36SPeter Brune if (shell->func) { 936a388c36SPeter Brune ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 946a388c36SPeter Brune } else { 956a388c36SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc"); 966a388c36SPeter Brune } 976a388c36SPeter Brune PetscFunctionReturn(0); 986a388c36SPeter Brune } 996a388c36SPeter Brune 1006a388c36SPeter Brune #undef __FUNCT__ 1016a388c36SPeter Brune #define __FUNCT__ "LineSearchDestroy_Shell" 1026a388c36SPeter Brune PetscErrorCode LineSearchDestroy_Shell(LineSearch linesearch) 1036a388c36SPeter Brune { 1046a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 1056a388c36SPeter Brune PetscErrorCode ierr; 1066a388c36SPeter Brune 1076a388c36SPeter Brune PetscFunctionBegin; 1086a388c36SPeter Brune ierr = PetscFree(shell);CHKERRQ(ierr); 1096a388c36SPeter Brune PetscFunctionReturn(0); 1106a388c36SPeter Brune } 1116a388c36SPeter Brune 1126a388c36SPeter Brune EXTERN_C_BEGIN 1136a388c36SPeter Brune #undef __FUNCT__ 1146a388c36SPeter Brune #define __FUNCT__ "LineSearchCreate_Shell" 1156a388c36SPeter Brune PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch) 1166a388c36SPeter Brune { 1176a388c36SPeter Brune 1186a388c36SPeter Brune LineSearch_Shell *shell; 1196a388c36SPeter Brune PetscErrorCode ierr; 1206a388c36SPeter Brune 1216a388c36SPeter Brune PetscFunctionBegin; 1226a388c36SPeter Brune 1236a388c36SPeter Brune linesearch->ops->apply = LineSearchApply_Shell; 1246a388c36SPeter Brune linesearch->ops->destroy = LineSearchDestroy_Shell; 1256a388c36SPeter Brune linesearch->ops->setfromoptions = PETSC_NULL; 1266a388c36SPeter Brune linesearch->ops->reset = PETSC_NULL; 1276a388c36SPeter Brune linesearch->ops->view = PETSC_NULL; 1286a388c36SPeter Brune linesearch->ops->setup = PETSC_NULL; 1296a388c36SPeter Brune 1306a388c36SPeter Brune ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr); 1316a388c36SPeter Brune linesearch->data = (void*) shell; 1326a388c36SPeter Brune PetscFunctionReturn(0); 1336a388c36SPeter Brune } 1346a388c36SPeter Brune EXTERN_C_END 135