xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision f1c6b773534bc9d3f9e058625aa590d993f2f137)
16a388c36SPeter Brune #include <private/linesearchimpl.h>
26a388c36SPeter Brune #include <private/snesimpl.h>
36a388c36SPeter Brune 
4f40b411bSPeter Brune 
56a388c36SPeter Brune typedef struct {
6*f1c6b773SPeter Brune   SNESLineSearchUserFunc func;
76a388c36SPeter Brune   void               *ctx;
8*f1c6b773SPeter Brune } SNESLineSearch_Shell;
96a388c36SPeter Brune 
106a388c36SPeter Brune #undef __FUNCT__
11*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellSetUserFunc"
12f40b411bSPeter Brune /*@C
13*f1c6b773SPeter Brune    SNESLineSearchShellSetUserFunc - Sets the user function for the SNESLineSearch Shell implementation.
14f40b411bSPeter Brune 
15f40b411bSPeter Brune    Not Collective
16f40b411bSPeter Brune 
17f40b411bSPeter Brune    Level: advanced
18f40b411bSPeter Brune 
19*f1c6b773SPeter Brune    .keywords: SNESLineSearch, SNESLineSearchShell, Shell
20f40b411bSPeter Brune 
21*f1c6b773SPeter Brune    .seealso: SNESLineSearchShellGetUserFunc()
22f40b411bSPeter Brune @*/
23*f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellSetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc func, void *ctx) {
246a388c36SPeter Brune 
256a388c36SPeter Brune   PetscErrorCode   ierr;
266a388c36SPeter Brune   PetscBool        flg;
27*f1c6b773SPeter Brune   SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data;
286a388c36SPeter Brune   PetscFunctionBegin;
29*f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1);
30*f1c6b773SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&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__
40*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchShellGetUserFunc"
41f40b411bSPeter Brune /*@C
42*f1c6b773SPeter Brune    SNESLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
43f40b411bSPeter Brune 
44f40b411bSPeter Brune    Not Collective
45f40b411bSPeter Brune 
46f40b411bSPeter Brune    Level: advanced
47f40b411bSPeter Brune 
48*f1c6b773SPeter Brune    .keywords: SNESLineSearch, SNESLineSearchShell, Shell
49f40b411bSPeter Brune 
50*f1c6b773SPeter Brune    .seealso: SNESLineSearchShellSetUserFunc()
51f40b411bSPeter Brune @*/
52*f1c6b773SPeter Brune PetscErrorCode SNESLineSearchShellGetUserFunc(SNESLineSearch linesearch, SNESLineSearchUserFunc *func, void **ctx) {
536a388c36SPeter Brune 
546a388c36SPeter Brune   PetscErrorCode   ierr;
556a388c36SPeter Brune   PetscBool        flg;
56*f1c6b773SPeter Brune   SNESLineSearch_Shell *shell = (SNESLineSearch_Shell *)linesearch->data;
576a388c36SPeter Brune   PetscFunctionBegin;
58*f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch, SNESLINESEARCH_CLASSID, 1);
596a388c36SPeter Brune   if (func) PetscValidPointer(func,2);
606a388c36SPeter Brune   if (ctx)  PetscValidPointer(ctx,3);
61*f1c6b773SPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,SNES_LINESEARCH_SHELL,&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__
71*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply_Shell"
72*f1c6b773SPeter Brune static PetscErrorCode  SNESLineSearchApply_Shell(SNESLineSearch linesearch)
736a388c36SPeter Brune {
74*f1c6b773SPeter Brune   SNESLineSearch_Shell *shell = (SNESLineSearch_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 {
83*f1c6b773SPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "SNESLineSearchShell needs to have a shell function set with SNESLineSearchShellSetUserFunc");
846a388c36SPeter Brune   }
856a388c36SPeter Brune   PetscFunctionReturn(0);
866a388c36SPeter Brune }
876a388c36SPeter Brune 
886a388c36SPeter Brune #undef __FUNCT__
89*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy_Shell"
90*f1c6b773SPeter Brune static PetscErrorCode  SNESLineSearchDestroy_Shell(SNESLineSearch linesearch)
916a388c36SPeter Brune {
92*f1c6b773SPeter Brune   SNESLineSearch_Shell *shell = (SNESLineSearch_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__
101*f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate_Shell"
102954494b2SJed Brown /*MC
103954494b2SJed Brown 
104*f1c6b773SPeter Brune SNES_LINESEARCH_SHELL - Provides context for a user-provided line search routine.
105954494b2SJed Brown 
106*f1c6b773SPeter Brune The user routine has one argument, the SNESLineSearch context.  The user uses the interface to
107954494b2SJed Brown extract line search parameters and set them accordingly when the computation is finished.
108954494b2SJed Brown 
109954494b2SJed Brown Any of the other line searches may serve as a guide to how this is to be done.
110954494b2SJed Brown 
111954494b2SJed Brown Level: advanced
112954494b2SJed Brown 
113954494b2SJed Brown M*/
114*f1c6b773SPeter Brune PETSC_EXTERN_C PetscErrorCode SNESLineSearchCreate_Shell(SNESLineSearch linesearch)
1156a388c36SPeter Brune {
1166a388c36SPeter Brune 
117*f1c6b773SPeter Brune   SNESLineSearch_Shell     *shell;
1186a388c36SPeter Brune   PetscErrorCode       ierr;
1196a388c36SPeter Brune 
1206a388c36SPeter Brune   PetscFunctionBegin;
1216a388c36SPeter Brune 
122*f1c6b773SPeter Brune   linesearch->ops->apply          = SNESLineSearchApply_Shell;
123*f1c6b773SPeter Brune   linesearch->ops->destroy        = SNESLineSearchDestroy_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 
129*f1c6b773SPeter Brune   ierr = PetscNewLog(linesearch, SNESLineSearch_Shell, &shell);CHKERRQ(ierr);
1306a388c36SPeter Brune   linesearch->data = (void*) shell;
1316a388c36SPeter Brune   PetscFunctionReturn(0);
1326a388c36SPeter Brune }
133