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