xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 0ad7597df3318518cf08ebbaa20b6a237bca446d)
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;
323bf7f4e0aSPeter Brune   PetscFunctionBegin;
324bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
3256b2b7091SBarry Smith   if (linesearch->ops->precheck) {
3266b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
32738bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
328bf7f4e0aSPeter Brune   }
329bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
330bf7f4e0aSPeter Brune }
331bf7f4e0aSPeter Brune 
332bf7f4e0aSPeter Brune #undef __FUNCT__
333f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
334f40b411bSPeter Brune /*@
335f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
336f40b411bSPeter Brune 
337cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
338f40b411bSPeter Brune 
339f40b411bSPeter Brune    Input Parameters:
3407b1df9c1SPeter Brune +  linesearch - The linesearch context
3417b1df9c1SPeter Brune .  X - The last solution
3427b1df9c1SPeter Brune .  Y - The step direction
3437b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
344f40b411bSPeter Brune 
345f40b411bSPeter Brune    Output Parameters:
34678bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
34778bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
348f40b411bSPeter Brune 
349f40b411bSPeter Brune    Level: Intermediate
350f40b411bSPeter Brune 
351f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
352f40b411bSPeter Brune 
353f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck()
354f40b411bSPeter Brune @*/
3557b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
356bf7f4e0aSPeter Brune {
357bf7f4e0aSPeter Brune   PetscErrorCode ierr;
358bf388a1fSBarry Smith 
359bf7f4e0aSPeter Brune   PetscFunctionBegin;
360bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
361bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
3626b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
3636b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
36438bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
36538bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
36686d74e61SPeter Brune   }
36786d74e61SPeter Brune   PetscFunctionReturn(0);
36886d74e61SPeter Brune }
36986d74e61SPeter Brune 
37086d74e61SPeter Brune #undef __FUNCT__
371f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
37286d74e61SPeter Brune /*@C
37386d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
37486d74e61SPeter Brune 
375cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
37686d74e61SPeter Brune 
37786d74e61SPeter Brune    Input Arguments:
37886d74e61SPeter Brune +  linesearch - linesearch context
37986d74e61SPeter Brune .  X - base state for this step
38086d74e61SPeter Brune .  Y - initial correction
38186d74e61SPeter Brune 
38286d74e61SPeter Brune    Output Arguments:
38386d74e61SPeter Brune +  Y - correction, possibly modified
38486d74e61SPeter Brune -  changed - flag indicating that Y was modified
38586d74e61SPeter Brune 
38686d74e61SPeter Brune    Options Database Key:
387cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
388cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
38986d74e61SPeter Brune 
39086d74e61SPeter Brune    Level: advanced
39186d74e61SPeter Brune 
39286d74e61SPeter Brune    Notes:
39386d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
39486d74e61SPeter Brune 
39586d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
39686d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
39786d74e61SPeter Brune    is generally not useful when using a Newton linearization.
39886d74e61SPeter Brune 
39986d74e61SPeter Brune    Reference:
40086d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
40186d74e61SPeter Brune 
40286d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
40386d74e61SPeter Brune @*/
404f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
40586d74e61SPeter Brune {
40686d74e61SPeter Brune   PetscErrorCode ierr;
40786d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
40886d74e61SPeter Brune   Vec            Ylast;
40986d74e61SPeter Brune   PetscScalar    dot;
41086d74e61SPeter Brune   PetscInt       iter;
41186d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
41286d74e61SPeter Brune   SNES           snes;
41386d74e61SPeter Brune 
41486d74e61SPeter Brune   PetscFunctionBegin;
415f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
41686d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
41786d74e61SPeter Brune   if (!Ylast) {
41886d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
41986d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
42086d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
42186d74e61SPeter Brune   }
42286d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
42386d74e61SPeter Brune   if (iter < 2) {
42486d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
42586d74e61SPeter Brune     *changed = PETSC_FALSE;
42686d74e61SPeter Brune     PetscFunctionReturn(0);
42786d74e61SPeter Brune   }
42886d74e61SPeter Brune 
42986d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
43086d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
43186d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
43286d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
43386d74e61SPeter Brune   theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
43486d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
43586d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
43686d74e61SPeter Brune     /* Modify the step Y */
43786d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
43886d74e61SPeter Brune     ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
43986d74e61SPeter Brune     ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
44086d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
44186d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
44286d74e61SPeter Brune     ierr = VecScale(Y,alpha);CHKERRQ(ierr);
443c69d1a72SBarry 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);
44486d74e61SPeter Brune   } else {
445c69d1a72SBarry 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);
44686d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
44786d74e61SPeter Brune     *changed = PETSC_FALSE;
448bf7f4e0aSPeter Brune   }
449bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
450bf7f4e0aSPeter Brune }
451bf7f4e0aSPeter Brune 
452bf7f4e0aSPeter Brune #undef __FUNCT__
453f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
454f40b411bSPeter Brune /*@
455cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
456f40b411bSPeter Brune 
457f1c6b773SPeter Brune    Collective on SNESLineSearch
458f40b411bSPeter Brune 
459f40b411bSPeter Brune    Input Parameters:
4608e557f58SPeter Brune +  linesearch - The linesearch context
4618e557f58SPeter Brune .  X - The current solution
4628e557f58SPeter Brune .  F - The current function
4638e557f58SPeter Brune .  fnorm - The current norm
4648e557f58SPeter Brune -  Y - The search direction
465f40b411bSPeter Brune 
466f40b411bSPeter Brune    Output Parameters:
4678e557f58SPeter Brune +  X - The new solution
4688e557f58SPeter Brune .  F - The new function
4698e557f58SPeter Brune -  fnorm - The new function norm
470f40b411bSPeter Brune 
471cd7522eaSPeter Brune    Options Database Keys:
4723c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell
473cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
4743c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
475cd7522eaSPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms
4763c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
4773c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
478cd7522eaSPeter Brune 
479cd7522eaSPeter Brune    Notes:
480cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
481cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
482cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
483cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
484cd7522eaSPeter Brune    application of the line search may invoke SNESComputeFunction several times, and
485cd7522eaSPeter Brune    therefore may be fairly expensive.
486cd7522eaSPeter Brune 
487f40b411bSPeter Brune    Level: Intermediate
488f40b411bSPeter Brune 
489f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
490f40b411bSPeter Brune 
491cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction()
492f40b411bSPeter Brune @*/
493bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
494bf388a1fSBarry Smith {
495bf7f4e0aSPeter Brune   PetscErrorCode ierr;
496bf7f4e0aSPeter Brune 
497bf388a1fSBarry Smith   PetscFunctionBegin;
498f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
499bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
500bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
501bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
502bf7f4e0aSPeter Brune 
503bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
504bf7f4e0aSPeter Brune 
505bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
506bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
507bf7f4e0aSPeter Brune   linesearch->vec_func = F;
508bf7f4e0aSPeter Brune 
509f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
510bf7f4e0aSPeter Brune 
511bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
512bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
513bf7f4e0aSPeter Brune 
514bf7f4e0aSPeter Brune   if (fnorm) {
515bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
516bf7f4e0aSPeter Brune   } else {
517bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
518bf7f4e0aSPeter Brune   }
519bf7f4e0aSPeter Brune 
520f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
521bf7f4e0aSPeter Brune 
522bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
523bf7f4e0aSPeter Brune 
524f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
525bf7f4e0aSPeter Brune 
526bf7f4e0aSPeter Brune   if (fnorm)
527bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
528bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
529bf7f4e0aSPeter Brune }
530bf7f4e0aSPeter Brune 
531bf7f4e0aSPeter Brune #undef __FUNCT__
532f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
533f40b411bSPeter Brune /*@
534f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
535f40b411bSPeter Brune 
536f1c6b773SPeter Brune    Collective on SNESLineSearch
537f40b411bSPeter Brune 
538f40b411bSPeter Brune    Input Parameters:
5398e557f58SPeter Brune .  linesearch - The linesearch context
540f40b411bSPeter Brune 
541f40b411bSPeter Brune    Level: Intermediate
542f40b411bSPeter Brune 
54378bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy
544f40b411bSPeter Brune 
545cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
546f40b411bSPeter Brune @*/
547bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
548bf388a1fSBarry Smith {
549bf7f4e0aSPeter Brune   PetscErrorCode ierr;
550bf388a1fSBarry Smith 
551bf7f4e0aSPeter Brune   PetscFunctionBegin;
552bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
553f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
554bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
555bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
55622d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
557bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
558bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
559bf7f4e0aSPeter Brune   }
560bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
561e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
562bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
563bf7f4e0aSPeter Brune }
564bf7f4e0aSPeter Brune 
565bf7f4e0aSPeter Brune #undef __FUNCT__
566f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
567f40b411bSPeter Brune /*@
568cd7522eaSPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search.
569bf7f4e0aSPeter Brune 
570bf7f4e0aSPeter Brune    Input Parameters:
571bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
572bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
573bf7f4e0aSPeter Brune 
574bf7f4e0aSPeter Brune    Logically Collective on SNES
575bf7f4e0aSPeter Brune 
576bf7f4e0aSPeter Brune    Options Database:
5778e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
578bf7f4e0aSPeter Brune 
579bf7f4e0aSPeter Brune    Level: intermediate
580bf7f4e0aSPeter Brune 
581bf7f4e0aSPeter Brune 
582cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer
583bf7f4e0aSPeter Brune @*/
584f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
585bf7f4e0aSPeter Brune {
586bf7f4e0aSPeter Brune   PetscErrorCode ierr;
587bf388a1fSBarry Smith 
588bf7f4e0aSPeter Brune   PetscFunctionBegin;
589bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
590bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
591bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
592bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
593bf7f4e0aSPeter Brune   }
594bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
595bf7f4e0aSPeter Brune }
596bf7f4e0aSPeter Brune 
597bf7f4e0aSPeter Brune #undef __FUNCT__
598f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
599f40b411bSPeter Brune /*@
600cd7522eaSPeter Brune    SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor.
6016a388c36SPeter Brune 
602f40b411bSPeter Brune    Input Parameters:
6038e557f58SPeter Brune .  linesearch - linesearch context
604f40b411bSPeter Brune 
605f40b411bSPeter Brune    Input Parameters:
6068e557f58SPeter Brune .  monitor - monitor context
607f40b411bSPeter Brune 
608f40b411bSPeter Brune    Logically Collective on SNES
609f40b411bSPeter Brune 
610f40b411bSPeter Brune 
611f40b411bSPeter Brune    Options Database Keys:
6128e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
613f40b411bSPeter Brune 
614f40b411bSPeter Brune    Level: intermediate
615f40b411bSPeter Brune 
616f40b411bSPeter Brune 
617cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer
618f40b411bSPeter Brune @*/
619f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6206a388c36SPeter Brune {
6216a388c36SPeter Brune   PetscFunctionBegin;
622f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6236a388c36SPeter Brune   if (monitor) {
6246a388c36SPeter Brune     PetscValidPointer(monitor, 2);
6256a388c36SPeter Brune     *monitor = linesearch->monitor;
6266a388c36SPeter Brune   }
6276a388c36SPeter Brune   PetscFunctionReturn(0);
6286a388c36SPeter Brune }
6296a388c36SPeter Brune 
6306a388c36SPeter Brune #undef __FUNCT__
631f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
632f40b411bSPeter Brune /*@
633f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
634f40b411bSPeter Brune 
635f40b411bSPeter Brune    Input Parameters:
6368e557f58SPeter Brune .  linesearch - linesearch context
637f40b411bSPeter Brune 
638f40b411bSPeter Brune    Options Database Keys:
6393c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell
6403c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
6415a9b6599SPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch type
64271eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
6431a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
6441a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
6451a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
6461a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
6471a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
648cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
6498e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
650cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
6511a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
6521a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method
653f40b411bSPeter Brune 
654f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
655f40b411bSPeter Brune 
656f40b411bSPeter Brune    Level: intermediate
657f40b411bSPeter Brune 
6583c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard()
659f40b411bSPeter Brune @*/
660bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
661bf388a1fSBarry Smith {
662bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6631a4f838cSPeter Brune   const char     *deft = SNESLINESEARCHBASIC;
664bf7f4e0aSPeter Brune   char           type[256];
665bf7f4e0aSPeter Brune   PetscBool      flg, set;
666bf388a1fSBarry Smith 
667bf7f4e0aSPeter Brune   PetscFunctionBegin;
668f1c6b773SPeter Brune   if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
669bf7f4e0aSPeter Brune 
670bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
671bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
672bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
673bf7f4e0aSPeter Brune   }
6743c7d6663SPeter Brune   ierr = PetscOptionsList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
675bf7f4e0aSPeter Brune   if (flg) {
676f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
677bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
678f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
679bf7f4e0aSPeter Brune   }
680bf7f4e0aSPeter Brune 
6817a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",
682bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
683f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
684bf7f4e0aSPeter Brune 
6851a9b3a06SPeter Brune   /* tolerances */
68671eef1aeSPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr);
6871a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr);
6881a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
6891a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr);
6901a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr);
6918e557f58SPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
6927a35526eSPeter Brune 
6931a9b3a06SPeter Brune   /* damping parameters */
6941a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
6951a9b3a06SPeter Brune 
6961a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
6971a9b3a06SPeter Brune 
6981a9b3a06SPeter Brune   /* precheck */
6997a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
7007a35526eSPeter Brune   if (set) {
7017a35526eSPeter Brune     if (flg) {
7027a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
7037a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
7047a35526eSPeter Brune                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,PETSC_NULL);CHKERRQ(ierr);
7057a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
7067a35526eSPeter Brune     } else {
7077a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
7087a35526eSPeter Brune     }
7097a35526eSPeter Brune   }
710b000cd8dSPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr);
7111a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
7127a35526eSPeter Brune 
7135a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
7145a9b6599SPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
7155a9b6599SPeter Brune   }
7165a9b6599SPeter Brune 
717bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
718bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
719bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
720bf7f4e0aSPeter Brune }
721bf7f4e0aSPeter Brune 
722bf7f4e0aSPeter Brune #undef __FUNCT__
723f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
724f40b411bSPeter Brune /*@
725cd7522eaSPeter Brune    SNESLineSearchView - Prints useful information about the line search not
726cd7522eaSPeter Brune    related to an individual call.
727f40b411bSPeter Brune 
728f40b411bSPeter Brune    Input Parameters:
7298e557f58SPeter Brune .  linesearch - linesearch context
730f40b411bSPeter Brune 
731f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
732f40b411bSPeter Brune 
733f40b411bSPeter Brune    Level: intermediate
734f40b411bSPeter Brune 
735f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
736f40b411bSPeter Brune @*/
737bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
738bf388a1fSBarry Smith {
7397f1410a3SPeter Brune   PetscErrorCode ierr;
7407f1410a3SPeter Brune   PetscBool      iascii;
741bf388a1fSBarry Smith 
742bf7f4e0aSPeter Brune   PetscFunctionBegin;
7437f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7447f1410a3SPeter Brune   if (!viewer) {
7457f1410a3SPeter Brune     ierr = PetscViewerASCIIGetStdout(((PetscObject)linesearch)->comm,&viewer);CHKERRQ(ierr);
7467f1410a3SPeter Brune   }
7477f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
7487f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
749f40b411bSPeter Brune 
750251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
7517f1410a3SPeter Brune   if (iascii) {
7527f1410a3SPeter Brune     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer,"SNESLineSearch Object");CHKERRQ(ierr);
7537f1410a3SPeter Brune     if (linesearch->ops->view) {
7547f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
7557f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
7567f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
7577f1410a3SPeter Brune     }
758c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
759c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
7607f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
7616b2b7091SBarry Smith     if (linesearch->ops->precheck) {
7626b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
7637f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
7647f1410a3SPeter Brune       } else {
7657f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
7667f1410a3SPeter Brune       }
7677f1410a3SPeter Brune     }
7686b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
7697f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
7707f1410a3SPeter Brune     }
7717f1410a3SPeter Brune   }
772bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
773bf7f4e0aSPeter Brune }
774bf7f4e0aSPeter Brune 
775bf7f4e0aSPeter Brune #undef __FUNCT__
776f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
777ea5d4fccSPeter Brune /*@C
778f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
779f40b411bSPeter Brune 
780f40b411bSPeter Brune    Input Parameters:
7818e557f58SPeter Brune +  linesearch - linesearch context
782f40b411bSPeter Brune -  type - The type of line search to be used
783f40b411bSPeter Brune 
784cd7522eaSPeter Brune    Available Types:
785cd7522eaSPeter Brune +  basic - Simple damping line search.
7868e557f58SPeter Brune .  bt - Backtracking line search over the L2 norm of the function
7878e557f58SPeter Brune .  l2 - Secant line search over the L2 norm of the function
7888e557f58SPeter Brune .  cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
7898e557f58SPeter Brune -  shell - User provided SNESLineSearch implementation
790cd7522eaSPeter Brune 
791f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
792f40b411bSPeter Brune 
793f40b411bSPeter Brune    Level: intermediate
794f40b411bSPeter Brune 
795f40b411bSPeter Brune 
796f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
797f40b411bSPeter Brune @*/
79819fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
799bf7f4e0aSPeter Brune {
800f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
801bf7f4e0aSPeter Brune   PetscBool      match;
802bf7f4e0aSPeter Brune 
803bf7f4e0aSPeter Brune   PetscFunctionBegin;
804f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
805bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
806bf7f4e0aSPeter Brune 
807251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
808bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
809bf7f4e0aSPeter Brune 
810140e18c1SBarry Smith   ierr =  PetscFunctionListFind(((PetscObject)linesearch)->comm,SNESLineSearchList,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
811bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
812bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
813bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
814bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
815bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
816bf7f4e0aSPeter Brune   }
817f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
818bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
819bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
820bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
821bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
822bf7f4e0aSPeter Brune 
823bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
824bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
825bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
826bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
827bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
828bf7f4e0aSPeter Brune   }
829bf7f4e0aSPeter Brune #endif
830bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
831bf7f4e0aSPeter Brune }
832bf7f4e0aSPeter Brune 
833bf7f4e0aSPeter Brune #undef __FUNCT__
834f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
835f40b411bSPeter Brune /*@
83678bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
837f40b411bSPeter Brune 
838f40b411bSPeter Brune    Input Parameters:
8398e557f58SPeter Brune +  linesearch - linesearch context
840f40b411bSPeter Brune -  snes - The snes instance
841f40b411bSPeter Brune 
84278bcb3b5SPeter Brune    Level: developer
84378bcb3b5SPeter Brune 
84478bcb3b5SPeter Brune    Notes:
84578bcb3b5SPeter Brune    This happens automatically when the line search is gotten/created with
84678bcb3b5SPeter Brune    SNESGetSNESLineSearch().  This routine is therefore mainly called within SNES
84778bcb3b5SPeter Brune    implementations.
848f40b411bSPeter Brune 
8498141a3b9SPeter Brune    Level: developer
850f40b411bSPeter Brune 
851cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
852f40b411bSPeter Brune @*/
853bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
854bf388a1fSBarry Smith {
855bf7f4e0aSPeter Brune   PetscFunctionBegin;
856f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
857bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
858bf7f4e0aSPeter Brune   linesearch->snes = snes;
859bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
860bf7f4e0aSPeter Brune }
861bf7f4e0aSPeter Brune 
862bf7f4e0aSPeter Brune #undef __FUNCT__
863f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
864f40b411bSPeter Brune /*@
8658141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
8668141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
8678141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
8688141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
869f40b411bSPeter Brune 
870f40b411bSPeter Brune    Input Parameters:
8718e557f58SPeter Brune .  linesearch - linesearch context
872f40b411bSPeter Brune 
873f40b411bSPeter Brune    Output Parameters:
874f40b411bSPeter Brune .  snes - The snes instance
875f40b411bSPeter Brune 
8768141a3b9SPeter Brune    Level: developer
877f40b411bSPeter Brune 
878cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
879f40b411bSPeter Brune @*/
880bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
881bf388a1fSBarry Smith {
882bf7f4e0aSPeter Brune   PetscFunctionBegin;
883f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
8846a388c36SPeter Brune   PetscValidPointer(snes, 2);
885bf7f4e0aSPeter Brune   *snes = linesearch->snes;
886bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
887bf7f4e0aSPeter Brune }
888bf7f4e0aSPeter Brune 
8896a388c36SPeter Brune #undef __FUNCT__
890f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
891f40b411bSPeter Brune /*@
892f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
893f40b411bSPeter Brune 
894f40b411bSPeter Brune    Input Parameters:
8958e557f58SPeter Brune .  linesearch - linesearch context
896f40b411bSPeter Brune 
897f40b411bSPeter Brune    Output Parameters:
898cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
899f40b411bSPeter Brune 
90078bcb3b5SPeter Brune    Level: advanced
90178bcb3b5SPeter Brune 
9028e557f58SPeter Brune    Notes:
9038e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
90478bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
90578bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
90678bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
90778bcb3b5SPeter Brune 
908f40b411bSPeter Brune 
909cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
910f40b411bSPeter Brune @*/
911f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
9126a388c36SPeter Brune {
9136a388c36SPeter Brune   PetscFunctionBegin;
914f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9156a388c36SPeter Brune   PetscValidPointer(lambda, 2);
9166a388c36SPeter Brune   *lambda = linesearch->lambda;
9176a388c36SPeter Brune   PetscFunctionReturn(0);
9186a388c36SPeter Brune }
9196a388c36SPeter Brune 
9206a388c36SPeter Brune #undef __FUNCT__
921f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
922f40b411bSPeter Brune /*@
923f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
924f40b411bSPeter Brune 
925f40b411bSPeter Brune    Input Parameters:
9268e557f58SPeter Brune +  linesearch - linesearch context
927f40b411bSPeter Brune -  lambda - The last steplength.
928f40b411bSPeter Brune 
929cd7522eaSPeter Brune    Notes:
930cd7522eaSPeter Brune    This routine is typically used within implementations of SNESLineSearchApply
931cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
932cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
933cd7522eaSPeter Brune    as an inner scaling parameter.
934cd7522eaSPeter Brune 
93578bcb3b5SPeter Brune    Level: advanced
936f40b411bSPeter Brune 
937f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
938f40b411bSPeter Brune @*/
939f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
9406a388c36SPeter Brune {
9416a388c36SPeter Brune   PetscFunctionBegin;
942f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9436a388c36SPeter Brune   linesearch->lambda = lambda;
9446a388c36SPeter Brune   PetscFunctionReturn(0);
9456a388c36SPeter Brune }
9466a388c36SPeter Brune 
9476a388c36SPeter Brune #undef  __FUNCT__
948f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
949f40b411bSPeter Brune /*@
9503c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
95178bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
95278bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
95378bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
954f40b411bSPeter Brune 
955f40b411bSPeter Brune    Input Parameters:
9568e557f58SPeter Brune .  linesearch - linesearch context
957f40b411bSPeter Brune 
958f40b411bSPeter Brune    Output Parameters:
959516fe3c3SPeter Brune +  steptol - The minimum steplength
9606cc8e53bSPeter Brune .  maxstep - The maximum steplength
961516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
962516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
963516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
964516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
965f40b411bSPeter Brune 
96678bcb3b5SPeter Brune    Level: intermediate
96778bcb3b5SPeter Brune 
96878bcb3b5SPeter Brune    Notes:
96978bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
9703c7d6663SPeter Brune    the type requires.
971516fe3c3SPeter Brune 
972f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
973f40b411bSPeter Brune @*/
974f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
9756a388c36SPeter Brune {
9766a388c36SPeter Brune   PetscFunctionBegin;
977f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
978516fe3c3SPeter Brune   if (steptol) {
9796a388c36SPeter Brune     PetscValidPointer(steptol, 2);
9806a388c36SPeter Brune     *steptol = linesearch->steptol;
981516fe3c3SPeter Brune   }
982516fe3c3SPeter Brune   if (maxstep) {
983516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
984516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
985516fe3c3SPeter Brune   }
986516fe3c3SPeter Brune   if (rtol) {
987516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
988516fe3c3SPeter Brune     *rtol = linesearch->rtol;
989516fe3c3SPeter Brune   }
990516fe3c3SPeter Brune   if (atol) {
991516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
992516fe3c3SPeter Brune     *atol = linesearch->atol;
993516fe3c3SPeter Brune   }
994516fe3c3SPeter Brune   if (ltol) {
995516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
996516fe3c3SPeter Brune     *ltol = linesearch->ltol;
997516fe3c3SPeter Brune   }
998516fe3c3SPeter Brune   if (max_its) {
999516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
1000516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1001516fe3c3SPeter Brune   }
10026a388c36SPeter Brune   PetscFunctionReturn(0);
10036a388c36SPeter Brune }
10046a388c36SPeter Brune 
10056a388c36SPeter Brune #undef  __FUNCT__
1006f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
1007f40b411bSPeter Brune /*@
10083c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
100978bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
101078bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
101178bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1012f40b411bSPeter Brune 
1013f40b411bSPeter Brune    Input Parameters:
10148e557f58SPeter Brune +  linesearch - linesearch context
1015516fe3c3SPeter Brune .  steptol - The minimum steplength
10166cc8e53bSPeter Brune .  maxstep - The maximum steplength
1017516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1018516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1019516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1020516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1021f40b411bSPeter Brune 
102278bcb3b5SPeter Brune    Notes:
10233c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
102478bcb3b5SPeter Brune    place of an argument.
1025f40b411bSPeter Brune 
102678bcb3b5SPeter Brune    Level: intermediate
1027516fe3c3SPeter Brune 
1028f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1029f40b411bSPeter Brune @*/
1030f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
10316a388c36SPeter Brune {
10326a388c36SPeter Brune   PetscFunctionBegin;
1033f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1034d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1035d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1036d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1037d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1038d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1039d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1040d3952184SSatish Balay 
1041d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1042c69d1a72SBarry Smith     if (steptol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
10436a388c36SPeter Brune     linesearch->steptol = steptol;
1044d3952184SSatish Balay   }
1045d3952184SSatish Balay 
1046d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1047c69d1a72SBarry Smith     if (maxstep < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1048516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1049d3952184SSatish Balay   }
1050d3952184SSatish Balay 
1051d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1052c69d1a72SBarry 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);
1053516fe3c3SPeter Brune     linesearch->rtol = rtol;
1054d3952184SSatish Balay   }
1055d3952184SSatish Balay 
1056d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1057c69d1a72SBarry Smith     if (atol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1058516fe3c3SPeter Brune     linesearch->atol = atol;
1059d3952184SSatish Balay   }
1060d3952184SSatish Balay 
1061d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1062c69d1a72SBarry Smith     if (ltol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol);
1063516fe3c3SPeter Brune   linesearch->ltol = ltol;
1064d3952184SSatish Balay   }
1065d3952184SSatish Balay 
1066d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1067d3952184SSatish Balay     if (max_its < 0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1068516fe3c3SPeter Brune     linesearch->max_its = max_its;
1069d3952184SSatish Balay   }
1070d3952184SSatish Balay 
10716a388c36SPeter Brune   PetscFunctionReturn(0);
10726a388c36SPeter Brune }
10736a388c36SPeter Brune 
10746a388c36SPeter Brune #undef __FUNCT__
1075f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
1076f40b411bSPeter Brune /*@
1077f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1078f40b411bSPeter Brune 
1079f40b411bSPeter Brune    Input Parameters:
10808e557f58SPeter Brune .  linesearch - linesearch context
1081f40b411bSPeter Brune 
1082f40b411bSPeter Brune    Output Parameters:
10838e557f58SPeter Brune .  damping - The damping parameter
1084f40b411bSPeter Brune 
108578bcb3b5SPeter Brune    Level: advanced
1086f40b411bSPeter Brune 
108778bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1088f40b411bSPeter Brune @*/
1089f40b411bSPeter Brune 
1090f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
10916a388c36SPeter Brune {
10926a388c36SPeter Brune   PetscFunctionBegin;
1093f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10946a388c36SPeter Brune   PetscValidPointer(damping, 2);
10956a388c36SPeter Brune   *damping = linesearch->damping;
10966a388c36SPeter Brune   PetscFunctionReturn(0);
10976a388c36SPeter Brune }
10986a388c36SPeter Brune 
10996a388c36SPeter Brune #undef __FUNCT__
1100f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
1101f40b411bSPeter Brune /*@
1102f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
1103f40b411bSPeter Brune 
1104f40b411bSPeter Brune    Input Parameters:
110578bcb3b5SPeter Brune .  linesearch - linesearch context
110678bcb3b5SPeter Brune .  damping - The damping parameter
1107f40b411bSPeter Brune 
1108f40b411bSPeter Brune    Level: intermediate
1109f40b411bSPeter Brune 
1110cd7522eaSPeter Brune    Notes:
1111cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1112cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
111378bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1114cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1115cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1116cd7522eaSPeter Brune 
1117f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1118f40b411bSPeter Brune @*/
1119f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
11206a388c36SPeter Brune {
11216a388c36SPeter Brune   PetscFunctionBegin;
1122f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11236a388c36SPeter Brune   linesearch->damping = damping;
11246a388c36SPeter Brune   PetscFunctionReturn(0);
11256a388c36SPeter Brune }
11266a388c36SPeter Brune 
11276a388c36SPeter Brune #undef __FUNCT__
112859405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder"
112959405d5eSPeter Brune /*@
113059405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
113159405d5eSPeter Brune 
113259405d5eSPeter Brune    Input Parameters:
113378bcb3b5SPeter Brune .  linesearch - linesearch context
113459405d5eSPeter Brune 
113559405d5eSPeter Brune    Output Parameters:
11368e557f58SPeter Brune .  order - The order
113759405d5eSPeter Brune 
113878bcb3b5SPeter Brune    Possible Values for order:
11393c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11403c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11413c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
114278bcb3b5SPeter Brune 
114359405d5eSPeter Brune    Level: intermediate
114459405d5eSPeter Brune 
114559405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
114659405d5eSPeter Brune @*/
114759405d5eSPeter Brune 
1148b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
114959405d5eSPeter Brune {
115059405d5eSPeter Brune   PetscFunctionBegin;
115159405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
115259405d5eSPeter Brune   PetscValidPointer(order, 2);
115359405d5eSPeter Brune   *order = linesearch->order;
115459405d5eSPeter Brune   PetscFunctionReturn(0);
115559405d5eSPeter Brune }
115659405d5eSPeter Brune 
115759405d5eSPeter Brune #undef __FUNCT__
115859405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder"
115959405d5eSPeter Brune /*@
116059405d5eSPeter Brune    SNESLineSearchSetOrder - Sets the line search damping paramter.
116159405d5eSPeter Brune 
116259405d5eSPeter Brune    Input Parameters:
116378bcb3b5SPeter Brune .  linesearch - linesearch context
116478bcb3b5SPeter Brune .  order - The damping parameter
116559405d5eSPeter Brune 
116659405d5eSPeter Brune    Level: intermediate
116759405d5eSPeter Brune 
116878bcb3b5SPeter Brune    Possible Values for order:
11693c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11703c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11713c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
117278bcb3b5SPeter Brune 
117359405d5eSPeter Brune    Notes:
117459405d5eSPeter Brune    Variable orders are supported by the following line searches:
117578bcb3b5SPeter Brune +  bt - cubic and quadratic
117678bcb3b5SPeter Brune -  cp - linear and quadratic
117759405d5eSPeter Brune 
117859405d5eSPeter Brune .seealso: SNESLineSearchGetOrder()
117959405d5eSPeter Brune @*/
1180b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
118159405d5eSPeter Brune {
118259405d5eSPeter Brune   PetscFunctionBegin;
118359405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
118459405d5eSPeter Brune   linesearch->order = order;
118559405d5eSPeter Brune   PetscFunctionReturn(0);
118659405d5eSPeter Brune }
118759405d5eSPeter Brune 
118859405d5eSPeter Brune #undef __FUNCT__
1189f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
1190f40b411bSPeter Brune /*@
1191f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1192f40b411bSPeter Brune 
1193f40b411bSPeter Brune    Input Parameters:
119478bcb3b5SPeter Brune .  linesearch - linesearch context
1195f40b411bSPeter Brune 
1196f40b411bSPeter Brune    Output Parameters:
1197f40b411bSPeter Brune +  xnorm - The norm of the current solution
1198f40b411bSPeter Brune .  fnorm - The norm of the current function
1199f40b411bSPeter Brune -  ynorm - The norm of the current update
1200f40b411bSPeter Brune 
1201cd7522eaSPeter Brune    Notes:
1202cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1203cd7522eaSPeter Brune 
120478bcb3b5SPeter Brune    Level: developer
1205f40b411bSPeter Brune 
1206f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1207f40b411bSPeter Brune @*/
1208f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1209bf7f4e0aSPeter Brune {
1210bf7f4e0aSPeter Brune   PetscFunctionBegin;
1211f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1212bf7f4e0aSPeter Brune   if (xnorm) {
1213bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
1214bf7f4e0aSPeter Brune   }
1215bf7f4e0aSPeter Brune   if (fnorm) {
1216bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
1217bf7f4e0aSPeter Brune   }
1218bf7f4e0aSPeter Brune   if (ynorm) {
1219bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
1220bf7f4e0aSPeter Brune   }
1221bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1222bf7f4e0aSPeter Brune }
1223bf7f4e0aSPeter Brune 
1224e7058c64SPeter Brune #undef __FUNCT__
1225f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
1226f40b411bSPeter Brune /*@
1227f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1228f40b411bSPeter Brune 
1229f40b411bSPeter Brune    Input Parameters:
123078bcb3b5SPeter Brune +  linesearch - linesearch context
1231f40b411bSPeter Brune .  xnorm - The norm of the current solution
1232f40b411bSPeter Brune .  fnorm - The norm of the current function
1233f40b411bSPeter Brune -  ynorm - The norm of the current update
1234f40b411bSPeter Brune 
123578bcb3b5SPeter Brune    Level: advanced
1236f40b411bSPeter Brune 
1237f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1238f40b411bSPeter Brune @*/
1239f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
12406a388c36SPeter Brune {
12416a388c36SPeter Brune   PetscFunctionBegin;
1242f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12436a388c36SPeter Brune   linesearch->xnorm = xnorm;
12446a388c36SPeter Brune   linesearch->fnorm = fnorm;
12456a388c36SPeter Brune   linesearch->ynorm = ynorm;
12466a388c36SPeter Brune   PetscFunctionReturn(0);
12476a388c36SPeter Brune }
12486a388c36SPeter Brune 
12496a388c36SPeter Brune #undef __FUNCT__
1250f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
1251f40b411bSPeter Brune /*@
1252f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1253f40b411bSPeter Brune 
1254f40b411bSPeter Brune    Input Parameters:
125578bcb3b5SPeter Brune .  linesearch - linesearch context
1256f40b411bSPeter Brune 
1257f40b411bSPeter Brune    Options Database Keys:
12588e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1259f40b411bSPeter Brune 
1260f40b411bSPeter Brune    Level: intermediate
1261f40b411bSPeter Brune 
126278bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1263f40b411bSPeter Brune @*/
1264f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
12656a388c36SPeter Brune {
12666a388c36SPeter Brune   PetscErrorCode ierr;
12679bd66eb0SPeter Brune   SNES           snes;
1268bf388a1fSBarry Smith 
12696a388c36SPeter Brune   PetscFunctionBegin;
12706a388c36SPeter Brune   if (linesearch->norms) {
12719bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1272f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
12739bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12749bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12759bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
12769bd66eb0SPeter Brune     } else {
12776a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12786a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12796a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12806a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12816a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12826a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12836a388c36SPeter Brune     }
12849bd66eb0SPeter Brune   }
12856a388c36SPeter Brune   PetscFunctionReturn(0);
12866a388c36SPeter Brune }
12876a388c36SPeter Brune 
12886f263ca3SPeter Brune #undef __FUNCT__
12896f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms"
12906f263ca3SPeter Brune /*@
12916f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
12926f263ca3SPeter Brune 
12936f263ca3SPeter Brune    Input Parameters:
129478bcb3b5SPeter Brune +  linesearch  - linesearch context
129578bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
12966f263ca3SPeter Brune 
12976f263ca3SPeter Brune    Options Database Keys:
12988e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
12996f263ca3SPeter Brune 
13006f263ca3SPeter Brune    Notes:
13011a4f838cSPeter Brune    This is most relevant to the SNESLINESEARCHBASIC line search type.
13026f263ca3SPeter Brune 
13036f263ca3SPeter Brune    Level: intermediate
13046f263ca3SPeter Brune 
13051a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13066f263ca3SPeter Brune @*/
13076f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13086f263ca3SPeter Brune {
13096f263ca3SPeter Brune   PetscFunctionBegin;
13106f263ca3SPeter Brune   linesearch->norms = flg;
13116f263ca3SPeter Brune   PetscFunctionReturn(0);
13126f263ca3SPeter Brune }
13136f263ca3SPeter Brune 
13146a388c36SPeter Brune #undef __FUNCT__
1315f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1316f40b411bSPeter Brune /*@
1317f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1318f40b411bSPeter Brune 
1319f40b411bSPeter Brune    Input Parameters:
132078bcb3b5SPeter Brune .  linesearch - linesearch context
1321f40b411bSPeter Brune 
1322f40b411bSPeter Brune    Output Parameters:
1323f40b411bSPeter Brune +  X - The old solution
1324f40b411bSPeter Brune .  F - The old function
1325f40b411bSPeter Brune .  Y - The search direction
1326f40b411bSPeter Brune .  W - The new solution
1327f40b411bSPeter Brune -  G - The new function
1328f40b411bSPeter Brune 
132978bcb3b5SPeter Brune    Level: advanced
1330f40b411bSPeter Brune 
1331f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1332f40b411bSPeter Brune @*/
1333bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1334bf388a1fSBarry Smith {
13356a388c36SPeter Brune   PetscFunctionBegin;
1336f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13376a388c36SPeter Brune   if (X) {
13386a388c36SPeter Brune     PetscValidPointer(X, 2);
13396a388c36SPeter Brune     *X = linesearch->vec_sol;
13406a388c36SPeter Brune   }
13416a388c36SPeter Brune   if (F) {
13426a388c36SPeter Brune     PetscValidPointer(F, 3);
13436a388c36SPeter Brune     *F = linesearch->vec_func;
13446a388c36SPeter Brune   }
13456a388c36SPeter Brune   if (Y) {
13466a388c36SPeter Brune     PetscValidPointer(Y, 4);
13476a388c36SPeter Brune     *Y = linesearch->vec_update;
13486a388c36SPeter Brune   }
13496a388c36SPeter Brune   if (W) {
13506a388c36SPeter Brune     PetscValidPointer(W, 5);
13516a388c36SPeter Brune     *W = linesearch->vec_sol_new;
13526a388c36SPeter Brune   }
13536a388c36SPeter Brune   if (G) {
13546a388c36SPeter Brune     PetscValidPointer(G, 6);
13556a388c36SPeter Brune     *G = linesearch->vec_func_new;
13566a388c36SPeter Brune   }
13576a388c36SPeter Brune 
13586a388c36SPeter Brune   PetscFunctionReturn(0);
13596a388c36SPeter Brune }
13606a388c36SPeter Brune 
13616a388c36SPeter Brune #undef __FUNCT__
1362f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1363f40b411bSPeter Brune /*@
1364f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1365f40b411bSPeter Brune 
1366f40b411bSPeter Brune    Input Parameters:
136778bcb3b5SPeter Brune +  linesearch - linesearch context
1368f40b411bSPeter Brune .  X - The old solution
1369f40b411bSPeter Brune .  F - The old function
1370f40b411bSPeter Brune .  Y - The search direction
1371f40b411bSPeter Brune .  W - The new solution
1372f40b411bSPeter Brune -  G - The new function
1373f40b411bSPeter Brune 
137478bcb3b5SPeter Brune    Level: advanced
1375f40b411bSPeter Brune 
1376f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1377f40b411bSPeter Brune @*/
1378bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1379bf388a1fSBarry Smith {
13806a388c36SPeter Brune   PetscFunctionBegin;
1381f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13826a388c36SPeter Brune   if (X) {
13836a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
13846a388c36SPeter Brune     linesearch->vec_sol = X;
13856a388c36SPeter Brune   }
13866a388c36SPeter Brune   if (F) {
13876a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
13886a388c36SPeter Brune     linesearch->vec_func = F;
13896a388c36SPeter Brune   }
13906a388c36SPeter Brune   if (Y) {
13916a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
13926a388c36SPeter Brune     linesearch->vec_update = Y;
13936a388c36SPeter Brune   }
13946a388c36SPeter Brune   if (W) {
13956a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
13966a388c36SPeter Brune     linesearch->vec_sol_new = W;
13976a388c36SPeter Brune   }
13986a388c36SPeter Brune   if (G) {
13996a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14006a388c36SPeter Brune     linesearch->vec_func_new = G;
14016a388c36SPeter Brune   }
14026a388c36SPeter Brune   PetscFunctionReturn(0);
14036a388c36SPeter Brune }
14046a388c36SPeter Brune 
14056a388c36SPeter Brune #undef __FUNCT__
1406f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1407e7058c64SPeter Brune /*@C
1408f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1409e7058c64SPeter Brune    SNES options in the database.
1410e7058c64SPeter Brune 
1411cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1412e7058c64SPeter Brune 
1413e7058c64SPeter Brune    Input Parameters:
1414e7058c64SPeter Brune +  snes - the SNES context
1415e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1416e7058c64SPeter Brune 
1417e7058c64SPeter Brune    Notes:
1418e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1419e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1420e7058c64SPeter Brune 
1421e7058c64SPeter Brune    Level: advanced
1422e7058c64SPeter Brune 
1423f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1424e7058c64SPeter Brune 
1425e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1426e7058c64SPeter Brune @*/
1427f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1428e7058c64SPeter Brune {
1429e7058c64SPeter Brune   PetscErrorCode ierr;
1430e7058c64SPeter Brune 
1431e7058c64SPeter Brune   PetscFunctionBegin;
1432f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1433e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1434e7058c64SPeter Brune   PetscFunctionReturn(0);
1435e7058c64SPeter Brune }
1436e7058c64SPeter Brune 
1437e7058c64SPeter Brune #undef __FUNCT__
1438f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1439e7058c64SPeter Brune /*@C
1440f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1441f1c6b773SPeter Brune    SNESLineSearch options in the database.
1442e7058c64SPeter Brune 
1443e7058c64SPeter Brune    Not Collective
1444e7058c64SPeter Brune 
1445e7058c64SPeter Brune    Input Parameter:
1446cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1447e7058c64SPeter Brune 
1448e7058c64SPeter Brune    Output Parameter:
1449e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1450e7058c64SPeter Brune 
14518e557f58SPeter Brune    Notes:
14528e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1453e7058c64SPeter Brune    sufficient length to hold the prefix.
1454e7058c64SPeter Brune 
1455e7058c64SPeter Brune    Level: advanced
1456e7058c64SPeter Brune 
1457f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1458e7058c64SPeter Brune 
1459e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1460e7058c64SPeter Brune @*/
1461f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1462e7058c64SPeter Brune {
1463e7058c64SPeter Brune   PetscErrorCode ierr;
1464e7058c64SPeter Brune 
1465e7058c64SPeter Brune   PetscFunctionBegin;
1466f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1467e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1468e7058c64SPeter Brune   PetscFunctionReturn(0);
1469e7058c64SPeter Brune }
1470bf7f4e0aSPeter Brune 
1471bf7f4e0aSPeter Brune #undef __FUNCT__
1472f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetWork"
1473f40b411bSPeter Brune /*@
1474f1c6b773SPeter Brune    SNESLineSearchGetWork - Gets work vectors for the line search.
1475f40b411bSPeter Brune 
1476f40b411bSPeter Brune    Input Parameter:
1477f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1478f40b411bSPeter Brune -  nwork - the number of work vectors
1479f40b411bSPeter Brune 
1480f40b411bSPeter Brune    Level: developer
1481f40b411bSPeter Brune 
1482cd7522eaSPeter Brune    Notes:
1483cd7522eaSPeter Brune    This is typically called at the beginning of a SNESLineSearch or SNESLineSearchShell implementation.
1484cd7522eaSPeter Brune 
1485f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1486f40b411bSPeter Brune 
1487f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1488f40b411bSPeter Brune @*/
1489f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetWork(SNESLineSearch linesearch, PetscInt nwork)
1490bf7f4e0aSPeter Brune {
1491bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1492bf388a1fSBarry Smith 
1493bf7f4e0aSPeter Brune   PetscFunctionBegin;
1494bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1495bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
1496*0ad7597dSKarl Rupp   }
1497*0ad7597dSKarl Rupp   SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1498bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1499bf7f4e0aSPeter Brune }
1500bf7f4e0aSPeter Brune 
1501bf7f4e0aSPeter Brune #undef __FUNCT__
1502f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1503f40b411bSPeter Brune /*@
1504f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1505f40b411bSPeter Brune 
1506f40b411bSPeter Brune    Input Parameters:
150778bcb3b5SPeter Brune .  linesearch - linesearch context
1508f40b411bSPeter Brune 
1509f40b411bSPeter Brune    Output Parameters:
15108e557f58SPeter Brune .  success - The success or failure status
1511f40b411bSPeter Brune 
1512cd7522eaSPeter Brune    Notes:
1513cd7522eaSPeter Brune    This is typically called after SNESLineSearchApply in order to determine if the line-search failed
1514cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1515cd7522eaSPeter Brune 
1516f40b411bSPeter Brune    Level: intermediate
1517f40b411bSPeter Brune 
1518f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1519f40b411bSPeter Brune @*/
1520f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1521bf7f4e0aSPeter Brune {
1522bf7f4e0aSPeter Brune   PetscFunctionBegin;
1523f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15246a388c36SPeter Brune   PetscValidPointer(success, 2);
1525bf7f4e0aSPeter Brune   if (success) {
1526bf7f4e0aSPeter Brune     *success = linesearch->success;
1527bf7f4e0aSPeter Brune   }
1528bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1529bf7f4e0aSPeter Brune }
1530bf7f4e0aSPeter Brune 
1531bf7f4e0aSPeter Brune #undef __FUNCT__
1532f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1533f40b411bSPeter Brune /*@
1534f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1535f40b411bSPeter Brune 
1536f40b411bSPeter Brune    Input Parameters:
153778bcb3b5SPeter Brune +  linesearch - linesearch context
15388e557f58SPeter Brune -  success - The success or failure status
1539f40b411bSPeter Brune 
1540cd7522eaSPeter Brune    Notes:
1541cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1542cd7522eaSPeter Brune    the success or failure of the line search method.
1543cd7522eaSPeter Brune 
154478bcb3b5SPeter Brune    Level: developer
1545f40b411bSPeter Brune 
1546f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1547f40b411bSPeter Brune @*/
1548f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
15496a388c36SPeter Brune {
1550f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15516a388c36SPeter Brune   PetscFunctionBegin;
15526a388c36SPeter Brune   linesearch->success = success;
15536a388c36SPeter Brune   PetscFunctionReturn(0);
15546a388c36SPeter Brune }
15556a388c36SPeter Brune 
15566a388c36SPeter Brune #undef __FUNCT__
1557f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
15589bd66eb0SPeter Brune /*@C
1559f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
15609bd66eb0SPeter Brune 
15619bd66eb0SPeter Brune    Input Parameters:
15629bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
15639bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
15649bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
15659bd66eb0SPeter Brune 
15669bd66eb0SPeter Brune    Logically Collective on SNES
15679bd66eb0SPeter Brune 
15689bd66eb0SPeter Brune    Calling sequence of projectfunc:
15699bd66eb0SPeter Brune .vb
15709bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
15719bd66eb0SPeter Brune .ve
15729bd66eb0SPeter Brune 
15739bd66eb0SPeter Brune     Input parameters for projectfunc:
15749bd66eb0SPeter Brune +   snes - nonlinear context
15759bd66eb0SPeter Brune -   X - current solution
15769bd66eb0SPeter Brune 
1577cd7522eaSPeter Brune     Output parameters for projectfunc:
15789bd66eb0SPeter Brune .   X - Projected solution
15799bd66eb0SPeter Brune 
15809bd66eb0SPeter Brune    Calling sequence of normfunc:
15819bd66eb0SPeter Brune .vb
15829bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
15839bd66eb0SPeter Brune .ve
15849bd66eb0SPeter Brune 
1585cd7522eaSPeter Brune     Input parameters for normfunc:
15869bd66eb0SPeter Brune +   snes - nonlinear context
15879bd66eb0SPeter Brune .   X - current solution
15889bd66eb0SPeter Brune -   F - current residual
15899bd66eb0SPeter Brune 
1590cd7522eaSPeter Brune     Output parameters for normfunc:
15919bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
15929bd66eb0SPeter Brune 
1593cd7522eaSPeter Brune     Notes:
1594cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1595cd7522eaSPeter Brune 
1596cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1597cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
15989bd66eb0SPeter Brune 
15999bd66eb0SPeter Brune     Level: developer
16009bd66eb0SPeter Brune 
16019bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
16029bd66eb0SPeter Brune 
1603f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16049bd66eb0SPeter Brune @*/
1605f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16069bd66eb0SPeter Brune {
16079bd66eb0SPeter Brune   PetscFunctionBegin;
1608f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16099bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16109bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16119bd66eb0SPeter Brune   PetscFunctionReturn(0);
16129bd66eb0SPeter Brune }
16139bd66eb0SPeter Brune 
16149bd66eb0SPeter Brune #undef __FUNCT__
1615f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
16169bd66eb0SPeter Brune /*@C
1617f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16189bd66eb0SPeter Brune 
16199bd66eb0SPeter Brune    Input Parameters:
16209bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
16219bd66eb0SPeter Brune 
16229bd66eb0SPeter Brune    Output Parameters:
16239bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16249bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16259bd66eb0SPeter Brune 
16269bd66eb0SPeter Brune    Logically Collective on SNES
16279bd66eb0SPeter Brune 
16289bd66eb0SPeter Brune     Level: developer
16299bd66eb0SPeter Brune 
16309bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
16319bd66eb0SPeter Brune 
1632f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16339bd66eb0SPeter Brune @*/
1634f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16359bd66eb0SPeter Brune {
16369bd66eb0SPeter Brune   PetscFunctionBegin;
16379bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16389bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16399bd66eb0SPeter Brune   PetscFunctionReturn(0);
16409bd66eb0SPeter Brune }
16419bd66eb0SPeter Brune 
16429bd66eb0SPeter Brune #undef __FUNCT__
1643f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1644bf7f4e0aSPeter Brune /*@C
1645f1c6b773SPeter Brune   SNESLineSearchRegister - See SNESLineSearchRegisterDynamic()
1646bf7f4e0aSPeter Brune 
1647bf7f4e0aSPeter Brune   Level: advanced
1648bf7f4e0aSPeter Brune @*/
1649f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNESLineSearch))
1650bf7f4e0aSPeter Brune {
1651bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1652bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1653bf7f4e0aSPeter Brune 
1654bf7f4e0aSPeter Brune   PetscFunctionBegin;
1655140e18c1SBarry Smith   ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr);
1656140e18c1SBarry Smith   ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&SNESLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1657bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1658bf7f4e0aSPeter Brune }
1659