xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 9e764e565363082b5d6809b4906b00cc8e5df768)
16a388c36SPeter Brune #include <private/linesearchimpl.h>
26a388c36SPeter Brune #include <private/snesimpl.h>
36a388c36SPeter Brune 
4f40b411bSPeter Brune /*MC
5f40b411bSPeter Brune 
66188f407SPeter Brune PetscLineSearchShell - Provides context for a user-provided line search routine.
7f40b411bSPeter Brune 
86188f407SPeter 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 {
186188f407SPeter Brune   PetscLineSearchUserFunc func;
196a388c36SPeter Brune   void               *ctx;
206188f407SPeter Brune } PetscLineSearch_Shell;
216a388c36SPeter Brune 
226a388c36SPeter Brune #undef __FUNCT__
236188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc"
24f40b411bSPeter Brune /*@C
256188f407SPeter 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 
316188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
32f40b411bSPeter Brune 
336188f407SPeter Brune    .seealso: PetscLineSearchShellGetUserFunc()
34f40b411bSPeter Brune @*/
35f40b411bSPeter Brune 
366188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) {
376a388c36SPeter Brune 
386a388c36SPeter Brune   PetscErrorCode   ierr;
396a388c36SPeter Brune   PetscBool        flg;
406188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
416a388c36SPeter Brune   PetscFunctionBegin;
426188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
436188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
446a388c36SPeter Brune   if (flg) {
456a388c36SPeter Brune     shell->ctx = ctx;
46*9e764e56SPeter Brune     shell->func = func;
476a388c36SPeter Brune   }
486a388c36SPeter Brune   PetscFunctionReturn(0);
496a388c36SPeter Brune }
506a388c36SPeter Brune 
516a388c36SPeter Brune 
526a388c36SPeter Brune #undef __FUNCT__
536188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc"
54f40b411bSPeter Brune /*@C
556188f407SPeter Brune    PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
56f40b411bSPeter Brune 
57f40b411bSPeter Brune    Not Collective
58f40b411bSPeter Brune 
59f40b411bSPeter Brune    Level: advanced
60f40b411bSPeter Brune 
616188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
62f40b411bSPeter Brune 
636188f407SPeter Brune    .seealso: PetscLineSearchShellSetUserFunc()
64f40b411bSPeter Brune @*/
656188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) {
666a388c36SPeter Brune 
676a388c36SPeter Brune   PetscErrorCode   ierr;
686a388c36SPeter Brune   PetscBool        flg;
696188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
706a388c36SPeter Brune   PetscFunctionBegin;
716188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
726a388c36SPeter Brune   if (func) PetscValidPointer(func,2);
736a388c36SPeter Brune   if (ctx)  PetscValidPointer(ctx,3);
746188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
756a388c36SPeter Brune   if (flg) {
766a388c36SPeter Brune     *ctx  = shell->ctx;
776a388c36SPeter Brune     *func = shell->func;
786a388c36SPeter Brune   }
796a388c36SPeter Brune   PetscFunctionReturn(0);
806a388c36SPeter Brune }
816a388c36SPeter Brune 
826a388c36SPeter Brune 
836a388c36SPeter Brune #undef __FUNCT__
846188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell"
856188f407SPeter Brune PetscErrorCode  PetscLineSearchApply_Shell(PetscLineSearch linesearch)
866a388c36SPeter Brune {
876188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
886a388c36SPeter Brune   PetscErrorCode   ierr;
896a388c36SPeter Brune 
906a388c36SPeter Brune   PetscFunctionBegin;
916a388c36SPeter Brune 
926a388c36SPeter Brune   /* apply the user function */
936a388c36SPeter Brune   if (shell->func) {
946a388c36SPeter Brune     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
956a388c36SPeter Brune   } else {
966188f407SPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc");
976a388c36SPeter Brune   }
986a388c36SPeter Brune   PetscFunctionReturn(0);
996a388c36SPeter Brune }
1006a388c36SPeter Brune 
1016a388c36SPeter Brune #undef __FUNCT__
1026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell"
1036188f407SPeter Brune PetscErrorCode  PetscLineSearchDestroy_Shell(PetscLineSearch linesearch)
1046a388c36SPeter Brune {
1056188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
1066a388c36SPeter Brune   PetscErrorCode   ierr;
1076a388c36SPeter Brune 
1086a388c36SPeter Brune   PetscFunctionBegin;
1096a388c36SPeter Brune   ierr = PetscFree(shell);CHKERRQ(ierr);
1106a388c36SPeter Brune   PetscFunctionReturn(0);
1116a388c36SPeter Brune }
1126a388c36SPeter Brune 
1136a388c36SPeter Brune EXTERN_C_BEGIN
1146a388c36SPeter Brune #undef __FUNCT__
1156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell"
1166188f407SPeter Brune PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch)
1176a388c36SPeter Brune {
1186a388c36SPeter Brune 
1196188f407SPeter Brune   PetscLineSearch_Shell     *shell;
1206a388c36SPeter Brune   PetscErrorCode       ierr;
1216a388c36SPeter Brune 
1226a388c36SPeter Brune   PetscFunctionBegin;
1236a388c36SPeter Brune 
1246188f407SPeter Brune   linesearch->ops->apply          = PetscLineSearchApply_Shell;
1256188f407SPeter Brune   linesearch->ops->destroy        = PetscLineSearchDestroy_Shell;
1266a388c36SPeter Brune   linesearch->ops->setfromoptions = PETSC_NULL;
1276a388c36SPeter Brune   linesearch->ops->reset          = PETSC_NULL;
1286a388c36SPeter Brune   linesearch->ops->view           = PETSC_NULL;
1296a388c36SPeter Brune   linesearch->ops->setup          = PETSC_NULL;
1306a388c36SPeter Brune 
1316188f407SPeter Brune   ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr);
1326a388c36SPeter Brune   linesearch->data = (void*) shell;
1336a388c36SPeter Brune   PetscFunctionReturn(0);
1346a388c36SPeter Brune }
1356a388c36SPeter Brune EXTERN_C_END
136