1 #include <private/linesearchimpl.h> 2 #include <private/snesimpl.h> 3 4 /*MC 5 6 PetscLineSearchShell - Provides context for a user-provided line search routine. 7 8 The user routine has one argument, the PetscLineSearch 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 PetscLineSearchUserFunc func; 19 void *ctx; 20 } PetscLineSearch_Shell; 21 22 #undef __FUNCT__ 23 #define __FUNCT__ "PetscLineSearchShellSetUserFunc" 24 /*@C 25 PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation. 26 27 Not Collective 28 29 Level: advanced 30 31 .keywords: PetscLineSearch, PetscLineSearchShell, Shell 32 33 .seealso: PetscLineSearchShellGetUserFunc() 34 @*/ 35 36 PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) { 37 38 PetscErrorCode ierr; 39 PetscBool flg; 40 PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 41 PetscFunctionBegin; 42 PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 43 ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr); 44 if (flg) { 45 shell->ctx = ctx; 46 shell->func = func; 47 } 48 PetscFunctionReturn(0); 49 } 50 51 52 #undef __FUNCT__ 53 #define __FUNCT__ "PetscLineSearchShellGetUserFunc" 54 /*@C 55 PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation. 56 57 Not Collective 58 59 Level: advanced 60 61 .keywords: PetscLineSearch, PetscLineSearchShell, Shell 62 63 .seealso: PetscLineSearchShellSetUserFunc() 64 @*/ 65 PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) { 66 67 PetscErrorCode ierr; 68 PetscBool flg; 69 PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 70 PetscFunctionBegin; 71 PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1); 72 if (func) PetscValidPointer(func,2); 73 if (ctx) PetscValidPointer(ctx,3); 74 ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr); 75 if (flg) { 76 *ctx = shell->ctx; 77 *func = shell->func; 78 } 79 PetscFunctionReturn(0); 80 } 81 82 83 #undef __FUNCT__ 84 #define __FUNCT__ "PetscLineSearchApply_Shell" 85 PetscErrorCode PetscLineSearchApply_Shell(PetscLineSearch linesearch) 86 { 87 PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 88 PetscErrorCode ierr; 89 90 PetscFunctionBegin; 91 92 /* apply the user function */ 93 if (shell->func) { 94 ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr); 95 } else { 96 SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc"); 97 } 98 PetscFunctionReturn(0); 99 } 100 101 #undef __FUNCT__ 102 #define __FUNCT__ "PetscLineSearchDestroy_Shell" 103 PetscErrorCode PetscLineSearchDestroy_Shell(PetscLineSearch linesearch) 104 { 105 PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data; 106 PetscErrorCode ierr; 107 108 PetscFunctionBegin; 109 ierr = PetscFree(shell);CHKERRQ(ierr); 110 PetscFunctionReturn(0); 111 } 112 113 EXTERN_C_BEGIN 114 #undef __FUNCT__ 115 #define __FUNCT__ "PetscLineSearchCreate_Shell" 116 PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch) 117 { 118 119 PetscLineSearch_Shell *shell; 120 PetscErrorCode ierr; 121 122 PetscFunctionBegin; 123 124 linesearch->ops->apply = PetscLineSearchApply_Shell; 125 linesearch->ops->destroy = PetscLineSearchDestroy_Shell; 126 linesearch->ops->setfromoptions = PETSC_NULL; 127 linesearch->ops->reset = PETSC_NULL; 128 linesearch->ops->view = PETSC_NULL; 129 linesearch->ops->setup = PETSC_NULL; 130 131 ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr); 132 linesearch->data = (void*) shell; 133 PetscFunctionReturn(0); 134 } 135 EXTERN_C_END 136