1 #include <private/linesearchimpl.h> 2 #include <private/snesimpl.h> 3 4 /*MC 5 6 LineSearchShell - Provides context for a user-provided line search routine. 7 8 The user routine has one argument, the LineSearch context. The user uses the interface to 9 extract line search parameters and set them accordingly when the computation is finished. 10 11 Any of the other line searches may serve as a guide to how this is to be done. 12 13 Level: advanced 14 15 M*/ 16 17 typedef struct { 18 LineSearchUserFunc func; 19 void *ctx; 20 } LineSearch_Shell; 21 22 #undef __FUNCT__ 23 #define __FUNCT__ "LineSearchShellSetUserFunc" 24 /*@C 25 LineSearchShellSetUserFunc - Sets the user function for the LineSearch Shell implementation. 26 27 Not Collective 28 29 Level: advanced 30 31 .keywords: LineSearch, LineSearchShell, Shell 32 33 .seealso: LineSearchShellGetUserFunc() 34 @*/ 35 36 PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) { 37 38 PetscErrorCode ierr; 39 PetscBool flg; 40 LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 41 PetscFunctionBegin; 42 PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 43 ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 44 if (flg) { 45 shell->ctx = ctx; 46 } 47 PetscFunctionReturn(0); 48 } 49 50 51 #undef __FUNCT__ 52 #define __FUNCT__ "LineSearchShellGetUserFunc" 53 /*@C 54 LineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 55 56 Not Collective 57 58 Level: advanced 59 60 .keywords: LineSearch, LineSearchShell, Shell 61 62 .seealso: LineSearchShellSetUserFunc() 63 @*/ 64 PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) { 65 66 PetscErrorCode ierr; 67 PetscBool flg; 68 LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 69 PetscFunctionBegin; 70 PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1); 71 if (func) PetscValidPointer(func,2); 72 if (ctx) PetscValidPointer(ctx,3); 73 ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr); 74 if (flg) { 75 *ctx = shell->ctx; 76 *func = shell->func; 77 } 78 PetscFunctionReturn(0); 79 } 80 81 82 #undef __FUNCT__ 83 #define __FUNCT__ "LineSearchApply_Shell" 84 PetscErrorCode LineSearchApply_Shell(LineSearch linesearch) 85 { 86 LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 87 PetscErrorCode ierr; 88 89 PetscFunctionBegin; 90 91 /* apply the user function */ 92 if (shell->func) { 93 ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 94 } else { 95 SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc"); 96 } 97 PetscFunctionReturn(0); 98 } 99 100 #undef __FUNCT__ 101 #define __FUNCT__ "LineSearchDestroy_Shell" 102 PetscErrorCode LineSearchDestroy_Shell(LineSearch linesearch) 103 { 104 LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data; 105 PetscErrorCode ierr; 106 107 PetscFunctionBegin; 108 ierr = PetscFree(shell);CHKERRQ(ierr); 109 PetscFunctionReturn(0); 110 } 111 112 EXTERN_C_BEGIN 113 #undef __FUNCT__ 114 #define __FUNCT__ "LineSearchCreate_Shell" 115 PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch) 116 { 117 118 LineSearch_Shell *shell; 119 PetscErrorCode ierr; 120 121 PetscFunctionBegin; 122 123 linesearch->ops->apply = LineSearchApply_Shell; 124 linesearch->ops->destroy = LineSearchDestroy_Shell; 125 linesearch->ops->setfromoptions = PETSC_NULL; 126 linesearch->ops->reset = PETSC_NULL; 127 linesearch->ops->view = PETSC_NULL; 128 linesearch->ops->setup = PETSC_NULL; 129 130 ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr); 131 linesearch->data = (void*) shell; 132 PetscFunctionReturn(0); 133 } 134 EXTERN_C_END 135