xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 6188f407cda09d19a743ec1bae486f4512cd7f1f)
16a388c36SPeter Brune #include <private/linesearchimpl.h>
26a388c36SPeter Brune #include <private/snesimpl.h>
36a388c36SPeter Brune 
4f40b411bSPeter Brune /*MC
5f40b411bSPeter Brune 
6*6188f407SPeter Brune PetscLineSearchShell - Provides context for a user-provided line search routine.
7f40b411bSPeter Brune 
8*6188f407SPeter Brune The user routine has one argument, the PetscLineSearch context.  The user uses the interface to
9f40b411bSPeter Brune extract line search parameters and set them accordingly when the computation is finished.
10f40b411bSPeter Brune 
11f40b411bSPeter Brune Any of the other line searches may serve as a guide to how this is to be done.
12f40b411bSPeter Brune 
13f40b411bSPeter Brune Level: advanced
14f40b411bSPeter Brune 
15f40b411bSPeter Brune  M*/
16f40b411bSPeter Brune 
176a388c36SPeter Brune typedef struct {
18*6188f407SPeter Brune   PetscLineSearchUserFunc func;
196a388c36SPeter Brune   void               *ctx;
20*6188f407SPeter Brune } PetscLineSearch_Shell;
216a388c36SPeter Brune 
226a388c36SPeter Brune #undef __FUNCT__
23*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc"
24f40b411bSPeter Brune /*@C
25*6188f407SPeter Brune    PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation.
26f40b411bSPeter Brune 
27f40b411bSPeter Brune    Not Collective
28f40b411bSPeter Brune 
29f40b411bSPeter Brune    Level: advanced
30f40b411bSPeter Brune 
31*6188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
32f40b411bSPeter Brune 
33*6188f407SPeter Brune    .seealso: PetscLineSearchShellGetUserFunc()
34f40b411bSPeter Brune @*/
35f40b411bSPeter Brune 
36*6188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) {
376a388c36SPeter Brune 
386a388c36SPeter Brune   PetscErrorCode   ierr;
396a388c36SPeter Brune   PetscBool        flg;
40*6188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
416a388c36SPeter Brune   PetscFunctionBegin;
42*6188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
43*6188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__
52*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc"
53f40b411bSPeter Brune /*@C
54*6188f407SPeter Brune    PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
55f40b411bSPeter Brune 
56f40b411bSPeter Brune    Not Collective
57f40b411bSPeter Brune 
58f40b411bSPeter Brune    Level: advanced
59f40b411bSPeter Brune 
60*6188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
61f40b411bSPeter Brune 
62*6188f407SPeter Brune    .seealso: PetscLineSearchShellSetUserFunc()
63f40b411bSPeter Brune @*/
64*6188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) {
656a388c36SPeter Brune 
666a388c36SPeter Brune   PetscErrorCode   ierr;
676a388c36SPeter Brune   PetscBool        flg;
68*6188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
696a388c36SPeter Brune   PetscFunctionBegin;
70*6188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
716a388c36SPeter Brune   if (func) PetscValidPointer(func,2);
726a388c36SPeter Brune   if (ctx)  PetscValidPointer(ctx,3);
73*6188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&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__
83*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell"
84*6188f407SPeter Brune PetscErrorCode  PetscLineSearchApply_Shell(PetscLineSearch linesearch)
856a388c36SPeter Brune {
86*6188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_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 {
95*6188f407SPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc");
966a388c36SPeter Brune   }
976a388c36SPeter Brune   PetscFunctionReturn(0);
986a388c36SPeter Brune }
996a388c36SPeter Brune 
1006a388c36SPeter Brune #undef __FUNCT__
101*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell"
102*6188f407SPeter Brune PetscErrorCode  PetscLineSearchDestroy_Shell(PetscLineSearch linesearch)
1036a388c36SPeter Brune {
104*6188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_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__
114*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell"
115*6188f407SPeter Brune PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch)
1166a388c36SPeter Brune {
1176a388c36SPeter Brune 
118*6188f407SPeter Brune   PetscLineSearch_Shell     *shell;
1196a388c36SPeter Brune   PetscErrorCode       ierr;
1206a388c36SPeter Brune 
1216a388c36SPeter Brune   PetscFunctionBegin;
1226a388c36SPeter Brune 
123*6188f407SPeter Brune   linesearch->ops->apply          = PetscLineSearchApply_Shell;
124*6188f407SPeter Brune   linesearch->ops->destroy        = PetscLineSearchDestroy_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 
130*6188f407SPeter Brune   ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr);
1316a388c36SPeter Brune   linesearch->data = (void*) shell;
1326a388c36SPeter Brune   PetscFunctionReturn(0);
1336a388c36SPeter Brune }
1346a388c36SPeter Brune EXTERN_C_END
135