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