1*6a388c36SPeter Brune #include <private/linesearchimpl.h> 2*6a388c36SPeter Brune #include <private/snesimpl.h> 3*6a388c36SPeter Brune 4*6a388c36SPeter Brune typedef struct { 5*6a388c36SPeter Brune LineSearchUserFunc func; 6*6a388c36SPeter Brune void *ctx; 7*6a388c36SPeter Brune } LineSearch_Shell; 8*6a388c36SPeter Brune 9*6a388c36SPeter Brune #undef __FUNCT__ 10*6a388c36SPeter Brune #define __FUNCT__ "LineSearchShellSetUserFunc" 11*6a388c36SPeter Brune PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) { 12*6a388c36SPeter Brune 13*6a388c36SPeter Brune PetscErrorCode ierr; 14*6a388c36SPeter Brune PetscBool flg; 15*6a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 16*6a388c36SPeter Brune PetscFunctionBegin; 17*6a388c36SPeter Brune PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 18*6a388c36SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 19*6a388c36SPeter Brune if (flg) { 20*6a388c36SPeter Brune shell->ctx = ctx; 21*6a388c36SPeter Brune } 22*6a388c36SPeter Brune PetscFunctionReturn(0); 23*6a388c36SPeter Brune } 24*6a388c36SPeter Brune 25*6a388c36SPeter Brune 26*6a388c36SPeter Brune #undef __FUNCT__ 27*6a388c36SPeter Brune #define __FUNCT__ "LineSearchShellGetUserFunc" 28*6a388c36SPeter Brune PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) { 29*6a388c36SPeter Brune 30*6a388c36SPeter Brune PetscErrorCode ierr; 31*6a388c36SPeter Brune PetscBool flg; 32*6a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 33*6a388c36SPeter Brune PetscFunctionBegin; 34*6a388c36SPeter Brune PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 35*6a388c36SPeter Brune if (func) PetscValidPointer(func,2); 36*6a388c36SPeter Brune if (ctx) PetscValidPointer(ctx,3); 37*6a388c36SPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 38*6a388c36SPeter Brune if (flg) { 39*6a388c36SPeter Brune *ctx = shell->ctx; 40*6a388c36SPeter Brune *func = shell->func; 41*6a388c36SPeter Brune } 42*6a388c36SPeter Brune PetscFunctionReturn(0); 43*6a388c36SPeter Brune } 44*6a388c36SPeter Brune 45*6a388c36SPeter Brune 46*6a388c36SPeter Brune #undef __FUNCT__ 47*6a388c36SPeter Brune #define __FUNCT__ "LineSearchApply_Shell" 48*6a388c36SPeter Brune PetscErrorCode LineSearchApply_Shell(LineSearch linesearch) 49*6a388c36SPeter Brune { 50*6a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 51*6a388c36SPeter Brune PetscErrorCode ierr; 52*6a388c36SPeter Brune 53*6a388c36SPeter Brune PetscFunctionBegin; 54*6a388c36SPeter Brune 55*6a388c36SPeter Brune /* apply the user function */ 56*6a388c36SPeter Brune if (shell->func) { 57*6a388c36SPeter Brune ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 58*6a388c36SPeter Brune } else { 59*6a388c36SPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc"); 60*6a388c36SPeter Brune } 61*6a388c36SPeter Brune PetscFunctionReturn(0); 62*6a388c36SPeter Brune } 63*6a388c36SPeter Brune 64*6a388c36SPeter Brune #undef __FUNCT__ 65*6a388c36SPeter Brune #define __FUNCT__ "LineSearchDestroy_Shell" 66*6a388c36SPeter Brune PetscErrorCode LineSearchDestroy_Shell(LineSearch linesearch) 67*6a388c36SPeter Brune { 68*6a388c36SPeter Brune LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 69*6a388c36SPeter Brune PetscErrorCode ierr; 70*6a388c36SPeter Brune 71*6a388c36SPeter Brune PetscFunctionBegin; 72*6a388c36SPeter Brune ierr = PetscFree(shell);CHKERRQ(ierr); 73*6a388c36SPeter Brune PetscFunctionReturn(0); 74*6a388c36SPeter Brune } 75*6a388c36SPeter Brune 76*6a388c36SPeter Brune EXTERN_C_BEGIN 77*6a388c36SPeter Brune #undef __FUNCT__ 78*6a388c36SPeter Brune #define __FUNCT__ "LineSearchCreate_Shell" 79*6a388c36SPeter Brune PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch) 80*6a388c36SPeter Brune { 81*6a388c36SPeter Brune 82*6a388c36SPeter Brune LineSearch_Shell *shell; 83*6a388c36SPeter Brune PetscErrorCode ierr; 84*6a388c36SPeter Brune 85*6a388c36SPeter Brune PetscFunctionBegin; 86*6a388c36SPeter Brune 87*6a388c36SPeter Brune linesearch->ops->apply = LineSearchApply_Shell; 88*6a388c36SPeter Brune linesearch->ops->destroy = LineSearchDestroy_Shell; 89*6a388c36SPeter Brune linesearch->ops->setfromoptions = PETSC_NULL; 90*6a388c36SPeter Brune linesearch->ops->reset = PETSC_NULL; 91*6a388c36SPeter Brune linesearch->ops->view = PETSC_NULL; 92*6a388c36SPeter Brune linesearch->ops->setup = PETSC_NULL; 93*6a388c36SPeter Brune 94*6a388c36SPeter Brune ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr); 95*6a388c36SPeter Brune linesearch->data = (void*) shell; 96*6a388c36SPeter Brune PetscFunctionReturn(0); 97*6a388c36SPeter Brune } 98*6a388c36SPeter Brune EXTERN_C_END 99