xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 5fd668637986a8d8518383a9159eebc368e1d5b4)
1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
3f1c6b773SPeter Brune PetscBool         SNESLineSearchRegisterAllCalled = PETSC_FALSE;
4140e18c1SBarry Smith PetscFunctionList SNESLineSearchList              = PETSC_NULL;
5bf7f4e0aSPeter Brune 
6f1c6b773SPeter Brune PetscClassId   SNESLINESEARCH_CLASSID;
7f1c6b773SPeter Brune PetscLogEvent  SNESLineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
10f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate"
11f40b411bSPeter Brune /*@
12cd7522eaSPeter Brune    SNESLineSearchCreate - Creates the line search context.
13f40b411bSPeter Brune 
14cd7522eaSPeter Brune    Logically Collective on Comm
15f40b411bSPeter Brune 
16f40b411bSPeter Brune    Input Parameters:
17cd7522eaSPeter Brune .  comm - MPI communicator for the line search (typically from the associated SNES context).
18f40b411bSPeter Brune 
19f40b411bSPeter Brune    Output Parameters:
208e557f58SPeter Brune .  outlinesearch - the new linesearch context
21f40b411bSPeter Brune 
2278bcb3b5SPeter Brune    Level: beginner
23f40b411bSPeter Brune 
24cd7522eaSPeter Brune .keywords: LineSearch, create, context
25f40b411bSPeter Brune 
26f40b411bSPeter Brune .seealso: LineSearchDestroy()
27f40b411bSPeter Brune @*/
28f40b411bSPeter Brune 
29bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch)
30bf388a1fSBarry Smith {
31bf7f4e0aSPeter Brune   PetscErrorCode     ierr;
32f1c6b773SPeter Brune   SNESLineSearch     linesearch;
33bf388a1fSBarry Smith 
34bf7f4e0aSPeter Brune   PetscFunctionBegin;
35ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
36ea5d4fccSPeter Brune   *outlinesearch = PETSC_NULL;
37bf388a1fSBarry Smith   ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, 0,"SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr);
38bf7f4e0aSPeter Brune 
396b2b7091SBarry Smith   linesearch->ops->precheck  = PETSC_NULL;
406b2b7091SBarry Smith   linesearch->ops->postcheck = PETSC_NULL;
41bf7f4e0aSPeter Brune 
429bd66eb0SPeter Brune   linesearch->vec_sol_new   = PETSC_NULL;
439bd66eb0SPeter Brune   linesearch->vec_func_new  = PETSC_NULL;
449bd66eb0SPeter Brune   linesearch->vec_sol       = PETSC_NULL;
459bd66eb0SPeter Brune   linesearch->vec_func      = PETSC_NULL;
469bd66eb0SPeter Brune   linesearch->vec_update    = PETSC_NULL;
479bd66eb0SPeter Brune 
48bf7f4e0aSPeter Brune   linesearch->lambda        = 1.0;
49bf7f4e0aSPeter Brune   linesearch->fnorm         = 1.0;
50bf7f4e0aSPeter Brune   linesearch->ynorm         = 1.0;
51bf7f4e0aSPeter Brune   linesearch->xnorm         = 1.0;
52bf7f4e0aSPeter Brune   linesearch->success       = PETSC_TRUE;
53bf7f4e0aSPeter Brune   linesearch->norms         = PETSC_TRUE;
54bf7f4e0aSPeter Brune   linesearch->keeplambda    = PETSC_FALSE;
55bf7f4e0aSPeter Brune   linesearch->damping       = 1.0;
56bf7f4e0aSPeter Brune   linesearch->maxstep       = 1e8;
57bf7f4e0aSPeter Brune   linesearch->steptol       = 1e-12;
58516fe3c3SPeter Brune   linesearch->rtol          = 1e-8;
59516fe3c3SPeter Brune   linesearch->atol          = 1e-15;
60516fe3c3SPeter Brune   linesearch->ltol          = 1e-8;
61bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
62bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
6359405d5eSPeter Brune   linesearch->max_its       = 1;
64bf7f4e0aSPeter Brune   linesearch->setupcalled   = PETSC_FALSE;
65bf7f4e0aSPeter Brune   *outlinesearch            = linesearch;
66bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
67bf7f4e0aSPeter Brune }
68bf7f4e0aSPeter Brune 
69bf7f4e0aSPeter Brune #undef __FUNCT__
70f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp"
71f40b411bSPeter Brune /*@
7278bcb3b5SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied by allocating
7378bcb3b5SPeter Brune    any required vectors.
74f40b411bSPeter Brune 
75cd7522eaSPeter Brune    Collective on SNESLineSearch
76f40b411bSPeter Brune 
77f40b411bSPeter Brune    Input Parameters:
78f40b411bSPeter Brune .  linesearch - The LineSearch instance.
79f40b411bSPeter Brune 
80cd7522eaSPeter Brune    Notes:
81cd7522eaSPeter Brune    For most cases, this needn't be called outside of SNESLineSearchApply().
82cd7522eaSPeter Brune    The only current case where this is called outside of this is for the VI
8378bcb3b5SPeter Brune    solvers, which modify the solution and work vectors before the first call
84cd7522eaSPeter Brune    of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be
85cd7522eaSPeter Brune    allocated upfront.
86cd7522eaSPeter Brune 
8778bcb3b5SPeter Brune    Level: advanced
88f40b411bSPeter Brune 
89f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp
90f40b411bSPeter Brune 
91f1c6b773SPeter Brune .seealso: SNESLineSearchReset()
92f40b411bSPeter Brune @*/
93f40b411bSPeter Brune 
94bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch)
95bf388a1fSBarry Smith {
96bf7f4e0aSPeter Brune   PetscErrorCode ierr;
97bf388a1fSBarry Smith 
98bf7f4e0aSPeter Brune   PetscFunctionBegin;
99bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
1001a4f838cSPeter Brune     ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr);
101bf7f4e0aSPeter Brune   }
102bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
1039bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
104bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
1059bd66eb0SPeter Brune     }
1069bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
1079bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
1089bd66eb0SPeter Brune     }
109bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
110bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
111bf7f4e0aSPeter Brune     }
112bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping;
113bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
114bf7f4e0aSPeter Brune   }
115bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
116bf7f4e0aSPeter Brune }
117bf7f4e0aSPeter Brune 
118bf7f4e0aSPeter Brune #undef __FUNCT__
119f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset"
120f40b411bSPeter Brune 
121f40b411bSPeter Brune /*@
12278bcb3b5SPeter Brune    SNESLineSearchReset - Undoes the SetUp and deletes any Vecs or Mats allocated by the line search.
123f40b411bSPeter Brune 
124f1c6b773SPeter Brune    Collective on SNESLineSearch
125f40b411bSPeter Brune 
126f40b411bSPeter Brune    Input Parameters:
127f40b411bSPeter Brune .  linesearch - The LineSearch instance.
128f40b411bSPeter Brune 
12978bcb3b5SPeter Brune    Level: intermediate
130f40b411bSPeter Brune 
131cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset
132f40b411bSPeter Brune 
133f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp()
134f40b411bSPeter Brune @*/
135f40b411bSPeter Brune 
136bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
137bf388a1fSBarry Smith {
138bf7f4e0aSPeter Brune   PetscErrorCode ierr;
139bf388a1fSBarry Smith 
140bf7f4e0aSPeter Brune   PetscFunctionBegin;
141bf7f4e0aSPeter Brune   if (linesearch->ops->reset) {
142bf7f4e0aSPeter Brune     (*linesearch->ops->reset)(linesearch);
143bf7f4e0aSPeter Brune   }
144bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
145bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
146bf7f4e0aSPeter Brune 
147bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
148bf7f4e0aSPeter Brune   linesearch->nwork = 0;
149bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
150bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
151bf7f4e0aSPeter Brune }
152bf7f4e0aSPeter Brune 
1536b2b7091SBarry Smith /*MC
1546b2b7091SBarry Smith     SNESLineSearchPreCheckFunction - functional form passed to check before line search is called
1556b2b7091SBarry Smith 
1566b2b7091SBarry Smith      Synopsis:
1576b2b7091SBarry Smith      #include "petscsnes.h"
1586b2b7091SBarry Smith      SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed);
1596b2b7091SBarry Smith 
1606b2b7091SBarry Smith        Input Parameters:
1616b2b7091SBarry Smith +      x - solution vector
1626b2b7091SBarry Smith .      y - search direction vector
1636b2b7091SBarry Smith -      changed - flag to indicate the precheck changed x or y.
1646b2b7091SBarry Smith 
1656b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
1666b2b7091SBarry Smith M*/
1676b2b7091SBarry Smith 
16886d74e61SPeter Brune #undef __FUNCT__
169f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck"
17086d74e61SPeter Brune /*@C
171f1c6b773SPeter Brune    SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
17286d74e61SPeter Brune 
173f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
17486d74e61SPeter Brune 
17586d74e61SPeter Brune    Input Parameters:
176f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1776b2b7091SBarry Smith .  SNESLineSearchPreCheckFunction - [optional] function evaluation routine
17886d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
17986d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
18086d74e61SPeter Brune 
18186d74e61SPeter Brune 
18286d74e61SPeter Brune    Level: intermediate
18386d74e61SPeter Brune 
18486d74e61SPeter Brune .keywords: set, linesearch, pre-check
18586d74e61SPeter Brune 
186f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck()
18786d74e61SPeter Brune @*/
1886b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
18986d74e61SPeter Brune {
1909bd66eb0SPeter Brune   PetscFunctionBegin;
191f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1926b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) linesearch->ops->precheck = SNESLineSearchPreCheckFunction;
19386d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
19486d74e61SPeter Brune   PetscFunctionReturn(0);
19586d74e61SPeter Brune }
19686d74e61SPeter Brune 
19786d74e61SPeter Brune #undef __FUNCT__
198f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck"
19986d74e61SPeter Brune /*@C
200cd7522eaSPeter Brune    SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine.
20186d74e61SPeter Brune 
20286d74e61SPeter Brune    Input Parameters:
203f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
20486d74e61SPeter Brune 
20586d74e61SPeter Brune    Output Parameters:
20686d74e61SPeter Brune +  func       - [optional] function evaluation routine
20786d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
20886d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
20986d74e61SPeter Brune 
21086d74e61SPeter Brune    Level: intermediate
21186d74e61SPeter Brune 
21286d74e61SPeter Brune .keywords: get, linesearch, pre-check
21386d74e61SPeter Brune 
214f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
21586d74e61SPeter Brune @*/
2166b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
21786d74e61SPeter Brune {
2189bd66eb0SPeter Brune   PetscFunctionBegin;
219f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2206b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) *SNESLineSearchPreCheckFunction = linesearch->ops->precheck;
22186d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
22286d74e61SPeter Brune   PetscFunctionReturn(0);
22386d74e61SPeter Brune }
22486d74e61SPeter Brune 
2256b2b7091SBarry Smith /*MC
2266b2b7091SBarry Smith     SNESLineSearchPostheckFunction - functional form that is called after line search is complete
2276b2b7091SBarry Smith 
2286b2b7091SBarry Smith      Synopsis:
2296b2b7091SBarry Smith      #include "petscsnes.h"
2306b2b7091SBarry Smith      SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y,  Vec w, *changed_y, PetscBool *changed_w);
2316b2b7091SBarry Smith 
2326b2b7091SBarry Smith      Input Parameters:
2336b2b7091SBarry Smith +      x - old solution vector
2346b2b7091SBarry Smith .      y - search direction vector
2356b2b7091SBarry Smith .      w - new solution vector
2366b2b7091SBarry Smith .      changed_y - indicates that the line search changed y
2376b2b7091SBarry Smith -      changed_w - indicates that the line search changed w
2386b2b7091SBarry Smith 
2396b2b7091SBarry Smith 
2406b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
2416b2b7091SBarry Smith M*/
2426b2b7091SBarry Smith 
24386d74e61SPeter Brune #undef __FUNCT__
244f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck"
24586d74e61SPeter Brune /*@C
246f1c6b773SPeter Brune    SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine.
24786d74e61SPeter Brune 
248f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
24986d74e61SPeter Brune 
25086d74e61SPeter Brune    Input Parameters:
251f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
2526b2b7091SBarry Smith .  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
25386d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
25486d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
25586d74e61SPeter Brune 
25686d74e61SPeter Brune    Level: intermediate
25786d74e61SPeter Brune 
25886d74e61SPeter Brune .keywords: set, linesearch, post-check
25986d74e61SPeter Brune 
260f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck()
26186d74e61SPeter Brune @*/
2626b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*),void *ctx)
26386d74e61SPeter Brune {
26486d74e61SPeter Brune   PetscFunctionBegin;
265f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2666b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) linesearch->ops->postcheck = SNESLineSearchPostCheckFunction;
26786d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
26886d74e61SPeter Brune   PetscFunctionReturn(0);
26986d74e61SPeter Brune }
27086d74e61SPeter Brune 
27186d74e61SPeter Brune #undef __FUNCT__
272f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck"
27386d74e61SPeter Brune /*@C
274f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
27586d74e61SPeter Brune 
27686d74e61SPeter Brune    Input Parameters:
277f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
27886d74e61SPeter Brune 
27986d74e61SPeter Brune    Output Parameters:
2806b2b7091SBarry Smith +  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
28186d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
28286d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
28386d74e61SPeter Brune 
28486d74e61SPeter Brune    Level: intermediate
28586d74e61SPeter Brune 
28686d74e61SPeter Brune .keywords: get, linesearch, post-check
28786d74e61SPeter Brune 
288f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck()
28986d74e61SPeter Brune @*/
2906b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*),void **ctx)
29186d74e61SPeter Brune {
2929bd66eb0SPeter Brune   PetscFunctionBegin;
293f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2946b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) *SNESLineSearchPostCheckFunction = linesearch->ops->postcheck;
29586d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
29686d74e61SPeter Brune   PetscFunctionReturn(0);
29786d74e61SPeter Brune }
29886d74e61SPeter Brune 
299bf7f4e0aSPeter Brune #undef __FUNCT__
300f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck"
301f40b411bSPeter Brune /*@
302f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
303f40b411bSPeter Brune 
304cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
305f40b411bSPeter Brune 
306f40b411bSPeter Brune    Input Parameters:
3077b1df9c1SPeter Brune +  linesearch - The linesearch instance.
3087b1df9c1SPeter Brune .  X - The current solution
3097b1df9c1SPeter Brune -  Y - The step direction
310f40b411bSPeter Brune 
311f40b411bSPeter Brune    Output Parameters:
3128e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
313f40b411bSPeter Brune 
314f40b411bSPeter Brune    Level: Beginner
315f40b411bSPeter Brune 
316f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
317f40b411bSPeter Brune 
318f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck()
319f40b411bSPeter Brune @*/
3207b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
321bf7f4e0aSPeter Brune {
322bf7f4e0aSPeter Brune   PetscErrorCode ierr;
323*5fd66863SKarl Rupp 
324bf7f4e0aSPeter Brune   PetscFunctionBegin;
325bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
3266b2b7091SBarry Smith   if (linesearch->ops->precheck) {
3276b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
32838bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
329bf7f4e0aSPeter Brune   }
330bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
331bf7f4e0aSPeter Brune }
332bf7f4e0aSPeter Brune 
333bf7f4e0aSPeter Brune #undef __FUNCT__
334f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
335f40b411bSPeter Brune /*@
336f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
337f40b411bSPeter Brune 
338cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
339f40b411bSPeter Brune 
340f40b411bSPeter Brune    Input Parameters:
3417b1df9c1SPeter Brune +  linesearch - The linesearch context
3427b1df9c1SPeter Brune .  X - The last solution
3437b1df9c1SPeter Brune .  Y - The step direction
3447b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
345f40b411bSPeter Brune 
346f40b411bSPeter Brune    Output Parameters:
34778bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
34878bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
349f40b411bSPeter Brune 
350f40b411bSPeter Brune    Level: Intermediate
351f40b411bSPeter Brune 
352f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
353f40b411bSPeter Brune 
354f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck()
355f40b411bSPeter Brune @*/
3567b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
357bf7f4e0aSPeter Brune {
358bf7f4e0aSPeter Brune   PetscErrorCode ierr;
359bf388a1fSBarry Smith 
360bf7f4e0aSPeter Brune   PetscFunctionBegin;
361bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
362bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
3636b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
3646b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
36538bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
36638bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
36786d74e61SPeter Brune   }
36886d74e61SPeter Brune   PetscFunctionReturn(0);
36986d74e61SPeter Brune }
37086d74e61SPeter Brune 
37186d74e61SPeter Brune #undef __FUNCT__
372f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
37386d74e61SPeter Brune /*@C
37486d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
37586d74e61SPeter Brune 
376cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
37786d74e61SPeter Brune 
37886d74e61SPeter Brune    Input Arguments:
37986d74e61SPeter Brune +  linesearch - linesearch context
38086d74e61SPeter Brune .  X - base state for this step
38186d74e61SPeter Brune .  Y - initial correction
38286d74e61SPeter Brune 
38386d74e61SPeter Brune    Output Arguments:
38486d74e61SPeter Brune +  Y - correction, possibly modified
38586d74e61SPeter Brune -  changed - flag indicating that Y was modified
38686d74e61SPeter Brune 
38786d74e61SPeter Brune    Options Database Key:
388cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
389cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
39086d74e61SPeter Brune 
39186d74e61SPeter Brune    Level: advanced
39286d74e61SPeter Brune 
39386d74e61SPeter Brune    Notes:
39486d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
39586d74e61SPeter Brune 
39686d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
39786d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
39886d74e61SPeter Brune    is generally not useful when using a Newton linearization.
39986d74e61SPeter Brune 
40086d74e61SPeter Brune    Reference:
40186d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
40286d74e61SPeter Brune 
40386d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
40486d74e61SPeter Brune @*/
405f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
40686d74e61SPeter Brune {
40786d74e61SPeter Brune   PetscErrorCode ierr;
40886d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
40986d74e61SPeter Brune   Vec            Ylast;
41086d74e61SPeter Brune   PetscScalar    dot;
41186d74e61SPeter Brune   PetscInt       iter;
41286d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
41386d74e61SPeter Brune   SNES           snes;
41486d74e61SPeter Brune 
41586d74e61SPeter Brune   PetscFunctionBegin;
416f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
41786d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
41886d74e61SPeter Brune   if (!Ylast) {
41986d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
42086d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
42186d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
42286d74e61SPeter Brune   }
42386d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
42486d74e61SPeter Brune   if (iter < 2) {
42586d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
42686d74e61SPeter Brune     *changed = PETSC_FALSE;
42786d74e61SPeter Brune     PetscFunctionReturn(0);
42886d74e61SPeter Brune   }
42986d74e61SPeter Brune 
43086d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
43186d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
43286d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
43386d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
43486d74e61SPeter Brune   theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
43586d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
43686d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
43786d74e61SPeter Brune     /* Modify the step Y */
43886d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
43986d74e61SPeter Brune     ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
44086d74e61SPeter Brune     ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
44186d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
44286d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
44386d74e61SPeter Brune     ierr = VecScale(Y,alpha);CHKERRQ(ierr);
444c69d1a72SBarry Smith     ierr = PetscInfo3(snes,"Angle %14.12e degrees less than threshold %14.12e, corrected step by alpha=%14.12e\n",(double)(theta*180./PETSC_PI),(double)angle,(double)alpha);CHKERRQ(ierr);
44586d74e61SPeter Brune   } else {
446c69d1a72SBarry Smith     ierr = PetscInfo2(snes,"Angle %14.12e degrees exceeds threshold %14.12e, no correction applied\n",(double)(theta*180./PETSC_PI),(double)angle);CHKERRQ(ierr);
44786d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
44886d74e61SPeter Brune     *changed = PETSC_FALSE;
449bf7f4e0aSPeter Brune   }
450bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
451bf7f4e0aSPeter Brune }
452bf7f4e0aSPeter Brune 
453bf7f4e0aSPeter Brune #undef __FUNCT__
454f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
455f40b411bSPeter Brune /*@
456cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
457f40b411bSPeter Brune 
458f1c6b773SPeter Brune    Collective on SNESLineSearch
459f40b411bSPeter Brune 
460f40b411bSPeter Brune    Input Parameters:
4618e557f58SPeter Brune +  linesearch - The linesearch context
4628e557f58SPeter Brune .  X - The current solution
4638e557f58SPeter Brune .  F - The current function
4648e557f58SPeter Brune .  fnorm - The current norm
4658e557f58SPeter Brune -  Y - The search direction
466f40b411bSPeter Brune 
467f40b411bSPeter Brune    Output Parameters:
4688e557f58SPeter Brune +  X - The new solution
4698e557f58SPeter Brune .  F - The new function
4708e557f58SPeter Brune -  fnorm - The new function norm
471f40b411bSPeter Brune 
472cd7522eaSPeter Brune    Options Database Keys:
4733c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell
474cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
4753c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
476cd7522eaSPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms
4773c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
4783c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
479cd7522eaSPeter Brune 
480cd7522eaSPeter Brune    Notes:
481cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
482cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
483cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
484cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
485cd7522eaSPeter Brune    application of the line search may invoke SNESComputeFunction several times, and
486cd7522eaSPeter Brune    therefore may be fairly expensive.
487cd7522eaSPeter Brune 
488f40b411bSPeter Brune    Level: Intermediate
489f40b411bSPeter Brune 
490f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
491f40b411bSPeter Brune 
492cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction()
493f40b411bSPeter Brune @*/
494bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
495bf388a1fSBarry Smith {
496bf7f4e0aSPeter Brune   PetscErrorCode ierr;
497bf7f4e0aSPeter Brune 
498bf388a1fSBarry Smith   PetscFunctionBegin;
499f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
500bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
501bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
502bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
503bf7f4e0aSPeter Brune 
504bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
505bf7f4e0aSPeter Brune 
506bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
507bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
508bf7f4e0aSPeter Brune   linesearch->vec_func = F;
509bf7f4e0aSPeter Brune 
510f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
511bf7f4e0aSPeter Brune 
512bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
513bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
514bf7f4e0aSPeter Brune 
515bf7f4e0aSPeter Brune   if (fnorm) {
516bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
517bf7f4e0aSPeter Brune   } else {
518bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
519bf7f4e0aSPeter Brune   }
520bf7f4e0aSPeter Brune 
521f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
522bf7f4e0aSPeter Brune 
523bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
524bf7f4e0aSPeter Brune 
525f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
526bf7f4e0aSPeter Brune 
527bf7f4e0aSPeter Brune   if (fnorm)
528bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
529bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
530bf7f4e0aSPeter Brune }
531bf7f4e0aSPeter Brune 
532bf7f4e0aSPeter Brune #undef __FUNCT__
533f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
534f40b411bSPeter Brune /*@
535f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
536f40b411bSPeter Brune 
537f1c6b773SPeter Brune    Collective on SNESLineSearch
538f40b411bSPeter Brune 
539f40b411bSPeter Brune    Input Parameters:
5408e557f58SPeter Brune .  linesearch - The linesearch context
541f40b411bSPeter Brune 
542f40b411bSPeter Brune    Level: Intermediate
543f40b411bSPeter Brune 
54478bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy
545f40b411bSPeter Brune 
546cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
547f40b411bSPeter Brune @*/
548bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
549bf388a1fSBarry Smith {
550bf7f4e0aSPeter Brune   PetscErrorCode ierr;
551bf388a1fSBarry Smith 
552bf7f4e0aSPeter Brune   PetscFunctionBegin;
553bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
554f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
555bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
556bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
55722d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
558bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
559bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
560bf7f4e0aSPeter Brune   }
561bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
562e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
563bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
564bf7f4e0aSPeter Brune }
565bf7f4e0aSPeter Brune 
566bf7f4e0aSPeter Brune #undef __FUNCT__
567f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
568f40b411bSPeter Brune /*@
569cd7522eaSPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search.
570bf7f4e0aSPeter Brune 
571bf7f4e0aSPeter Brune    Input Parameters:
572bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
573bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
574bf7f4e0aSPeter Brune 
575bf7f4e0aSPeter Brune    Logically Collective on SNES
576bf7f4e0aSPeter Brune 
577bf7f4e0aSPeter Brune    Options Database:
5788e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
579bf7f4e0aSPeter Brune 
580bf7f4e0aSPeter Brune    Level: intermediate
581bf7f4e0aSPeter Brune 
582bf7f4e0aSPeter Brune 
583cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer
584bf7f4e0aSPeter Brune @*/
585f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
586bf7f4e0aSPeter Brune {
587bf7f4e0aSPeter Brune   PetscErrorCode ierr;
588bf388a1fSBarry Smith 
589bf7f4e0aSPeter Brune   PetscFunctionBegin;
590bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
591bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
592bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
593bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
594bf7f4e0aSPeter Brune   }
595bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
596bf7f4e0aSPeter Brune }
597bf7f4e0aSPeter Brune 
598bf7f4e0aSPeter Brune #undef __FUNCT__
599f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
600f40b411bSPeter Brune /*@
601cd7522eaSPeter Brune    SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor.
6026a388c36SPeter Brune 
603f40b411bSPeter Brune    Input Parameters:
6048e557f58SPeter Brune .  linesearch - linesearch context
605f40b411bSPeter Brune 
606f40b411bSPeter Brune    Input Parameters:
6078e557f58SPeter Brune .  monitor - monitor context
608f40b411bSPeter Brune 
609f40b411bSPeter Brune    Logically Collective on SNES
610f40b411bSPeter Brune 
611f40b411bSPeter Brune 
612f40b411bSPeter Brune    Options Database Keys:
6138e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
614f40b411bSPeter Brune 
615f40b411bSPeter Brune    Level: intermediate
616f40b411bSPeter Brune 
617f40b411bSPeter Brune 
618cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer
619f40b411bSPeter Brune @*/
620f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6216a388c36SPeter Brune {
6226a388c36SPeter Brune   PetscFunctionBegin;
623f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6246a388c36SPeter Brune   if (monitor) {
6256a388c36SPeter Brune     PetscValidPointer(monitor, 2);
6266a388c36SPeter Brune     *monitor = linesearch->monitor;
6276a388c36SPeter Brune   }
6286a388c36SPeter Brune   PetscFunctionReturn(0);
6296a388c36SPeter Brune }
6306a388c36SPeter Brune 
6316a388c36SPeter Brune #undef __FUNCT__
632f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
633f40b411bSPeter Brune /*@
634f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
635f40b411bSPeter Brune 
636f40b411bSPeter Brune    Input Parameters:
6378e557f58SPeter Brune .  linesearch - linesearch context
638f40b411bSPeter Brune 
639f40b411bSPeter Brune    Options Database Keys:
6403c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell
6413c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
6425a9b6599SPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch type
64371eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
6441a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
6451a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
6461a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
6471a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
6481a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
649cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
6508e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
651cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
6521a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
6531a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method
654f40b411bSPeter Brune 
655f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
656f40b411bSPeter Brune 
657f40b411bSPeter Brune    Level: intermediate
658f40b411bSPeter Brune 
6593c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard()
660f40b411bSPeter Brune @*/
661bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
662bf388a1fSBarry Smith {
663bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6641a4f838cSPeter Brune   const char     *deft = SNESLINESEARCHBASIC;
665bf7f4e0aSPeter Brune   char           type[256];
666bf7f4e0aSPeter Brune   PetscBool      flg, set;
667bf388a1fSBarry Smith 
668bf7f4e0aSPeter Brune   PetscFunctionBegin;
669f1c6b773SPeter Brune   if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
670bf7f4e0aSPeter Brune 
671bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
672bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
673bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
674bf7f4e0aSPeter Brune   }
6753c7d6663SPeter Brune   ierr = PetscOptionsList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
676bf7f4e0aSPeter Brune   if (flg) {
677f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
678bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
679f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
680bf7f4e0aSPeter Brune   }
681bf7f4e0aSPeter Brune 
6827a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",
683bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
684f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
685bf7f4e0aSPeter Brune 
6861a9b3a06SPeter Brune   /* tolerances */
68771eef1aeSPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr);
6881a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr);
6891a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
6901a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr);
6911a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr);
6928e557f58SPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
6937a35526eSPeter Brune 
6941a9b3a06SPeter Brune   /* damping parameters */
6951a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
6961a9b3a06SPeter Brune 
6971a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
6981a9b3a06SPeter Brune 
6991a9b3a06SPeter Brune   /* precheck */
7007a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
7017a35526eSPeter Brune   if (set) {
7027a35526eSPeter Brune     if (flg) {
7037a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
7047a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
7057a35526eSPeter Brune                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,PETSC_NULL);CHKERRQ(ierr);
7067a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
7077a35526eSPeter Brune     } else {
7087a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
7097a35526eSPeter Brune     }
7107a35526eSPeter Brune   }
711b000cd8dSPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr);
7121a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
7137a35526eSPeter Brune 
7145a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
7155a9b6599SPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
7165a9b6599SPeter Brune   }
7175a9b6599SPeter Brune 
718bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
719bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
720bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
721bf7f4e0aSPeter Brune }
722bf7f4e0aSPeter Brune 
723bf7f4e0aSPeter Brune #undef __FUNCT__
724f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
725f40b411bSPeter Brune /*@
726cd7522eaSPeter Brune    SNESLineSearchView - Prints useful information about the line search not
727cd7522eaSPeter Brune    related to an individual call.
728f40b411bSPeter Brune 
729f40b411bSPeter Brune    Input Parameters:
7308e557f58SPeter Brune .  linesearch - linesearch context
731f40b411bSPeter Brune 
732f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
733f40b411bSPeter Brune 
734f40b411bSPeter Brune    Level: intermediate
735f40b411bSPeter Brune 
736f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
737f40b411bSPeter Brune @*/
738bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
739bf388a1fSBarry Smith {
7407f1410a3SPeter Brune   PetscErrorCode ierr;
7417f1410a3SPeter Brune   PetscBool      iascii;
742bf388a1fSBarry Smith 
743bf7f4e0aSPeter Brune   PetscFunctionBegin;
7447f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7457f1410a3SPeter Brune   if (!viewer) {
7467f1410a3SPeter Brune     ierr = PetscViewerASCIIGetStdout(((PetscObject)linesearch)->comm,&viewer);CHKERRQ(ierr);
7477f1410a3SPeter Brune   }
7487f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
7497f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
750f40b411bSPeter Brune 
751251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
7527f1410a3SPeter Brune   if (iascii) {
7537f1410a3SPeter Brune     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer,"SNESLineSearch Object");CHKERRQ(ierr);
7547f1410a3SPeter Brune     if (linesearch->ops->view) {
7557f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
7567f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
7577f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
7587f1410a3SPeter Brune     }
759c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
760c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
7617f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
7626b2b7091SBarry Smith     if (linesearch->ops->precheck) {
7636b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
7647f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
7657f1410a3SPeter Brune       } else {
7667f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
7677f1410a3SPeter Brune       }
7687f1410a3SPeter Brune     }
7696b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
7707f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
7717f1410a3SPeter Brune     }
7727f1410a3SPeter Brune   }
773bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
774bf7f4e0aSPeter Brune }
775bf7f4e0aSPeter Brune 
776bf7f4e0aSPeter Brune #undef __FUNCT__
777f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
778ea5d4fccSPeter Brune /*@C
779f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
780f40b411bSPeter Brune 
781f40b411bSPeter Brune    Input Parameters:
7828e557f58SPeter Brune +  linesearch - linesearch context
783f40b411bSPeter Brune -  type - The type of line search to be used
784f40b411bSPeter Brune 
785cd7522eaSPeter Brune    Available Types:
786cd7522eaSPeter Brune +  basic - Simple damping line search.
7878e557f58SPeter Brune .  bt - Backtracking line search over the L2 norm of the function
7888e557f58SPeter Brune .  l2 - Secant line search over the L2 norm of the function
7898e557f58SPeter Brune .  cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
7908e557f58SPeter Brune -  shell - User provided SNESLineSearch implementation
791cd7522eaSPeter Brune 
792f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
793f40b411bSPeter Brune 
794f40b411bSPeter Brune    Level: intermediate
795f40b411bSPeter Brune 
796f40b411bSPeter Brune 
797f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
798f40b411bSPeter Brune @*/
79919fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
800bf7f4e0aSPeter Brune {
801f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
802bf7f4e0aSPeter Brune   PetscBool      match;
803bf7f4e0aSPeter Brune 
804bf7f4e0aSPeter Brune   PetscFunctionBegin;
805f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
806bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
807bf7f4e0aSPeter Brune 
808251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
809bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
810bf7f4e0aSPeter Brune 
811140e18c1SBarry Smith   ierr =  PetscFunctionListFind(((PetscObject)linesearch)->comm,SNESLineSearchList,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
812bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
813bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
814bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
815bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
816bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
817bf7f4e0aSPeter Brune   }
818f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
819bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
820bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
821bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
822bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
823bf7f4e0aSPeter Brune 
824bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
825bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
826bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
827bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
828bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
829bf7f4e0aSPeter Brune   }
830bf7f4e0aSPeter Brune #endif
831bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
832bf7f4e0aSPeter Brune }
833bf7f4e0aSPeter Brune 
834bf7f4e0aSPeter Brune #undef __FUNCT__
835f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
836f40b411bSPeter Brune /*@
83778bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
838f40b411bSPeter Brune 
839f40b411bSPeter Brune    Input Parameters:
8408e557f58SPeter Brune +  linesearch - linesearch context
841f40b411bSPeter Brune -  snes - The snes instance
842f40b411bSPeter Brune 
84378bcb3b5SPeter Brune    Level: developer
84478bcb3b5SPeter Brune 
84578bcb3b5SPeter Brune    Notes:
84678bcb3b5SPeter Brune    This happens automatically when the line search is gotten/created with
84778bcb3b5SPeter Brune    SNESGetSNESLineSearch().  This routine is therefore mainly called within SNES
84878bcb3b5SPeter Brune    implementations.
849f40b411bSPeter Brune 
8508141a3b9SPeter Brune    Level: developer
851f40b411bSPeter Brune 
852cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
853f40b411bSPeter Brune @*/
854bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
855bf388a1fSBarry Smith {
856bf7f4e0aSPeter Brune   PetscFunctionBegin;
857f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
858bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
859bf7f4e0aSPeter Brune   linesearch->snes = snes;
860bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
861bf7f4e0aSPeter Brune }
862bf7f4e0aSPeter Brune 
863bf7f4e0aSPeter Brune #undef __FUNCT__
864f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
865f40b411bSPeter Brune /*@
8668141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
8678141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
8688141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
8698141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
870f40b411bSPeter Brune 
871f40b411bSPeter Brune    Input Parameters:
8728e557f58SPeter Brune .  linesearch - linesearch context
873f40b411bSPeter Brune 
874f40b411bSPeter Brune    Output Parameters:
875f40b411bSPeter Brune .  snes - The snes instance
876f40b411bSPeter Brune 
8778141a3b9SPeter Brune    Level: developer
878f40b411bSPeter Brune 
879cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
880f40b411bSPeter Brune @*/
881bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
882bf388a1fSBarry Smith {
883bf7f4e0aSPeter Brune   PetscFunctionBegin;
884f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
8856a388c36SPeter Brune   PetscValidPointer(snes, 2);
886bf7f4e0aSPeter Brune   *snes = linesearch->snes;
887bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
888bf7f4e0aSPeter Brune }
889bf7f4e0aSPeter Brune 
8906a388c36SPeter Brune #undef __FUNCT__
891f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
892f40b411bSPeter Brune /*@
893f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
894f40b411bSPeter Brune 
895f40b411bSPeter Brune    Input Parameters:
8968e557f58SPeter Brune .  linesearch - linesearch context
897f40b411bSPeter Brune 
898f40b411bSPeter Brune    Output Parameters:
899cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
900f40b411bSPeter Brune 
90178bcb3b5SPeter Brune    Level: advanced
90278bcb3b5SPeter Brune 
9038e557f58SPeter Brune    Notes:
9048e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
90578bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
90678bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
90778bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
90878bcb3b5SPeter Brune 
909f40b411bSPeter Brune 
910cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
911f40b411bSPeter Brune @*/
912f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
9136a388c36SPeter Brune {
9146a388c36SPeter Brune   PetscFunctionBegin;
915f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9166a388c36SPeter Brune   PetscValidPointer(lambda, 2);
9176a388c36SPeter Brune   *lambda = linesearch->lambda;
9186a388c36SPeter Brune   PetscFunctionReturn(0);
9196a388c36SPeter Brune }
9206a388c36SPeter Brune 
9216a388c36SPeter Brune #undef __FUNCT__
922f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
923f40b411bSPeter Brune /*@
924f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
925f40b411bSPeter Brune 
926f40b411bSPeter Brune    Input Parameters:
9278e557f58SPeter Brune +  linesearch - linesearch context
928f40b411bSPeter Brune -  lambda - The last steplength.
929f40b411bSPeter Brune 
930cd7522eaSPeter Brune    Notes:
931cd7522eaSPeter Brune    This routine is typically used within implementations of SNESLineSearchApply
932cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
933cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
934cd7522eaSPeter Brune    as an inner scaling parameter.
935cd7522eaSPeter Brune 
93678bcb3b5SPeter Brune    Level: advanced
937f40b411bSPeter Brune 
938f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
939f40b411bSPeter Brune @*/
940f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
9416a388c36SPeter Brune {
9426a388c36SPeter Brune   PetscFunctionBegin;
943f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9446a388c36SPeter Brune   linesearch->lambda = lambda;
9456a388c36SPeter Brune   PetscFunctionReturn(0);
9466a388c36SPeter Brune }
9476a388c36SPeter Brune 
9486a388c36SPeter Brune #undef  __FUNCT__
949f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
950f40b411bSPeter Brune /*@
9513c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
95278bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
95378bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
95478bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
955f40b411bSPeter Brune 
956f40b411bSPeter Brune    Input Parameters:
9578e557f58SPeter Brune .  linesearch - linesearch context
958f40b411bSPeter Brune 
959f40b411bSPeter Brune    Output Parameters:
960516fe3c3SPeter Brune +  steptol - The minimum steplength
9616cc8e53bSPeter Brune .  maxstep - The maximum steplength
962516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
963516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
964516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
965516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
966f40b411bSPeter Brune 
96778bcb3b5SPeter Brune    Level: intermediate
96878bcb3b5SPeter Brune 
96978bcb3b5SPeter Brune    Notes:
97078bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
9713c7d6663SPeter Brune    the type requires.
972516fe3c3SPeter Brune 
973f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
974f40b411bSPeter Brune @*/
975f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
9766a388c36SPeter Brune {
9776a388c36SPeter Brune   PetscFunctionBegin;
978f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
979516fe3c3SPeter Brune   if (steptol) {
9806a388c36SPeter Brune     PetscValidPointer(steptol, 2);
9816a388c36SPeter Brune     *steptol = linesearch->steptol;
982516fe3c3SPeter Brune   }
983516fe3c3SPeter Brune   if (maxstep) {
984516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
985516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
986516fe3c3SPeter Brune   }
987516fe3c3SPeter Brune   if (rtol) {
988516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
989516fe3c3SPeter Brune     *rtol = linesearch->rtol;
990516fe3c3SPeter Brune   }
991516fe3c3SPeter Brune   if (atol) {
992516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
993516fe3c3SPeter Brune     *atol = linesearch->atol;
994516fe3c3SPeter Brune   }
995516fe3c3SPeter Brune   if (ltol) {
996516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
997516fe3c3SPeter Brune     *ltol = linesearch->ltol;
998516fe3c3SPeter Brune   }
999516fe3c3SPeter Brune   if (max_its) {
1000516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
1001516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1002516fe3c3SPeter Brune   }
10036a388c36SPeter Brune   PetscFunctionReturn(0);
10046a388c36SPeter Brune }
10056a388c36SPeter Brune 
10066a388c36SPeter Brune #undef  __FUNCT__
1007f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
1008f40b411bSPeter Brune /*@
10093c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
101078bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
101178bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
101278bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1013f40b411bSPeter Brune 
1014f40b411bSPeter Brune    Input Parameters:
10158e557f58SPeter Brune +  linesearch - linesearch context
1016516fe3c3SPeter Brune .  steptol - The minimum steplength
10176cc8e53bSPeter Brune .  maxstep - The maximum steplength
1018516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1019516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1020516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1021516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1022f40b411bSPeter Brune 
102378bcb3b5SPeter Brune    Notes:
10243c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
102578bcb3b5SPeter Brune    place of an argument.
1026f40b411bSPeter Brune 
102778bcb3b5SPeter Brune    Level: intermediate
1028516fe3c3SPeter Brune 
1029f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1030f40b411bSPeter Brune @*/
1031f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
10326a388c36SPeter Brune {
10336a388c36SPeter Brune   PetscFunctionBegin;
1034f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1035d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1036d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1037d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1038d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1039d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1040d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1041d3952184SSatish Balay 
1042d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1043c69d1a72SBarry Smith     if (steptol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
10446a388c36SPeter Brune     linesearch->steptol = steptol;
1045d3952184SSatish Balay   }
1046d3952184SSatish Balay 
1047d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1048c69d1a72SBarry Smith     if (maxstep < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1049516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1050d3952184SSatish Balay   }
1051d3952184SSatish Balay 
1052d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1053c69d1a72SBarry Smith     if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol);
1054516fe3c3SPeter Brune     linesearch->rtol = rtol;
1055d3952184SSatish Balay   }
1056d3952184SSatish Balay 
1057d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1058c69d1a72SBarry Smith     if (atol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1059516fe3c3SPeter Brune     linesearch->atol = atol;
1060d3952184SSatish Balay   }
1061d3952184SSatish Balay 
1062d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1063c69d1a72SBarry Smith     if (ltol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol);
1064516fe3c3SPeter Brune   linesearch->ltol = ltol;
1065d3952184SSatish Balay   }
1066d3952184SSatish Balay 
1067d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1068d3952184SSatish Balay     if (max_its < 0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1069516fe3c3SPeter Brune     linesearch->max_its = max_its;
1070d3952184SSatish Balay   }
1071d3952184SSatish Balay 
10726a388c36SPeter Brune   PetscFunctionReturn(0);
10736a388c36SPeter Brune }
10746a388c36SPeter Brune 
10756a388c36SPeter Brune #undef __FUNCT__
1076f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
1077f40b411bSPeter Brune /*@
1078f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1079f40b411bSPeter Brune 
1080f40b411bSPeter Brune    Input Parameters:
10818e557f58SPeter Brune .  linesearch - linesearch context
1082f40b411bSPeter Brune 
1083f40b411bSPeter Brune    Output Parameters:
10848e557f58SPeter Brune .  damping - The damping parameter
1085f40b411bSPeter Brune 
108678bcb3b5SPeter Brune    Level: advanced
1087f40b411bSPeter Brune 
108878bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1089f40b411bSPeter Brune @*/
1090f40b411bSPeter Brune 
1091f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
10926a388c36SPeter Brune {
10936a388c36SPeter Brune   PetscFunctionBegin;
1094f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10956a388c36SPeter Brune   PetscValidPointer(damping, 2);
10966a388c36SPeter Brune   *damping = linesearch->damping;
10976a388c36SPeter Brune   PetscFunctionReturn(0);
10986a388c36SPeter Brune }
10996a388c36SPeter Brune 
11006a388c36SPeter Brune #undef __FUNCT__
1101f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
1102f40b411bSPeter Brune /*@
1103f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
1104f40b411bSPeter Brune 
1105f40b411bSPeter Brune    Input Parameters:
110678bcb3b5SPeter Brune .  linesearch - linesearch context
110778bcb3b5SPeter Brune .  damping - The damping parameter
1108f40b411bSPeter Brune 
1109f40b411bSPeter Brune    Level: intermediate
1110f40b411bSPeter Brune 
1111cd7522eaSPeter Brune    Notes:
1112cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1113cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
111478bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1115cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1116cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1117cd7522eaSPeter Brune 
1118f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1119f40b411bSPeter Brune @*/
1120f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
11216a388c36SPeter Brune {
11226a388c36SPeter Brune   PetscFunctionBegin;
1123f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11246a388c36SPeter Brune   linesearch->damping = damping;
11256a388c36SPeter Brune   PetscFunctionReturn(0);
11266a388c36SPeter Brune }
11276a388c36SPeter Brune 
11286a388c36SPeter Brune #undef __FUNCT__
112959405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder"
113059405d5eSPeter Brune /*@
113159405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
113259405d5eSPeter Brune 
113359405d5eSPeter Brune    Input Parameters:
113478bcb3b5SPeter Brune .  linesearch - linesearch context
113559405d5eSPeter Brune 
113659405d5eSPeter Brune    Output Parameters:
11378e557f58SPeter Brune .  order - The order
113859405d5eSPeter Brune 
113978bcb3b5SPeter Brune    Possible Values for order:
11403c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11413c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11423c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
114378bcb3b5SPeter Brune 
114459405d5eSPeter Brune    Level: intermediate
114559405d5eSPeter Brune 
114659405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
114759405d5eSPeter Brune @*/
114859405d5eSPeter Brune 
1149b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
115059405d5eSPeter Brune {
115159405d5eSPeter Brune   PetscFunctionBegin;
115259405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
115359405d5eSPeter Brune   PetscValidPointer(order, 2);
115459405d5eSPeter Brune   *order = linesearch->order;
115559405d5eSPeter Brune   PetscFunctionReturn(0);
115659405d5eSPeter Brune }
115759405d5eSPeter Brune 
115859405d5eSPeter Brune #undef __FUNCT__
115959405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder"
116059405d5eSPeter Brune /*@
116159405d5eSPeter Brune    SNESLineSearchSetOrder - Sets the line search damping paramter.
116259405d5eSPeter Brune 
116359405d5eSPeter Brune    Input Parameters:
116478bcb3b5SPeter Brune .  linesearch - linesearch context
116578bcb3b5SPeter Brune .  order - The damping parameter
116659405d5eSPeter Brune 
116759405d5eSPeter Brune    Level: intermediate
116859405d5eSPeter Brune 
116978bcb3b5SPeter Brune    Possible Values for order:
11703c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11713c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11723c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
117378bcb3b5SPeter Brune 
117459405d5eSPeter Brune    Notes:
117559405d5eSPeter Brune    Variable orders are supported by the following line searches:
117678bcb3b5SPeter Brune +  bt - cubic and quadratic
117778bcb3b5SPeter Brune -  cp - linear and quadratic
117859405d5eSPeter Brune 
117959405d5eSPeter Brune .seealso: SNESLineSearchGetOrder()
118059405d5eSPeter Brune @*/
1181b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
118259405d5eSPeter Brune {
118359405d5eSPeter Brune   PetscFunctionBegin;
118459405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
118559405d5eSPeter Brune   linesearch->order = order;
118659405d5eSPeter Brune   PetscFunctionReturn(0);
118759405d5eSPeter Brune }
118859405d5eSPeter Brune 
118959405d5eSPeter Brune #undef __FUNCT__
1190f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
1191f40b411bSPeter Brune /*@
1192f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1193f40b411bSPeter Brune 
1194f40b411bSPeter Brune    Input Parameters:
119578bcb3b5SPeter Brune .  linesearch - linesearch context
1196f40b411bSPeter Brune 
1197f40b411bSPeter Brune    Output Parameters:
1198f40b411bSPeter Brune +  xnorm - The norm of the current solution
1199f40b411bSPeter Brune .  fnorm - The norm of the current function
1200f40b411bSPeter Brune -  ynorm - The norm of the current update
1201f40b411bSPeter Brune 
1202cd7522eaSPeter Brune    Notes:
1203cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1204cd7522eaSPeter Brune 
120578bcb3b5SPeter Brune    Level: developer
1206f40b411bSPeter Brune 
1207f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1208f40b411bSPeter Brune @*/
1209f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1210bf7f4e0aSPeter Brune {
1211bf7f4e0aSPeter Brune   PetscFunctionBegin;
1212f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1213bf7f4e0aSPeter Brune   if (xnorm) {
1214bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
1215bf7f4e0aSPeter Brune   }
1216bf7f4e0aSPeter Brune   if (fnorm) {
1217bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
1218bf7f4e0aSPeter Brune   }
1219bf7f4e0aSPeter Brune   if (ynorm) {
1220bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
1221bf7f4e0aSPeter Brune   }
1222bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1223bf7f4e0aSPeter Brune }
1224bf7f4e0aSPeter Brune 
1225e7058c64SPeter Brune #undef __FUNCT__
1226f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
1227f40b411bSPeter Brune /*@
1228f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1229f40b411bSPeter Brune 
1230f40b411bSPeter Brune    Input Parameters:
123178bcb3b5SPeter Brune +  linesearch - linesearch context
1232f40b411bSPeter Brune .  xnorm - The norm of the current solution
1233f40b411bSPeter Brune .  fnorm - The norm of the current function
1234f40b411bSPeter Brune -  ynorm - The norm of the current update
1235f40b411bSPeter Brune 
123678bcb3b5SPeter Brune    Level: advanced
1237f40b411bSPeter Brune 
1238f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1239f40b411bSPeter Brune @*/
1240f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
12416a388c36SPeter Brune {
12426a388c36SPeter Brune   PetscFunctionBegin;
1243f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12446a388c36SPeter Brune   linesearch->xnorm = xnorm;
12456a388c36SPeter Brune   linesearch->fnorm = fnorm;
12466a388c36SPeter Brune   linesearch->ynorm = ynorm;
12476a388c36SPeter Brune   PetscFunctionReturn(0);
12486a388c36SPeter Brune }
12496a388c36SPeter Brune 
12506a388c36SPeter Brune #undef __FUNCT__
1251f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
1252f40b411bSPeter Brune /*@
1253f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1254f40b411bSPeter Brune 
1255f40b411bSPeter Brune    Input Parameters:
125678bcb3b5SPeter Brune .  linesearch - linesearch context
1257f40b411bSPeter Brune 
1258f40b411bSPeter Brune    Options Database Keys:
12598e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1260f40b411bSPeter Brune 
1261f40b411bSPeter Brune    Level: intermediate
1262f40b411bSPeter Brune 
126378bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1264f40b411bSPeter Brune @*/
1265f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
12666a388c36SPeter Brune {
12676a388c36SPeter Brune   PetscErrorCode ierr;
12689bd66eb0SPeter Brune   SNES           snes;
1269bf388a1fSBarry Smith 
12706a388c36SPeter Brune   PetscFunctionBegin;
12716a388c36SPeter Brune   if (linesearch->norms) {
12729bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1273f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
12749bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12759bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12769bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
12779bd66eb0SPeter Brune     } else {
12786a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12796a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12806a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12816a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12826a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12836a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12846a388c36SPeter Brune     }
12859bd66eb0SPeter Brune   }
12866a388c36SPeter Brune   PetscFunctionReturn(0);
12876a388c36SPeter Brune }
12886a388c36SPeter Brune 
12896f263ca3SPeter Brune #undef __FUNCT__
12906f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms"
12916f263ca3SPeter Brune /*@
12926f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
12936f263ca3SPeter Brune 
12946f263ca3SPeter Brune    Input Parameters:
129578bcb3b5SPeter Brune +  linesearch  - linesearch context
129678bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
12976f263ca3SPeter Brune 
12986f263ca3SPeter Brune    Options Database Keys:
12998e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
13006f263ca3SPeter Brune 
13016f263ca3SPeter Brune    Notes:
13021a4f838cSPeter Brune    This is most relevant to the SNESLINESEARCHBASIC line search type.
13036f263ca3SPeter Brune 
13046f263ca3SPeter Brune    Level: intermediate
13056f263ca3SPeter Brune 
13061a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13076f263ca3SPeter Brune @*/
13086f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13096f263ca3SPeter Brune {
13106f263ca3SPeter Brune   PetscFunctionBegin;
13116f263ca3SPeter Brune   linesearch->norms = flg;
13126f263ca3SPeter Brune   PetscFunctionReturn(0);
13136f263ca3SPeter Brune }
13146f263ca3SPeter Brune 
13156a388c36SPeter Brune #undef __FUNCT__
1316f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1317f40b411bSPeter Brune /*@
1318f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1319f40b411bSPeter Brune 
1320f40b411bSPeter Brune    Input Parameters:
132178bcb3b5SPeter Brune .  linesearch - linesearch context
1322f40b411bSPeter Brune 
1323f40b411bSPeter Brune    Output Parameters:
1324f40b411bSPeter Brune +  X - The old solution
1325f40b411bSPeter Brune .  F - The old function
1326f40b411bSPeter Brune .  Y - The search direction
1327f40b411bSPeter Brune .  W - The new solution
1328f40b411bSPeter Brune -  G - The new function
1329f40b411bSPeter Brune 
133078bcb3b5SPeter Brune    Level: advanced
1331f40b411bSPeter Brune 
1332f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1333f40b411bSPeter Brune @*/
1334bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1335bf388a1fSBarry Smith {
13366a388c36SPeter Brune   PetscFunctionBegin;
1337f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13386a388c36SPeter Brune   if (X) {
13396a388c36SPeter Brune     PetscValidPointer(X, 2);
13406a388c36SPeter Brune     *X = linesearch->vec_sol;
13416a388c36SPeter Brune   }
13426a388c36SPeter Brune   if (F) {
13436a388c36SPeter Brune     PetscValidPointer(F, 3);
13446a388c36SPeter Brune     *F = linesearch->vec_func;
13456a388c36SPeter Brune   }
13466a388c36SPeter Brune   if (Y) {
13476a388c36SPeter Brune     PetscValidPointer(Y, 4);
13486a388c36SPeter Brune     *Y = linesearch->vec_update;
13496a388c36SPeter Brune   }
13506a388c36SPeter Brune   if (W) {
13516a388c36SPeter Brune     PetscValidPointer(W, 5);
13526a388c36SPeter Brune     *W = linesearch->vec_sol_new;
13536a388c36SPeter Brune   }
13546a388c36SPeter Brune   if (G) {
13556a388c36SPeter Brune     PetscValidPointer(G, 6);
13566a388c36SPeter Brune     *G = linesearch->vec_func_new;
13576a388c36SPeter Brune   }
13586a388c36SPeter Brune 
13596a388c36SPeter Brune   PetscFunctionReturn(0);
13606a388c36SPeter Brune }
13616a388c36SPeter Brune 
13626a388c36SPeter Brune #undef __FUNCT__
1363f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1364f40b411bSPeter Brune /*@
1365f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1366f40b411bSPeter Brune 
1367f40b411bSPeter Brune    Input Parameters:
136878bcb3b5SPeter Brune +  linesearch - linesearch context
1369f40b411bSPeter Brune .  X - The old solution
1370f40b411bSPeter Brune .  F - The old function
1371f40b411bSPeter Brune .  Y - The search direction
1372f40b411bSPeter Brune .  W - The new solution
1373f40b411bSPeter Brune -  G - The new function
1374f40b411bSPeter Brune 
137578bcb3b5SPeter Brune    Level: advanced
1376f40b411bSPeter Brune 
1377f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1378f40b411bSPeter Brune @*/
1379bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1380bf388a1fSBarry Smith {
13816a388c36SPeter Brune   PetscFunctionBegin;
1382f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13836a388c36SPeter Brune   if (X) {
13846a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
13856a388c36SPeter Brune     linesearch->vec_sol = X;
13866a388c36SPeter Brune   }
13876a388c36SPeter Brune   if (F) {
13886a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
13896a388c36SPeter Brune     linesearch->vec_func = F;
13906a388c36SPeter Brune   }
13916a388c36SPeter Brune   if (Y) {
13926a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
13936a388c36SPeter Brune     linesearch->vec_update = Y;
13946a388c36SPeter Brune   }
13956a388c36SPeter Brune   if (W) {
13966a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
13976a388c36SPeter Brune     linesearch->vec_sol_new = W;
13986a388c36SPeter Brune   }
13996a388c36SPeter Brune   if (G) {
14006a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14016a388c36SPeter Brune     linesearch->vec_func_new = G;
14026a388c36SPeter Brune   }
14036a388c36SPeter Brune   PetscFunctionReturn(0);
14046a388c36SPeter Brune }
14056a388c36SPeter Brune 
14066a388c36SPeter Brune #undef __FUNCT__
1407f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1408e7058c64SPeter Brune /*@C
1409f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1410e7058c64SPeter Brune    SNES options in the database.
1411e7058c64SPeter Brune 
1412cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1413e7058c64SPeter Brune 
1414e7058c64SPeter Brune    Input Parameters:
1415e7058c64SPeter Brune +  snes - the SNES context
1416e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1417e7058c64SPeter Brune 
1418e7058c64SPeter Brune    Notes:
1419e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1420e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1421e7058c64SPeter Brune 
1422e7058c64SPeter Brune    Level: advanced
1423e7058c64SPeter Brune 
1424f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1425e7058c64SPeter Brune 
1426e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1427e7058c64SPeter Brune @*/
1428f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1429e7058c64SPeter Brune {
1430e7058c64SPeter Brune   PetscErrorCode ierr;
1431e7058c64SPeter Brune 
1432e7058c64SPeter Brune   PetscFunctionBegin;
1433f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1434e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1435e7058c64SPeter Brune   PetscFunctionReturn(0);
1436e7058c64SPeter Brune }
1437e7058c64SPeter Brune 
1438e7058c64SPeter Brune #undef __FUNCT__
1439f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1440e7058c64SPeter Brune /*@C
1441f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1442f1c6b773SPeter Brune    SNESLineSearch options in the database.
1443e7058c64SPeter Brune 
1444e7058c64SPeter Brune    Not Collective
1445e7058c64SPeter Brune 
1446e7058c64SPeter Brune    Input Parameter:
1447cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1448e7058c64SPeter Brune 
1449e7058c64SPeter Brune    Output Parameter:
1450e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1451e7058c64SPeter Brune 
14528e557f58SPeter Brune    Notes:
14538e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1454e7058c64SPeter Brune    sufficient length to hold the prefix.
1455e7058c64SPeter Brune 
1456e7058c64SPeter Brune    Level: advanced
1457e7058c64SPeter Brune 
1458f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1459e7058c64SPeter Brune 
1460e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1461e7058c64SPeter Brune @*/
1462f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1463e7058c64SPeter Brune {
1464e7058c64SPeter Brune   PetscErrorCode ierr;
1465e7058c64SPeter Brune 
1466e7058c64SPeter Brune   PetscFunctionBegin;
1467f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1468e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1469e7058c64SPeter Brune   PetscFunctionReturn(0);
1470e7058c64SPeter Brune }
1471bf7f4e0aSPeter Brune 
1472bf7f4e0aSPeter Brune #undef __FUNCT__
1473f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetWork"
1474f40b411bSPeter Brune /*@
1475f1c6b773SPeter Brune    SNESLineSearchGetWork - Gets work vectors for the line search.
1476f40b411bSPeter Brune 
1477f40b411bSPeter Brune    Input Parameter:
1478f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1479f40b411bSPeter Brune -  nwork - the number of work vectors
1480f40b411bSPeter Brune 
1481f40b411bSPeter Brune    Level: developer
1482f40b411bSPeter Brune 
1483cd7522eaSPeter Brune    Notes:
1484cd7522eaSPeter Brune    This is typically called at the beginning of a SNESLineSearch or SNESLineSearchShell implementation.
1485cd7522eaSPeter Brune 
1486f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1487f40b411bSPeter Brune 
1488f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1489f40b411bSPeter Brune @*/
1490f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetWork(SNESLineSearch linesearch, PetscInt nwork)
1491bf7f4e0aSPeter Brune {
1492bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1493bf388a1fSBarry Smith 
1494bf7f4e0aSPeter Brune   PetscFunctionBegin;
1495bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1496bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
14970ad7597dSKarl Rupp   }
14980ad7597dSKarl Rupp   SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1499bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1500bf7f4e0aSPeter Brune }
1501bf7f4e0aSPeter Brune 
1502bf7f4e0aSPeter Brune #undef __FUNCT__
1503f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1504f40b411bSPeter Brune /*@
1505f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1506f40b411bSPeter Brune 
1507f40b411bSPeter Brune    Input Parameters:
150878bcb3b5SPeter Brune .  linesearch - linesearch context
1509f40b411bSPeter Brune 
1510f40b411bSPeter Brune    Output Parameters:
15118e557f58SPeter Brune .  success - The success or failure status
1512f40b411bSPeter Brune 
1513cd7522eaSPeter Brune    Notes:
1514cd7522eaSPeter Brune    This is typically called after SNESLineSearchApply in order to determine if the line-search failed
1515cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1516cd7522eaSPeter Brune 
1517f40b411bSPeter Brune    Level: intermediate
1518f40b411bSPeter Brune 
1519f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1520f40b411bSPeter Brune @*/
1521f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1522bf7f4e0aSPeter Brune {
1523bf7f4e0aSPeter Brune   PetscFunctionBegin;
1524f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15256a388c36SPeter Brune   PetscValidPointer(success, 2);
1526bf7f4e0aSPeter Brune   if (success) {
1527bf7f4e0aSPeter Brune     *success = linesearch->success;
1528bf7f4e0aSPeter Brune   }
1529bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1530bf7f4e0aSPeter Brune }
1531bf7f4e0aSPeter Brune 
1532bf7f4e0aSPeter Brune #undef __FUNCT__
1533f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1534f40b411bSPeter Brune /*@
1535f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1536f40b411bSPeter Brune 
1537f40b411bSPeter Brune    Input Parameters:
153878bcb3b5SPeter Brune +  linesearch - linesearch context
15398e557f58SPeter Brune -  success - The success or failure status
1540f40b411bSPeter Brune 
1541cd7522eaSPeter Brune    Notes:
1542cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1543cd7522eaSPeter Brune    the success or failure of the line search method.
1544cd7522eaSPeter Brune 
154578bcb3b5SPeter Brune    Level: developer
1546f40b411bSPeter Brune 
1547f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1548f40b411bSPeter Brune @*/
1549f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
15506a388c36SPeter Brune {
15516a388c36SPeter Brune   PetscFunctionBegin;
1552*5fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15536a388c36SPeter Brune   linesearch->success = success;
15546a388c36SPeter Brune   PetscFunctionReturn(0);
15556a388c36SPeter Brune }
15566a388c36SPeter Brune 
15576a388c36SPeter Brune #undef __FUNCT__
1558f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
15599bd66eb0SPeter Brune /*@C
1560f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
15619bd66eb0SPeter Brune 
15629bd66eb0SPeter Brune    Input Parameters:
15639bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
15649bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
15659bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
15669bd66eb0SPeter Brune 
15679bd66eb0SPeter Brune    Logically Collective on SNES
15689bd66eb0SPeter Brune 
15699bd66eb0SPeter Brune    Calling sequence of projectfunc:
15709bd66eb0SPeter Brune .vb
15719bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
15729bd66eb0SPeter Brune .ve
15739bd66eb0SPeter Brune 
15749bd66eb0SPeter Brune     Input parameters for projectfunc:
15759bd66eb0SPeter Brune +   snes - nonlinear context
15769bd66eb0SPeter Brune -   X - current solution
15779bd66eb0SPeter Brune 
1578cd7522eaSPeter Brune     Output parameters for projectfunc:
15799bd66eb0SPeter Brune .   X - Projected solution
15809bd66eb0SPeter Brune 
15819bd66eb0SPeter Brune    Calling sequence of normfunc:
15829bd66eb0SPeter Brune .vb
15839bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
15849bd66eb0SPeter Brune .ve
15859bd66eb0SPeter Brune 
1586cd7522eaSPeter Brune     Input parameters for normfunc:
15879bd66eb0SPeter Brune +   snes - nonlinear context
15889bd66eb0SPeter Brune .   X - current solution
15899bd66eb0SPeter Brune -   F - current residual
15909bd66eb0SPeter Brune 
1591cd7522eaSPeter Brune     Output parameters for normfunc:
15929bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
15939bd66eb0SPeter Brune 
1594cd7522eaSPeter Brune     Notes:
1595cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1596cd7522eaSPeter Brune 
1597cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1598cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
15999bd66eb0SPeter Brune 
16009bd66eb0SPeter Brune     Level: developer
16019bd66eb0SPeter Brune 
16029bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
16039bd66eb0SPeter Brune 
1604f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16059bd66eb0SPeter Brune @*/
1606f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16079bd66eb0SPeter Brune {
16089bd66eb0SPeter Brune   PetscFunctionBegin;
1609f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16109bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16119bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16129bd66eb0SPeter Brune   PetscFunctionReturn(0);
16139bd66eb0SPeter Brune }
16149bd66eb0SPeter Brune 
16159bd66eb0SPeter Brune #undef __FUNCT__
1616f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
16179bd66eb0SPeter Brune /*@C
1618f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16199bd66eb0SPeter Brune 
16209bd66eb0SPeter Brune    Input Parameters:
16219bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
16229bd66eb0SPeter Brune 
16239bd66eb0SPeter Brune    Output Parameters:
16249bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16259bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16269bd66eb0SPeter Brune 
16279bd66eb0SPeter Brune    Logically Collective on SNES
16289bd66eb0SPeter Brune 
16299bd66eb0SPeter Brune     Level: developer
16309bd66eb0SPeter Brune 
16319bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
16329bd66eb0SPeter Brune 
1633f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16349bd66eb0SPeter Brune @*/
1635f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16369bd66eb0SPeter Brune {
16379bd66eb0SPeter Brune   PetscFunctionBegin;
16389bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16399bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16409bd66eb0SPeter Brune   PetscFunctionReturn(0);
16419bd66eb0SPeter Brune }
16429bd66eb0SPeter Brune 
16439bd66eb0SPeter Brune #undef __FUNCT__
1644f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1645bf7f4e0aSPeter Brune /*@C
1646f1c6b773SPeter Brune   SNESLineSearchRegister - See SNESLineSearchRegisterDynamic()
1647bf7f4e0aSPeter Brune 
1648bf7f4e0aSPeter Brune   Level: advanced
1649bf7f4e0aSPeter Brune @*/
1650f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNESLineSearch))
1651bf7f4e0aSPeter Brune {
1652bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1653bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1654bf7f4e0aSPeter Brune 
1655bf7f4e0aSPeter Brune   PetscFunctionBegin;
1656140e18c1SBarry Smith   ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr);
1657140e18c1SBarry Smith   ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&SNESLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1658bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1659bf7f4e0aSPeter Brune }
1660