xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 0ebbf5cd9a3c2c6e80db03c16b7e9d3cb0ce5fc5)
1 #include <private/linesearchimpl.h>
2 #include <private/snesimpl.h>
3 
4 /*MC
5 
6 LineSearchShell - Provides context for a user-provided line search routine.
7 
8 The user routine has one argument, the LineSearch context.  The user uses the interface to
9 extract line search parameters and set them accordingly when the computation is finished.
10 
11 Any of the other line searches may serve as a guide to how this is to be done.
12 
13 Level: advanced
14 
15  M*/
16 
17 typedef struct {
18   LineSearchUserFunc func;
19   void               *ctx;
20 } LineSearch_Shell;
21 
22 #undef __FUNCT__
23 #define __FUNCT__ "LineSearchShellSetUserFunc"
24 /*@C
25    LineSearchShellSetUserFunc - Sets the user function for the LineSearch Shell implementation.
26 
27    Not Collective
28 
29    Level: advanced
30 
31    .keywords: LineSearch, LineSearchShell, Shell
32 
33    .seealso: LineSearchShellGetUserFunc()
34 @*/
35 
36 PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) {
37 
38   PetscErrorCode   ierr;
39   PetscBool        flg;
40   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
41   PetscFunctionBegin;
42   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
43   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
44   if (flg) {
45     shell->ctx = ctx;
46   }
47   PetscFunctionReturn(0);
48 }
49 
50 
51 #undef __FUNCT__
52 #define __FUNCT__ "LineSearchShellGetUserFunc"
53 /*@C
54    LineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
55 
56    Not Collective
57 
58    Level: advanced
59 
60    .keywords: LineSearch, LineSearchShell, Shell
61 
62    .seealso: LineSearchShellSetUserFunc()
63 @*/
64 PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) {
65 
66   PetscErrorCode   ierr;
67   PetscBool        flg;
68   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
69   PetscFunctionBegin;
70   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
71   if (func) PetscValidPointer(func,2);
72   if (ctx)  PetscValidPointer(ctx,3);
73   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
74   if (flg) {
75     *ctx  = shell->ctx;
76     *func = shell->func;
77   }
78   PetscFunctionReturn(0);
79 }
80 
81 
82 #undef __FUNCT__
83 #define __FUNCT__ "LineSearchApply_Shell"
84 PetscErrorCode  LineSearchApply_Shell(LineSearch linesearch)
85 {
86   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
87   PetscErrorCode   ierr;
88 
89   PetscFunctionBegin;
90 
91   /* apply the user function */
92   if (shell->func) {
93     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
94   } else {
95     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc");
96   }
97   PetscFunctionReturn(0);
98 }
99 
100 #undef __FUNCT__
101 #define __FUNCT__ "LineSearchDestroy_Shell"
102 PetscErrorCode  LineSearchDestroy_Shell(LineSearch linesearch)
103 {
104   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
105   PetscErrorCode   ierr;
106 
107   PetscFunctionBegin;
108   ierr = PetscFree(shell);CHKERRQ(ierr);
109   PetscFunctionReturn(0);
110 }
111 
112 EXTERN_C_BEGIN
113 #undef __FUNCT__
114 #define __FUNCT__ "LineSearchCreate_Shell"
115 PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch)
116 {
117 
118   LineSearch_Shell     *shell;
119   PetscErrorCode       ierr;
120 
121   PetscFunctionBegin;
122 
123   linesearch->ops->apply          = LineSearchApply_Shell;
124   linesearch->ops->destroy        = LineSearchDestroy_Shell;
125   linesearch->ops->setfromoptions = PETSC_NULL;
126   linesearch->ops->reset          = PETSC_NULL;
127   linesearch->ops->view           = PETSC_NULL;
128   linesearch->ops->setup          = PETSC_NULL;
129 
130   ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr);
131   linesearch->data = (void*) shell;
132   PetscFunctionReturn(0);
133 }
134 EXTERN_C_END
135