16a388c36SPeter Brune #include <private/linesearchimpl.h> 26a388c36SPeter Brune #include <private/snesimpl.h> 36a388c36SPeter Brune 4f40b411bSPeter Brune /*MC 5f40b411bSPeter Brune 6*6188f407SPeter Brune PetscLineSearchShell - Provides context for a user-provided line search routine. 7f40b411bSPeter Brune 8*6188f407SPeter Brune The user routine has one argument, the PetscLineSearch context. The user uses the interface to 9f40b411bSPeter Brune extract line search parameters and set them accordingly when the computation is finished. 10f40b411bSPeter Brune 11f40b411bSPeter Brune Any of the other line searches may serve as a guide to how this is to be done. 12f40b411bSPeter Brune 13f40b411bSPeter Brune Level: advanced 14f40b411bSPeter Brune 15f40b411bSPeter Brune M*/ 16f40b411bSPeter Brune 176a388c36SPeter Brune typedef struct { 18*6188f407SPeter Brune PetscLineSearchUserFunc func; 196a388c36SPeter Brune void *ctx; 20*6188f407SPeter Brune } PetscLineSearch_Shell; 216a388c36SPeter Brune 226a388c36SPeter Brune #undef __FUNCT__ 23*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc" 24f40b411bSPeter Brune /*@C 25*6188f407SPeter Brune PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation. 26f40b411bSPeter Brune 27f40b411bSPeter Brune Not Collective 28f40b411bSPeter Brune 29f40b411bSPeter Brune Level: advanced 30f40b411bSPeter Brune 31*6188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 32f40b411bSPeter Brune 33*6188f407SPeter Brune .seealso: PetscLineSearchShellGetUserFunc() 34f40b411bSPeter Brune @*/ 35f40b411bSPeter Brune 36*6188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) { 376a388c36SPeter Brune 386a388c36SPeter Brune PetscErrorCode ierr; 396a388c36SPeter Brune PetscBool flg; 40*6188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 416a388c36SPeter Brune PetscFunctionBegin; 42*6188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 43*6188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__ 52*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc" 53f40b411bSPeter Brune /*@C 54*6188f407SPeter Brune PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 55f40b411bSPeter Brune 56f40b411bSPeter Brune Not Collective 57f40b411bSPeter Brune 58f40b411bSPeter Brune Level: advanced 59f40b411bSPeter Brune 60*6188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 61f40b411bSPeter Brune 62*6188f407SPeter Brune .seealso: PetscLineSearchShellSetUserFunc() 63f40b411bSPeter Brune @*/ 64*6188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) { 656a388c36SPeter Brune 666a388c36SPeter Brune PetscErrorCode ierr; 676a388c36SPeter Brune PetscBool flg; 68*6188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 696a388c36SPeter Brune PetscFunctionBegin; 70*6188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 716a388c36SPeter Brune if (func) PetscValidPointer(func,2); 726a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 73*6188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__ 83*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell" 84*6188f407SPeter Brune PetscErrorCode PetscLineSearchApply_Shell(PetscLineSearch linesearch) 856a388c36SPeter Brune { 86*6188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_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 { 95*6188f407SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc"); 966a388c36SPeter Brune } 976a388c36SPeter Brune PetscFunctionReturn(0); 986a388c36SPeter Brune } 996a388c36SPeter Brune 1006a388c36SPeter Brune #undef __FUNCT__ 101*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell" 102*6188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy_Shell(PetscLineSearch linesearch) 1036a388c36SPeter Brune { 104*6188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_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__ 114*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell" 115*6188f407SPeter Brune PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch) 1166a388c36SPeter Brune { 1176a388c36SPeter Brune 118*6188f407SPeter Brune PetscLineSearch_Shell *shell; 1196a388c36SPeter Brune PetscErrorCode ierr; 1206a388c36SPeter Brune 1216a388c36SPeter Brune PetscFunctionBegin; 1226a388c36SPeter Brune 123*6188f407SPeter Brune linesearch->ops->apply = PetscLineSearchApply_Shell; 124*6188f407SPeter Brune linesearch->ops->destroy = PetscLineSearchDestroy_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 130*6188f407SPeter Brune ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr); 1316a388c36SPeter Brune linesearch->data = (void*) shell; 1326a388c36SPeter Brune PetscFunctionReturn(0); 1336a388c36SPeter Brune } 1346a388c36SPeter Brune EXTERN_C_END 135