xref: /petsc/src/snes/linesearch/impls/shell/linesearchshell.c (revision 6a388c361ff2893f4363aecae9e02aa0b4e91a18)
1 #include <private/linesearchimpl.h>
2 #include <private/snesimpl.h>
3 
4 typedef struct {
5   LineSearchUserFunc func;
6   void               *ctx;
7 } LineSearch_Shell;
8 
9 #undef __FUNCT__
10 #define __FUNCT__ "LineSearchShellSetUserFunc"
11 PetscErrorCode LineSearchShellSetUserFunc(LineSearch linesearch, LineSearchUserFunc func, void *ctx) {
12 
13   PetscErrorCode   ierr;
14   PetscBool        flg;
15   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
16   PetscFunctionBegin;
17   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
18   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
19   if (flg) {
20     shell->ctx = ctx;
21   }
22   PetscFunctionReturn(0);
23 }
24 
25 
26 #undef __FUNCT__
27 #define __FUNCT__ "LineSearchShellGetUserFunc"
28 PetscErrorCode LineSearchShellGetUserFunc(LineSearch linesearch, LineSearchUserFunc *func, void **ctx) {
29 
30   PetscErrorCode   ierr;
31   PetscBool        flg;
32   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
33   PetscFunctionBegin;
34   PetscValidHeaderSpecific(linesearch, LineSearch_CLASSID, 1);
35   if (func) PetscValidPointer(func,2);
36   if (ctx)  PetscValidPointer(ctx,3);
37   ierr = PetscTypeCompare((PetscObject)linesearch,LINESEARCHSHELL,&flg);CHKERRQ(ierr);
38   if (flg) {
39     *ctx  = shell->ctx;
40     *func = shell->func;
41   }
42   PetscFunctionReturn(0);
43 }
44 
45 
46 #undef __FUNCT__
47 #define __FUNCT__ "LineSearchApply_Shell"
48 PetscErrorCode  LineSearchApply_Shell(LineSearch linesearch)
49 {
50   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
51   PetscErrorCode   ierr;
52 
53   PetscFunctionBegin;
54 
55   /* apply the user function */
56   if (shell->func) {
57     ierr = (*shell->func)(linesearch, shell->ctx);CHKERRQ(ierr);
58   } else {
59     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "LineSearchShell needs to have a shell function set with LineSearchShellSetUserFunc");
60   }
61   PetscFunctionReturn(0);
62 }
63 
64 #undef __FUNCT__
65 #define __FUNCT__ "LineSearchDestroy_Shell"
66 PetscErrorCode  LineSearchDestroy_Shell(LineSearch linesearch)
67 {
68   LineSearch_Shell *shell = (LineSearch_Shell *)linesearch->data;
69   PetscErrorCode   ierr;
70 
71   PetscFunctionBegin;
72   ierr = PetscFree(shell);CHKERRQ(ierr);
73   PetscFunctionReturn(0);
74 }
75 
76 EXTERN_C_BEGIN
77 #undef __FUNCT__
78 #define __FUNCT__ "LineSearchCreate_Shell"
79 PetscErrorCode LineSearchCreate_Shell(LineSearch linesearch)
80 {
81 
82   LineSearch_Shell     *shell;
83   PetscErrorCode       ierr;
84 
85   PetscFunctionBegin;
86 
87   linesearch->ops->apply          = LineSearchApply_Shell;
88   linesearch->ops->destroy        = LineSearchDestroy_Shell;
89   linesearch->ops->setfromoptions = PETSC_NULL;
90   linesearch->ops->reset          = PETSC_NULL;
91   linesearch->ops->view           = PETSC_NULL;
92   linesearch->ops->setup          = PETSC_NULL;
93 
94   ierr = PetscNewLog(linesearch, LineSearch_Shell, &shell);CHKERRQ(ierr);
95   linesearch->data = (void*) shell;
96   PetscFunctionReturn(0);
97 }
98 EXTERN_C_END
99