16a388c36SPeter Brune #include <private/linesearchimpl.h> 26a388c36SPeter Brune #include <private/snesimpl.h> 36a388c36SPeter Brune 4f40b411bSPeter Brune /*MC 5f40b411bSPeter Brune 66188f407SPeter Brune PetscLineSearchShell - Provides context for a user-provided line search routine. 7f40b411bSPeter Brune 86188f407SPeter 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 { 186188f407SPeter Brune PetscLineSearchUserFunc func; 196a388c36SPeter Brune void *ctx; 206188f407SPeter Brune } PetscLineSearch_Shell; 216a388c36SPeter Brune 226a388c36SPeter Brune #undef __FUNCT__ 236188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc" 24f40b411bSPeter Brune /*@C 256188f407SPeter 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 316188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 32f40b411bSPeter Brune 336188f407SPeter Brune .seealso: PetscLineSearchShellGetUserFunc() 34f40b411bSPeter Brune @*/ 35f40b411bSPeter Brune 366188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) { 376a388c36SPeter Brune 386a388c36SPeter Brune PetscErrorCode ierr; 396a388c36SPeter Brune PetscBool flg; 406188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 416a388c36SPeter Brune PetscFunctionBegin; 426188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 436188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr); 446a388c36SPeter Brune if (flg) { 456a388c36SPeter Brune shell->ctx = ctx; 46*9e764e56SPeter Brune shell->func = func; 476a388c36SPeter Brune } 486a388c36SPeter Brune PetscFunctionReturn(0); 496a388c36SPeter Brune } 506a388c36SPeter Brune 516a388c36SPeter Brune 526a388c36SPeter Brune #undef __FUNCT__ 536188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc" 54f40b411bSPeter Brune /*@C 556188f407SPeter Brune PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 56f40b411bSPeter Brune 57f40b411bSPeter Brune Not Collective 58f40b411bSPeter Brune 59f40b411bSPeter Brune Level: advanced 60f40b411bSPeter Brune 616188f407SPeter Brune .keywords: PetscLineSearch, PetscLineSearchShell, Shell 62f40b411bSPeter Brune 636188f407SPeter Brune .seealso: PetscLineSearchShellSetUserFunc() 64f40b411bSPeter Brune @*/ 656188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) { 666a388c36SPeter Brune 676a388c36SPeter Brune PetscErrorCode ierr; 686a388c36SPeter Brune PetscBool flg; 696188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 706a388c36SPeter Brune PetscFunctionBegin; 716188f407SPeter Brune PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 726a388c36SPeter Brune if (func) PetscValidPointer(func,2); 736a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 746188f407SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr); 756a388c36SPeter Brune if (flg) { 766a388c36SPeter Brune *ctx = shell->ctx; 776a388c36SPeter Brune *func = shell->func; 786a388c36SPeter Brune } 796a388c36SPeter Brune PetscFunctionReturn(0); 806a388c36SPeter Brune } 816a388c36SPeter Brune 826a388c36SPeter Brune 836a388c36SPeter Brune #undef __FUNCT__ 846188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell" 856188f407SPeter Brune PetscErrorCode PetscLineSearchApply_Shell(PetscLineSearch linesearch) 866a388c36SPeter Brune { 876188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 886a388c36SPeter Brune PetscErrorCode ierr; 896a388c36SPeter Brune 906a388c36SPeter Brune PetscFunctionBegin; 916a388c36SPeter Brune 926a388c36SPeter Brune /* apply the user function */ 936a388c36SPeter Brune if (shell->func) { 946a388c36SPeter Brune ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 956a388c36SPeter Brune } else { 966188f407SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc"); 976a388c36SPeter Brune } 986a388c36SPeter Brune PetscFunctionReturn(0); 996a388c36SPeter Brune } 1006a388c36SPeter Brune 1016a388c36SPeter Brune #undef __FUNCT__ 1026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell" 1036188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy_Shell(PetscLineSearch linesearch) 1046a388c36SPeter Brune { 1056188f407SPeter Brune PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 1066a388c36SPeter Brune PetscErrorCode ierr; 1076a388c36SPeter Brune 1086a388c36SPeter Brune PetscFunctionBegin; 1096a388c36SPeter Brune ierr = PetscFree(shell);CHKERRQ(ierr); 1106a388c36SPeter Brune PetscFunctionReturn(0); 1116a388c36SPeter Brune } 1126a388c36SPeter Brune 1136a388c36SPeter Brune EXTERN_C_BEGIN 1146a388c36SPeter Brune #undef __FUNCT__ 1156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell" 1166188f407SPeter Brune PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch) 1176a388c36SPeter Brune { 1186a388c36SPeter Brune 1196188f407SPeter Brune PetscLineSearch_Shell *shell; 1206a388c36SPeter Brune PetscErrorCode ierr; 1216a388c36SPeter Brune 1226a388c36SPeter Brune PetscFunctionBegin; 1236a388c36SPeter Brune 1246188f407SPeter Brune linesearch->ops->apply = PetscLineSearchApply_Shell; 1256188f407SPeter Brune linesearch->ops->destroy = PetscLineSearchDestroy_Shell; 1266a388c36SPeter Brune linesearch->ops->setfromoptions = PETSC_NULL; 1276a388c36SPeter Brune linesearch->ops->reset = PETSC_NULL; 1286a388c36SPeter Brune linesearch->ops->view = PETSC_NULL; 1296a388c36SPeter Brune linesearch->ops->setup = PETSC_NULL; 1306a388c36SPeter Brune 1316188f407SPeter Brune ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr); 1326a388c36SPeter Brune linesearch->data = (void*) shell; 1336a388c36SPeter Brune PetscFunctionReturn(0); 1346a388c36SPeter Brune } 1356a388c36SPeter Brune EXTERN_C_END 136