xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 9e764e565363082b5d6809b4906b00cc8e5df768)
1 #include <private/linesearchimpl.h>
2 #include <private/snesimpl.h>
3 
4 /*MC
5 
6 PetscLineSearchShell - Provides context for a user-provided line search routine.
7 
8 The user routine has one argument, the PetscLineSearch 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   PetscLineSearchUserFunc func;
19   void               *ctx;
20 } PetscLineSearch_Shell;
21 
22 #undef __FUNCT__
23 #define __FUNCT__ "PetscLineSearchShellSetUserFunc"
24 /*@C
25    PetscLineSearchShellSetUserFunc - Sets the user function for the PetscLineSearch Shell implementation.
26 
27    Not Collective
28 
29    Level: advanced
30 
31    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
32 
33    .seealso: PetscLineSearchShellGetUserFunc()
34 @*/
35 
36 PetscErrorCode PetscLineSearchShellSetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc func, void *ctx) {
37 
38   PetscErrorCode   ierr;
39   PetscBool        flg;
40   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
41   PetscFunctionBegin;
42   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
43   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
44   if (flg) {
45     shell->ctx = ctx;
46     shell->func = func;
47   }
48   PetscFunctionReturn(0);
49 }
50 
51 
52 #undef __FUNCT__
53 #define __FUNCT__ "PetscLineSearchShellGetUserFunc"
54 /*@C
55    PetscLineSearchShellGetUserFunc - Gets the user function and context for the shell implementation.
56 
57    Not Collective
58 
59    Level: advanced
60 
61    .keywords: PetscLineSearch, PetscLineSearchShell, Shell
62 
63    .seealso: PetscLineSearchShellSetUserFunc()
64 @*/
65 PetscErrorCode PetscLineSearchShellGetUserFunc(PetscLineSearch linesearch, PetscLineSearchUserFunc *func, void **ctx) {
66 
67   PetscErrorCode   ierr;
68   PetscBool        flg;
69   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
70   PetscFunctionBegin;
71   PetscValidHeaderSpecific(linesearch, PETSCLINESEARCH_CLASSID, 1);
72   if (func) PetscValidPointer(func,2);
73   if (ctx)  PetscValidPointer(ctx,3);
74   ierr = PetscTypeCompare((PetscObject)linesearch,PETSCLINESEARCHSHELL,&flg);CHKERRQ(ierr);
75   if (flg) {
76     *ctx  = shell->ctx;
77     *func = shell->func;
78   }
79   PetscFunctionReturn(0);
80 }
81 
82 
83 #undef __FUNCT__
84 #define __FUNCT__ "PetscLineSearchApply_Shell"
85 PetscErrorCode  PetscLineSearchApply_Shell(PetscLineSearch linesearch)
86 {
87   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
88   PetscErrorCode   ierr;
89 
90   PetscFunctionBegin;
91 
92   /* apply the user function */
93   if (shell->func) {
94     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
95   } else {
96     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "PetscLineSearchShell needs to have a shell function set with PetscLineSearchShellSetUserFunc");
97   }
98   PetscFunctionReturn(0);
99 }
100 
101 #undef __FUNCT__
102 #define __FUNCT__ "PetscLineSearchDestroy_Shell"
103 PetscErrorCode  PetscLineSearchDestroy_Shell(PetscLineSearch linesearch)
104 {
105   PetscLineSearch_Shell *shell = (PetscLineSearch_Shell *)linesearch->data;
106   PetscErrorCode   ierr;
107 
108   PetscFunctionBegin;
109   ierr = PetscFree(shell);CHKERRQ(ierr);
110   PetscFunctionReturn(0);
111 }
112 
113 EXTERN_C_BEGIN
114 #undef __FUNCT__
115 #define __FUNCT__ "PetscLineSearchCreate_Shell"
116 PetscErrorCode PetscLineSearchCreate_Shell(PetscLineSearch linesearch)
117 {
118 
119   PetscLineSearch_Shell     *shell;
120   PetscErrorCode       ierr;
121 
122   PetscFunctionBegin;
123 
124   linesearch->ops->apply          = PetscLineSearchApply_Shell;
125   linesearch->ops->destroy        = PetscLineSearchDestroy_Shell;
126   linesearch->ops->setfromoptions = PETSC_NULL;
127   linesearch->ops->reset          = PETSC_NULL;
128   linesearch->ops->view           = PETSC_NULL;
129   linesearch->ops->setup          = PETSC_NULL;
130 
131   ierr = PetscNewLog(linesearch, PetscLineSearch_Shell, &shell);CHKERRQ(ierr);
132   linesearch->data = (void*) shell;
133   PetscFunctionReturn(0);
134 }
135 EXTERN_C_END
136