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