xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision f40b411b744099cdada5b1b9d4f261e67692b0a2)
16a388c36SPeter Brune #include <private/linesearchimpl.h>
26a388c36SPeter Brune #include <private/snesimpl.h>
36a388c36SPeter Brune 
4*f40b411bSPeter Brune /*MC
5*f40b411bSPeter Brune 
6*f40b411bSPeter Brune LineSearchShell - Provides context for a user-provided line search routine.
7*f40b411bSPeter Brune 
8*f40b411bSPeter Brune The user routine has one argument, the LineSearch context.  The user uses the interface to
9*f40b411bSPeter Brune extract line search parameters and set them accordingly when the computation is finished.
10*f40b411bSPeter Brune 
11*f40b411bSPeter Brune Any of the other line searches may serve as a guide to how this is to be done.
12*f40b411bSPeter Brune 
13*f40b411bSPeter Brune Level: advanced
14*f40b411bSPeter Brune 
15*f40b411bSPeter Brune  M*/
16*f40b411bSPeter Brune 
176a388c36SPeter Brune typedef struct {
186a388c36SPeter Brune   LineSearchUserFunc func;
196a388c36SPeter Brune   void               *ctx;
206a388c36SPeter Brune } LineSearch_Shell;
216a388c36SPeter Brune 
226a388c36SPeter Brune #undef __FUNCT__
236a388c36SPeter Brune #define __FUNCT__ "LineSearchShellSetUserFunc"
24*f40b411bSPeter Brune /*@C
25*f40b411bSPeter Brune    LineSearchShellSetUserFunc - Sets the user function for the LineSearch Shell implementation.
26*f40b411bSPeter Brune 
27*f40b411bSPeter Brune    Not Collective
28*f40b411bSPeter Brune 
29*f40b411bSPeter Brune    Level: advanced
30*f40b411bSPeter Brune 
31*f40b411bSPeter Brune    .keywords: LineSearch, LineSearchShell, Shell
32*f40b411bSPeter Brune 
33*f40b411bSPeter Brune    .seealso: LineSearchShellGetUserFunc()
34*f40b411bSPeter Brune @*/
35*f40b411bSPeter Brune 
366a388c36SPeter Brune PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) {
376a388c36SPeter Brune 
386a388c36SPeter Brune   PetscErrorCode   ierr;
396a388c36SPeter Brune   PetscBool        flg;
406a388c36SPeter Brune   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
416a388c36SPeter Brune   PetscFunctionBegin;
426a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
436a388c36SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
446a388c36SPeter Brune   if (flg) {
456a388c36SPeter Brune     shell->ctx = ctx;
466a388c36SPeter Brune   }
476a388c36SPeter Brune   PetscFunctionReturn(0);
486a388c36SPeter Brune }
496a388c36SPeter Brune 
506a388c36SPeter Brune 
516a388c36SPeter Brune #undef __FUNCT__
526a388c36SPeter Brune #define __FUNCT__ "LineSearchShellGetUserFunc"
53*f40b411bSPeter Brune /*@C
54*f40b411bSPeter Brune    LineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
55*f40b411bSPeter Brune 
56*f40b411bSPeter Brune    Not Collective
57*f40b411bSPeter Brune 
58*f40b411bSPeter Brune    Level: advanced
59*f40b411bSPeter Brune 
60*f40b411bSPeter Brune    .keywords: LineSearch, LineSearchShell, Shell
61*f40b411bSPeter Brune 
62*f40b411bSPeter Brune    .seealso: LineSearchShellSetUserFunc()
63*f40b411bSPeter Brune @*/
646a388c36SPeter Brune PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) {
656a388c36SPeter Brune 
666a388c36SPeter Brune   PetscErrorCode   ierr;
676a388c36SPeter Brune   PetscBool        flg;
686a388c36SPeter Brune   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
696a388c36SPeter Brune   PetscFunctionBegin;
706a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
716a388c36SPeter Brune   if (func) PetscValidPointer(func,2);
726a388c36SPeter Brune   if (ctx)  PetscValidPointer(ctx,3);
736a388c36SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
746a388c36SPeter Brune   if (flg) {
756a388c36SPeter Brune     *ctx  = shell->ctx;
766a388c36SPeter Brune     *func = shell->func;
776a388c36SPeter Brune   }
786a388c36SPeter Brune   PetscFunctionReturn(0);
796a388c36SPeter Brune }
806a388c36SPeter Brune 
816a388c36SPeter Brune 
826a388c36SPeter Brune #undef __FUNCT__
836a388c36SPeter Brune #define __FUNCT__ "LineSearchApply_Shell"
846a388c36SPeter Brune PetscErrorCode  LineSearchApply_Shell(LineSearch linesearch)
856a388c36SPeter Brune {
866a388c36SPeter Brune   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
876a388c36SPeter Brune   PetscErrorCode   ierr;
886a388c36SPeter Brune 
896a388c36SPeter Brune   PetscFunctionBegin;
906a388c36SPeter Brune 
916a388c36SPeter Brune   /* apply the user function */
926a388c36SPeter Brune   if (shell->func) {
936a388c36SPeter Brune     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
946a388c36SPeter Brune   } else {
956a388c36SPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc");
966a388c36SPeter Brune   }
976a388c36SPeter Brune   PetscFunctionReturn(0);
986a388c36SPeter Brune }
996a388c36SPeter Brune 
1006a388c36SPeter Brune #undef __FUNCT__
1016a388c36SPeter Brune #define __FUNCT__ "LineSearchDestroy_Shell"
1026a388c36SPeter Brune PetscErrorCode  LineSearchDestroy_Shell(LineSearch linesearch)
1036a388c36SPeter Brune {
1046a388c36SPeter Brune   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
1056a388c36SPeter Brune   PetscErrorCode   ierr;
1066a388c36SPeter Brune 
1076a388c36SPeter Brune   PetscFunctionBegin;
1086a388c36SPeter Brune   ierr = PetscFree(shell);CHKERRQ(ierr);
1096a388c36SPeter Brune   PetscFunctionReturn(0);
1106a388c36SPeter Brune }
1116a388c36SPeter Brune 
1126a388c36SPeter Brune EXTERN_C_BEGIN
1136a388c36SPeter Brune #undef __FUNCT__
1146a388c36SPeter Brune #define __FUNCT__ "LineSearchCreate_Shell"
1156a388c36SPeter Brune PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch)
1166a388c36SPeter Brune {
1176a388c36SPeter Brune 
1186a388c36SPeter Brune   LineSearch_Shell     *shell;
1196a388c36SPeter Brune   PetscErrorCode       ierr;
1206a388c36SPeter Brune 
1216a388c36SPeter Brune   PetscFunctionBegin;
1226a388c36SPeter Brune 
1236a388c36SPeter Brune   linesearch->ops->apply          = LineSearchApply_Shell;
1246a388c36SPeter Brune   linesearch->ops->destroy        = LineSearchDestroy_Shell;
1256a388c36SPeter Brune   linesearch->ops->setfromoptions = PETSC_NULL;
1266a388c36SPeter Brune   linesearch->ops->reset          = PETSC_NULL;
1276a388c36SPeter Brune   linesearch->ops->view           = PETSC_NULL;
1286a388c36SPeter Brune   linesearch->ops->setup          = PETSC_NULL;
1296a388c36SPeter Brune 
1306a388c36SPeter Brune   ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr);
1316a388c36SPeter Brune   linesearch->data = (void*) shell;
1326a388c36SPeter Brune   PetscFunctionReturn(0);
1336a388c36SPeter Brune }
1346a388c36SPeter Brune EXTERN_C_END
135