xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision f40b411b744099cdada5b1b9d4f261e67692b0a2)
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"
11*f40b411bSPeter Brune /*@
12*f40b411bSPeter Brune    LineSearchCreate - Creates the line search.
13*f40b411bSPeter Brune 
14*f40b411bSPeter Brune    Collective on LineSearch
15*f40b411bSPeter Brune 
16*f40b411bSPeter Brune    Input Parameters:
17*f40b411bSPeter Brune .  comm - MPI communicator for the line search
18*f40b411bSPeter Brune 
19*f40b411bSPeter Brune    Output Parameters:
20*f40b411bSPeter Brune .  outlinesearch - the line search instance.
21*f40b411bSPeter Brune 
22*f40b411bSPeter Brune    Level: Beginner
23*f40b411bSPeter Brune 
24*f40b411bSPeter Brune    .keywords: LineSearch, Create
25*f40b411bSPeter Brune 
26*f40b411bSPeter Brune    .seealso: LineSearchDestroy()
27*f40b411bSPeter Brune @*/
28*f40b411bSPeter 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;
49bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
50bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
51bf7f4e0aSPeter Brune   linesearch->max_its       = 1;
52bf7f4e0aSPeter Brune   linesearch->setupcalled   = PETSC_FALSE;
53bf7f4e0aSPeter Brune   *outlinesearch            = linesearch;
54bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
55bf7f4e0aSPeter Brune }
56bf7f4e0aSPeter Brune 
57bf7f4e0aSPeter Brune #undef __FUNCT__
58bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetUp"
59*f40b411bSPeter Brune /*@
60*f40b411bSPeter Brune    LineSearchSetUp - Prepares the line search for being applied.
61*f40b411bSPeter Brune 
62*f40b411bSPeter Brune    Collective on LineSearch
63*f40b411bSPeter Brune 
64*f40b411bSPeter Brune    Input Parameters:
65*f40b411bSPeter Brune .  linesearch - The LineSearch instance.
66*f40b411bSPeter Brune 
67*f40b411bSPeter Brune    Level: Intermediate
68*f40b411bSPeter Brune 
69*f40b411bSPeter Brune    .keywords: LineSearch, SetUp
70*f40b411bSPeter Brune 
71*f40b411bSPeter Brune    .seealso: LineSearchReset()
72*f40b411bSPeter Brune @*/
73*f40b411bSPeter Brune 
74bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetUp(LineSearch linesearch) {
75bf7f4e0aSPeter Brune   PetscErrorCode ierr;
76bf7f4e0aSPeter Brune   PetscFunctionBegin;
77bf7f4e0aSPeter Brune 
78bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
79bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,LINESEARCHBASIC);CHKERRQ(ierr);
80bf7f4e0aSPeter Brune   }
81bf7f4e0aSPeter Brune 
82bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
83bf7f4e0aSPeter Brune     ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
84bf7f4e0aSPeter Brune     ierr = VecDuplicate(linesearch->vec_func, &linesearch->vec_func_new);CHKERRQ(ierr);
85bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
86bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
87bf7f4e0aSPeter Brune     }
88bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping;
89bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
90bf7f4e0aSPeter Brune   }
91bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
92bf7f4e0aSPeter Brune }
93bf7f4e0aSPeter Brune 
94bf7f4e0aSPeter Brune #undef __FUNCT__
95bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchReset"
96*f40b411bSPeter Brune 
97*f40b411bSPeter Brune /*@
98*f40b411bSPeter Brune    LineSearchReset - Tears down the structures required for application
99*f40b411bSPeter Brune 
100*f40b411bSPeter Brune    Collective on LineSearch
101*f40b411bSPeter Brune 
102*f40b411bSPeter Brune    Input Parameters:
103*f40b411bSPeter Brune .  linesearch - The LineSearch instance.
104*f40b411bSPeter Brune 
105*f40b411bSPeter Brune    Level: Intermediate
106*f40b411bSPeter Brune 
107*f40b411bSPeter Brune    .keywords: LineSearch, Create
108*f40b411bSPeter Brune 
109*f40b411bSPeter Brune    .seealso: LineSearchSetUp()
110*f40b411bSPeter Brune @*/
111*f40b411bSPeter Brune 
112bf7f4e0aSPeter Brune PetscErrorCode LineSearchReset(LineSearch linesearch) {
113bf7f4e0aSPeter Brune   PetscErrorCode ierr;
114bf7f4e0aSPeter Brune   PetscFunctionBegin;
115bf7f4e0aSPeter Brune   if (linesearch->ops->reset) {
116bf7f4e0aSPeter Brune     (*linesearch->ops->reset)(linesearch);
117bf7f4e0aSPeter Brune   }
118bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
119bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
120bf7f4e0aSPeter Brune 
121bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
122bf7f4e0aSPeter Brune   linesearch->nwork = 0;
123bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
124bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
125bf7f4e0aSPeter Brune }
126bf7f4e0aSPeter Brune 
127bf7f4e0aSPeter Brune #undef __FUNCT__
128bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPreCheck"
129*f40b411bSPeter Brune /*@
130*f40b411bSPeter Brune    LineSearchPreCheck - Prepares the line search for being applied.
131*f40b411bSPeter Brune 
132*f40b411bSPeter Brune    Collective on LineSearch
133*f40b411bSPeter Brune 
134*f40b411bSPeter Brune    Input Parameters:
135*f40b411bSPeter Brune .  linesearch - The linesearch instance.
136*f40b411bSPeter Brune 
137*f40b411bSPeter Brune    Output Parameters:
138*f40b411bSPeter Brune .  changed - Indicator if the pre-check has changed anything.
139*f40b411bSPeter Brune 
140*f40b411bSPeter Brune    Level: Beginner
141*f40b411bSPeter Brune 
142*f40b411bSPeter Brune    .keywords: LineSearch, Create
143*f40b411bSPeter Brune 
144*f40b411bSPeter Brune    .seealso: LineSearchPostCheck()
145*f40b411bSPeter Brune @*/
146bf7f4e0aSPeter Brune PetscErrorCode LineSearchPreCheck(LineSearch linesearch, PetscBool * changed)
147bf7f4e0aSPeter Brune {
148bf7f4e0aSPeter Brune   PetscErrorCode ierr;
149bf7f4e0aSPeter Brune   PetscFunctionBegin;
150bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
151bf7f4e0aSPeter Brune   if (linesearch->ops->precheckstep) {
152bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr);
153bf7f4e0aSPeter Brune   }
154bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
155bf7f4e0aSPeter Brune }
156bf7f4e0aSPeter Brune 
157bf7f4e0aSPeter Brune #undef __FUNCT__
158bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPostCheck"
159*f40b411bSPeter Brune /*@
160*f40b411bSPeter Brune    LineSearchPostCheck - Prepares the line search for being applied.
161*f40b411bSPeter Brune 
162*f40b411bSPeter Brune    Collective on LineSearch
163*f40b411bSPeter Brune 
164*f40b411bSPeter Brune    Input Parameters:
165*f40b411bSPeter Brune .  linesearch - The linesearch instance.
166*f40b411bSPeter Brune 
167*f40b411bSPeter Brune    Output Parameters:
168*f40b411bSPeter Brune +  changed_W - Indicator if the solution has been changed.
169*f40b411bSPeter Brune -  changed_Y - Indicator if the direction has been changed.
170*f40b411bSPeter Brune 
171*f40b411bSPeter Brune    Level: Intermediate
172*f40b411bSPeter Brune 
173*f40b411bSPeter Brune    .keywords: LineSearch, Create
174*f40b411bSPeter Brune 
175*f40b411bSPeter Brune    .seealso: LineSearchPreCheck()
176*f40b411bSPeter Brune @*/
177bf7f4e0aSPeter Brune PetscErrorCode LineSearchPostCheck(LineSearch linesearch, PetscBool * changed_W, PetscBool * changed_Y)
178bf7f4e0aSPeter Brune {
179bf7f4e0aSPeter Brune   PetscErrorCode ierr;
180bf7f4e0aSPeter Brune   PetscFunctionBegin;
181bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
182bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
183bf7f4e0aSPeter Brune   if (linesearch->ops->postcheckstep) {
184bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_sol_new, linesearch->vec_update, changed_W, changed_Y);CHKERRQ(ierr);
185bf7f4e0aSPeter Brune   }
186bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
187bf7f4e0aSPeter Brune }
188bf7f4e0aSPeter Brune 
189bf7f4e0aSPeter Brune #undef __FUNCT__
190bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchApply"
191*f40b411bSPeter Brune /*@
192*f40b411bSPeter Brune    LineSearchApply - Computes the line-search update
193*f40b411bSPeter Brune 
194*f40b411bSPeter Brune    Collective on LineSearch
195*f40b411bSPeter Brune 
196*f40b411bSPeter Brune    Input Parameters:
197*f40b411bSPeter Brune +  linesearch - The linesearch instance.
198*f40b411bSPeter Brune .  X - The current solution.
199*f40b411bSPeter Brune .  F - The current function.
200*f40b411bSPeter Brune .  fnorm - The current norm.
201*f40b411bSPeter Brune .  Y - The search direction.
202*f40b411bSPeter Brune 
203*f40b411bSPeter Brune    Output Parameters:
204*f40b411bSPeter Brune +  X - The new solution.
205*f40b411bSPeter Brune .  F - The new function.
206*f40b411bSPeter Brune -  fnorm - The new function norm.
207*f40b411bSPeter Brune 
208*f40b411bSPeter Brune    Level: Intermediate
209*f40b411bSPeter Brune 
210*f40b411bSPeter Brune    .keywords: LineSearch, Create
211*f40b411bSPeter Brune 
212*f40b411bSPeter Brune    .seealso: LineSearchCreate(), LineSearchPreCheck(), LineSearchPostCheck()
213*f40b411bSPeter Brune @*/
214bf7f4e0aSPeter Brune PetscErrorCode LineSearchApply(LineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
215bf7f4e0aSPeter Brune   PetscErrorCode ierr;
216bf7f4e0aSPeter Brune   PetscFunctionBegin;
217bf7f4e0aSPeter Brune 
218bf7f4e0aSPeter Brune   /* check the pointers */
219bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
220bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
221bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
222bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
223bf7f4e0aSPeter Brune 
224bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
225bf7f4e0aSPeter Brune 
226bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
227bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
228bf7f4e0aSPeter Brune   linesearch->vec_func = F;
229bf7f4e0aSPeter Brune 
230bf7f4e0aSPeter Brune   ierr = LineSearchSetUp(linesearch);CHKERRQ(ierr);
231bf7f4e0aSPeter Brune 
232bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
233bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
234bf7f4e0aSPeter Brune 
235bf7f4e0aSPeter Brune   if (fnorm) {
236bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
237bf7f4e0aSPeter Brune   } else {
238bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
239bf7f4e0aSPeter Brune   }
240bf7f4e0aSPeter Brune 
241bf7f4e0aSPeter Brune   ierr = PetscLogEventBegin(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
242bf7f4e0aSPeter Brune 
243bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
244bf7f4e0aSPeter Brune 
245bf7f4e0aSPeter Brune   ierr = PetscLogEventEnd(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
246bf7f4e0aSPeter Brune 
247bf7f4e0aSPeter Brune   if (fnorm)
248bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
249bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
250bf7f4e0aSPeter Brune }
251bf7f4e0aSPeter Brune 
252bf7f4e0aSPeter Brune #undef __FUNCT__
253bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchDestroy"
254*f40b411bSPeter Brune /*@
255*f40b411bSPeter Brune    LineSearchDestroy - Destroys the line search instance.
256*f40b411bSPeter Brune 
257*f40b411bSPeter Brune    Collective on LineSearch
258*f40b411bSPeter Brune 
259*f40b411bSPeter Brune    Input Parameters:
260*f40b411bSPeter Brune .  linesearch - The linesearch instance.
261*f40b411bSPeter Brune 
262*f40b411bSPeter Brune    Level: Intermediate
263*f40b411bSPeter Brune 
264*f40b411bSPeter Brune    .keywords: LineSearch, Create
265*f40b411bSPeter Brune 
266*f40b411bSPeter Brune    .seealso: LineSearchCreate(), LineSearchReset()
267*f40b411bSPeter Brune @*/
268bf7f4e0aSPeter Brune PetscErrorCode LineSearchDestroy(LineSearch * linesearch) {
269bf7f4e0aSPeter Brune   PetscErrorCode ierr;
270bf7f4e0aSPeter Brune   PetscFunctionBegin;
271bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
272bf7f4e0aSPeter Brune   PetscValidHeaderSpecific((*linesearch),LineSearch_CLASSID,1);
273bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
274bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
275bf7f4e0aSPeter Brune   ierr = LineSearchReset(*linesearch);
276bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
277bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
278bf7f4e0aSPeter Brune   }
279bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
280e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
281bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
282bf7f4e0aSPeter Brune }
283bf7f4e0aSPeter Brune 
284bf7f4e0aSPeter Brune #undef __FUNCT__
285e7058c64SPeter Brune #define __FUNCT__ "LineSearchSetMonitor"
286*f40b411bSPeter Brune /*@
287*f40b411bSPeter Brune    LineSearchSetMonitor - Turns on/off printing useful things about the line search.
288bf7f4e0aSPeter Brune 
289bf7f4e0aSPeter Brune    Input Parameters:
290bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
291bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
292bf7f4e0aSPeter Brune 
293bf7f4e0aSPeter Brune    Logically Collective on SNES
294bf7f4e0aSPeter Brune 
295bf7f4e0aSPeter Brune    Options Database:
296*f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
297bf7f4e0aSPeter Brune 
298bf7f4e0aSPeter Brune    Level: intermediate
299bf7f4e0aSPeter Brune 
300bf7f4e0aSPeter Brune 
301*f40b411bSPeter Brune .seealso: LineSearchGetMonitor()
302bf7f4e0aSPeter Brune @*/
303bf7f4e0aSPeter Brune PetscErrorCode  LineSearchSetMonitor(LineSearch linesearch, PetscBool flg)
304bf7f4e0aSPeter Brune {
305bf7f4e0aSPeter Brune 
306bf7f4e0aSPeter Brune   PetscErrorCode ierr;
307bf7f4e0aSPeter Brune   PetscFunctionBegin;
308bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
309bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
310bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
311bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
312bf7f4e0aSPeter Brune   }
313bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
314bf7f4e0aSPeter Brune }
315bf7f4e0aSPeter Brune 
316bf7f4e0aSPeter Brune #undef __FUNCT__
3176a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMonitor"
318*f40b411bSPeter Brune /*@
319*f40b411bSPeter Brune    LineSearchGetMonitor - Gets the monitor instance for the line search
3206a388c36SPeter Brune 
321*f40b411bSPeter Brune    Input Parameters:
322*f40b411bSPeter Brune .  linesearch - linesearch context.
323*f40b411bSPeter Brune 
324*f40b411bSPeter Brune    Input Parameters:
325*f40b411bSPeter Brune .  monitor - monitor context.
326*f40b411bSPeter Brune 
327*f40b411bSPeter Brune    Logically Collective on SNES
328*f40b411bSPeter Brune 
329*f40b411bSPeter Brune 
330*f40b411bSPeter Brune    Options Database Keys:
331*f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
332*f40b411bSPeter Brune 
333*f40b411bSPeter Brune    Level: intermediate
334*f40b411bSPeter Brune 
335*f40b411bSPeter Brune 
336*f40b411bSPeter Brune .seealso: LineSearchSetMonitor()
337*f40b411bSPeter Brune @*/
3386a388c36SPeter Brune PetscErrorCode  LineSearchGetMonitor(LineSearch linesearch, PetscViewer *monitor)
3396a388c36SPeter Brune {
3406a388c36SPeter Brune 
3416a388c36SPeter Brune   PetscFunctionBegin;
3426a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
3436a388c36SPeter Brune   if (monitor) {
3446a388c36SPeter Brune     PetscValidPointer(monitor, 2);
3456a388c36SPeter Brune     *monitor = linesearch->monitor;
3466a388c36SPeter Brune   }
3476a388c36SPeter Brune   PetscFunctionReturn(0);
3486a388c36SPeter Brune }
3496a388c36SPeter Brune 
3506a388c36SPeter Brune #undef __FUNCT__
351bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetFromOptions"
352*f40b411bSPeter Brune /*@
353*f40b411bSPeter Brune    LineSearchSetFromOptions - Sets options for the line search
354*f40b411bSPeter Brune 
355*f40b411bSPeter Brune    Input Parameters:
356*f40b411bSPeter Brune .  linesearch - linesearch context.
357*f40b411bSPeter Brune 
358*f40b411bSPeter Brune    Options Database Keys:
359*f40b411bSPeter Brune + -linesearch_type - The Line search method
360*f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches
361*f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter.
362*f40b411bSPeter Brune . -linesearch_norms   - Turn on/off the linesearch norms
363*f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess.
364*f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches.
365*f40b411bSPeter Brune 
366*f40b411bSPeter Brune    Logically Collective on LineSearch
367*f40b411bSPeter Brune 
368*f40b411bSPeter Brune    Level: intermediate
369*f40b411bSPeter Brune 
370*f40b411bSPeter Brune 
371*f40b411bSPeter Brune .seealso: LineSearchCreate()
372*f40b411bSPeter Brune @*/
373bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetFromOptions(LineSearch linesearch) {
374bf7f4e0aSPeter Brune   PetscErrorCode ierr;
375bf7f4e0aSPeter Brune   const char     *deft = LINESEARCHBASIC;
376bf7f4e0aSPeter Brune   char           type[256];
377bf7f4e0aSPeter Brune   PetscBool      flg, set;
378bf7f4e0aSPeter Brune   PetscFunctionBegin;
379bf7f4e0aSPeter Brune   if (!LineSearchRegisterAllCalled) {ierr = LineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
380bf7f4e0aSPeter Brune 
381bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
382bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
383bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
384bf7f4e0aSPeter Brune   }
385bf7f4e0aSPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","LineSearchSetType",LineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
386bf7f4e0aSPeter Brune   if (flg) {
387bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,type);CHKERRQ(ierr);
388bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
389bf7f4e0aSPeter Brune     ierr = LineSearchSetType(linesearch,deft);CHKERRQ(ierr);
390bf7f4e0aSPeter Brune   }
391bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
392bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
393bf7f4e0aSPeter Brune   }
394bf7f4e0aSPeter Brune 
395bf7f4e0aSPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESLineSearchSetMonitor",
396bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
397bf7f4e0aSPeter Brune   if (set) {ierr = LineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
398bf7f4e0aSPeter Brune 
399bf7f4e0aSPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","LineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
4006a388c36SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","LineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
4016a388c36SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","LineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
402bf7f4e0aSPeter Brune   ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
403bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
404bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
405bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
406bf7f4e0aSPeter Brune }
407bf7f4e0aSPeter Brune 
408bf7f4e0aSPeter Brune #undef __FUNCT__
409bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchView"
410*f40b411bSPeter Brune /*@
411*f40b411bSPeter Brune    LineSearchView - Views useful information for the line search.
412*f40b411bSPeter Brune 
413*f40b411bSPeter Brune    Input Parameters:
414*f40b411bSPeter Brune .  linesearch - linesearch context.
415*f40b411bSPeter Brune 
416*f40b411bSPeter Brune    Logically Collective on LineSearch
417*f40b411bSPeter Brune 
418*f40b411bSPeter Brune    Level: intermediate
419*f40b411bSPeter Brune 
420*f40b411bSPeter Brune 
421*f40b411bSPeter Brune .seealso: LineSearchCreate()
422*f40b411bSPeter Brune @*/
423bf7f4e0aSPeter Brune PetscErrorCode LineSearchView(LineSearch linesearch) {
424bf7f4e0aSPeter Brune   PetscFunctionBegin;
425*f40b411bSPeter Brune 
426bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
427bf7f4e0aSPeter Brune }
428bf7f4e0aSPeter Brune 
429bf7f4e0aSPeter Brune #undef __FUNCT__
430bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetType"
431*f40b411bSPeter Brune /*@
432*f40b411bSPeter Brune    LineSearchSetType - Sets the linesearch type
433*f40b411bSPeter Brune 
434*f40b411bSPeter Brune    Input Parameters:
435*f40b411bSPeter Brune +  linesearch - linesearch context.
436*f40b411bSPeter Brune -  type - The type of line search to be used
437*f40b411bSPeter Brune 
438*f40b411bSPeter Brune    Logically Collective on LineSearch
439*f40b411bSPeter Brune 
440*f40b411bSPeter Brune    Level: intermediate
441*f40b411bSPeter Brune 
442*f40b411bSPeter Brune 
443*f40b411bSPeter Brune .seealso: LineSearchCreate()
444*f40b411bSPeter Brune @*/
445bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetType(LineSearch linesearch, const LineSearchType type)
446bf7f4e0aSPeter Brune {
447bf7f4e0aSPeter Brune 
448bf7f4e0aSPeter Brune   PetscErrorCode ierr,(*r)(LineSearch);
449bf7f4e0aSPeter Brune   PetscBool      match;
450bf7f4e0aSPeter Brune 
451bf7f4e0aSPeter Brune   PetscFunctionBegin;
452bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
453bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
454bf7f4e0aSPeter Brune 
455bf7f4e0aSPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
456bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
457bf7f4e0aSPeter Brune 
458bf7f4e0aSPeter Brune   ierr =  PetscFListFind(LineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
459bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
460bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
461bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
462bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
463bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
464bf7f4e0aSPeter Brune   }
465bf7f4e0aSPeter Brune   /* Reinitialize function pointers in LineSearchOps structure */
466bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
467bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
468bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
469bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
470bf7f4e0aSPeter Brune 
471bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
472bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
473bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
474bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
475bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
476bf7f4e0aSPeter Brune   }
477bf7f4e0aSPeter Brune #endif
478bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
479bf7f4e0aSPeter Brune }
480bf7f4e0aSPeter Brune 
481bf7f4e0aSPeter Brune #undef __FUNCT__
482bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetSNES"
483*f40b411bSPeter Brune /*@
484*f40b411bSPeter Brune    LineSearchSetSNES - Sets the SNES for the linesearch for function evaluation
485*f40b411bSPeter Brune 
486*f40b411bSPeter Brune    Input Parameters:
487*f40b411bSPeter Brune +  linesearch - linesearch context.
488*f40b411bSPeter Brune -  snes - The snes instance
489*f40b411bSPeter Brune 
490*f40b411bSPeter Brune    Level: intermediate
491*f40b411bSPeter Brune 
492*f40b411bSPeter Brune 
493*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
494*f40b411bSPeter Brune @*/
495bf7f4e0aSPeter Brune PetscErrorCode  LineSearchSetSNES(LineSearch linesearch, SNES snes){
496bf7f4e0aSPeter Brune   PetscFunctionBegin;
497bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
498bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
499bf7f4e0aSPeter Brune   linesearch->snes = snes;
500bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
501bf7f4e0aSPeter Brune }
502bf7f4e0aSPeter Brune 
503bf7f4e0aSPeter Brune #undef __FUNCT__
504bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSNES"
505*f40b411bSPeter Brune /*@
506*f40b411bSPeter Brune    LineSearchGetSNES - Gets the SNES for the linesearch for function evaluation
507*f40b411bSPeter Brune 
508*f40b411bSPeter Brune    Input Parameters:
509*f40b411bSPeter Brune .  linesearch - linesearch context.
510*f40b411bSPeter Brune 
511*f40b411bSPeter Brune    Output Parameters:
512*f40b411bSPeter Brune .  snes - The snes instance
513*f40b411bSPeter Brune 
514*f40b411bSPeter Brune    Level: intermediate
515*f40b411bSPeter Brune 
516*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
517*f40b411bSPeter Brune @*/
518bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetSNES(LineSearch linesearch, SNES *snes){
519bf7f4e0aSPeter Brune   PetscFunctionBegin;
5206a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5216a388c36SPeter Brune   PetscValidPointer(snes, 2);
522bf7f4e0aSPeter Brune   *snes = linesearch->snes;
523bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
524bf7f4e0aSPeter Brune }
525bf7f4e0aSPeter Brune 
5266a388c36SPeter Brune #undef __FUNCT__
5276a388c36SPeter Brune #define __FUNCT__ "LineSearchGetLambda"
528*f40b411bSPeter Brune /*@
529*f40b411bSPeter Brune    LineSearchGetLambda - Gets the last linesearch steplength discovered.
530*f40b411bSPeter Brune 
531*f40b411bSPeter Brune    Input Parameters:
532*f40b411bSPeter Brune .  linesearch - linesearch context.
533*f40b411bSPeter Brune 
534*f40b411bSPeter Brune    Output Parameters:
535*f40b411bSPeter Brune .  lambda - The last steplength.
536*f40b411bSPeter Brune 
537*f40b411bSPeter Brune    Level: intermediate
538*f40b411bSPeter Brune 
539*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs()
540*f40b411bSPeter Brune @*/
5416a388c36SPeter Brune PetscErrorCode  LineSearchGetLambda(LineSearch linesearch,PetscReal *lambda)
5426a388c36SPeter Brune {
5436a388c36SPeter Brune   PetscFunctionBegin;
5446a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5456a388c36SPeter Brune   PetscValidPointer(lambda, 2);
5466a388c36SPeter Brune   *lambda = linesearch->lambda;
5476a388c36SPeter Brune   PetscFunctionReturn(0);
5486a388c36SPeter Brune }
5496a388c36SPeter Brune 
5506a388c36SPeter Brune #undef __FUNCT__
5516a388c36SPeter Brune #define __FUNCT__ "LineSearchSetLambda"
552*f40b411bSPeter Brune /*@
553*f40b411bSPeter Brune    LineSearchSetLambda - Sets the linesearch steplength.
554*f40b411bSPeter Brune 
555*f40b411bSPeter Brune    Input Parameters:
556*f40b411bSPeter Brune +  linesearch - linesearch context.
557*f40b411bSPeter Brune -  lambda - The last steplength.
558*f40b411bSPeter Brune 
559*f40b411bSPeter Brune    Level: intermediate
560*f40b411bSPeter Brune 
561*f40b411bSPeter Brune .seealso: LineSearchGetLambda()
562*f40b411bSPeter Brune @*/
5636a388c36SPeter Brune PetscErrorCode  LineSearchSetLambda(LineSearch linesearch, PetscReal lambda)
5646a388c36SPeter Brune {
5656a388c36SPeter Brune   PetscFunctionBegin;
5666a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5676a388c36SPeter Brune   linesearch->lambda = lambda;
5686a388c36SPeter Brune   PetscFunctionReturn(0);
5696a388c36SPeter Brune }
5706a388c36SPeter Brune 
5716a388c36SPeter Brune #undef __FUNCT__
5726a388c36SPeter Brune #define __FUNCT__ "LineSearchGetStepTolerance"
573*f40b411bSPeter Brune /*@
574*f40b411bSPeter Brune    LineSearchGetStepTolerance - Gets the line search step tolerance.
575*f40b411bSPeter Brune 
576*f40b411bSPeter Brune    Input Parameters:
577*f40b411bSPeter Brune .  linesearch - linesearch context.
578*f40b411bSPeter Brune 
579*f40b411bSPeter Brune    Output Parameters:
580*f40b411bSPeter Brune .  steptol - The last steplength.
581*f40b411bSPeter Brune 
582*f40b411bSPeter Brune    Level: intermediate
583*f40b411bSPeter Brune 
584*f40b411bSPeter Brune .seealso: LineSearchSetStepTolerance()
585*f40b411bSPeter Brune @*/
5866a388c36SPeter Brune PetscErrorCode  LineSearchGetStepTolerance(LineSearch linesearch ,PetscReal *steptol)
5876a388c36SPeter Brune {
5886a388c36SPeter Brune   PetscFunctionBegin;
5896a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
5906a388c36SPeter Brune   PetscValidPointer(steptol, 2);
5916a388c36SPeter Brune   *steptol = linesearch->steptol;
5926a388c36SPeter Brune   PetscFunctionReturn(0);
5936a388c36SPeter Brune }
5946a388c36SPeter Brune 
5956a388c36SPeter Brune #undef __FUNCT__
5966a388c36SPeter Brune #define __FUNCT__ "LineSearchSetStepTolerance"
597*f40b411bSPeter Brune /*@
598*f40b411bSPeter Brune    LineSearchSetStepTolerance - Gets the line search step tolerance.
599*f40b411bSPeter Brune 
600*f40b411bSPeter Brune    Input Parameters:
601*f40b411bSPeter Brune .  linesearch - linesearch context.
602*f40b411bSPeter Brune .  steptol - The last steplength.
603*f40b411bSPeter Brune 
604*f40b411bSPeter Brune    Level: intermediate
605*f40b411bSPeter Brune 
606*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance()
607*f40b411bSPeter Brune @*/
6086a388c36SPeter Brune PetscErrorCode  LineSearchSetStepTolerance(LineSearch linesearch,PetscReal steptol)
6096a388c36SPeter Brune {
6106a388c36SPeter Brune   PetscFunctionBegin;
6116a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6126a388c36SPeter Brune   linesearch->steptol = steptol;
6136a388c36SPeter Brune   PetscFunctionReturn(0);
6146a388c36SPeter Brune }
6156a388c36SPeter Brune 
6166a388c36SPeter Brune #undef __FUNCT__
6176a388c36SPeter Brune #define __FUNCT__ "LineSearchGetDamping"
618*f40b411bSPeter Brune /*@
619*f40b411bSPeter Brune    LineSearchGetDamping - Gets the line search damping paramter.
620*f40b411bSPeter Brune 
621*f40b411bSPeter Brune    Input Parameters:
622*f40b411bSPeter Brune .  linesearch - linesearch context.
623*f40b411bSPeter Brune 
624*f40b411bSPeter Brune    Output Parameters:
625*f40b411bSPeter Brune .  damping - The damping parameter.
626*f40b411bSPeter Brune 
627*f40b411bSPeter Brune    Level: intermediate
628*f40b411bSPeter Brune 
629*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance()
630*f40b411bSPeter Brune @*/
631*f40b411bSPeter Brune 
632*f40b411bSPeter Brune PetscErrorCode  LineSearchGetDamping(LineSearch linesearch,PetscReal *damping)
6336a388c36SPeter Brune {
6346a388c36SPeter Brune   PetscFunctionBegin;
6356a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6366a388c36SPeter Brune   PetscValidPointer(damping, 2);
6376a388c36SPeter Brune   *damping = linesearch->damping;
6386a388c36SPeter Brune   PetscFunctionReturn(0);
6396a388c36SPeter Brune }
6406a388c36SPeter Brune 
6416a388c36SPeter Brune #undef __FUNCT__
6426a388c36SPeter Brune #define __FUNCT__ "LineSearchSetDamping"
643*f40b411bSPeter Brune /*@
644*f40b411bSPeter Brune    LineSearchSetDamping - Sets the line search damping paramter.
645*f40b411bSPeter Brune 
646*f40b411bSPeter Brune    Input Parameters:
647*f40b411bSPeter Brune .  linesearch - linesearch context.
648*f40b411bSPeter Brune .  damping - The damping parameter.
649*f40b411bSPeter Brune 
650*f40b411bSPeter Brune    Level: intermediate
651*f40b411bSPeter Brune 
652*f40b411bSPeter Brune .seealso: LineSearchGetDamping()
653*f40b411bSPeter Brune @*/
654*f40b411bSPeter Brune PetscErrorCode  LineSearchSetDamping(LineSearch linesearch,PetscReal damping)
6556a388c36SPeter Brune {
6566a388c36SPeter Brune   PetscFunctionBegin;
6576a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6586a388c36SPeter Brune   linesearch->damping = damping;
6596a388c36SPeter Brune   PetscFunctionReturn(0);
6606a388c36SPeter Brune }
6616a388c36SPeter Brune 
6626a388c36SPeter Brune #undef __FUNCT__
6636a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMaxStep"
664*f40b411bSPeter Brune /*@
665*f40b411bSPeter Brune    LineSearchGetMaxStep - Gets the maximum allowable step size for the line search.
666*f40b411bSPeter Brune 
667*f40b411bSPeter Brune    Input Parameters:
668*f40b411bSPeter Brune .  linesearch - linesearch context.
669*f40b411bSPeter Brune 
670*f40b411bSPeter Brune    Output Parameters:
671*f40b411bSPeter Brune .  maxstep - The maximum step.
672*f40b411bSPeter Brune 
673*f40b411bSPeter Brune    Level: intermediate
674*f40b411bSPeter Brune 
675*f40b411bSPeter Brune .seealso: LineSearchSetMaxStep()
676*f40b411bSPeter Brune @*/
677*f40b411bSPeter Brune PetscErrorCode  LineSearchGetMaxStep(LineSearch linesearch,PetscReal* maxstep)
6786a388c36SPeter Brune {
6796a388c36SPeter Brune   PetscFunctionBegin;
6806a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
6816a388c36SPeter Brune   PetscValidPointer(maxstep, 2);
6826a388c36SPeter Brune   *maxstep = linesearch->maxstep;
6836a388c36SPeter Brune   PetscFunctionReturn(0);
6846a388c36SPeter Brune }
6856a388c36SPeter Brune 
6866a388c36SPeter Brune #undef __FUNCT__
6876a388c36SPeter Brune #define __FUNCT__ "LineSearchSetMaxStep"
688*f40b411bSPeter Brune /*@
689*f40b411bSPeter Brune    LineSearchSetMaxStep - Sets the maximum allowable step size for the line search.
690*f40b411bSPeter Brune 
691*f40b411bSPeter Brune    Input Parameters:
692*f40b411bSPeter Brune .  linesearch - linesearch context.
693*f40b411bSPeter Brune .  maxstep - The maximum step.
694*f40b411bSPeter Brune 
695*f40b411bSPeter Brune    Level: intermediate
696*f40b411bSPeter Brune 
697*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance()
698*f40b411bSPeter Brune @*/
699*f40b411bSPeter Brune PetscErrorCode  LineSearchSetMaxStep(LineSearch linesearch, PetscReal maxstep)
7006a388c36SPeter Brune {
7016a388c36SPeter Brune   PetscFunctionBegin;
7026a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
7036a388c36SPeter Brune   linesearch->maxstep = maxstep;
7046a388c36SPeter Brune   PetscFunctionReturn(0);
7056a388c36SPeter Brune }
7066a388c36SPeter Brune 
7076a388c36SPeter Brune #undef __FUNCT__
7086a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMaxIts"
709*f40b411bSPeter Brune /*@
710*f40b411bSPeter Brune    LineSearchGetMaxIts - Gets the maximum iterations for iterative line searches.
711*f40b411bSPeter Brune 
712*f40b411bSPeter Brune    Input Parameters:
713*f40b411bSPeter Brune .  linesearch - linesearch context.
714*f40b411bSPeter Brune 
715*f40b411bSPeter Brune    Output Parameters:
716*f40b411bSPeter Brune .  max_its - The maximum number of iterations.
717*f40b411bSPeter Brune 
718*f40b411bSPeter Brune    Level: intermediate
719*f40b411bSPeter Brune 
720*f40b411bSPeter Brune .seealso: LineSearchSetMaxIts()
721*f40b411bSPeter Brune @*/
7226a388c36SPeter Brune PetscErrorCode LineSearchGetMaxIts(LineSearch linesearch, PetscInt * max_its)
7236a388c36SPeter Brune {
7246a388c36SPeter Brune   PetscFunctionBegin;
7256a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
7266a388c36SPeter Brune   PetscValidPointer(max_its, 2);
7276a388c36SPeter Brune   *max_its = linesearch->max_its;
7286a388c36SPeter Brune   PetscFunctionReturn(0);
7296a388c36SPeter Brune }
7306a388c36SPeter Brune 
7316a388c36SPeter Brune #undef __FUNCT__
7326a388c36SPeter Brune #define __FUNCT__ "LineSearchSetMaxIts"
733*f40b411bSPeter Brune /*@
734*f40b411bSPeter Brune    LineSearchSetMaxIts - Sets the maximum iterations for iterative line searches.
735*f40b411bSPeter Brune 
736*f40b411bSPeter Brune    Input Parameters:
737*f40b411bSPeter Brune .  linesearch - linesearch context.
738*f40b411bSPeter Brune .  max_its - The maximum number of iterations.
739*f40b411bSPeter Brune 
740*f40b411bSPeter Brune    Level: intermediate
741*f40b411bSPeter Brune 
742*f40b411bSPeter Brune .seealso: LineSearchGetMaxIts()
743*f40b411bSPeter Brune @*/
7446a388c36SPeter Brune PetscErrorCode LineSearchSetMaxIts(LineSearch linesearch, PetscInt max_its)
7456a388c36SPeter Brune {
7466a388c36SPeter Brune   PetscFunctionBegin;
7476a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
7486a388c36SPeter Brune   linesearch->max_its = max_its;
7496a388c36SPeter Brune   PetscFunctionReturn(0);
7506a388c36SPeter Brune }
751bf7f4e0aSPeter Brune 
752bf7f4e0aSPeter Brune #undef __FUNCT__
753bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetNorms"
754*f40b411bSPeter Brune /*@
755*f40b411bSPeter Brune    LineSearchGetNorms - Gets the norms for for X, Y, and F.
756*f40b411bSPeter Brune 
757*f40b411bSPeter Brune    Input Parameters:
758*f40b411bSPeter Brune .  linesearch - linesearch context.
759*f40b411bSPeter Brune 
760*f40b411bSPeter Brune    Output Parameters:
761*f40b411bSPeter Brune +  xnorm - The norm of the current solution
762*f40b411bSPeter Brune .  fnorm - The norm of the current function
763*f40b411bSPeter Brune -  ynorm - The norm of the current update
764*f40b411bSPeter Brune 
765*f40b411bSPeter Brune    Level: intermediate
766*f40b411bSPeter Brune 
767*f40b411bSPeter Brune .seealso: LineSearchSetNorms() LineSearchGetVecs()
768*f40b411bSPeter Brune @*/
769bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetNorms(LineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
770bf7f4e0aSPeter Brune {
771bf7f4e0aSPeter Brune   PetscFunctionBegin;
7726a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
773bf7f4e0aSPeter Brune   if (xnorm) {
774bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
775bf7f4e0aSPeter Brune   }
776bf7f4e0aSPeter Brune   if (fnorm) {
777bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
778bf7f4e0aSPeter Brune   }
779bf7f4e0aSPeter Brune   if (ynorm) {
780bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
781bf7f4e0aSPeter Brune   }
782bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
783bf7f4e0aSPeter Brune }
784bf7f4e0aSPeter Brune 
785e7058c64SPeter Brune #undef __FUNCT__
7866a388c36SPeter Brune #define __FUNCT__ "LineSearchSetNorms"
787*f40b411bSPeter Brune /*@
788*f40b411bSPeter Brune    LineSearchSetNorms - Gets the computed norms for for X, Y, and F.
789*f40b411bSPeter Brune 
790*f40b411bSPeter Brune    Input Parameters:
791*f40b411bSPeter Brune +  linesearch - linesearch context.
792*f40b411bSPeter Brune .  xnorm - The norm of the current solution
793*f40b411bSPeter Brune .  fnorm - The norm of the current function
794*f40b411bSPeter Brune -  ynorm - The norm of the current update
795*f40b411bSPeter Brune 
796*f40b411bSPeter Brune    Level: intermediate
797*f40b411bSPeter Brune 
798*f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs()
799*f40b411bSPeter Brune @*/
8006a388c36SPeter Brune PetscErrorCode  LineSearchSetNorms(LineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
8016a388c36SPeter Brune {
8026a388c36SPeter Brune   PetscFunctionBegin;
8036a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
8046a388c36SPeter Brune   if (xnorm) {
8056a388c36SPeter Brune     linesearch->xnorm = xnorm;
8066a388c36SPeter Brune   }
8076a388c36SPeter Brune   if (fnorm) {
8086a388c36SPeter Brune     linesearch->fnorm = fnorm;
8096a388c36SPeter Brune   }
8106a388c36SPeter Brune   if (ynorm) {
8116a388c36SPeter Brune     linesearch->ynorm = ynorm;
8126a388c36SPeter Brune   }
8136a388c36SPeter Brune   PetscFunctionReturn(0);
8146a388c36SPeter Brune }
8156a388c36SPeter Brune 
8166a388c36SPeter Brune #undef __FUNCT__
8176a388c36SPeter Brune #define __FUNCT__ "LineSearchComputeNorms"
818*f40b411bSPeter Brune /*@
819*f40b411bSPeter Brune    LineSearchComputeNorms - Computes the norms of X, F, and Y.
820*f40b411bSPeter Brune 
821*f40b411bSPeter Brune    Input Parameters:
822*f40b411bSPeter Brune .  linesearch - linesearch context.
823*f40b411bSPeter Brune 
824*f40b411bSPeter Brune    Options Database Keys:
825*f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
826*f40b411bSPeter Brune 
827*f40b411bSPeter Brune    Level: intermediate
828*f40b411bSPeter Brune 
829*f40b411bSPeter Brune .seealso: LineSearchGetNorms, LineSearchSetNorms()
830*f40b411bSPeter Brune @*/
8316a388c36SPeter Brune PetscErrorCode LineSearchComputeNorms(LineSearch linesearch)
8326a388c36SPeter Brune {
8336a388c36SPeter Brune   PetscErrorCode ierr;
8346a388c36SPeter Brune   PetscFunctionBegin;
8356a388c36SPeter Brune   if (linesearch->norms) {
8366a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
8376a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
8386a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
8396a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
8406a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
8416a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
8426a388c36SPeter Brune   }
8436a388c36SPeter Brune   PetscFunctionReturn(0);
8446a388c36SPeter Brune }
8456a388c36SPeter Brune 
8466a388c36SPeter Brune #undef __FUNCT__
8476a388c36SPeter Brune #define __FUNCT__ "LineSearchGetVecs"
848*f40b411bSPeter Brune /*@
849*f40b411bSPeter Brune    LineSearchGetVecs - Gets the vectors from the LineSearch context
850*f40b411bSPeter Brune 
851*f40b411bSPeter Brune    Input Parameters:
852*f40b411bSPeter Brune .  linesearch - linesearch context.
853*f40b411bSPeter Brune 
854*f40b411bSPeter Brune    Output Parameters:
855*f40b411bSPeter Brune +  X - The old solution
856*f40b411bSPeter Brune .  F - The old function
857*f40b411bSPeter Brune .  Y - The search direction
858*f40b411bSPeter Brune .  W - The new solution
859*f40b411bSPeter Brune -  G - The new function
860*f40b411bSPeter Brune 
861*f40b411bSPeter Brune    Level: intermediate
862*f40b411bSPeter Brune 
863*f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs()
864*f40b411bSPeter Brune @*/
8656a388c36SPeter Brune PetscErrorCode LineSearchGetVecs(LineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
8666a388c36SPeter Brune   PetscFunctionBegin;
8676a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
8686a388c36SPeter Brune   if (X) {
8696a388c36SPeter Brune     PetscValidPointer(X, 2);
8706a388c36SPeter Brune     *X = linesearch->vec_sol;
8716a388c36SPeter Brune   }
8726a388c36SPeter Brune   if (F) {
8736a388c36SPeter Brune     PetscValidPointer(F, 3);
8746a388c36SPeter Brune     *F = linesearch->vec_func;
8756a388c36SPeter Brune   }
8766a388c36SPeter Brune   if (Y) {
8776a388c36SPeter Brune     PetscValidPointer(Y, 4);
8786a388c36SPeter Brune     *Y = linesearch->vec_update;
8796a388c36SPeter Brune   }
8806a388c36SPeter Brune   if (W) {
8816a388c36SPeter Brune     PetscValidPointer(W, 5);
8826a388c36SPeter Brune     *W = linesearch->vec_sol_new;
8836a388c36SPeter Brune   }
8846a388c36SPeter Brune   if (G) {
8856a388c36SPeter Brune     PetscValidPointer(G, 6);
8866a388c36SPeter Brune     *G = linesearch->vec_func_new;
8876a388c36SPeter Brune   }
8886a388c36SPeter Brune 
8896a388c36SPeter Brune   PetscFunctionReturn(0);
8906a388c36SPeter Brune }
8916a388c36SPeter Brune 
8926a388c36SPeter Brune #undef __FUNCT__
8936a388c36SPeter Brune #define __FUNCT__ "LineSearchSetVecs"
894*f40b411bSPeter Brune /*@
895*f40b411bSPeter Brune    LineSearchSetVecs - Sets the vectors on the LineSearch context
896*f40b411bSPeter Brune 
897*f40b411bSPeter Brune    Input Parameters:
898*f40b411bSPeter Brune +  linesearch - linesearch context.
899*f40b411bSPeter Brune .  X - The old solution
900*f40b411bSPeter Brune .  F - The old function
901*f40b411bSPeter Brune .  Y - The search direction
902*f40b411bSPeter Brune .  W - The new solution
903*f40b411bSPeter Brune -  G - The new function
904*f40b411bSPeter Brune 
905*f40b411bSPeter Brune    Level: intermediate
906*f40b411bSPeter Brune 
907*f40b411bSPeter Brune .seealso: LineSearchSetNorms(), LineSearchGetVecs()
908*f40b411bSPeter Brune @*/
9096a388c36SPeter Brune PetscErrorCode LineSearchSetVecs(LineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
9106a388c36SPeter Brune   PetscFunctionBegin;
9116a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
9126a388c36SPeter Brune   if (X) {
9136a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
9146a388c36SPeter Brune     linesearch->vec_sol = X;
9156a388c36SPeter Brune   }
9166a388c36SPeter Brune   if (F) {
9176a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
9186a388c36SPeter Brune     linesearch->vec_func = F;
9196a388c36SPeter Brune   }
9206a388c36SPeter Brune   if (Y) {
9216a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
9226a388c36SPeter Brune     linesearch->vec_update = Y;
9236a388c36SPeter Brune   }
9246a388c36SPeter Brune   if (W) {
9256a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
9266a388c36SPeter Brune     linesearch->vec_sol_new = W;
9276a388c36SPeter Brune   }
9286a388c36SPeter Brune   if (G) {
9296a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
9306a388c36SPeter Brune     linesearch->vec_func_new = G;
9316a388c36SPeter Brune   }
9326a388c36SPeter Brune 
9336a388c36SPeter Brune   PetscFunctionReturn(0);
9346a388c36SPeter Brune }
9356a388c36SPeter Brune 
9366a388c36SPeter Brune #undef __FUNCT__
937e7058c64SPeter Brune #define __FUNCT__ "LineSearchAppendOptionsPrefix"
938e7058c64SPeter Brune /*@C
939e7058c64SPeter Brune    LineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
940e7058c64SPeter Brune    SNES options in the database.
941e7058c64SPeter Brune 
942e7058c64SPeter Brune    Logically Collective on SNES
943e7058c64SPeter Brune 
944e7058c64SPeter Brune    Input Parameters:
945e7058c64SPeter Brune +  snes - the SNES context
946e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
947e7058c64SPeter Brune 
948e7058c64SPeter Brune    Notes:
949e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
950e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
951e7058c64SPeter Brune 
952e7058c64SPeter Brune    Level: advanced
953e7058c64SPeter Brune 
954*f40b411bSPeter Brune .keywords: LineSearch, append, options, prefix, database
955e7058c64SPeter Brune 
956e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
957e7058c64SPeter Brune @*/
958e7058c64SPeter Brune PetscErrorCode  LineSearchAppendOptionsPrefix(LineSearch linesearch,const char prefix[])
959e7058c64SPeter Brune {
960e7058c64SPeter Brune   PetscErrorCode ierr;
961e7058c64SPeter Brune 
962e7058c64SPeter Brune   PetscFunctionBegin;
963e7058c64SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
964e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
965e7058c64SPeter Brune   PetscFunctionReturn(0);
966e7058c64SPeter Brune }
967e7058c64SPeter Brune 
968e7058c64SPeter Brune #undef __FUNCT__
969e7058c64SPeter Brune #define __FUNCT__ "LineSearchGetOptionsPrefix"
970e7058c64SPeter Brune /*@C
971e7058c64SPeter Brune    LineSearchGetOptionsPrefix - Sets the prefix used for searching for all
972*f40b411bSPeter Brune    LineSearch options in the database.
973e7058c64SPeter Brune 
974e7058c64SPeter Brune    Not Collective
975e7058c64SPeter Brune 
976e7058c64SPeter Brune    Input Parameter:
977e7058c64SPeter Brune .  snes - the SNES context
978e7058c64SPeter Brune 
979e7058c64SPeter Brune    Output Parameter:
980e7058c64SPeter Brune .  prefix - pointer to the prefix string used
981e7058c64SPeter Brune 
982e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
983e7058c64SPeter Brune    sufficient length to hold the prefix.
984e7058c64SPeter Brune 
985e7058c64SPeter Brune    Level: advanced
986e7058c64SPeter Brune 
987*f40b411bSPeter Brune .keywords: LineSearch, get, options, prefix, database
988e7058c64SPeter Brune 
989e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
990e7058c64SPeter Brune @*/
991e7058c64SPeter Brune PetscErrorCode  LineSearchGetOptionsPrefix(LineSearch linesearch,const char *prefix[])
992e7058c64SPeter Brune {
993e7058c64SPeter Brune   PetscErrorCode ierr;
994e7058c64SPeter Brune 
995e7058c64SPeter Brune   PetscFunctionBegin;
996e7058c64SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
997e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
998e7058c64SPeter Brune   PetscFunctionReturn(0);
999e7058c64SPeter Brune }
1000bf7f4e0aSPeter Brune 
1001bf7f4e0aSPeter Brune #undef __FUNCT__
1002bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetWork"
1003*f40b411bSPeter Brune /*@
1004*f40b411bSPeter Brune    LineSearchGetWork - Gets work vectors for the line search.
1005*f40b411bSPeter Brune 
1006*f40b411bSPeter Brune    Input Parameter:
1007*f40b411bSPeter Brune +  linesearch - the LineSearch context
1008*f40b411bSPeter Brune -  nwork - the number of work vectors
1009*f40b411bSPeter Brune 
1010*f40b411bSPeter Brune    Level: developer
1011*f40b411bSPeter Brune 
1012*f40b411bSPeter Brune .keywords: LineSearch, work, vector
1013*f40b411bSPeter Brune 
1014*f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1015*f40b411bSPeter Brune @*/
1016bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetWork(LineSearch linesearch, PetscInt nwork)
1017bf7f4e0aSPeter Brune {
1018bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1019bf7f4e0aSPeter Brune   PetscFunctionBegin;
1020bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1021bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
1022bf7f4e0aSPeter Brune   } else {
1023bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1024bf7f4e0aSPeter Brune   }
1025bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1026bf7f4e0aSPeter Brune }
1027bf7f4e0aSPeter Brune 
10286a388c36SPeter Brune 
1029bf7f4e0aSPeter Brune #undef __FUNCT__
1030bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSuccess"
1031*f40b411bSPeter Brune /*@
1032*f40b411bSPeter Brune    LineSearchGetSuccess - Gets the success/failure status of the last line search application
1033*f40b411bSPeter Brune 
1034*f40b411bSPeter Brune    Input Parameters:
1035*f40b411bSPeter Brune .  linesearch - linesearch context.
1036*f40b411bSPeter Brune 
1037*f40b411bSPeter Brune    Output Parameters:
1038*f40b411bSPeter Brune .  success - The success or failure status.
1039*f40b411bSPeter Brune 
1040*f40b411bSPeter Brune    Level: intermediate
1041*f40b411bSPeter Brune 
1042*f40b411bSPeter Brune .seealso: LineSearchSetSuccess()
1043*f40b411bSPeter Brune @*/
1044bf7f4e0aSPeter Brune PetscErrorCode  LineSearchGetSuccess(LineSearch linesearch, PetscBool *success)
1045bf7f4e0aSPeter Brune {
1046bf7f4e0aSPeter Brune   PetscFunctionBegin;
10476a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
10486a388c36SPeter Brune   PetscValidPointer(success, 2);
1049bf7f4e0aSPeter Brune   if (success) {
1050bf7f4e0aSPeter Brune     *success = linesearch->success;
1051bf7f4e0aSPeter Brune   }
1052bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1053bf7f4e0aSPeter Brune }
1054bf7f4e0aSPeter Brune 
1055bf7f4e0aSPeter Brune #undef __FUNCT__
10566a388c36SPeter Brune #define __FUNCT__ "LineSearchSetSuccess"
1057*f40b411bSPeter Brune /*@
1058*f40b411bSPeter Brune    LineSearchSetSuccess - Sets the success/failure status of the last line search application
1059*f40b411bSPeter Brune 
1060*f40b411bSPeter Brune    Input Parameters:
1061*f40b411bSPeter Brune +  linesearch - linesearch context.
1062*f40b411bSPeter Brune -  success - The success or failure status.
1063*f40b411bSPeter Brune 
1064*f40b411bSPeter Brune    Level: intermediate
1065*f40b411bSPeter Brune 
1066*f40b411bSPeter Brune .seealso: LineSearchGetSuccess()
1067*f40b411bSPeter Brune @*/
10686a388c36SPeter Brune PetscErrorCode  LineSearchSetSuccess(LineSearch linesearch, PetscBool success)
10696a388c36SPeter Brune {
10706a388c36SPeter Brune   PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1);
10716a388c36SPeter Brune   PetscFunctionBegin;
10726a388c36SPeter Brune   linesearch->success = success;
10736a388c36SPeter Brune   PetscFunctionReturn(0);
10746a388c36SPeter Brune }
10756a388c36SPeter Brune 
10766a388c36SPeter Brune #undef __FUNCT__
1077bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchRegister"
1078bf7f4e0aSPeter Brune /*@C
1079bf7f4e0aSPeter Brune   LineSearchRegister - See LineSearchRegisterDynamic()
1080bf7f4e0aSPeter Brune 
1081bf7f4e0aSPeter Brune   Level: advanced
1082bf7f4e0aSPeter Brune @*/
1083bf7f4e0aSPeter Brune PetscErrorCode  LineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(LineSearch))
1084bf7f4e0aSPeter Brune {
1085bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1086bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1087bf7f4e0aSPeter Brune 
1088bf7f4e0aSPeter Brune   PetscFunctionBegin;
1089bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
1090bf7f4e0aSPeter Brune   ierr = PetscFListAdd(&LineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1091bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1092bf7f4e0aSPeter Brune }
1093