xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 9e764e565363082b5d6809b4906b00cc8e5df768)
1*9e764e56SPeter Brune #include <private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
36188f407SPeter Brune PetscBool  PetscLineSearchRegisterAllCalled = PETSC_FALSE;
46188f407SPeter Brune PetscFList PetscLineSearchList              = PETSC_NULL;
5bf7f4e0aSPeter Brune 
66188f407SPeter Brune PetscClassId   PETSCLINESEARCH_CLASSID;
76188f407SPeter Brune PetscLogEvent  PetscLineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate"
11f40b411bSPeter Brune /*@
126188f407SPeter Brune    PetscLineSearchCreate - 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 
296188f407SPeter Brune PetscErrorCode PetscLineSearchCreate(MPI_Comm comm, PetscLineSearch * outlinesearch) {
30bf7f4e0aSPeter Brune   PetscErrorCode ierr;
316188f407SPeter Brune   PetscLineSearch     linesearch;
32bf7f4e0aSPeter Brune   PetscFunctionBegin;
336188f407SPeter Brune   ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,PETSCLINESEARCH_CLASSID, 0,
346188f407SPeter Brune                            "LineSearch","Line-search method","LineSearch",comm,PetscLineSearchDestroy,PetscLineSearchView);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;
49516fe3c3SPeter Brune   linesearch->rtol          = 1e-8;
50516fe3c3SPeter Brune   linesearch->atol          = 1e-15;
51516fe3c3SPeter Brune   linesearch->ltol          = 1e-8;
52bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
53bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
54516fe3c3SPeter 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__
616188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetUp"
62f40b411bSPeter Brune /*@
636188f407SPeter Brune    PetscLineSearchSetUp - 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 
726188f407SPeter Brune    .keywords: PetscLineSearch, SetUp
73f40b411bSPeter Brune 
746188f407SPeter Brune    .seealso: PetscLineSearchReset()
75f40b411bSPeter Brune @*/
76f40b411bSPeter Brune 
776188f407SPeter Brune PetscErrorCode PetscLineSearchSetUp(PetscLineSearch linesearch) {
78bf7f4e0aSPeter Brune   PetscErrorCode ierr;
79bf7f4e0aSPeter Brune   PetscFunctionBegin;
80bf7f4e0aSPeter Brune 
81bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
826188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,PETSCLINESEARCHBASIC);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__
986188f407SPeter Brune #define __FUNCT__ "PetscLineSearchReset"
99f40b411bSPeter Brune 
100f40b411bSPeter Brune /*@
1016188f407SPeter Brune    PetscLineSearchReset - Tears down the structures required for application
102f40b411bSPeter Brune 
1036188f407SPeter Brune    Collective on PetscLineSearch
104f40b411bSPeter Brune 
105f40b411bSPeter Brune    Input Parameters:
106f40b411bSPeter Brune .  linesearch - The LineSearch instance.
107f40b411bSPeter Brune 
108f40b411bSPeter Brune    Level: Intermediate
109f40b411bSPeter Brune 
1106188f407SPeter Brune    .keywords: PetscLineSearch, Create
111f40b411bSPeter Brune 
1126188f407SPeter Brune    .seealso: PetscLineSearchSetUp()
113f40b411bSPeter Brune @*/
114f40b411bSPeter Brune 
1156188f407SPeter Brune PetscErrorCode PetscLineSearchReset(PetscLineSearch 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__
1316188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheck"
132f40b411bSPeter Brune /*@
1336188f407SPeter Brune    PetscLineSearchPreCheck - Prepares the line search for being applied.
134f40b411bSPeter Brune 
1356188f407SPeter Brune    Collective on PetscLineSearch
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 
1456188f407SPeter Brune    .keywords: PetscLineSearch, Create
146f40b411bSPeter Brune 
1476188f407SPeter Brune    .seealso: PetscLineSearchPostCheck()
148f40b411bSPeter Brune @*/
1496188f407SPeter Brune PetscErrorCode PetscLineSearchPreCheck(PetscLineSearch 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__
1616188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPostCheck"
162f40b411bSPeter Brune /*@
1636188f407SPeter Brune    PetscLineSearchPostCheck - Prepares the line search for being applied.
164f40b411bSPeter Brune 
1656188f407SPeter Brune    Collective on PetscLineSearch
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 
1766188f407SPeter Brune    .keywords: PetscLineSearch, Create
177f40b411bSPeter Brune 
1786188f407SPeter Brune    .seealso: PetscLineSearchPreCheck()
179f40b411bSPeter Brune @*/
1806188f407SPeter Brune PetscErrorCode PetscLineSearchPostCheck(PetscLineSearch 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__
1936188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply"
194f40b411bSPeter Brune /*@
1956188f407SPeter Brune    PetscLineSearchApply - Computes the line-search update
196f40b411bSPeter Brune 
1976188f407SPeter Brune    Collective on PetscLineSearch
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 
2136188f407SPeter Brune    .keywords: PetscLineSearch, Create
214f40b411bSPeter Brune 
2156188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchPreCheck(), PetscLineSearchPostCheck()
216f40b411bSPeter Brune @*/
2176188f407SPeter Brune PetscErrorCode PetscLineSearchApply(PetscLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
218bf7f4e0aSPeter Brune   PetscErrorCode ierr;
219bf7f4e0aSPeter Brune   PetscFunctionBegin;
220bf7f4e0aSPeter Brune 
221bf7f4e0aSPeter Brune   /* check the pointers */
2226188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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 
2336188f407SPeter Brune   ierr = PetscLineSearchSetUp(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 
2446188f407SPeter Brune   ierr = PetscLogEventBegin(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
245bf7f4e0aSPeter Brune 
246bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
247bf7f4e0aSPeter Brune 
2486188f407SPeter Brune   ierr = PetscLogEventEnd(PetscLineSearch_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__
2566188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy"
257f40b411bSPeter Brune /*@
2586188f407SPeter Brune    PetscLineSearchDestroy - Destroys the line search instance.
259f40b411bSPeter Brune 
2606188f407SPeter Brune    Collective on PetscLineSearch
261f40b411bSPeter Brune 
262f40b411bSPeter Brune    Input Parameters:
263f40b411bSPeter Brune .  linesearch - The linesearch instance.
264f40b411bSPeter Brune 
265f40b411bSPeter Brune    Level: Intermediate
266f40b411bSPeter Brune 
2676188f407SPeter Brune    .keywords: PetscLineSearch, Create
268f40b411bSPeter Brune 
2696188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchReset()
270f40b411bSPeter Brune @*/
2716188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy(PetscLineSearch * linesearch) {
272bf7f4e0aSPeter Brune   PetscErrorCode ierr;
273bf7f4e0aSPeter Brune   PetscFunctionBegin;
274bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
2756188f407SPeter Brune   PetscValidHeaderSpecific((*linesearch),PETSCLINESEARCH_CLASSID,1);
276bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
277bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
2786188f407SPeter Brune   ierr = PetscLineSearchReset(*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__
2886188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetMonitor"
289f40b411bSPeter Brune /*@
2906188f407SPeter Brune    PetscLineSearchSetMonitor - 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 
3046188f407SPeter Brune .seealso: PetscLineSearchGetMonitor()
305bf7f4e0aSPeter Brune @*/
3066188f407SPeter Brune PetscErrorCode  PetscLineSearchSetMonitor(PetscLineSearch 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__
3206188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetMonitor"
321f40b411bSPeter Brune /*@
3226188f407SPeter Brune    PetscLineSearchGetMonitor - 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 
3396188f407SPeter Brune .seealso: PetscLineSearchSetMonitor()
340f40b411bSPeter Brune @*/
3416188f407SPeter Brune PetscErrorCode  PetscLineSearchGetMonitor(PetscLineSearch linesearch, PetscViewer *monitor)
3426a388c36SPeter Brune {
3436a388c36SPeter Brune 
3446a388c36SPeter Brune   PetscFunctionBegin;
3456188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
3546188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetFromOptions"
355f40b411bSPeter Brune /*@
3566188f407SPeter Brune    PetscLineSearchSetFromOptions - 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 
3696188f407SPeter Brune    Logically Collective on PetscLineSearch
370f40b411bSPeter Brune 
371f40b411bSPeter Brune    Level: intermediate
372f40b411bSPeter Brune 
373f40b411bSPeter Brune 
3746188f407SPeter Brune .seealso: PetscLineSearchCreate()
375f40b411bSPeter Brune @*/
3766188f407SPeter Brune PetscErrorCode PetscLineSearchSetFromOptions(PetscLineSearch linesearch) {
377bf7f4e0aSPeter Brune   PetscErrorCode ierr;
3786188f407SPeter Brune   const char     *deft = PETSCLINESEARCHBASIC;
379bf7f4e0aSPeter Brune   char           type[256];
380bf7f4e0aSPeter Brune   PetscBool      flg, set;
381bf7f4e0aSPeter Brune   PetscFunctionBegin;
3826188f407SPeter Brune   if (!PetscLineSearchRegisterAllCalled) {ierr = PetscLineSearchRegisterAll(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   }
3886188f407SPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","PetscLineSearchSetType",PetscLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
389bf7f4e0aSPeter Brune   if (flg) {
3906188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,type);CHKERRQ(ierr);
391bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
3926188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
393bf7f4e0aSPeter Brune   }
394bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
395bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
396bf7f4e0aSPeter Brune   }
397bf7f4e0aSPeter Brune 
3986188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESPetscLineSearchSetMonitor",
399bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
4006188f407SPeter Brune   if (set) {ierr = PetscLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
401bf7f4e0aSPeter Brune 
4026188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","PetscLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
4036188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","PetscLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
4046188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","PetscLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
4056188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","PetscLineSearchSetKeepLambda",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__
4136188f407SPeter Brune #define __FUNCT__ "PetscLineSearchView"
414f40b411bSPeter Brune /*@
4156188f407SPeter Brune    PetscLineSearchView - Views useful information for the line search.
416f40b411bSPeter Brune 
417f40b411bSPeter Brune    Input Parameters:
418f40b411bSPeter Brune .  linesearch - linesearch context.
419f40b411bSPeter Brune 
4206188f407SPeter Brune    Logically Collective on PetscLineSearch
421f40b411bSPeter Brune 
422f40b411bSPeter Brune    Level: intermediate
423f40b411bSPeter Brune 
424f40b411bSPeter Brune 
4256188f407SPeter Brune .seealso: PetscLineSearchCreate()
426f40b411bSPeter Brune @*/
4276188f407SPeter Brune PetscErrorCode PetscLineSearchView(PetscLineSearch linesearch) {
428bf7f4e0aSPeter Brune   PetscFunctionBegin;
429f40b411bSPeter Brune 
430bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
431bf7f4e0aSPeter Brune }
432bf7f4e0aSPeter Brune 
433bf7f4e0aSPeter Brune #undef __FUNCT__
4346188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetType"
435f40b411bSPeter Brune /*@
4366188f407SPeter Brune    PetscLineSearchSetType - 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 
4426188f407SPeter Brune    Logically Collective on PetscLineSearch
443f40b411bSPeter Brune 
444f40b411bSPeter Brune    Level: intermediate
445f40b411bSPeter Brune 
446f40b411bSPeter Brune 
4476188f407SPeter Brune .seealso: PetscLineSearchCreate()
448f40b411bSPeter Brune @*/
4496188f407SPeter Brune PetscErrorCode PetscLineSearchSetType(PetscLineSearch linesearch, const PetscLineSearchType type)
450bf7f4e0aSPeter Brune {
451bf7f4e0aSPeter Brune 
4526188f407SPeter Brune   PetscErrorCode ierr,(*r)(PetscLineSearch);
453bf7f4e0aSPeter Brune   PetscBool      match;
454bf7f4e0aSPeter Brune 
455bf7f4e0aSPeter Brune   PetscFunctionBegin;
4566188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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 
4626188f407SPeter Brune   ierr =  PetscFListFind(PetscLineSearchList,((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   }
4696188f407SPeter Brune   /* Reinitialize function pointers in PetscLineSearchOps 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__
4866188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSNES"
487f40b411bSPeter Brune /*@
4886188f407SPeter Brune    PetscLineSearchSetSNES - 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 
4976188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
498f40b411bSPeter Brune @*/
4996188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSNES(PetscLineSearch linesearch, SNES snes){
500bf7f4e0aSPeter Brune   PetscFunctionBegin;
5016188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
5086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSNES"
509f40b411bSPeter Brune /*@
5106188f407SPeter Brune    PetscLineSearchGetSNES - 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 
5206188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
521f40b411bSPeter Brune @*/
5226188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSNES(PetscLineSearch linesearch, SNES *snes){
523bf7f4e0aSPeter Brune   PetscFunctionBegin;
5246188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
5256a388c36SPeter Brune   PetscValidPointer(snes, 2);
526bf7f4e0aSPeter Brune   *snes = linesearch->snes;
527bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
528bf7f4e0aSPeter Brune }
529bf7f4e0aSPeter Brune 
5306a388c36SPeter Brune #undef __FUNCT__
5316188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetLambda"
532f40b411bSPeter Brune /*@
5336188f407SPeter Brune    PetscLineSearchGetLambda - 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 
5436188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
544f40b411bSPeter Brune @*/
5456188f407SPeter Brune PetscErrorCode  PetscLineSearchGetLambda(PetscLineSearch linesearch,PetscReal *lambda)
5466a388c36SPeter Brune {
5476a388c36SPeter Brune   PetscFunctionBegin;
5486188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
5496a388c36SPeter Brune   PetscValidPointer(lambda, 2);
5506a388c36SPeter Brune   *lambda = linesearch->lambda;
5516a388c36SPeter Brune   PetscFunctionReturn(0);
5526a388c36SPeter Brune }
5536a388c36SPeter Brune 
5546a388c36SPeter Brune #undef __FUNCT__
5556188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetLambda"
556f40b411bSPeter Brune /*@
5576188f407SPeter Brune    PetscLineSearchSetLambda - 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 
5656188f407SPeter Brune .seealso: PetscLineSearchGetLambda()
566f40b411bSPeter Brune @*/
5676188f407SPeter Brune PetscErrorCode  PetscLineSearchSetLambda(PetscLineSearch linesearch, PetscReal lambda)
5686a388c36SPeter Brune {
5696a388c36SPeter Brune   PetscFunctionBegin;
5706188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
5716a388c36SPeter Brune   linesearch->lambda = lambda;
5726a388c36SPeter Brune   PetscFunctionReturn(0);
5736a388c36SPeter Brune }
5746a388c36SPeter Brune 
5756a388c36SPeter Brune #undef  __FUNCT__
5766188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetTolerances"
577f40b411bSPeter Brune /*@
5786188f407SPeter Brune    PetscLineSearchGetTolerances - Gets the tolerances for the method
579f40b411bSPeter Brune 
580f40b411bSPeter Brune    Input Parameters:
581f40b411bSPeter Brune .  linesearch - linesearch context.
582f40b411bSPeter Brune 
583f40b411bSPeter Brune    Output Parameters:
584516fe3c3SPeter Brune +  steptol - The minimum steplength
585516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
586516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
587516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
588516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
589f40b411bSPeter Brune 
590f40b411bSPeter Brune 
591516fe3c3SPeter Brune    Level: advanced
592516fe3c3SPeter Brune 
5936188f407SPeter Brune .seealso: PetscLineSearchSetTolerances()
594f40b411bSPeter Brune @*/
5956188f407SPeter Brune PetscErrorCode  PetscLineSearchGetTolerances(PetscLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
5966a388c36SPeter Brune {
5976a388c36SPeter Brune   PetscFunctionBegin;
5986188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
599516fe3c3SPeter Brune   if (steptol) {
6006a388c36SPeter Brune     PetscValidPointer(steptol, 2);
6016a388c36SPeter Brune     *steptol = linesearch->steptol;
602516fe3c3SPeter Brune   }
603516fe3c3SPeter Brune   if (maxstep) {
604516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
605516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
606516fe3c3SPeter Brune   }
607516fe3c3SPeter Brune   if (rtol) {
608516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
609516fe3c3SPeter Brune     *rtol = linesearch->rtol;
610516fe3c3SPeter Brune   }
611516fe3c3SPeter Brune   if (atol) {
612516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
613516fe3c3SPeter Brune     *atol = linesearch->atol;
614516fe3c3SPeter Brune   }
615516fe3c3SPeter Brune   if (ltol) {
616516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
617516fe3c3SPeter Brune     *ltol = linesearch->ltol;
618516fe3c3SPeter Brune   }
619516fe3c3SPeter Brune   if (max_its) {
620516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
621516fe3c3SPeter Brune     *max_its = linesearch->max_its;
622516fe3c3SPeter Brune   }
6236a388c36SPeter Brune   PetscFunctionReturn(0);
6246a388c36SPeter Brune }
6256a388c36SPeter Brune 
6266a388c36SPeter Brune #undef  __FUNCT__
6276188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetTolerances"
628f40b411bSPeter Brune /*@
6296188f407SPeter Brune    PetscLineSearchSetTolerances - Sets the tolerances for the method
630f40b411bSPeter Brune 
631f40b411bSPeter Brune    Input Parameters:
632516fe3c3SPeter Brune +  linesearch - linesearch context.
633516fe3c3SPeter Brune .  steptol - The minimum steplength
634516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
635516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
636516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
637516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
638f40b411bSPeter Brune 
639f40b411bSPeter Brune 
640516fe3c3SPeter Brune    Level: advanced
641516fe3c3SPeter Brune 
6426188f407SPeter Brune .seealso: PetscLineSearchGetTolerances()
643f40b411bSPeter Brune @*/
6446188f407SPeter Brune PetscErrorCode  PetscLineSearchSetTolerances(PetscLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
6456a388c36SPeter Brune {
6466a388c36SPeter Brune   PetscFunctionBegin;
6476188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
6486a388c36SPeter Brune   linesearch->steptol = steptol;
649516fe3c3SPeter Brune   linesearch->maxstep = maxstep;
650516fe3c3SPeter Brune   linesearch->rtol = rtol;
651516fe3c3SPeter Brune   linesearch->atol = atol;
652516fe3c3SPeter Brune   linesearch->ltol = ltol;
653516fe3c3SPeter Brune   linesearch->max_its = max_its;
6546a388c36SPeter Brune   PetscFunctionReturn(0);
6556a388c36SPeter Brune }
6566a388c36SPeter Brune 
657516fe3c3SPeter Brune 
6586a388c36SPeter Brune #undef __FUNCT__
6596188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetDamping"
660f40b411bSPeter Brune /*@
6616188f407SPeter Brune    PetscLineSearchGetDamping - 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 
6716188f407SPeter Brune .seealso: PetscLineSearchGetStepTolerance()
672f40b411bSPeter Brune @*/
673f40b411bSPeter Brune 
6746188f407SPeter Brune PetscErrorCode  PetscLineSearchGetDamping(PetscLineSearch linesearch,PetscReal *damping)
6756a388c36SPeter Brune {
6766a388c36SPeter Brune   PetscFunctionBegin;
6776188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
6786a388c36SPeter Brune   PetscValidPointer(damping, 2);
6796a388c36SPeter Brune   *damping = linesearch->damping;
6806a388c36SPeter Brune   PetscFunctionReturn(0);
6816a388c36SPeter Brune }
6826a388c36SPeter Brune 
6836a388c36SPeter Brune #undef __FUNCT__
6846188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetDamping"
685f40b411bSPeter Brune /*@
6866188f407SPeter Brune    PetscLineSearchSetDamping - 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 
6946188f407SPeter Brune .seealso: PetscLineSearchGetDamping()
695f40b411bSPeter Brune @*/
6966188f407SPeter Brune PetscErrorCode  PetscLineSearchSetDamping(PetscLineSearch linesearch,PetscReal damping)
6976a388c36SPeter Brune {
6986a388c36SPeter Brune   PetscFunctionBegin;
6996188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7006a388c36SPeter Brune   linesearch->damping = damping;
7016a388c36SPeter Brune   PetscFunctionReturn(0);
7026a388c36SPeter Brune }
7036a388c36SPeter Brune 
7046a388c36SPeter Brune #undef __FUNCT__
7056188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetNorms"
706f40b411bSPeter Brune /*@
7076188f407SPeter Brune    PetscLineSearchGetNorms - 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 
7196188f407SPeter Brune .seealso: PetscLineSearchSetNorms() PetscLineSearchGetVecs()
720f40b411bSPeter Brune @*/
7216188f407SPeter Brune PetscErrorCode  PetscLineSearchGetNorms(PetscLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
722bf7f4e0aSPeter Brune {
723bf7f4e0aSPeter Brune   PetscFunctionBegin;
7246188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
7386188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetNorms"
739f40b411bSPeter Brune /*@
7406188f407SPeter Brune    PetscLineSearchSetNorms - 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 
7506188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
751f40b411bSPeter Brune @*/
7526188f407SPeter Brune PetscErrorCode  PetscLineSearchSetNorms(PetscLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
7536a388c36SPeter Brune {
7546a388c36SPeter Brune   PetscFunctionBegin;
7556188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7566a388c36SPeter Brune   linesearch->xnorm = xnorm;
7576a388c36SPeter Brune   linesearch->fnorm = fnorm;
7586a388c36SPeter Brune   linesearch->ynorm = ynorm;
7596a388c36SPeter Brune   PetscFunctionReturn(0);
7606a388c36SPeter Brune }
7616a388c36SPeter Brune 
7626a388c36SPeter Brune #undef __FUNCT__
7636188f407SPeter Brune #define __FUNCT__ "PetscLineSearchComputeNorms"
764f40b411bSPeter Brune /*@
7656188f407SPeter Brune    PetscLineSearchComputeNorms - Computes the norms of X, F, and Y.
766f40b411bSPeter Brune 
767f40b411bSPeter Brune    Input Parameters:
768f40b411bSPeter Brune .  linesearch - linesearch context.
769f40b411bSPeter Brune 
770f40b411bSPeter Brune    Options Database Keys:
771f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
772f40b411bSPeter Brune 
773f40b411bSPeter Brune    Level: intermediate
774f40b411bSPeter Brune 
7756188f407SPeter Brune .seealso: PetscLineSearchGetNorms, PetscLineSearchSetNorms()
776f40b411bSPeter Brune @*/
7776188f407SPeter Brune PetscErrorCode PetscLineSearchComputeNorms(PetscLineSearch linesearch)
7786a388c36SPeter Brune {
7796a388c36SPeter Brune   PetscErrorCode ierr;
7806a388c36SPeter Brune   PetscFunctionBegin;
7816a388c36SPeter Brune   if (linesearch->norms) {
7826a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
7836a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
7846a388c36SPeter Brune     ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
7856a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
7866a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
7876a388c36SPeter Brune     ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
7886a388c36SPeter Brune   }
7896a388c36SPeter Brune   PetscFunctionReturn(0);
7906a388c36SPeter Brune }
7916a388c36SPeter Brune 
7926a388c36SPeter Brune #undef __FUNCT__
7936188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetVecs"
794f40b411bSPeter Brune /*@
7956188f407SPeter Brune    PetscLineSearchGetVecs - Gets the vectors from the PetscLineSearch context
796f40b411bSPeter Brune 
797f40b411bSPeter Brune    Input Parameters:
798f40b411bSPeter Brune .  linesearch - linesearch context.
799f40b411bSPeter Brune 
800f40b411bSPeter Brune    Output Parameters:
801f40b411bSPeter Brune +  X - The old solution
802f40b411bSPeter Brune .  F - The old function
803f40b411bSPeter Brune .  Y - The search direction
804f40b411bSPeter Brune .  W - The new solution
805f40b411bSPeter Brune -  G - The new function
806f40b411bSPeter Brune 
807f40b411bSPeter Brune    Level: intermediate
808f40b411bSPeter Brune 
8096188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
810f40b411bSPeter Brune @*/
8116188f407SPeter Brune PetscErrorCode PetscLineSearchGetVecs(PetscLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
8126a388c36SPeter Brune   PetscFunctionBegin;
8136188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
8146a388c36SPeter Brune   if (X) {
8156a388c36SPeter Brune     PetscValidPointer(X, 2);
8166a388c36SPeter Brune     *X = linesearch->vec_sol;
8176a388c36SPeter Brune   }
8186a388c36SPeter Brune   if (F) {
8196a388c36SPeter Brune     PetscValidPointer(F, 3);
8206a388c36SPeter Brune     *F = linesearch->vec_func;
8216a388c36SPeter Brune   }
8226a388c36SPeter Brune   if (Y) {
8236a388c36SPeter Brune     PetscValidPointer(Y, 4);
8246a388c36SPeter Brune     *Y = linesearch->vec_update;
8256a388c36SPeter Brune   }
8266a388c36SPeter Brune   if (W) {
8276a388c36SPeter Brune     PetscValidPointer(W, 5);
8286a388c36SPeter Brune     *W = linesearch->vec_sol_new;
8296a388c36SPeter Brune   }
8306a388c36SPeter Brune   if (G) {
8316a388c36SPeter Brune     PetscValidPointer(G, 6);
8326a388c36SPeter Brune     *G = linesearch->vec_func_new;
8336a388c36SPeter Brune   }
8346a388c36SPeter Brune 
8356a388c36SPeter Brune   PetscFunctionReturn(0);
8366a388c36SPeter Brune }
8376a388c36SPeter Brune 
8386a388c36SPeter Brune #undef __FUNCT__
8396188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetVecs"
840f40b411bSPeter Brune /*@
8416188f407SPeter Brune    PetscLineSearchSetVecs - Sets the vectors on the PetscLineSearch context
842f40b411bSPeter Brune 
843f40b411bSPeter Brune    Input Parameters:
844f40b411bSPeter Brune +  linesearch - linesearch context.
845f40b411bSPeter Brune .  X - The old solution
846f40b411bSPeter Brune .  F - The old function
847f40b411bSPeter Brune .  Y - The search direction
848f40b411bSPeter Brune .  W - The new solution
849f40b411bSPeter Brune -  G - The new function
850f40b411bSPeter Brune 
851f40b411bSPeter Brune    Level: intermediate
852f40b411bSPeter Brune 
8536188f407SPeter Brune .seealso: PetscLineSearchSetNorms(), PetscLineSearchGetVecs()
854f40b411bSPeter Brune @*/
8556188f407SPeter Brune PetscErrorCode PetscLineSearchSetVecs(PetscLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
8566a388c36SPeter Brune   PetscFunctionBegin;
8576188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
8586a388c36SPeter Brune   if (X) {
8596a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
8606a388c36SPeter Brune     linesearch->vec_sol = X;
8616a388c36SPeter Brune   }
8626a388c36SPeter Brune   if (F) {
8636a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
8646a388c36SPeter Brune     linesearch->vec_func = F;
8656a388c36SPeter Brune   }
8666a388c36SPeter Brune   if (Y) {
8676a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
8686a388c36SPeter Brune     linesearch->vec_update = Y;
8696a388c36SPeter Brune   }
8706a388c36SPeter Brune   if (W) {
8716a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
8726a388c36SPeter Brune     linesearch->vec_sol_new = W;
8736a388c36SPeter Brune   }
8746a388c36SPeter Brune   if (G) {
8756a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
8766a388c36SPeter Brune     linesearch->vec_func_new = G;
8776a388c36SPeter Brune   }
8786a388c36SPeter Brune 
8796a388c36SPeter Brune   PetscFunctionReturn(0);
8806a388c36SPeter Brune }
8816a388c36SPeter Brune 
8826a388c36SPeter Brune #undef __FUNCT__
8836188f407SPeter Brune #define __FUNCT__ "PetscLineSearchAppendOptionsPrefix"
884e7058c64SPeter Brune /*@C
8856188f407SPeter Brune    PetscLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
886e7058c64SPeter Brune    SNES options in the database.
887e7058c64SPeter Brune 
888e7058c64SPeter Brune    Logically Collective on SNES
889e7058c64SPeter Brune 
890e7058c64SPeter Brune    Input Parameters:
891e7058c64SPeter Brune +  snes - the SNES context
892e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
893e7058c64SPeter Brune 
894e7058c64SPeter Brune    Notes:
895e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
896e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
897e7058c64SPeter Brune 
898e7058c64SPeter Brune    Level: advanced
899e7058c64SPeter Brune 
9006188f407SPeter Brune .keywords: PetscLineSearch, append, options, prefix, database
901e7058c64SPeter Brune 
902e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
903e7058c64SPeter Brune @*/
9046188f407SPeter Brune PetscErrorCode  PetscLineSearchAppendOptionsPrefix(PetscLineSearch linesearch,const char prefix[])
905e7058c64SPeter Brune {
906e7058c64SPeter Brune   PetscErrorCode ierr;
907e7058c64SPeter Brune 
908e7058c64SPeter Brune   PetscFunctionBegin;
9096188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
910e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
911e7058c64SPeter Brune   PetscFunctionReturn(0);
912e7058c64SPeter Brune }
913e7058c64SPeter Brune 
914e7058c64SPeter Brune #undef __FUNCT__
9156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetOptionsPrefix"
916e7058c64SPeter Brune /*@C
9176188f407SPeter Brune    PetscLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
9186188f407SPeter Brune    PetscLineSearch options in the database.
919e7058c64SPeter Brune 
920e7058c64SPeter Brune    Not Collective
921e7058c64SPeter Brune 
922e7058c64SPeter Brune    Input Parameter:
923e7058c64SPeter Brune .  snes - the SNES context
924e7058c64SPeter Brune 
925e7058c64SPeter Brune    Output Parameter:
926e7058c64SPeter Brune .  prefix - pointer to the prefix string used
927e7058c64SPeter Brune 
928e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
929e7058c64SPeter Brune    sufficient length to hold the prefix.
930e7058c64SPeter Brune 
931e7058c64SPeter Brune    Level: advanced
932e7058c64SPeter Brune 
9336188f407SPeter Brune .keywords: PetscLineSearch, get, options, prefix, database
934e7058c64SPeter Brune 
935e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
936e7058c64SPeter Brune @*/
9376188f407SPeter Brune PetscErrorCode  PetscLineSearchGetOptionsPrefix(PetscLineSearch linesearch,const char *prefix[])
938e7058c64SPeter Brune {
939e7058c64SPeter Brune   PetscErrorCode ierr;
940e7058c64SPeter Brune 
941e7058c64SPeter Brune   PetscFunctionBegin;
9426188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
943e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
944e7058c64SPeter Brune   PetscFunctionReturn(0);
945e7058c64SPeter Brune }
946bf7f4e0aSPeter Brune 
947bf7f4e0aSPeter Brune #undef __FUNCT__
9486188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetWork"
949f40b411bSPeter Brune /*@
9506188f407SPeter Brune    PetscLineSearchGetWork - Gets work vectors for the line search.
951f40b411bSPeter Brune 
952f40b411bSPeter Brune    Input Parameter:
9536188f407SPeter Brune +  linesearch - the PetscLineSearch context
954f40b411bSPeter Brune -  nwork - the number of work vectors
955f40b411bSPeter Brune 
956f40b411bSPeter Brune    Level: developer
957f40b411bSPeter Brune 
9586188f407SPeter Brune .keywords: PetscLineSearch, work, vector
959f40b411bSPeter Brune 
960f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
961f40b411bSPeter Brune @*/
9626188f407SPeter Brune PetscErrorCode  PetscLineSearchGetWork(PetscLineSearch linesearch, PetscInt nwork)
963bf7f4e0aSPeter Brune {
964bf7f4e0aSPeter Brune   PetscErrorCode ierr;
965bf7f4e0aSPeter Brune   PetscFunctionBegin;
966bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
967bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
968bf7f4e0aSPeter Brune   } else {
969bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
970bf7f4e0aSPeter Brune   }
971bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
972bf7f4e0aSPeter Brune }
973bf7f4e0aSPeter Brune 
9746a388c36SPeter Brune 
975bf7f4e0aSPeter Brune #undef __FUNCT__
9766188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSuccess"
977f40b411bSPeter Brune /*@
9786188f407SPeter Brune    PetscLineSearchGetSuccess - Gets the success/failure status of the last line search application
979f40b411bSPeter Brune 
980f40b411bSPeter Brune    Input Parameters:
981f40b411bSPeter Brune .  linesearch - linesearch context.
982f40b411bSPeter Brune 
983f40b411bSPeter Brune    Output Parameters:
984f40b411bSPeter Brune .  success - The success or failure status.
985f40b411bSPeter Brune 
986f40b411bSPeter Brune    Level: intermediate
987f40b411bSPeter Brune 
9886188f407SPeter Brune .seealso: PetscLineSearchSetSuccess()
989f40b411bSPeter Brune @*/
9906188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSuccess(PetscLineSearch linesearch, PetscBool *success)
991bf7f4e0aSPeter Brune {
992bf7f4e0aSPeter Brune   PetscFunctionBegin;
9936188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9946a388c36SPeter Brune   PetscValidPointer(success, 2);
995bf7f4e0aSPeter Brune   if (success) {
996bf7f4e0aSPeter Brune     *success = linesearch->success;
997bf7f4e0aSPeter Brune   }
998bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
999bf7f4e0aSPeter Brune }
1000bf7f4e0aSPeter Brune 
1001bf7f4e0aSPeter Brune #undef __FUNCT__
10026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSuccess"
1003f40b411bSPeter Brune /*@
10046188f407SPeter Brune    PetscLineSearchSetSuccess - Sets the success/failure status of the last line search application
1005f40b411bSPeter Brune 
1006f40b411bSPeter Brune    Input Parameters:
1007f40b411bSPeter Brune +  linesearch - linesearch context.
1008f40b411bSPeter Brune -  success - The success or failure status.
1009f40b411bSPeter Brune 
1010f40b411bSPeter Brune    Level: intermediate
1011f40b411bSPeter Brune 
10126188f407SPeter Brune .seealso: PetscLineSearchGetSuccess()
1013f40b411bSPeter Brune @*/
10146188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSuccess(PetscLineSearch linesearch, PetscBool success)
10156a388c36SPeter Brune {
10166188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
10176a388c36SPeter Brune   PetscFunctionBegin;
10186a388c36SPeter Brune   linesearch->success = success;
10196a388c36SPeter Brune   PetscFunctionReturn(0);
10206a388c36SPeter Brune }
10216a388c36SPeter Brune 
10226a388c36SPeter Brune #undef __FUNCT__
10236188f407SPeter Brune #define __FUNCT__ "PetscLineSearchRegister"
1024bf7f4e0aSPeter Brune /*@C
10256188f407SPeter Brune   PetscLineSearchRegister - See PetscLineSearchRegisterDynamic()
1026bf7f4e0aSPeter Brune 
1027bf7f4e0aSPeter Brune   Level: advanced
1028bf7f4e0aSPeter Brune @*/
10296188f407SPeter Brune PetscErrorCode  PetscLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscLineSearch))
1030bf7f4e0aSPeter Brune {
1031bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1032bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1033bf7f4e0aSPeter Brune 
1034bf7f4e0aSPeter Brune   PetscFunctionBegin;
1035bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
10366188f407SPeter Brune   ierr = PetscFListAdd(&PetscLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1037bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1038bf7f4e0aSPeter Brune }
1039