xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 954494b2f105144292715050ea1b8966feeb7ce6)
16a388c36SPeter Brune #include <private/linesearchimpl.h>
26a388c36SPeter Brune #include <private/snesimpl.h>
36a388c36SPeter Brune 
4f40b411bSPeter Brune 
56a388c36SPeter Brune typedef struct {
66188f407SPeter Brune   PetscLineSearchUserFunc func;
76a388c36SPeter Brune   void               *ctx;
86188f407SPeter Brune } PetscLineSearch_Shell;
96a388c36SPeter Brune 
106a388c36SPeter Brune #undef __FUNCT__
116188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellSetUserFunc"
12f40b411bSPeter Brune /*@C
136188f407SPeter Brune    PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation.
14f40b411bSPeter Brune 
15f40b411bSPeter Brune    Not Collective
16f40b411bSPeter Brune 
17f40b411bSPeter Brune    Level: advanced
18f40b411bSPeter Brune 
196188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
20f40b411bSPeter Brune 
216188f407SPeter Brune    .seealso: PetscLineSearchShellGetUserFunc()
22f40b411bSPeter Brune @*/
236188f407SPeter Brune PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) {
246a388c36SPeter Brune 
256a388c36SPeter Brune   PetscErrorCode   ierr;
266a388c36SPeter Brune   PetscBool        flg;
276188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
286a388c36SPeter Brune   PetscFunctionBegin;
296188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
306188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
316a388c36SPeter Brune   if (flg) {
326a388c36SPeter Brune     shell->ctx = ctx;
339e764e56SPeter Brune     shell->func = func;
346a388c36SPeter Brune   }
356a388c36SPeter Brune   PetscFunctionReturn(0);
366a388c36SPeter Brune }
376a388c36SPeter Brune 
386a388c36SPeter Brune 
396a388c36SPeter Brune #undef __FUNCT__
406188f407SPeter Brune #define __FUNCT__ "PetscLineSearchShellGetUserFunc"
41f40b411bSPeter Brune /*@C
426188f407SPeter Brune    PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
43f40b411bSPeter Brune 
44f40b411bSPeter Brune    Not Collective
45f40b411bSPeter Brune 
46f40b411bSPeter Brune    Level: advanced
47f40b411bSPeter Brune 
486188f407SPeter Brune    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
49f40b411bSPeter Brune 
506188f407SPeter Brune    .seealso: PetscLineSearchShellSetUserFunc()
51f40b411bSPeter Brune @*/
526188f407SPeter Brune PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) {
536a388c36SPeter Brune 
546a388c36SPeter Brune   PetscErrorCode   ierr;
556a388c36SPeter Brune   PetscBool        flg;
566188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
576a388c36SPeter Brune   PetscFunctionBegin;
586188f407SPeter Brune   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
596a388c36SPeter Brune   if (func) PetscValidPointer(func,2);
606a388c36SPeter Brune   if (ctx)  PetscValidPointer(ctx,3);
616188f407SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
626a388c36SPeter Brune   if (flg) {
636a388c36SPeter Brune     *ctx  = shell->ctx;
646a388c36SPeter Brune     *func = shell->func;
656a388c36SPeter Brune   }
666a388c36SPeter Brune   PetscFunctionReturn(0);
676a388c36SPeter Brune }
686a388c36SPeter Brune 
696a388c36SPeter Brune 
706a388c36SPeter Brune #undef __FUNCT__
716188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Shell"
72*954494b2SJed Brown static PetscErrorCode  PetscLineSearchApply_Shell(PetscLineSearch linesearch)
736a388c36SPeter Brune {
746188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
756a388c36SPeter Brune   PetscErrorCode   ierr;
766a388c36SPeter Brune 
776a388c36SPeter Brune   PetscFunctionBegin;
786a388c36SPeter Brune 
796a388c36SPeter Brune   /* apply the user function */
806a388c36SPeter Brune   if (shell->func) {
816a388c36SPeter Brune     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
826a388c36SPeter Brune   } else {
836188f407SPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc");
846a388c36SPeter Brune   }
856a388c36SPeter Brune   PetscFunctionReturn(0);
866a388c36SPeter Brune }
876a388c36SPeter Brune 
886a388c36SPeter Brune #undef __FUNCT__
896188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy_Shell"
90*954494b2SJed Brown static PetscErrorCode  PetscLineSearchDestroy_Shell(PetscLineSearch linesearch)
916a388c36SPeter Brune {
926188f407SPeter Brune   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
936a388c36SPeter Brune   PetscErrorCode   ierr;
946a388c36SPeter Brune 
956a388c36SPeter Brune   PetscFunctionBegin;
966a388c36SPeter Brune   ierr = PetscFree(shell);CHKERRQ(ierr);
976a388c36SPeter Brune   PetscFunctionReturn(0);
986a388c36SPeter Brune }
996a388c36SPeter Brune 
1006a388c36SPeter Brune #undef __FUNCT__
1016188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Shell"
102*954494b2SJed Brown /*MC
103*954494b2SJed Brown 
104*954494b2SJed Brown PETSCLINESEARCHSHELL - Provides context for a user-provided line search routine.
105*954494b2SJed Brown 
106*954494b2SJed Brown The user routine has one argument, the PetscLineSearch context.  The user uses the interface to
107*954494b2SJed Brown extract line search parameters and set them accordingly when the computation is finished.
108*954494b2SJed Brown 
109*954494b2SJed Brown Any of the other line searches may serve as a guide to how this is to be done.
110*954494b2SJed Brown 
111*954494b2SJed Brown Level: advanced
112*954494b2SJed Brown 
113*954494b2SJed Brown M*/
114*954494b2SJed Brown PETSC_EXTERN_C PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch)
1156a388c36SPeter Brune {
1166a388c36SPeter Brune 
1176188f407SPeter Brune   PetscLineSearch_Shell     *shell;
1186a388c36SPeter Brune   PetscErrorCode       ierr;
1196a388c36SPeter Brune 
1206a388c36SPeter Brune   PetscFunctionBegin;
1216a388c36SPeter Brune 
1226188f407SPeter Brune   linesearch->ops->apply          = PetscLineSearchApply_Shell;
1236188f407SPeter Brune   linesearch->ops->destroy        = PetscLineSearchDestroy_Shell;
1246a388c36SPeter Brune   linesearch->ops->setfromoptions = PETSC_NULL;
1256a388c36SPeter Brune   linesearch->ops->reset          = PETSC_NULL;
1266a388c36SPeter Brune   linesearch->ops->view           = PETSC_NULL;
1276a388c36SPeter Brune   linesearch->ops->setup          = PETSC_NULL;
1286a388c36SPeter Brune 
1296188f407SPeter Brune   ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr);
1306a388c36SPeter Brune   linesearch->data = (void*) shell;
1316a388c36SPeter Brune   PetscFunctionReturn(0);
1326a388c36SPeter Brune }
133