xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 516fe3c3b5b020f4b984a78364b4422b1b3dade6)
1bf7f4e0aSPeter Brune #include <private/linesearchimpl.h> /*I "petsclinesearch.h" I*/
2bf7f4e0aSPeter Brune 
3bf7f4e0aSPeter Brune PetscBool  LineSearchRegisterAllCalled = PETSC_FALSE;
4bf7f4e0aSPeter Brune PetscFList LineSearchList              = PETSC_NULL;
5bf7f4e0aSPeter Brune 
6bf7f4e0aSPeter Brune PetscClassId   LineSearch_CLASSID;
7bf7f4e0aSPeter Brune PetscLogEvent  LineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
10bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchCreate"
11f40b411bSPeter Brune /*@
12f40b411bSPeter Brune    LineSearchCreate - Creates the line search.
13f40b411bSPeter Brune 
14f40b411bSPeter Brune    Collective on LineSearch
15f40b411bSPeter Brune 
16f40b411bSPeter Brune    Input Parameters:
17f40b411bSPeter Brune .  comm - MPI communicator for the line search
18f40b411bSPeter Brune 
19f40b411bSPeter Brune    Output Parameters:
20f40b411bSPeter Brune .  outlinesearch - the line search instance.
21f40b411bSPeter Brune 
22f40b411bSPeter Brune    Level: Beginner
23f40b411bSPeter Brune 
24f40b411bSPeter Brune    .keywords: LineSearch, Create
25f40b411bSPeter Brune 
26f40b411bSPeter Brune    .seealso: LineSearchDestroy()
27f40b411bSPeter Brune @*/
28f40b411bSPeter Brune 
29bf7f4e0aSPeter Brune PetscErrorCode LineSearchCreate(MPI_Comm comm, LineSearch * outlinesearch) {
30bf7f4e0aSPeter Brune   PetscErrorCode ierr;
31bf7f4e0aSPeter Brune   LineSearch     linesearch;
32bf7f4e0aSPeter Brune   PetscFunctionBegin;
33bf7f4e0aSPeter Brune   ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,LineSearch_CLASSID, 0,
34bf7f4e0aSPeter Brune                            "LineSearch","Line-search method","LineSearch",comm,LineSearchDestroy,LineSearchView);CHKERRQ(ierr);
35bf7f4e0aSPeter Brune 
36bf7f4e0aSPeter Brune   linesearch->ops->precheckstep = PETSC_NULL;
37bf7f4e0aSPeter Brune   linesearch->ops->postcheckstep = PETSC_NULL;
38bf7f4e0aSPeter Brune 
39bf7f4e0aSPeter Brune   linesearch->lambda        = 1.0;
40bf7f4e0aSPeter Brune   linesearch->fnorm         = 1.0;
41bf7f4e0aSPeter Brune   linesearch->ynorm         = 1.0;
42bf7f4e0aSPeter Brune   linesearch->xnorm         = 1.0;
43bf7f4e0aSPeter Brune   linesearch->success       = PETSC_TRUE;
44bf7f4e0aSPeter Brune   linesearch->norms         = PETSC_TRUE;
45bf7f4e0aSPeter Brune   linesearch->keeplambda    = PETSC_FALSE;
46bf7f4e0aSPeter Brune   linesearch->damping       = 1.0;
47bf7f4e0aSPeter Brune   linesearch->maxstep       = 1e8;
48bf7f4e0aSPeter Brune   linesearch->steptol       = 1e-12;
49*516fe3c3SPeter Brune   linesearch->rtol          = 1e-8;
50*516fe3c3SPeter Brune   linesearch->atol          = 1e-15;
51*516fe3c3SPeter Brune   linesearch->ltol          = 1e-8;
52bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
53bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
54*516fe3c3SPeter Brune   linesearch->max_its       = 3;
55bf7f4e0aSPeter Brune   linesearch->setupcalled   = PETSC_FALSE;
56bf7f4e0aSPeter Brune   *outlinesearch            = linesearch;
57bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
58bf7f4e0aSPeter Brune }
59bf7f4e0aSPeter Brune 
60bf7f4e0aSPeter Brune #undef __FUNCT__
61bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetUp"
62f40b411bSPeter Brune /*@
63f40b411bSPeter Brune    LineSearchSetUp - Prepares the line search for being applied.
64f40b411bSPeter Brune 
65f40b411bSPeter Brune    Collective on LineSearch
66f40b411bSPeter Brune 
67f40b411bSPeter Brune    Input Parameters:
68f40b411bSPeter Brune .  linesearch - The LineSearch instance.
69f40b411bSPeter Brune 
70f40b411bSPeter Brune    Level: Intermediate
71f40b411bSPeter Brune 
72f40b411bSPeter Brune    .keywords: LineSearch, SetUp
73f40b411bSPeter Brune 
74f40b411bSPeter Brune    .seealso: LineSearchReset()
75f40b411bSPeter Brune @*/
76f40b411bSPeter Brune 
77bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetUp(LineSearch linesearch) {
78bf7f4e0aSPeter Brune   PetscErrorCode ierr;
79bf7f4e0aSPeter Brune   PetscFunctionBegin;
80bf7f4e0aSPeter Brune 
81bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
82bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,LINESEARCHBASIC);CHKERRQ(ierr);
83bf7f4e0aSPeter Brune   }
84bf7f4e0aSPeter Brune 
85bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
86bf7f4e0aSPeter Brune     ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
87bf7f4e0aSPeter Brune     ierr = VecDuplicate(linesearch->vec_func, &linesearch->vec_func_new);CHKERRQ(ierr);
88bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
89bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
90bf7f4e0aSPeter Brune     }
91bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping;
92bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
93bf7f4e0aSPeter Brune   }
94bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
95bf7f4e0aSPeter Brune }
96bf7f4e0aSPeter Brune 
97bf7f4e0aSPeter Brune #undef __FUNCT__
98bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchReset"
99f40b411bSPeter Brune 
100f40b411bSPeter Brune /*@
101f40b411bSPeter Brune    LineSearchReset - Tears down the structures required for application
102f40b411bSPeter Brune 
103f40b411bSPeter Brune    Collective on LineSearch
104f40b411bSPeter Brune 
105f40b411bSPeter Brune    Input Parameters:
106f40b411bSPeter Brune .  linesearch - The LineSearch instance.
107f40b411bSPeter Brune 
108f40b411bSPeter Brune    Level: Intermediate
109f40b411bSPeter Brune 
110f40b411bSPeter Brune    .keywords: LineSearch, Create
111f40b411bSPeter Brune 
112f40b411bSPeter Brune    .seealso: LineSearchSetUp()
113f40b411bSPeter Brune @*/
114f40b411bSPeter Brune 
115bf7f4e0aSPeter Brune PetscErrorCode LineSearchReset(LineSearch linesearch) {
116bf7f4e0aSPeter Brune   PetscErrorCode ierr;
117bf7f4e0aSPeter Brune   PetscFunctionBegin;
118bf7f4e0aSPeter Brune   if (linesearch->ops->reset) {
119bf7f4e0aSPeter Brune     (*linesearch->ops->reset)(linesearch);
120bf7f4e0aSPeter Brune   }
121bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
122bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
123bf7f4e0aSPeter Brune 
124bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
125bf7f4e0aSPeter Brune   linesearch->nwork = 0;
126bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
127bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
128bf7f4e0aSPeter Brune }
129bf7f4e0aSPeter Brune 
130bf7f4e0aSPeter Brune #undef __FUNCT__
131bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPreCheck"
132f40b411bSPeter Brune /*@
133f40b411bSPeter Brune    LineSearchPreCheck - Prepares the line search for being applied.
134f40b411bSPeter Brune 
135f40b411bSPeter Brune    Collective on LineSearch
136f40b411bSPeter Brune 
137f40b411bSPeter Brune    Input Parameters:
138f40b411bSPeter Brune .  linesearch - The linesearch instance.
139f40b411bSPeter Brune 
140f40b411bSPeter Brune    Output Parameters:
141f40b411bSPeter Brune .  changed - Indicator if the pre-check has changed anything.
142f40b411bSPeter Brune 
143f40b411bSPeter Brune    Level: Beginner
144f40b411bSPeter Brune 
145f40b411bSPeter Brune    .keywords: LineSearch, Create
146f40b411bSPeter Brune 
147f40b411bSPeter Brune    .seealso: LineSearchPostCheck()
148f40b411bSPeter Brune @*/
149bf7f4e0aSPeter Brune PetscErrorCode LineSearchPreCheck(LineSearch linesearch, PetscBool * changed)
150bf7f4e0aSPeter Brune {
151bf7f4e0aSPeter Brune   PetscErrorCode ierr;
152bf7f4e0aSPeter Brune   PetscFunctionBegin;
153bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
154bf7f4e0aSPeter Brune   if (linesearch->ops->precheckstep) {
155bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr);
156bf7f4e0aSPeter Brune   }
157bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
158bf7f4e0aSPeter Brune }
159bf7f4e0aSPeter Brune 
160bf7f4e0aSPeter Brune #undef __FUNCT__
161bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPostCheck"
162f40b411bSPeter Brune /*@
163f40b411bSPeter Brune    LineSearchPostCheck - Prepares the line search for being applied.
164f40b411bSPeter Brune 
165f40b411bSPeter Brune    Collective on LineSearch
166f40b411bSPeter Brune 
167f40b411bSPeter Brune    Input Parameters:
168f40b411bSPeter Brune .  linesearch - The linesearch instance.
169f40b411bSPeter Brune 
170f40b411bSPeter Brune    Output Parameters:
171f40b411bSPeter Brune +  changed_W - Indicator if the solution has been changed.
172f40b411bSPeter Brune -  changed_Y - Indicator if the direction has been changed.
173f40b411bSPeter Brune 
174f40b411bSPeter Brune    Level: Intermediate
175f40b411bSPeter Brune 
176f40b411bSPeter Brune    .keywords: LineSearch, Create
177f40b411bSPeter Brune 
178f40b411bSPeter Brune    .seealso: LineSearchPreCheck()
179f40b411bSPeter Brune @*/
180bf7f4e0aSPeter Brune PetscErrorCode LineSearchPostCheck(LineSearch linesearch, PetscBool * changed_W, PetscBool * changed_Y)
181bf7f4e0aSPeter Brune {
182bf7f4e0aSPeter Brune   PetscErrorCode ierr;
183bf7f4e0aSPeter Brune   PetscFunctionBegin;
184bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
185bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
186bf7f4e0aSPeter Brune   if (linesearch->ops->postcheckstep) {
187bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_sol_new, linesearch->vec_update, changed_W, changed_Y);CHKERRQ(ierr);
188bf7f4e0aSPeter Brune   }
189bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
190bf7f4e0aSPeter Brune }
191bf7f4e0aSPeter Brune 
192bf7f4e0aSPeter Brune #undef __FUNCT__
193bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchApply"
194f40b411bSPeter Brune /*@
195f40b411bSPeter Brune    LineSearchApply - Computes the line-search update
196f40b411bSPeter Brune 
197f40b411bSPeter Brune    Collective on LineSearch
198f40b411bSPeter Brune 
199f40b411bSPeter Brune    Input Parameters:
200f40b411bSPeter Brune +  linesearch - The linesearch instance.
201f40b411bSPeter Brune .  X - The current solution.
202f40b411bSPeter Brune .  F - The current function.
203f40b411bSPeter Brune .  fnorm - The current norm.
204f40b411bSPeter Brune .  Y - The search direction.
205f40b411bSPeter Brune 
206f40b411bSPeter Brune    Output Parameters:
207f40b411bSPeter Brune +  X - The new solution.
208f40b411bSPeter Brune .  F - The new function.
209f40b411bSPeter Brune -  fnorm - The new function norm.
210f40b411bSPeter Brune 
211f40b411bSPeter Brune    Level: Intermediate
212f40b411bSPeter Brune 
213f40b411bSPeter Brune    .keywords: LineSearch, Create
214f40b411bSPeter Brune 
215f40b411bSPeter Brune    .seealso: LineSearchCreate(), LineSearchPreCheck(), LineSearchPostCheck()
216f40b411bSPeter Brune @*/
217bf7f4e0aSPeter Brune PetscErrorCode LineSearchApply(LineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
218bf7f4e0aSPeter Brune   PetscErrorCode ierr;
219bf7f4e0aSPeter Brune   PetscFunctionBegin;
220bf7f4e0aSPeter Brune 
221bf7f4e0aSPeter Brune   /* check the pointers */
222bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
223bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
224bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
225bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
226bf7f4e0aSPeter Brune 
227bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
228bf7f4e0aSPeter Brune 
229bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
230bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
231bf7f4e0aSPeter Brune   linesearch->vec_func = F;
232bf7f4e0aSPeter Brune 
233bf7f4e0aSPeter Brune   ierr = LineSearchSetUp(linesearch);CHKERRQ(ierr);
234bf7f4e0aSPeter Brune 
235bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
236bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
237bf7f4e0aSPeter Brune 
238bf7f4e0aSPeter Brune   if (fnorm) {
239bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
240bf7f4e0aSPeter Brune   } else {
241bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
242bf7f4e0aSPeter Brune   }
243bf7f4e0aSPeter Brune 
244bf7f4e0aSPeter Brune   ierr = PetscLogEventBegin(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
245bf7f4e0aSPeter Brune 
246bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
247bf7f4e0aSPeter Brune 
248bf7f4e0aSPeter Brune   ierr = PetscLogEventEnd(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
249bf7f4e0aSPeter Brune 
250bf7f4e0aSPeter Brune   if (fnorm)
251bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
252bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
253bf7f4e0aSPeter Brune }
254bf7f4e0aSPeter Brune 
255bf7f4e0aSPeter Brune #undef __FUNCT__
256bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchDestroy"
257f40b411bSPeter Brune /*@
258f40b411bSPeter Brune    LineSearchDestroy - Destroys the line search instance.
259f40b411bSPeter Brune 
260f40b411bSPeter Brune    Collective on LineSearch
261f40b411bSPeter Brune 
262f40b411bSPeter Brune    Input Parameters:
263f40b411bSPeter Brune .  linesearch - The linesearch instance.
264f40b411bSPeter Brune 
265f40b411bSPeter Brune    Level: Intermediate
266f40b411bSPeter Brune 
267f40b411bSPeter Brune    .keywords: LineSearch, Create
268f40b411bSPeter Brune 
269f40b411bSPeter Brune    .seealso: LineSearchCreate(), LineSearchReset()
270f40b411bSPeter Brune @*/
271bf7f4e0aSPeter Brune PetscErrorCode LineSearchDestroy(LineSearch * linesearch) {
272bf7f4e0aSPeter Brune   PetscErrorCode ierr;
273bf7f4e0aSPeter Brune   PetscFunctionBegin;
274bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
275bf7f4e0aSPeter Brune   PetscValidHeaderSpecific((*linesearch),LineSearch_CLASSID,1);
276bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
277bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
278bf7f4e0aSPeter Brune   ierr = LineSearchReset(*linesearch);
279bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
280bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
281bf7f4e0aSPeter Brune   }
282bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
283e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
284bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
285bf7f4e0aSPeter Brune }
286bf7f4e0aSPeter Brune 
287bf7f4e0aSPeter Brune #undef __FUNCT__
288e7058c64SPeter Brune #define __FUNCT__ "LineSearchSetMonitor"
289f40b411bSPeter Brune /*@
290f40b411bSPeter Brune    LineSearchSetMonitor - Turns on/off printing useful things about the line search.
291bf7f4e0aSPeter Brune 
292bf7f4e0aSPeter Brune    Input Parameters:
293bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
294bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
295bf7f4e0aSPeter Brune 
296bf7f4e0aSPeter Brune    Logically Collective on SNES
297bf7f4e0aSPeter Brune 
298bf7f4e0aSPeter Brune    Options Database:
299f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
300bf7f4e0aSPeter Brune 
301bf7f4e0aSPeter Brune    Level: intermediate
302bf7f4e0aSPeter Brune 
303bf7f4e0aSPeter Brune 
304f40b411bSPeter Brune .seealso: LineSearchGetMonitor()
305bf7f4e0aSPeter Brune @*/
306bf7f4e0aSPeter Brune PetscErrorCode  LineSearchSetMonitor(LineSearch linesearch, PetscBool flg)
307bf7f4e0aSPeter Brune {
308bf7f4e0aSPeter Brune 
309bf7f4e0aSPeter Brune   PetscErrorCode ierr;
310bf7f4e0aSPeter Brune   PetscFunctionBegin;
311bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
312bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
313bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
314bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
315bf7f4e0aSPeter Brune   }
316bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
317bf7f4e0aSPeter Brune }
318bf7f4e0aSPeter Brune 
319bf7f4e0aSPeter Brune #undef __FUNCT__
3206a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMonitor"
321f40b411bSPeter Brune /*@
322f40b411bSPeter Brune    LineSearchGetMonitor - Gets the monitor instance for the line search
3236a388c36SPeter Brune 
324f40b411bSPeter Brune    Input Parameters:
325f40b411bSPeter Brune .  linesearch - linesearch context.
326f40b411bSPeter Brune 
327f40b411bSPeter Brune    Input Parameters:
328f40b411bSPeter Brune .  monitor - monitor context.
329f40b411bSPeter Brune 
330f40b411bSPeter Brune    Logically Collective on SNES
331f40b411bSPeter Brune 
332f40b411bSPeter Brune 
333f40b411bSPeter Brune    Options Database Keys:
334f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
335f40b411bSPeter Brune 
336f40b411bSPeter Brune    Level: intermediate
337f40b411bSPeter Brune 
338f40b411bSPeter Brune 
339f40b411bSPeter Brune .seealso: LineSearchSetMonitor()
340f40b411bSPeter Brune @*/
3416a388c36SPeter Brune PetscErrorCode  LineSearchGetMonitor(LineSearch linesearch, PetscViewer *monitor)
3426a388c36SPeter Brune {
3436a388c36SPeter Brune 
3446a388c36SPeter Brune   PetscFunctionBegin;
3456a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
3466a388c36SPeter Brune   if (monitor) {
3476a388c36SPeter Brune     PetscValidPointer(monitor, 2);
3486a388c36SPeter Brune     *monitor = linesearch->monitor;
3496a388c36SPeter Brune   }
3506a388c36SPeter Brune   PetscFunctionReturn(0);
3516a388c36SPeter Brune }
3526a388c36SPeter Brune 
3536a388c36SPeter Brune #undef __FUNCT__
354bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetFromOptions"
355f40b411bSPeter Brune /*@
356f40b411bSPeter Brune    LineSearchSetFromOptions - Sets options for the line search
357f40b411bSPeter Brune 
358f40b411bSPeter Brune    Input Parameters:
359f40b411bSPeter Brune .  linesearch - linesearch context.
360f40b411bSPeter Brune 
361f40b411bSPeter Brune    Options Database Keys:
362f40b411bSPeter Brune + -linesearch_type - The Line search method
363f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches
364f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter.
365f40b411bSPeter Brune . -linesearch_norms   - Turn on/off the linesearch norms
366f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess.
367f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches.
368f40b411bSPeter Brune 
369f40b411bSPeter Brune    Logically Collective on LineSearch
370f40b411bSPeter Brune 
371f40b411bSPeter Brune    Level: intermediate
372f40b411bSPeter Brune 
373f40b411bSPeter Brune 
374f40b411bSPeter Brune .seealso: LineSearchCreate()
375f40b411bSPeter Brune @*/
376bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetFromOptions(LineSearch linesearch) {
377bf7f4e0aSPeter Brune   PetscErrorCode ierr;
378bf7f4e0aSPeter Brune   const char     *deft = LINESEARCHBASIC;
379bf7f4e0aSPeter Brune   char           type[256];
380bf7f4e0aSPeter Brune   PetscBool      flg, set;
381bf7f4e0aSPeter Brune   PetscFunctionBegin;
382bf7f4e0aSPeter Brune   if (!LineSearchRegisterAllCalled) {ierr = LineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
383bf7f4e0aSPeter Brune 
384bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
385bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
386bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
387bf7f4e0aSPeter Brune   }
388bf7f4e0aSPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","LineSearchSetType",LineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
389bf7f4e0aSPeter Brune   if (flg) {
390bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,type);CHKERRQ(ierr);
391bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
392bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,deft);CHKERRQ(ierr);
393bf7f4e0aSPeter Brune   }
394bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
395bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
396bf7f4e0aSPeter Brune   }
397bf7f4e0aSPeter Brune 
398bf7f4e0aSPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESLineSearchSetMonitor",
399bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
400bf7f4e0aSPeter Brune   if (set) {ierr = LineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
401bf7f4e0aSPeter Brune 
402bf7f4e0aSPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","LineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
403*516fe3c3SPeter Brune   ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","LineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
4046a388c36SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","LineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
4056a388c36SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","LineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
406bf7f4e0aSPeter Brune   ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
407bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
408bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
409bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
410bf7f4e0aSPeter Brune }
411bf7f4e0aSPeter Brune 
412bf7f4e0aSPeter Brune #undef __FUNCT__
413bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchView"
414f40b411bSPeter Brune /*@
415f40b411bSPeter Brune    LineSearchView - Views useful information for the line search.
416f40b411bSPeter Brune 
417f40b411bSPeter Brune    Input Parameters:
418f40b411bSPeter Brune .  linesearch - linesearch context.
419f40b411bSPeter Brune 
420f40b411bSPeter Brune    Logically Collective on LineSearch
421f40b411bSPeter Brune 
422f40b411bSPeter Brune    Level: intermediate
423f40b411bSPeter Brune 
424f40b411bSPeter Brune 
425f40b411bSPeter Brune .seealso: LineSearchCreate()
426f40b411bSPeter Brune @*/
427bf7f4e0aSPeter Brune PetscErrorCode LineSearchView(LineSearch linesearch) {
428bf7f4e0aSPeter Brune   PetscFunctionBegin;
429f40b411bSPeter Brune 
430bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
431bf7f4e0aSPeter Brune }
432bf7f4e0aSPeter Brune 
433bf7f4e0aSPeter Brune #undef __FUNCT__
434bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetType"
435f40b411bSPeter Brune /*@
436f40b411bSPeter Brune    LineSearchSetType - Sets the linesearch type
437f40b411bSPeter Brune 
438f40b411bSPeter Brune    Input Parameters:
439f40b411bSPeter Brune +  linesearch - linesearch context.
440f40b411bSPeter Brune -  type - The type of line search to be used
441f40b411bSPeter Brune 
442f40b411bSPeter Brune    Logically Collective on LineSearch
443f40b411bSPeter Brune 
444f40b411bSPeter Brune    Level: intermediate
445f40b411bSPeter Brune 
446f40b411bSPeter Brune 
447f40b411bSPeter Brune .seealso: LineSearchCreate()
448f40b411bSPeter Brune @*/
449bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetType(LineSearch linesearch, const LineSearchType type)
450bf7f4e0aSPeter Brune {
451bf7f4e0aSPeter Brune 
452bf7f4e0aSPeter Brune   PetscErrorCode ierr,(*r)(LineSearch);
453bf7f4e0aSPeter Brune   PetscBool      match;
454bf7f4e0aSPeter Brune 
455bf7f4e0aSPeter Brune   PetscFunctionBegin;
456bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
457bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
458bf7f4e0aSPeter Brune 
459bf7f4e0aSPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
460bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
461bf7f4e0aSPeter Brune 
462bf7f4e0aSPeter Brune   ierr =  PetscFListFind(LineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
463bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
464bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
465bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
466bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
467bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
468bf7f4e0aSPeter Brune   }
469bf7f4e0aSPeter Brune   /* Reinitialize function pointers in LineSearchOps structure */
470bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
471bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
472bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
473bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
474bf7f4e0aSPeter Brune 
475bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
476bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
477bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
478bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
479bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
480bf7f4e0aSPeter Brune   }
481bf7f4e0aSPeter Brune #endif
482bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
483bf7f4e0aSPeter Brune }
484bf7f4e0aSPeter Brune 
485bf7f4e0aSPeter Brune #undef __FUNCT__
486bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetSNES"
487f40b411bSPeter Brune /*@
488f40b411bSPeter Brune    LineSearchSetSNES - Sets the SNES for the linesearch for function evaluation
489f40b411bSPeter Brune 
490f40b411bSPeter Brune    Input Parameters:
491f40b411bSPeter Brune +  linesearch - linesearch context.
492f40b411bSPeter Brune -  snes - The snes instance
493f40b411bSPeter Brune 
494f40b411bSPeter Brune    Level: intermediate
495f40b411bSPeter Brune 
496f40b411bSPeter Brune 
497f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
498f40b411bSPeter Brune @*/
499bf7f4e0aSPeter Brune PetscErrorCode  LineSearchSetSNES(LineSearch linesearch, SNES snes){
500bf7f4e0aSPeter Brune   PetscFunctionBegin;
501bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
502bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
503bf7f4e0aSPeter Brune   linesearch->snes = snes;
504bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
505bf7f4e0aSPeter Brune }
506bf7f4e0aSPeter Brune 
507bf7f4e0aSPeter Brune #undef __FUNCT__
508bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSNES"
509f40b411bSPeter Brune /*@
510f40b411bSPeter Brune    LineSearchGetSNES - Gets the SNES for the linesearch for function evaluation
511f40b411bSPeter Brune 
512f40b411bSPeter Brune    Input Parameters:
513f40b411bSPeter Brune .  linesearch - linesearch context.
514f40b411bSPeter Brune 
515f40b411bSPeter Brune    Output Parameters:
516f40b411bSPeter Brune .  snes - The snes instance
517f40b411bSPeter Brune 
518f40b411bSPeter Brune    Level: intermediate
519f40b411bSPeter Brune 
520f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
521f40b411bSPeter Brune @*/
522bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetSNES(LineSearch linesearch, SNES *snes){
523bf7f4e0aSPeter Brune   PetscFunctionBegin;
5246a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5256a388c36SPeter Brune   PetscValidPointer(snes, 2);
526bf7f4e0aSPeter Brune   *snes = linesearch->snes;
527bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
528bf7f4e0aSPeter Brune }
529bf7f4e0aSPeter Brune 
5306a388c36SPeter Brune #undef __FUNCT__
5316a388c36SPeter Brune #define __FUNCT__ "LineSearchGetLambda"
532f40b411bSPeter Brune /*@
533f40b411bSPeter Brune    LineSearchGetLambda - Gets the last linesearch steplength discovered.
534f40b411bSPeter Brune 
535f40b411bSPeter Brune    Input Parameters:
536f40b411bSPeter Brune .  linesearch - linesearch context.
537f40b411bSPeter Brune 
538f40b411bSPeter Brune    Output Parameters:
539f40b411bSPeter Brune .  lambda - The last steplength.
540f40b411bSPeter Brune 
541f40b411bSPeter Brune    Level: intermediate
542f40b411bSPeter Brune 
543f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
544f40b411bSPeter Brune @*/
5456a388c36SPeter Brune PetscErrorCode  LineSearchGetLambda(LineSearch linesearch,PetscReal *lambda)
5466a388c36SPeter Brune {
5476a388c36SPeter Brune   PetscFunctionBegin;
5486a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5496a388c36SPeter Brune   PetscValidPointer(lambda, 2);
5506a388c36SPeter Brune   *lambda = linesearch->lambda;
5516a388c36SPeter Brune   PetscFunctionReturn(0);
5526a388c36SPeter Brune }
5536a388c36SPeter Brune 
5546a388c36SPeter Brune #undef __FUNCT__
5556a388c36SPeter Brune #define __FUNCT__ "LineSearchSetLambda"
556f40b411bSPeter Brune /*@
557f40b411bSPeter Brune    LineSearchSetLambda - Sets the linesearch steplength.
558f40b411bSPeter Brune 
559f40b411bSPeter Brune    Input Parameters:
560f40b411bSPeter Brune +  linesearch - linesearch context.
561f40b411bSPeter Brune -  lambda - The last steplength.
562f40b411bSPeter Brune 
563f40b411bSPeter Brune    Level: intermediate
564f40b411bSPeter Brune 
565f40b411bSPeter Brune .seealso: LineSearchGetLambda()
566f40b411bSPeter Brune @*/
5676a388c36SPeter Brune PetscErrorCode  LineSearchSetLambda(LineSearch linesearch, PetscReal lambda)
5686a388c36SPeter Brune {
5696a388c36SPeter Brune   PetscFunctionBegin;
5706a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5716a388c36SPeter Brune   linesearch->lambda = lambda;
5726a388c36SPeter Brune   PetscFunctionReturn(0);
5736a388c36SPeter Brune }
5746a388c36SPeter Brune 
5756a388c36SPeter Brune #undef  __FUNCT__
576*516fe3c3SPeter Brune #define __FUNCT__ "LineSearchGetTolerances"
577f40b411bSPeter Brune /*@
578*516fe3c3SPeter Brune    LineSearchGetTolerances - Gets the tolerances for the method
579f40b411bSPeter Brune 
580f40b411bSPeter Brune    Input Parameters:
581f40b411bSPeter Brune .  linesearch - linesearch context.
582f40b411bSPeter Brune 
583f40b411bSPeter Brune    Output Parameters:
584*516fe3c3SPeter Brune +  steptol - The minimum steplength
585*516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
586*516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
587*516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
588*516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
589f40b411bSPeter Brune 
590f40b411bSPeter Brune 
591*516fe3c3SPeter Brune    Level: advanced
592*516fe3c3SPeter Brune 
593*516fe3c3SPeter Brune .seealso: LineSearchSetTolerances()
594f40b411bSPeter Brune @*/
595*516fe3c3SPeter Brune PetscErrorCode  LineSearchGetTolerances(LineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
5966a388c36SPeter Brune {
5976a388c36SPeter Brune   PetscFunctionBegin;
5986a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
599*516fe3c3SPeter Brune   if (steptol) {
6006a388c36SPeter Brune     PetscValidPointer(steptol, 2);
6016a388c36SPeter Brune     *steptol = linesearch->steptol;
602*516fe3c3SPeter Brune   }
603*516fe3c3SPeter Brune   if (maxstep) {
604*516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
605*516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
606*516fe3c3SPeter Brune   }
607*516fe3c3SPeter Brune   if (rtol) {
608*516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
609*516fe3c3SPeter Brune     *rtol = linesearch->rtol;
610*516fe3c3SPeter Brune   }
611*516fe3c3SPeter Brune   if (atol) {
612*516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
613*516fe3c3SPeter Brune     *atol = linesearch->atol;
614*516fe3c3SPeter Brune   }
615*516fe3c3SPeter Brune   if (ltol) {
616*516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
617*516fe3c3SPeter Brune     *ltol = linesearch->ltol;
618*516fe3c3SPeter Brune   }
619*516fe3c3SPeter Brune   if (max_its) {
620*516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
621*516fe3c3SPeter Brune     *max_its = linesearch->max_its;
622*516fe3c3SPeter Brune   }
6236a388c36SPeter Brune   PetscFunctionReturn(0);
6246a388c36SPeter Brune }
6256a388c36SPeter Brune 
6266a388c36SPeter Brune #undef  __FUNCT__
627*516fe3c3SPeter Brune #define __FUNCT__ "LineSearchSetTolerances"
628f40b411bSPeter Brune /*@
629*516fe3c3SPeter Brune    LineSearchSetTolerances - Sets the tolerances for the method
630f40b411bSPeter Brune 
631f40b411bSPeter Brune    Input Parameters:
632*516fe3c3SPeter Brune +  linesearch - linesearch context.
633*516fe3c3SPeter Brune .  steptol - The minimum steplength
634*516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
635*516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
636*516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
637*516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
638f40b411bSPeter Brune 
639f40b411bSPeter Brune 
640*516fe3c3SPeter Brune    Level: advanced
641*516fe3c3SPeter Brune 
642*516fe3c3SPeter Brune .seealso: LineSearchGetTolerances()
643f40b411bSPeter Brune @*/
644*516fe3c3SPeter Brune PetscErrorCode  LineSearchSetTolerances(LineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
6456a388c36SPeter Brune {
6466a388c36SPeter Brune   PetscFunctionBegin;
6476a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6486a388c36SPeter Brune   linesearch->steptol = steptol;
649*516fe3c3SPeter Brune   linesearch->maxstep = maxstep;
650*516fe3c3SPeter Brune   linesearch->rtol = rtol;
651*516fe3c3SPeter Brune   linesearch->atol = atol;
652*516fe3c3SPeter Brune   linesearch->ltol = ltol;
653*516fe3c3SPeter Brune   linesearch->max_its = max_its;
6546a388c36SPeter Brune   PetscFunctionReturn(0);
6556a388c36SPeter Brune }
6566a388c36SPeter Brune 
657*516fe3c3SPeter Brune 
6586a388c36SPeter Brune #undef __FUNCT__
6596a388c36SPeter Brune #define __FUNCT__ "LineSearchGetDamping"
660f40b411bSPeter Brune /*@
661*516fe3c3SPeter Brune    LineSearchGetDamping - Gets the line search damping parameter.
662f40b411bSPeter Brune 
663f40b411bSPeter Brune    Input Parameters:
664f40b411bSPeter Brune .  linesearch - linesearch context.
665f40b411bSPeter Brune 
666f40b411bSPeter Brune    Output Parameters:
667f40b411bSPeter Brune .  damping - The damping parameter.
668f40b411bSPeter Brune 
669f40b411bSPeter Brune    Level: intermediate
670f40b411bSPeter Brune 
671f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance()
672f40b411bSPeter Brune @*/
673f40b411bSPeter Brune 
674f40b411bSPeter Brune PetscErrorCode  LineSearchGetDamping(LineSearch linesearch,PetscReal *damping)
6756a388c36SPeter Brune {
6766a388c36SPeter Brune   PetscFunctionBegin;
6776a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6786a388c36SPeter Brune   PetscValidPointer(damping, 2);
6796a388c36SPeter Brune   *damping = linesearch->damping;
6806a388c36SPeter Brune   PetscFunctionReturn(0);
6816a388c36SPeter Brune }
6826a388c36SPeter Brune 
6836a388c36SPeter Brune #undef __FUNCT__
6846a388c36SPeter Brune #define __FUNCT__ "LineSearchSetDamping"
685f40b411bSPeter Brune /*@
686f40b411bSPeter Brune    LineSearchSetDamping - Sets the line search damping paramter.
687f40b411bSPeter Brune 
688f40b411bSPeter Brune    Input Parameters:
689f40b411bSPeter Brune .  linesearch - linesearch context.
690f40b411bSPeter Brune .  damping - The damping parameter.
691f40b411bSPeter Brune 
692f40b411bSPeter Brune    Level: intermediate
693f40b411bSPeter Brune 
694f40b411bSPeter Brune .seealso: LineSearchGetDamping()
695f40b411bSPeter Brune @*/
696f40b411bSPeter Brune PetscErrorCode  LineSearchSetDamping(LineSearch linesearch,PetscReal damping)
6976a388c36SPeter Brune {
6986a388c36SPeter Brune   PetscFunctionBegin;
6996a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
7006a388c36SPeter Brune   linesearch->damping = damping;
7016a388c36SPeter Brune   PetscFunctionReturn(0);
7026a388c36SPeter Brune }
7036a388c36SPeter Brune 
7046a388c36SPeter Brune #undef __FUNCT__
705bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetNorms"
706f40b411bSPeter Brune /*@
707f40b411bSPeter Brune    LineSearchGetNorms - Gets the norms for for X, Y, and F.
708f40b411bSPeter Brune 
709f40b411bSPeter Brune    Input Parameters:
710f40b411bSPeter Brune .  linesearch - linesearch context.
711f40b411bSPeter Brune 
712f40b411bSPeter Brune    Output Parameters:
713f40b411bSPeter Brune +  xnorm - The norm of the current solution
714f40b411bSPeter Brune .  fnorm - The norm of the current function
715f40b411bSPeter Brune -  ynorm - The norm of the current update
716f40b411bSPeter Brune 
717f40b411bSPeter Brune    Level: intermediate
718f40b411bSPeter Brune 
719f40b411bSPeter Brune .seealso: LineSearchSetNorms() LineSearchGetVecs()
720f40b411bSPeter Brune @*/
721bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetNorms(LineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
722bf7f4e0aSPeter Brune {
723bf7f4e0aSPeter Brune   PetscFunctionBegin;
7246a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
725bf7f4e0aSPeter Brune   if (xnorm) {
726bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
727bf7f4e0aSPeter Brune   }
728bf7f4e0aSPeter Brune   if (fnorm) {
729bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
730bf7f4e0aSPeter Brune   }
731bf7f4e0aSPeter Brune   if (ynorm) {
732bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
733bf7f4e0aSPeter Brune   }
734bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
735bf7f4e0aSPeter Brune }
736bf7f4e0aSPeter Brune 
737e7058c64SPeter Brune #undef __FUNCT__
7386a388c36SPeter Brune #define __FUNCT__ "LineSearchSetNorms"
739f40b411bSPeter Brune /*@
740f40b411bSPeter Brune    LineSearchSetNorms - Gets the computed norms for for X, Y, and F.
741f40b411bSPeter Brune 
742f40b411bSPeter Brune    Input Parameters:
743f40b411bSPeter Brune +  linesearch - linesearch context.
744f40b411bSPeter Brune .  xnorm - The norm of the current solution
745f40b411bSPeter Brune .  fnorm - The norm of the current function
746f40b411bSPeter Brune -  ynorm - The norm of the current update
747f40b411bSPeter Brune 
748f40b411bSPeter Brune    Level: intermediate
749f40b411bSPeter Brune 
750f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs()
751f40b411bSPeter Brune @*/
7526a388c36SPeter Brune PetscErrorCode  LineSearchSetNorms(LineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
7536a388c36SPeter Brune {
7546a388c36SPeter Brune   PetscFunctionBegin;
7556a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
7566a388c36SPeter Brune   if (xnorm) {
7576a388c36SPeter Brune     linesearch->xnorm = xnorm;
7586a388c36SPeter Brune   }
7596a388c36SPeter Brune   if (fnorm) {
7606a388c36SPeter Brune     linesearch->fnorm = fnorm;
7616a388c36SPeter Brune   }
7626a388c36SPeter Brune   if (ynorm) {
7636a388c36SPeter Brune     linesearch->ynorm = ynorm;
7646a388c36SPeter Brune   }
7656a388c36SPeter Brune   PetscFunctionReturn(0);
7666a388c36SPeter Brune }
7676a388c36SPeter Brune 
7686a388c36SPeter Brune #undef __FUNCT__
7696a388c36SPeter Brune #define __FUNCT__ "LineSearchComputeNorms"
770f40b411bSPeter Brune /*@
771f40b411bSPeter Brune    LineSearchComputeNorms - Computes the norms of X, F, and Y.
772f40b411bSPeter Brune 
773f40b411bSPeter Brune    Input Parameters:
774f40b411bSPeter Brune .  linesearch - linesearch context.
775f40b411bSPeter Brune 
776f40b411bSPeter Brune    Options Database Keys:
777f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
778f40b411bSPeter Brune 
779f40b411bSPeter Brune    Level: intermediate
780f40b411bSPeter Brune 
781f40b411bSPeter Brune .seealso: LineSearchGetNorms, LineSearchSetNorms()
782f40b411bSPeter Brune @*/
7836a388c36SPeter Brune PetscErrorCode LineSearchComputeNorms(LineSearch linesearch)
7846a388c36SPeter Brune {
7856a388c36SPeter Brune   PetscErrorCode ierr;
7866a388c36SPeter Brune   PetscFunctionBegin;
7876a388c36SPeter Brune   if (linesearch->norms) {
7886a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
7896a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
7906a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
7916a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
7926a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
7936a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
7946a388c36SPeter Brune   }
7956a388c36SPeter Brune   PetscFunctionReturn(0);
7966a388c36SPeter Brune }
7976a388c36SPeter Brune 
7986a388c36SPeter Brune #undef __FUNCT__
7996a388c36SPeter Brune #define __FUNCT__ "LineSearchGetVecs"
800f40b411bSPeter Brune /*@
801f40b411bSPeter Brune    LineSearchGetVecs - Gets the vectors from the LineSearch context
802f40b411bSPeter Brune 
803f40b411bSPeter Brune    Input Parameters:
804f40b411bSPeter Brune .  linesearch - linesearch context.
805f40b411bSPeter Brune 
806f40b411bSPeter Brune    Output Parameters:
807f40b411bSPeter Brune +  X - The old solution
808f40b411bSPeter Brune .  F - The old function
809f40b411bSPeter Brune .  Y - The search direction
810f40b411bSPeter Brune .  W - The new solution
811f40b411bSPeter Brune -  G - The new function
812f40b411bSPeter Brune 
813f40b411bSPeter Brune    Level: intermediate
814f40b411bSPeter Brune 
815f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs()
816f40b411bSPeter Brune @*/
8176a388c36SPeter Brune PetscErrorCode LineSearchGetVecs(LineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
8186a388c36SPeter Brune   PetscFunctionBegin;
8196a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
8206a388c36SPeter Brune   if (X) {
8216a388c36SPeter Brune     PetscValidPointer(X, 2);
8226a388c36SPeter Brune     *X = linesearch->vec_sol;
8236a388c36SPeter Brune   }
8246a388c36SPeter Brune   if (F) {
8256a388c36SPeter Brune     PetscValidPointer(F, 3);
8266a388c36SPeter Brune     *F = linesearch->vec_func;
8276a388c36SPeter Brune   }
8286a388c36SPeter Brune   if (Y) {
8296a388c36SPeter Brune     PetscValidPointer(Y, 4);
8306a388c36SPeter Brune     *Y = linesearch->vec_update;
8316a388c36SPeter Brune   }
8326a388c36SPeter Brune   if (W) {
8336a388c36SPeter Brune     PetscValidPointer(W, 5);
8346a388c36SPeter Brune     *W = linesearch->vec_sol_new;
8356a388c36SPeter Brune   }
8366a388c36SPeter Brune   if (G) {
8376a388c36SPeter Brune     PetscValidPointer(G, 6);
8386a388c36SPeter Brune     *G = linesearch->vec_func_new;
8396a388c36SPeter Brune   }
8406a388c36SPeter Brune 
8416a388c36SPeter Brune   PetscFunctionReturn(0);
8426a388c36SPeter Brune }
8436a388c36SPeter Brune 
8446a388c36SPeter Brune #undef __FUNCT__
8456a388c36SPeter Brune #define __FUNCT__ "LineSearchSetVecs"
846f40b411bSPeter Brune /*@
847f40b411bSPeter Brune    LineSearchSetVecs - Sets the vectors on the LineSearch context
848f40b411bSPeter Brune 
849f40b411bSPeter Brune    Input Parameters:
850f40b411bSPeter Brune +  linesearch - linesearch context.
851f40b411bSPeter Brune .  X - The old solution
852f40b411bSPeter Brune .  F - The old function
853f40b411bSPeter Brune .  Y - The search direction
854f40b411bSPeter Brune .  W - The new solution
855f40b411bSPeter Brune -  G - The new function
856f40b411bSPeter Brune 
857f40b411bSPeter Brune    Level: intermediate
858f40b411bSPeter Brune 
859f40b411bSPeter Brune .seealso: LineSearchSetNorms(), LineSearchGetVecs()
860f40b411bSPeter Brune @*/
8616a388c36SPeter Brune PetscErrorCode LineSearchSetVecs(LineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
8626a388c36SPeter Brune   PetscFunctionBegin;
8636a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
8646a388c36SPeter Brune   if (X) {
8656a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
8666a388c36SPeter Brune     linesearch->vec_sol = X;
8676a388c36SPeter Brune   }
8686a388c36SPeter Brune   if (F) {
8696a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
8706a388c36SPeter Brune     linesearch->vec_func = F;
8716a388c36SPeter Brune   }
8726a388c36SPeter Brune   if (Y) {
8736a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
8746a388c36SPeter Brune     linesearch->vec_update = Y;
8756a388c36SPeter Brune   }
8766a388c36SPeter Brune   if (W) {
8776a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
8786a388c36SPeter Brune     linesearch->vec_sol_new = W;
8796a388c36SPeter Brune   }
8806a388c36SPeter Brune   if (G) {
8816a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
8826a388c36SPeter Brune     linesearch->vec_func_new = G;
8836a388c36SPeter Brune   }
8846a388c36SPeter Brune 
8856a388c36SPeter Brune   PetscFunctionReturn(0);
8866a388c36SPeter Brune }
8876a388c36SPeter Brune 
8886a388c36SPeter Brune #undef __FUNCT__
889e7058c64SPeter Brune #define __FUNCT__ "LineSearchAppendOptionsPrefix"
890e7058c64SPeter Brune /*@C
891e7058c64SPeter Brune    LineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
892e7058c64SPeter Brune    SNES options in the database.
893e7058c64SPeter Brune 
894e7058c64SPeter Brune    Logically Collective on SNES
895e7058c64SPeter Brune 
896e7058c64SPeter Brune    Input Parameters:
897e7058c64SPeter Brune +  snes - the SNES context
898e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
899e7058c64SPeter Brune 
900e7058c64SPeter Brune    Notes:
901e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
902e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
903e7058c64SPeter Brune 
904e7058c64SPeter Brune    Level: advanced
905e7058c64SPeter Brune 
906f40b411bSPeter Brune .keywords: LineSearch, append, options, prefix, database
907e7058c64SPeter Brune 
908e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
909e7058c64SPeter Brune @*/
910e7058c64SPeter Brune PetscErrorCode  LineSearchAppendOptionsPrefix(LineSearch linesearch,const char prefix[])
911e7058c64SPeter Brune {
912e7058c64SPeter Brune   PetscErrorCode ierr;
913e7058c64SPeter Brune 
914e7058c64SPeter Brune   PetscFunctionBegin;
915e7058c64SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
916e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
917e7058c64SPeter Brune   PetscFunctionReturn(0);
918e7058c64SPeter Brune }
919e7058c64SPeter Brune 
920e7058c64SPeter Brune #undef __FUNCT__
921e7058c64SPeter Brune #define __FUNCT__ "LineSearchGetOptionsPrefix"
922e7058c64SPeter Brune /*@C
923e7058c64SPeter Brune    LineSearchGetOptionsPrefix - Sets the prefix used for searching for all
924f40b411bSPeter Brune    LineSearch options in the database.
925e7058c64SPeter Brune 
926e7058c64SPeter Brune    Not Collective
927e7058c64SPeter Brune 
928e7058c64SPeter Brune    Input Parameter:
929e7058c64SPeter Brune .  snes - the SNES context
930e7058c64SPeter Brune 
931e7058c64SPeter Brune    Output Parameter:
932e7058c64SPeter Brune .  prefix - pointer to the prefix string used
933e7058c64SPeter Brune 
934e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
935e7058c64SPeter Brune    sufficient length to hold the prefix.
936e7058c64SPeter Brune 
937e7058c64SPeter Brune    Level: advanced
938e7058c64SPeter Brune 
939f40b411bSPeter Brune .keywords: LineSearch, get, options, prefix, database
940e7058c64SPeter Brune 
941e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
942e7058c64SPeter Brune @*/
943e7058c64SPeter Brune PetscErrorCode  LineSearchGetOptionsPrefix(LineSearch linesearch,const char *prefix[])
944e7058c64SPeter Brune {
945e7058c64SPeter Brune   PetscErrorCode ierr;
946e7058c64SPeter Brune 
947e7058c64SPeter Brune   PetscFunctionBegin;
948e7058c64SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
949e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
950e7058c64SPeter Brune   PetscFunctionReturn(0);
951e7058c64SPeter Brune }
952bf7f4e0aSPeter Brune 
953bf7f4e0aSPeter Brune #undef __FUNCT__
954bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetWork"
955f40b411bSPeter Brune /*@
956f40b411bSPeter Brune    LineSearchGetWork - Gets work vectors for the line search.
957f40b411bSPeter Brune 
958f40b411bSPeter Brune    Input Parameter:
959f40b411bSPeter Brune +  linesearch - the LineSearch context
960f40b411bSPeter Brune -  nwork - the number of work vectors
961f40b411bSPeter Brune 
962f40b411bSPeter Brune    Level: developer
963f40b411bSPeter Brune 
964f40b411bSPeter Brune .keywords: LineSearch, work, vector
965f40b411bSPeter Brune 
966f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
967f40b411bSPeter Brune @*/
968bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetWork(LineSearch linesearch, PetscInt nwork)
969bf7f4e0aSPeter Brune {
970bf7f4e0aSPeter Brune   PetscErrorCode ierr;
971bf7f4e0aSPeter Brune   PetscFunctionBegin;
972bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
973bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
974bf7f4e0aSPeter Brune   } else {
975bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
976bf7f4e0aSPeter Brune   }
977bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
978bf7f4e0aSPeter Brune }
979bf7f4e0aSPeter Brune 
9806a388c36SPeter Brune 
981bf7f4e0aSPeter Brune #undef __FUNCT__
982bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSuccess"
983f40b411bSPeter Brune /*@
984f40b411bSPeter Brune    LineSearchGetSuccess - Gets the success/failure status of the last line search application
985f40b411bSPeter Brune 
986f40b411bSPeter Brune    Input Parameters:
987f40b411bSPeter Brune .  linesearch - linesearch context.
988f40b411bSPeter Brune 
989f40b411bSPeter Brune    Output Parameters:
990f40b411bSPeter Brune .  success - The success or failure status.
991f40b411bSPeter Brune 
992f40b411bSPeter Brune    Level: intermediate
993f40b411bSPeter Brune 
994f40b411bSPeter Brune .seealso: LineSearchSetSuccess()
995f40b411bSPeter Brune @*/
996bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetSuccess(LineSearch linesearch, PetscBool *success)
997bf7f4e0aSPeter Brune {
998bf7f4e0aSPeter Brune   PetscFunctionBegin;
9996a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
10006a388c36SPeter Brune   PetscValidPointer(success, 2);
1001bf7f4e0aSPeter Brune   if (success) {
1002bf7f4e0aSPeter Brune     *success = linesearch->success;
1003bf7f4e0aSPeter Brune   }
1004bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1005bf7f4e0aSPeter Brune }
1006bf7f4e0aSPeter Brune 
1007bf7f4e0aSPeter Brune #undef __FUNCT__
10086a388c36SPeter Brune #define __FUNCT__ "LineSearchSetSuccess"
1009f40b411bSPeter Brune /*@
1010f40b411bSPeter Brune    LineSearchSetSuccess - Sets the success/failure status of the last line search application
1011f40b411bSPeter Brune 
1012f40b411bSPeter Brune    Input Parameters:
1013f40b411bSPeter Brune +  linesearch - linesearch context.
1014f40b411bSPeter Brune -  success - The success or failure status.
1015f40b411bSPeter Brune 
1016f40b411bSPeter Brune    Level: intermediate
1017f40b411bSPeter Brune 
1018f40b411bSPeter Brune .seealso: LineSearchGetSuccess()
1019f40b411bSPeter Brune @*/
10206a388c36SPeter Brune PetscErrorCode  LineSearchSetSuccess(LineSearch linesearch, PetscBool success)
10216a388c36SPeter Brune {
10226a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
10236a388c36SPeter Brune   PetscFunctionBegin;
10246a388c36SPeter Brune   linesearch->success = success;
10256a388c36SPeter Brune   PetscFunctionReturn(0);
10266a388c36SPeter Brune }
10276a388c36SPeter Brune 
10286a388c36SPeter Brune #undef __FUNCT__
1029bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchRegister"
1030bf7f4e0aSPeter Brune /*@C
1031bf7f4e0aSPeter Brune   LineSearchRegister - See LineSearchRegisterDynamic()
1032bf7f4e0aSPeter Brune 
1033bf7f4e0aSPeter Brune   Level: advanced
1034bf7f4e0aSPeter Brune @*/
1035bf7f4e0aSPeter Brune PetscErrorCode  LineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(LineSearch))
1036bf7f4e0aSPeter Brune {
1037bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1038bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1039bf7f4e0aSPeter Brune 
1040bf7f4e0aSPeter Brune   PetscFunctionBegin;
1041bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
1042bf7f4e0aSPeter Brune   ierr = PetscFListAdd(&LineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1043bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1044bf7f4e0aSPeter Brune }
1045