xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 162e0bf5d2abb9059acb5c4f43d56cf9491b2a12)
1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
3f1c6b773SPeter Brune PetscBool         SNESLineSearchRegisterAllCalled = PETSC_FALSE;
40298fd71SBarry Smith PetscFunctionList SNESLineSearchList              = 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 
22*162e0bf5SPeter Brune    Level: developer
23*162e0bf5SPeter Brune 
24*162e0bf5SPeter Brune    Notes:
25*162e0bf5SPeter Brune    The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance
26*162e0bf5SPeter Brune    already associated with the SNES.  This function is for developer use.
27f40b411bSPeter Brune 
28cd7522eaSPeter Brune .keywords: LineSearch, create, context
29f40b411bSPeter Brune 
30*162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch()
31f40b411bSPeter Brune @*/
32f40b411bSPeter Brune 
33bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch)
34bf388a1fSBarry Smith {
35bf7f4e0aSPeter Brune   PetscErrorCode ierr;
36f1c6b773SPeter Brune   SNESLineSearch linesearch;
37bf388a1fSBarry Smith 
38bf7f4e0aSPeter Brune   PetscFunctionBegin;
39ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
40f34a81feSMatthew G. Knepley   ierr = SNESInitializePackage();CHKERRQ(ierr);
410298fd71SBarry Smith   *outlinesearch = NULL;
42f5af7f23SKarl Rupp 
4367c2884eSBarry Smith   ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr);
44bf7f4e0aSPeter Brune 
450298fd71SBarry Smith   linesearch->ops->precheck  = NULL;
460298fd71SBarry Smith   linesearch->ops->postcheck = NULL;
47bf7f4e0aSPeter Brune 
480298fd71SBarry Smith   linesearch->vec_sol_new  = NULL;
490298fd71SBarry Smith   linesearch->vec_func_new = NULL;
500298fd71SBarry Smith   linesearch->vec_sol      = NULL;
510298fd71SBarry Smith   linesearch->vec_func     = NULL;
520298fd71SBarry Smith   linesearch->vec_update   = NULL;
539bd66eb0SPeter Brune 
54bf7f4e0aSPeter Brune   linesearch->lambda       = 1.0;
55bf7f4e0aSPeter Brune   linesearch->fnorm        = 1.0;
56bf7f4e0aSPeter Brune   linesearch->ynorm        = 1.0;
57bf7f4e0aSPeter Brune   linesearch->xnorm        = 1.0;
58bf7f4e0aSPeter Brune   linesearch->success      = PETSC_TRUE;
59bf7f4e0aSPeter Brune   linesearch->norms        = PETSC_TRUE;
60bf7f4e0aSPeter Brune   linesearch->keeplambda   = PETSC_FALSE;
61bf7f4e0aSPeter Brune   linesearch->damping      = 1.0;
62bf7f4e0aSPeter Brune   linesearch->maxstep      = 1e8;
63bf7f4e0aSPeter Brune   linesearch->steptol      = 1e-12;
64516fe3c3SPeter Brune   linesearch->rtol         = 1e-8;
65516fe3c3SPeter Brune   linesearch->atol         = 1e-15;
66516fe3c3SPeter Brune   linesearch->ltol         = 1e-8;
670298fd71SBarry Smith   linesearch->precheckctx  = NULL;
680298fd71SBarry Smith   linesearch->postcheckctx = NULL;
6959405d5eSPeter Brune   linesearch->max_its      = 1;
70bf7f4e0aSPeter Brune   linesearch->setupcalled  = PETSC_FALSE;
71bf7f4e0aSPeter Brune   *outlinesearch           = linesearch;
72bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
73bf7f4e0aSPeter Brune }
74bf7f4e0aSPeter Brune 
75bf7f4e0aSPeter Brune #undef __FUNCT__
76f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp"
77f40b411bSPeter Brune /*@
7878bcb3b5SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied by allocating
7978bcb3b5SPeter Brune    any required vectors.
80f40b411bSPeter Brune 
81cd7522eaSPeter Brune    Collective on SNESLineSearch
82f40b411bSPeter Brune 
83f40b411bSPeter Brune    Input Parameters:
84f40b411bSPeter Brune .  linesearch - The LineSearch instance.
85f40b411bSPeter Brune 
86cd7522eaSPeter Brune    Notes:
87cd7522eaSPeter Brune    For most cases, this needn't be called outside of SNESLineSearchApply().
88cd7522eaSPeter Brune    The only current case where this is called outside of this is for the VI
8978bcb3b5SPeter Brune    solvers, which modify the solution and work vectors before the first call
90cd7522eaSPeter Brune    of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be
91cd7522eaSPeter Brune    allocated upfront.
92cd7522eaSPeter Brune 
9378bcb3b5SPeter Brune    Level: advanced
94f40b411bSPeter Brune 
95f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp
96f40b411bSPeter Brune 
97f1c6b773SPeter Brune .seealso: SNESLineSearchReset()
98f40b411bSPeter Brune @*/
99f40b411bSPeter Brune 
100bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch)
101bf388a1fSBarry Smith {
102bf7f4e0aSPeter Brune   PetscErrorCode ierr;
103bf388a1fSBarry Smith 
104bf7f4e0aSPeter Brune   PetscFunctionBegin;
105bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
1061a4f838cSPeter Brune     ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr);
107bf7f4e0aSPeter Brune   }
108bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
1099bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
110bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
1119bd66eb0SPeter Brune     }
1129bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
1139bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
1149bd66eb0SPeter Brune     }
115bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
116bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
117bf7f4e0aSPeter Brune     }
118ed07d7d7SPeter Brune     if (!linesearch->ops->snesfunc) {ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunction);CHKERRQ(ierr);}
119bf7f4e0aSPeter Brune     linesearch->lambda      = linesearch->damping;
120bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
121bf7f4e0aSPeter Brune   }
122bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
123bf7f4e0aSPeter Brune }
124bf7f4e0aSPeter Brune 
125bf7f4e0aSPeter Brune #undef __FUNCT__
126f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset"
127f40b411bSPeter Brune 
128f40b411bSPeter Brune /*@
12978bcb3b5SPeter Brune    SNESLineSearchReset - Undoes the SetUp and deletes any Vecs or Mats allocated by the line search.
130f40b411bSPeter Brune 
131f1c6b773SPeter Brune    Collective on SNESLineSearch
132f40b411bSPeter Brune 
133f40b411bSPeter Brune    Input Parameters:
134f40b411bSPeter Brune .  linesearch - The LineSearch instance.
135f40b411bSPeter Brune 
13678bcb3b5SPeter Brune    Level: intermediate
137f40b411bSPeter Brune 
138cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset
139f40b411bSPeter Brune 
140f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp()
141f40b411bSPeter Brune @*/
142f40b411bSPeter Brune 
143bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
144bf388a1fSBarry Smith {
145bf7f4e0aSPeter Brune   PetscErrorCode ierr;
146bf388a1fSBarry Smith 
147bf7f4e0aSPeter Brune   PetscFunctionBegin;
148f5af7f23SKarl Rupp   if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch);
149f5af7f23SKarl Rupp 
150bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
151bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
152bf7f4e0aSPeter Brune 
153bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
154f5af7f23SKarl Rupp 
155bf7f4e0aSPeter Brune   linesearch->nwork       = 0;
156bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
157bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
158bf7f4e0aSPeter Brune }
159bf7f4e0aSPeter Brune 
160ed07d7d7SPeter Brune #undef __FUNCT__
161ed07d7d7SPeter Brune #define __FUNCT__ "SNESLineSearchSetFunction"
162ed07d7d7SPeter Brune /*@C
163ed07d7d7SPeter Brune    SNESLineSearchSetPreCheck - Sets the function evaluation context on the
164ed07d7d7SPeter Brune 
165ed07d7d7SPeter Brune    Input Parameters:
166ed07d7d7SPeter Brune .  linesearch - the SNESLineSearch context
167ed07d7d7SPeter Brune 
168ed07d7d7SPeter Brune    Output Parameters:
169ed07d7d7SPeter Brune +  func       - [optional] function evaluation routine
170ed07d7d7SPeter Brune 
171ed07d7d7SPeter Brune    Level: developer
172ed07d7d7SPeter Brune 
173ed07d7d7SPeter Brune .keywords: get, linesearch, pre-check
174ed07d7d7SPeter Brune 
175ed07d7d7SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
176ed07d7d7SPeter Brune @*/
177ed07d7d7SPeter Brune PetscErrorCode  SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec))
178ed07d7d7SPeter Brune {
179ed07d7d7SPeter Brune   PetscFunctionBegin;
180ed07d7d7SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
181ed07d7d7SPeter Brune   linesearch->ops->snesfunc = func;
182ed07d7d7SPeter Brune   PetscFunctionReturn(0);
183ed07d7d7SPeter Brune }
184ed07d7d7SPeter Brune 
185ed07d7d7SPeter Brune 
1866b2b7091SBarry Smith /*MC
1876b2b7091SBarry Smith     SNESLineSearchPreCheckFunction - functional form passed to check before line search is called
1886b2b7091SBarry Smith 
1896b2b7091SBarry Smith      Synopsis:
190aaa7dc30SBarry Smith      #include <petscsnes.h>
1916b2b7091SBarry Smith      SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed);
1926b2b7091SBarry Smith 
1936b2b7091SBarry Smith        Input Parameters:
1946b2b7091SBarry Smith +      x - solution vector
1956b2b7091SBarry Smith .      y - search direction vector
1966b2b7091SBarry Smith -      changed - flag to indicate the precheck changed x or y.
1976b2b7091SBarry Smith 
198878cb397SSatish Balay    Level: advanced
199878cb397SSatish Balay 
2006b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
2016b2b7091SBarry Smith M*/
2026b2b7091SBarry Smith 
20386d74e61SPeter Brune #undef __FUNCT__
204f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck"
20586d74e61SPeter Brune /*@C
206f1c6b773SPeter Brune    SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
20786d74e61SPeter Brune 
208f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
20986d74e61SPeter Brune 
21086d74e61SPeter Brune    Input Parameters:
211f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
2126b2b7091SBarry Smith .  SNESLineSearchPreCheckFunction - [optional] function evaluation routine
21386d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2140298fd71SBarry Smith                 function evaluation routine (may be NULL)
21586d74e61SPeter Brune 
21686d74e61SPeter Brune 
21786d74e61SPeter Brune    Level: intermediate
21886d74e61SPeter Brune 
21986d74e61SPeter Brune .keywords: set, linesearch, pre-check
22086d74e61SPeter Brune 
221f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck()
22286d74e61SPeter Brune @*/
2236b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
22486d74e61SPeter Brune {
2259bd66eb0SPeter Brune   PetscFunctionBegin;
226f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2276b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) linesearch->ops->precheck = SNESLineSearchPreCheckFunction;
22886d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
22986d74e61SPeter Brune   PetscFunctionReturn(0);
23086d74e61SPeter Brune }
23186d74e61SPeter Brune 
23286d74e61SPeter Brune #undef __FUNCT__
233f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck"
23486d74e61SPeter Brune /*@C
235cd7522eaSPeter Brune    SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine.
23686d74e61SPeter Brune 
23786d74e61SPeter Brune    Input Parameters:
238f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
23986d74e61SPeter Brune 
24086d74e61SPeter Brune    Output Parameters:
24186d74e61SPeter Brune +  func       - [optional] function evaluation routine
24286d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2430298fd71SBarry Smith                 function evaluation routine (may be NULL)
24486d74e61SPeter Brune 
24586d74e61SPeter Brune    Level: intermediate
24686d74e61SPeter Brune 
24786d74e61SPeter Brune .keywords: get, linesearch, pre-check
24886d74e61SPeter Brune 
249f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
25086d74e61SPeter Brune @*/
2516b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
25286d74e61SPeter Brune {
2539bd66eb0SPeter Brune   PetscFunctionBegin;
254f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2556b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) *SNESLineSearchPreCheckFunction = linesearch->ops->precheck;
25686d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
25786d74e61SPeter Brune   PetscFunctionReturn(0);
25886d74e61SPeter Brune }
25986d74e61SPeter Brune 
2606b2b7091SBarry Smith /*MC
2616b2b7091SBarry Smith     SNESLineSearchPostheckFunction - functional form that is called after line search is complete
2626b2b7091SBarry Smith 
2636b2b7091SBarry Smith      Synopsis:
264aaa7dc30SBarry Smith      #include <petscsnes.h>
2656b2b7091SBarry Smith      SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y,  Vec w, *changed_y, PetscBool *changed_w);
2666b2b7091SBarry Smith 
2676b2b7091SBarry Smith      Input Parameters:
2686b2b7091SBarry Smith +      x - old solution vector
2696b2b7091SBarry Smith .      y - search direction vector
2706b2b7091SBarry Smith .      w - new solution vector
2716b2b7091SBarry Smith .      changed_y - indicates that the line search changed y
2726b2b7091SBarry Smith -      changed_w - indicates that the line search changed w
2736b2b7091SBarry Smith 
274878cb397SSatish Balay    Level: advanced
2756b2b7091SBarry Smith 
2766b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
2776b2b7091SBarry Smith M*/
2786b2b7091SBarry Smith 
27986d74e61SPeter Brune #undef __FUNCT__
280f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck"
28186d74e61SPeter Brune /*@C
282f1c6b773SPeter Brune    SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine.
28386d74e61SPeter Brune 
284f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
28586d74e61SPeter Brune 
28686d74e61SPeter Brune    Input Parameters:
287f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
2886b2b7091SBarry Smith .  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
28986d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2900298fd71SBarry Smith                 function evaluation routine (may be NULL)
29186d74e61SPeter Brune 
29286d74e61SPeter Brune    Level: intermediate
29386d74e61SPeter Brune 
29486d74e61SPeter Brune .keywords: set, linesearch, post-check
29586d74e61SPeter Brune 
296f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck()
29786d74e61SPeter Brune @*/
2986b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx)
29986d74e61SPeter Brune {
30086d74e61SPeter Brune   PetscFunctionBegin;
301f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
3026b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) linesearch->ops->postcheck = SNESLineSearchPostCheckFunction;
30386d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
30486d74e61SPeter Brune   PetscFunctionReturn(0);
30586d74e61SPeter Brune }
30686d74e61SPeter Brune 
30786d74e61SPeter Brune #undef __FUNCT__
308f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck"
30986d74e61SPeter Brune /*@C
310f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
31186d74e61SPeter Brune 
31286d74e61SPeter Brune    Input Parameters:
313f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
31486d74e61SPeter Brune 
31586d74e61SPeter Brune    Output Parameters:
3166b2b7091SBarry Smith +  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
31786d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
3180298fd71SBarry Smith                 function evaluation routine (may be NULL)
31986d74e61SPeter Brune 
32086d74e61SPeter Brune    Level: intermediate
32186d74e61SPeter Brune 
32286d74e61SPeter Brune .keywords: get, linesearch, post-check
32386d74e61SPeter Brune 
324f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck()
32586d74e61SPeter Brune @*/
3266b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx)
32786d74e61SPeter Brune {
3289bd66eb0SPeter Brune   PetscFunctionBegin;
329f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
3306b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) *SNESLineSearchPostCheckFunction = linesearch->ops->postcheck;
33186d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
33286d74e61SPeter Brune   PetscFunctionReturn(0);
33386d74e61SPeter Brune }
33486d74e61SPeter Brune 
335bf7f4e0aSPeter Brune #undef __FUNCT__
336f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck"
337f40b411bSPeter Brune /*@
338f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
339f40b411bSPeter Brune 
340cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
341f40b411bSPeter Brune 
342f40b411bSPeter Brune    Input Parameters:
3437b1df9c1SPeter Brune +  linesearch - The linesearch instance.
3447b1df9c1SPeter Brune .  X - The current solution
3457b1df9c1SPeter Brune -  Y - The step direction
346f40b411bSPeter Brune 
347f40b411bSPeter Brune    Output Parameters:
3488e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
349f40b411bSPeter Brune 
350f40b411bSPeter Brune    Level: Beginner
351f40b411bSPeter Brune 
352f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
353f40b411bSPeter Brune 
354f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck()
355f40b411bSPeter Brune @*/
3567b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
357bf7f4e0aSPeter Brune {
358bf7f4e0aSPeter Brune   PetscErrorCode ierr;
3595fd66863SKarl Rupp 
360bf7f4e0aSPeter Brune   PetscFunctionBegin;
361bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
3626b2b7091SBarry Smith   if (linesearch->ops->precheck) {
3636b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
36438bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
365bf7f4e0aSPeter Brune   }
366bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
367bf7f4e0aSPeter Brune }
368bf7f4e0aSPeter Brune 
369bf7f4e0aSPeter Brune #undef __FUNCT__
370f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
371f40b411bSPeter Brune /*@
372f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
373f40b411bSPeter Brune 
374cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
375f40b411bSPeter Brune 
376f40b411bSPeter Brune    Input Parameters:
3777b1df9c1SPeter Brune +  linesearch - The linesearch context
3787b1df9c1SPeter Brune .  X - The last solution
3797b1df9c1SPeter Brune .  Y - The step direction
3807b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
381f40b411bSPeter Brune 
382f40b411bSPeter Brune    Output Parameters:
38378bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
38478bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
385f40b411bSPeter Brune 
386f40b411bSPeter Brune    Level: Intermediate
387f40b411bSPeter Brune 
388f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
389f40b411bSPeter Brune 
390f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck()
391f40b411bSPeter Brune @*/
3927b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
393bf7f4e0aSPeter Brune {
394bf7f4e0aSPeter Brune   PetscErrorCode ierr;
395bf388a1fSBarry Smith 
396bf7f4e0aSPeter Brune   PetscFunctionBegin;
397bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
398bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
3996b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
4006b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
40138bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
40238bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
40386d74e61SPeter Brune   }
40486d74e61SPeter Brune   PetscFunctionReturn(0);
40586d74e61SPeter Brune }
40686d74e61SPeter Brune 
40786d74e61SPeter Brune #undef __FUNCT__
408f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
40986d74e61SPeter Brune /*@C
41086d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
41186d74e61SPeter Brune 
412cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
41386d74e61SPeter Brune 
41486d74e61SPeter Brune    Input Arguments:
41586d74e61SPeter Brune +  linesearch - linesearch context
41686d74e61SPeter Brune .  X - base state for this step
41786d74e61SPeter Brune .  Y - initial correction
41886d74e61SPeter Brune 
41986d74e61SPeter Brune    Output Arguments:
42086d74e61SPeter Brune +  Y - correction, possibly modified
42186d74e61SPeter Brune -  changed - flag indicating that Y was modified
42286d74e61SPeter Brune 
42386d74e61SPeter Brune    Options Database Key:
424cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
425cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
42686d74e61SPeter Brune 
42786d74e61SPeter Brune    Level: advanced
42886d74e61SPeter Brune 
42986d74e61SPeter Brune    Notes:
43086d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
43186d74e61SPeter Brune 
43286d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
43386d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
43486d74e61SPeter Brune    is generally not useful when using a Newton linearization.
43586d74e61SPeter Brune 
43686d74e61SPeter Brune    Reference:
43786d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
43886d74e61SPeter Brune 
43986d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
44086d74e61SPeter Brune @*/
441f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
44286d74e61SPeter Brune {
44386d74e61SPeter Brune   PetscErrorCode ierr;
44486d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
44586d74e61SPeter Brune   Vec            Ylast;
44686d74e61SPeter Brune   PetscScalar    dot;
44786d74e61SPeter Brune   PetscInt       iter;
44886d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
44986d74e61SPeter Brune   SNES           snes;
45086d74e61SPeter Brune 
45186d74e61SPeter Brune   PetscFunctionBegin;
452f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
45386d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
45486d74e61SPeter Brune   if (!Ylast) {
45586d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
45686d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
45786d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
45886d74e61SPeter Brune   }
45986d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
46086d74e61SPeter Brune   if (iter < 2) {
46186d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
46286d74e61SPeter Brune     *changed = PETSC_FALSE;
46386d74e61SPeter Brune     PetscFunctionReturn(0);
46486d74e61SPeter Brune   }
46586d74e61SPeter Brune 
46686d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
46786d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
46886d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
46986d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
470255453a1SBarry Smith   theta         = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
47186d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
47286d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
47386d74e61SPeter Brune     /* Modify the step Y */
47486d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
47586d74e61SPeter Brune     ierr  = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
47686d74e61SPeter Brune     ierr  = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
47786d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
47886d74e61SPeter Brune     ierr  = VecCopy(Y,Ylast);CHKERRQ(ierr);
47986d74e61SPeter Brune     ierr  = VecScale(Y,alpha);CHKERRQ(ierr);
480c69d1a72SBarry 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);
48186d74e61SPeter Brune   } else {
482c69d1a72SBarry 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);
48386d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
48486d74e61SPeter Brune     *changed = PETSC_FALSE;
485bf7f4e0aSPeter Brune   }
486bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
487bf7f4e0aSPeter Brune }
488bf7f4e0aSPeter Brune 
489bf7f4e0aSPeter Brune #undef __FUNCT__
490f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
491f40b411bSPeter Brune /*@
492cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
493f40b411bSPeter Brune 
494f1c6b773SPeter Brune    Collective on SNESLineSearch
495f40b411bSPeter Brune 
496f40b411bSPeter Brune    Input Parameters:
4978e557f58SPeter Brune +  linesearch - The linesearch context
4988e557f58SPeter Brune .  X - The current solution
4998e557f58SPeter Brune .  F - The current function
5008e557f58SPeter Brune .  fnorm - The current norm
5018e557f58SPeter Brune -  Y - The search direction
502f40b411bSPeter Brune 
503f40b411bSPeter Brune    Output Parameters:
5048e557f58SPeter Brune +  X - The new solution
5058e557f58SPeter Brune .  F - The new function
5068e557f58SPeter Brune -  fnorm - The new function norm
507f40b411bSPeter Brune 
508cd7522eaSPeter Brune    Options Database Keys:
5093c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell
510cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
5113c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
512cd7522eaSPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms
5133c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
5143c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
515cd7522eaSPeter Brune 
516cd7522eaSPeter Brune    Notes:
517cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
518cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
519cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
520cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
521cd7522eaSPeter Brune    application of the line search may invoke SNESComputeFunction several times, and
522cd7522eaSPeter Brune    therefore may be fairly expensive.
523cd7522eaSPeter Brune 
524f40b411bSPeter Brune    Level: Intermediate
525f40b411bSPeter Brune 
526f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
527f40b411bSPeter Brune 
528cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction()
529f40b411bSPeter Brune @*/
530bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
531bf388a1fSBarry Smith {
532bf7f4e0aSPeter Brune   PetscErrorCode ierr;
533bf7f4e0aSPeter Brune 
534bf388a1fSBarry Smith   PetscFunctionBegin;
535f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
536bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
537bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
538bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
539bf7f4e0aSPeter Brune 
540bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
541bf7f4e0aSPeter Brune 
542bf7f4e0aSPeter Brune   linesearch->vec_sol    = X;
543bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
544bf7f4e0aSPeter Brune   linesearch->vec_func   = F;
545bf7f4e0aSPeter Brune 
546f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
547bf7f4e0aSPeter Brune 
548f5af7f23SKarl Rupp   if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
549bf7f4e0aSPeter Brune 
550f5af7f23SKarl Rupp   if (fnorm) linesearch->fnorm = *fnorm;
551f5af7f23SKarl Rupp   else {
552bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
553bf7f4e0aSPeter Brune   }
554bf7f4e0aSPeter Brune 
555f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
556bf7f4e0aSPeter Brune 
557bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
558bf7f4e0aSPeter Brune 
559f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
560bf7f4e0aSPeter Brune 
561f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
562bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
563bf7f4e0aSPeter Brune }
564bf7f4e0aSPeter Brune 
565bf7f4e0aSPeter Brune #undef __FUNCT__
566f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
567f40b411bSPeter Brune /*@
568f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
569f40b411bSPeter Brune 
570f1c6b773SPeter Brune    Collective on SNESLineSearch
571f40b411bSPeter Brune 
572f40b411bSPeter Brune    Input Parameters:
5738e557f58SPeter Brune .  linesearch - The linesearch context
574f40b411bSPeter Brune 
575f40b411bSPeter Brune    Level: Intermediate
576f40b411bSPeter Brune 
57778bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy
578f40b411bSPeter Brune 
579cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
580f40b411bSPeter Brune @*/
581bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
582bf388a1fSBarry Smith {
583bf7f4e0aSPeter Brune   PetscErrorCode ierr;
584bf388a1fSBarry Smith 
585bf7f4e0aSPeter Brune   PetscFunctionBegin;
586bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
587f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
588bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
589e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr);
59022d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
591f5af7f23SKarl Rupp   if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch);
592bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
593e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
594bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
595bf7f4e0aSPeter Brune }
596bf7f4e0aSPeter Brune 
597bf7f4e0aSPeter Brune #undef __FUNCT__
598f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
599f40b411bSPeter Brune /*@
600cd7522eaSPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search.
601bf7f4e0aSPeter Brune 
602bf7f4e0aSPeter Brune    Input Parameters:
603bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
604bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
605bf7f4e0aSPeter Brune 
606bf7f4e0aSPeter Brune    Logically Collective on SNES
607bf7f4e0aSPeter Brune 
608bf7f4e0aSPeter Brune    Options Database:
6098e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
610bf7f4e0aSPeter Brune 
611bf7f4e0aSPeter Brune    Level: intermediate
612bf7f4e0aSPeter Brune 
613bf7f4e0aSPeter Brune 
614cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer
615bf7f4e0aSPeter Brune @*/
616f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
617bf7f4e0aSPeter Brune {
618bf7f4e0aSPeter Brune   PetscErrorCode ierr;
619bf388a1fSBarry Smith 
620bf7f4e0aSPeter Brune   PetscFunctionBegin;
621bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
622ce94432eSBarry Smith     ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)linesearch),"stdout",&linesearch->monitor);CHKERRQ(ierr);
623bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
624bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
625bf7f4e0aSPeter Brune   }
626bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
627bf7f4e0aSPeter Brune }
628bf7f4e0aSPeter Brune 
629bf7f4e0aSPeter Brune #undef __FUNCT__
630f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
631f40b411bSPeter Brune /*@
632cd7522eaSPeter Brune    SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor.
6336a388c36SPeter Brune 
634f40b411bSPeter Brune    Input Parameters:
6358e557f58SPeter Brune .  linesearch - linesearch context
636f40b411bSPeter Brune 
637f40b411bSPeter Brune    Input Parameters:
6388e557f58SPeter Brune .  monitor - monitor context
639f40b411bSPeter Brune 
640f40b411bSPeter Brune    Logically Collective on SNES
641f40b411bSPeter Brune 
642f40b411bSPeter Brune 
643f40b411bSPeter Brune    Options Database Keys:
6448e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
645f40b411bSPeter Brune 
646f40b411bSPeter Brune    Level: intermediate
647f40b411bSPeter Brune 
648f40b411bSPeter Brune 
649cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer
650f40b411bSPeter Brune @*/
651f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6526a388c36SPeter Brune {
6536a388c36SPeter Brune   PetscFunctionBegin;
654f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6556a388c36SPeter Brune   if (monitor) {
6566a388c36SPeter Brune     PetscValidPointer(monitor, 2);
6576a388c36SPeter Brune     *monitor = linesearch->monitor;
6586a388c36SPeter Brune   }
6596a388c36SPeter Brune   PetscFunctionReturn(0);
6606a388c36SPeter Brune }
6616a388c36SPeter Brune 
6626a388c36SPeter Brune #undef __FUNCT__
663f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
664f40b411bSPeter Brune /*@
665f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
666f40b411bSPeter Brune 
667f40b411bSPeter Brune    Input Parameters:
6688e557f58SPeter Brune .  linesearch - linesearch context
669f40b411bSPeter Brune 
670f40b411bSPeter Brune    Options Database Keys:
6713c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell
6723c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
6735a9b6599SPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch type
67471eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
6751a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
6761a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
6771a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
6781a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
6791a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
680cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
6818e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
682cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
6831a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
6841a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method
685f40b411bSPeter Brune 
686f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
687f40b411bSPeter Brune 
688f40b411bSPeter Brune    Level: intermediate
689f40b411bSPeter Brune 
6903c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard()
691f40b411bSPeter Brune @*/
692bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
693bf388a1fSBarry Smith {
694bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6951a4f838cSPeter Brune   const char     *deft = SNESLINESEARCHBASIC;
696bf7f4e0aSPeter Brune   char           type[256];
697bf7f4e0aSPeter Brune   PetscBool      flg, set;
698bf388a1fSBarry Smith 
699bf7f4e0aSPeter Brune   PetscFunctionBegin;
700607a6623SBarry Smith   if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);}
701bf7f4e0aSPeter Brune 
702bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
703f5af7f23SKarl Rupp   if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name;
704a264d7a6SBarry Smith   ierr = PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
705bf7f4e0aSPeter Brune   if (flg) {
706f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
707bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
708f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
709bf7f4e0aSPeter Brune   }
710bf7f4e0aSPeter Brune 
7117a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",
712bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
713f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
714bf7f4e0aSPeter Brune 
7151a9b3a06SPeter Brune   /* tolerances */
71671eef1aeSPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr);
7171a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr);
7181a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
7191a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr);
7201a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr);
7218e557f58SPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
7227a35526eSPeter Brune 
7231a9b3a06SPeter Brune   /* damping parameters */
7241a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
7251a9b3a06SPeter Brune 
7261a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
7271a9b3a06SPeter Brune 
7281a9b3a06SPeter Brune   /* precheck */
7297a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
7307a35526eSPeter Brune   if (set) {
7317a35526eSPeter Brune     if (flg) {
7327a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
733f5af7f23SKarl Rupp 
7347a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
7350298fd71SBarry Smith                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr);
7367a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
7377a35526eSPeter Brune     } else {
7380298fd71SBarry Smith       ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr);
7397a35526eSPeter Brune     }
7407a35526eSPeter Brune   }
741b000cd8dSPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr);
7421a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
7437a35526eSPeter Brune 
7445a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
7455a9b6599SPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
7465a9b6599SPeter Brune   }
7475a9b6599SPeter Brune 
748bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
749bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
750bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
751bf7f4e0aSPeter Brune }
752bf7f4e0aSPeter Brune 
753bf7f4e0aSPeter Brune #undef __FUNCT__
754f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
755f40b411bSPeter Brune /*@
756cd7522eaSPeter Brune    SNESLineSearchView - Prints useful information about the line search not
757cd7522eaSPeter Brune    related to an individual call.
758f40b411bSPeter Brune 
759f40b411bSPeter Brune    Input Parameters:
7608e557f58SPeter Brune .  linesearch - linesearch context
761f40b411bSPeter Brune 
762f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
763f40b411bSPeter Brune 
764f40b411bSPeter Brune    Level: intermediate
765f40b411bSPeter Brune 
766f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
767f40b411bSPeter Brune @*/
768bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
769bf388a1fSBarry Smith {
7707f1410a3SPeter Brune   PetscErrorCode ierr;
7717f1410a3SPeter Brune   PetscBool      iascii;
772bf388a1fSBarry Smith 
773bf7f4e0aSPeter Brune   PetscFunctionBegin;
7747f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7757f1410a3SPeter Brune   if (!viewer) {
776ce94432eSBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr);
7777f1410a3SPeter Brune   }
7787f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
7797f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
780f40b411bSPeter Brune 
781251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
7827f1410a3SPeter Brune   if (iascii) {
783dae58748SBarry Smith     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr);
7847f1410a3SPeter Brune     if (linesearch->ops->view) {
7857f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
7867f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
7877f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
7887f1410a3SPeter Brune     }
789c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
790c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
7917f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
7926b2b7091SBarry Smith     if (linesearch->ops->precheck) {
7936b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
7947f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
7957f1410a3SPeter Brune       } else {
7967f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
7977f1410a3SPeter Brune       }
7987f1410a3SPeter Brune     }
7996b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
8007f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
8017f1410a3SPeter Brune     }
8027f1410a3SPeter Brune   }
803bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
804bf7f4e0aSPeter Brune }
805bf7f4e0aSPeter Brune 
806bf7f4e0aSPeter Brune #undef __FUNCT__
807f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
808ea5d4fccSPeter Brune /*@C
809f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
810f40b411bSPeter Brune 
811f40b411bSPeter Brune    Input Parameters:
8128e557f58SPeter Brune +  linesearch - linesearch context
813f40b411bSPeter Brune -  type - The type of line search to be used
814f40b411bSPeter Brune 
815cd7522eaSPeter Brune    Available Types:
816cd7522eaSPeter Brune +  basic - Simple damping line search.
8178e557f58SPeter Brune .  bt - Backtracking line search over the L2 norm of the function
8188e557f58SPeter Brune .  l2 - Secant line search over the L2 norm of the function
8198e557f58SPeter Brune .  cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
8208e557f58SPeter Brune -  shell - User provided SNESLineSearch implementation
821cd7522eaSPeter Brune 
822f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
823f40b411bSPeter Brune 
824f40b411bSPeter Brune    Level: intermediate
825f40b411bSPeter Brune 
826f40b411bSPeter Brune 
827f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
828f40b411bSPeter Brune @*/
82919fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
830bf7f4e0aSPeter Brune {
831f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
832bf7f4e0aSPeter Brune   PetscBool      match;
833bf7f4e0aSPeter Brune 
834bf7f4e0aSPeter Brune   PetscFunctionBegin;
835f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
836bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
837bf7f4e0aSPeter Brune 
838251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
839bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
840bf7f4e0aSPeter Brune 
8411c9cd337SJed Brown   ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr);
842bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
843bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
844bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
845bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
846f5af7f23SKarl Rupp 
8470298fd71SBarry Smith     linesearch->ops->destroy = NULL;
848bf7f4e0aSPeter Brune   }
849f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
850bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
851bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
852bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
853bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
854bf7f4e0aSPeter Brune 
855bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
856bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
857bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
858bf7f4e0aSPeter Brune }
859bf7f4e0aSPeter Brune 
860bf7f4e0aSPeter Brune #undef __FUNCT__
861f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
862f40b411bSPeter Brune /*@
86378bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
864f40b411bSPeter Brune 
865f40b411bSPeter Brune    Input Parameters:
8668e557f58SPeter Brune +  linesearch - linesearch context
867f40b411bSPeter Brune -  snes - The snes instance
868f40b411bSPeter Brune 
86978bcb3b5SPeter Brune    Level: developer
87078bcb3b5SPeter Brune 
87178bcb3b5SPeter Brune    Notes:
87278bcb3b5SPeter Brune    This happens automatically when the line search is gotten/created with
8737601faf0SJed Brown    SNESGetLineSearch().  This routine is therefore mainly called within SNES
87478bcb3b5SPeter Brune    implementations.
875f40b411bSPeter Brune 
8768141a3b9SPeter Brune    Level: developer
877f40b411bSPeter Brune 
878cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
879f40b411bSPeter Brune @*/
880bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
881bf388a1fSBarry Smith {
882bf7f4e0aSPeter Brune   PetscFunctionBegin;
883f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
884bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
885bf7f4e0aSPeter Brune   linesearch->snes = snes;
886bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
887bf7f4e0aSPeter Brune }
888bf7f4e0aSPeter Brune 
889bf7f4e0aSPeter Brune #undef __FUNCT__
890f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
891f40b411bSPeter Brune /*@
8928141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
8938141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
8948141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
8958141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
896f40b411bSPeter Brune 
897f40b411bSPeter Brune    Input Parameters:
8988e557f58SPeter Brune .  linesearch - linesearch context
899f40b411bSPeter Brune 
900f40b411bSPeter Brune    Output Parameters:
901f40b411bSPeter Brune .  snes - The snes instance
902f40b411bSPeter Brune 
9038141a3b9SPeter Brune    Level: developer
904f40b411bSPeter Brune 
905cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
906f40b411bSPeter Brune @*/
907bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
908bf388a1fSBarry Smith {
909bf7f4e0aSPeter Brune   PetscFunctionBegin;
910f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9116a388c36SPeter Brune   PetscValidPointer(snes, 2);
912bf7f4e0aSPeter Brune   *snes = linesearch->snes;
913bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
914bf7f4e0aSPeter Brune }
915bf7f4e0aSPeter Brune 
9166a388c36SPeter Brune #undef __FUNCT__
917f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
918f40b411bSPeter Brune /*@
919f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
920f40b411bSPeter Brune 
921f40b411bSPeter Brune    Input Parameters:
9228e557f58SPeter Brune .  linesearch - linesearch context
923f40b411bSPeter Brune 
924f40b411bSPeter Brune    Output Parameters:
925cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
926f40b411bSPeter Brune 
92778bcb3b5SPeter Brune    Level: advanced
92878bcb3b5SPeter Brune 
9298e557f58SPeter Brune    Notes:
9308e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
93178bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
93278bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
93378bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
93478bcb3b5SPeter Brune 
935f40b411bSPeter Brune 
936cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
937f40b411bSPeter Brune @*/
938f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
9396a388c36SPeter Brune {
9406a388c36SPeter Brune   PetscFunctionBegin;
941f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9426a388c36SPeter Brune   PetscValidPointer(lambda, 2);
9436a388c36SPeter Brune   *lambda = linesearch->lambda;
9446a388c36SPeter Brune   PetscFunctionReturn(0);
9456a388c36SPeter Brune }
9466a388c36SPeter Brune 
9476a388c36SPeter Brune #undef __FUNCT__
948f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
949f40b411bSPeter Brune /*@
950f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
951f40b411bSPeter Brune 
952f40b411bSPeter Brune    Input Parameters:
9538e557f58SPeter Brune +  linesearch - linesearch context
954f40b411bSPeter Brune -  lambda - The last steplength.
955f40b411bSPeter Brune 
956cd7522eaSPeter Brune    Notes:
957cd7522eaSPeter Brune    This routine is typically used within implementations of SNESLineSearchApply
958cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
959cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
960cd7522eaSPeter Brune    as an inner scaling parameter.
961cd7522eaSPeter Brune 
96278bcb3b5SPeter Brune    Level: advanced
963f40b411bSPeter Brune 
964f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
965f40b411bSPeter Brune @*/
966f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
9676a388c36SPeter Brune {
9686a388c36SPeter Brune   PetscFunctionBegin;
969f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9706a388c36SPeter Brune   linesearch->lambda = lambda;
9716a388c36SPeter Brune   PetscFunctionReturn(0);
9726a388c36SPeter Brune }
9736a388c36SPeter Brune 
9746a388c36SPeter Brune #undef  __FUNCT__
975f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
976f40b411bSPeter Brune /*@
9773c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
97878bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
97978bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
98078bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
981f40b411bSPeter Brune 
982f40b411bSPeter Brune    Input Parameters:
9838e557f58SPeter Brune .  linesearch - linesearch context
984f40b411bSPeter Brune 
985f40b411bSPeter Brune    Output Parameters:
986516fe3c3SPeter Brune +  steptol - The minimum steplength
9876cc8e53bSPeter Brune .  maxstep - The maximum steplength
988516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
989516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
990516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
991516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
992f40b411bSPeter Brune 
99378bcb3b5SPeter Brune    Level: intermediate
99478bcb3b5SPeter Brune 
99578bcb3b5SPeter Brune    Notes:
99678bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
9973c7d6663SPeter Brune    the type requires.
998516fe3c3SPeter Brune 
999f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
1000f40b411bSPeter Brune @*/
1001f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
10026a388c36SPeter Brune {
10036a388c36SPeter Brune   PetscFunctionBegin;
1004f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1005516fe3c3SPeter Brune   if (steptol) {
10066a388c36SPeter Brune     PetscValidPointer(steptol, 2);
10076a388c36SPeter Brune     *steptol = linesearch->steptol;
1008516fe3c3SPeter Brune   }
1009516fe3c3SPeter Brune   if (maxstep) {
1010516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
1011516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
1012516fe3c3SPeter Brune   }
1013516fe3c3SPeter Brune   if (rtol) {
1014516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
1015516fe3c3SPeter Brune     *rtol = linesearch->rtol;
1016516fe3c3SPeter Brune   }
1017516fe3c3SPeter Brune   if (atol) {
1018516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
1019516fe3c3SPeter Brune     *atol = linesearch->atol;
1020516fe3c3SPeter Brune   }
1021516fe3c3SPeter Brune   if (ltol) {
1022516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
1023516fe3c3SPeter Brune     *ltol = linesearch->ltol;
1024516fe3c3SPeter Brune   }
1025516fe3c3SPeter Brune   if (max_its) {
1026516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
1027516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1028516fe3c3SPeter Brune   }
10296a388c36SPeter Brune   PetscFunctionReturn(0);
10306a388c36SPeter Brune }
10316a388c36SPeter Brune 
10326a388c36SPeter Brune #undef  __FUNCT__
1033f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
1034f40b411bSPeter Brune /*@
10353c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
103678bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
103778bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
103878bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1039f40b411bSPeter Brune 
1040f40b411bSPeter Brune    Input Parameters:
10418e557f58SPeter Brune +  linesearch - linesearch context
1042516fe3c3SPeter Brune .  steptol - The minimum steplength
10436cc8e53bSPeter Brune .  maxstep - The maximum steplength
1044516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1045516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1046516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1047516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1048f40b411bSPeter Brune 
104978bcb3b5SPeter Brune    Notes:
10503c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
105178bcb3b5SPeter Brune    place of an argument.
1052f40b411bSPeter Brune 
105378bcb3b5SPeter Brune    Level: intermediate
1054516fe3c3SPeter Brune 
1055f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1056f40b411bSPeter Brune @*/
1057f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
10586a388c36SPeter Brune {
10596a388c36SPeter Brune   PetscFunctionBegin;
1060f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1061d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1062d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1063d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1064d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1065d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1066d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1067d3952184SSatish Balay 
1068d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1069ce94432eSBarry Smith     if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
10706a388c36SPeter Brune     linesearch->steptol = steptol;
1071d3952184SSatish Balay   }
1072d3952184SSatish Balay 
1073d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1074ce94432eSBarry Smith     if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1075516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1076d3952184SSatish Balay   }
1077d3952184SSatish Balay 
1078d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1079ce94432eSBarry Smith     if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol);
1080516fe3c3SPeter Brune     linesearch->rtol = rtol;
1081d3952184SSatish Balay   }
1082d3952184SSatish Balay 
1083d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1084ce94432eSBarry Smith     if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1085516fe3c3SPeter Brune     linesearch->atol = atol;
1086d3952184SSatish Balay   }
1087d3952184SSatish Balay 
1088d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1089ce94432eSBarry Smith     if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol);
1090516fe3c3SPeter Brune     linesearch->ltol = ltol;
1091d3952184SSatish Balay   }
1092d3952184SSatish Balay 
1093d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1094ce94432eSBarry Smith     if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1095516fe3c3SPeter Brune     linesearch->max_its = max_its;
1096d3952184SSatish Balay   }
10976a388c36SPeter Brune   PetscFunctionReturn(0);
10986a388c36SPeter Brune }
10996a388c36SPeter Brune 
11006a388c36SPeter Brune #undef __FUNCT__
1101f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
1102f40b411bSPeter Brune /*@
1103f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1104f40b411bSPeter Brune 
1105f40b411bSPeter Brune    Input Parameters:
11068e557f58SPeter Brune .  linesearch - linesearch context
1107f40b411bSPeter Brune 
1108f40b411bSPeter Brune    Output Parameters:
11098e557f58SPeter Brune .  damping - The damping parameter
1110f40b411bSPeter Brune 
111178bcb3b5SPeter Brune    Level: advanced
1112f40b411bSPeter Brune 
111378bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1114f40b411bSPeter Brune @*/
1115f40b411bSPeter Brune 
1116f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
11176a388c36SPeter Brune {
11186a388c36SPeter Brune   PetscFunctionBegin;
1119f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11206a388c36SPeter Brune   PetscValidPointer(damping, 2);
11216a388c36SPeter Brune   *damping = linesearch->damping;
11226a388c36SPeter Brune   PetscFunctionReturn(0);
11236a388c36SPeter Brune }
11246a388c36SPeter Brune 
11256a388c36SPeter Brune #undef __FUNCT__
1126f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
1127f40b411bSPeter Brune /*@
1128f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
1129f40b411bSPeter Brune 
1130f40b411bSPeter Brune    Input Parameters:
113178bcb3b5SPeter Brune .  linesearch - linesearch context
113278bcb3b5SPeter Brune .  damping - The damping parameter
1133f40b411bSPeter Brune 
1134f40b411bSPeter Brune    Level: intermediate
1135f40b411bSPeter Brune 
1136cd7522eaSPeter Brune    Notes:
1137cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1138cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
113978bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1140cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1141cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1142cd7522eaSPeter Brune 
1143f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1144f40b411bSPeter Brune @*/
1145f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
11466a388c36SPeter Brune {
11476a388c36SPeter Brune   PetscFunctionBegin;
1148f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11496a388c36SPeter Brune   linesearch->damping = damping;
11506a388c36SPeter Brune   PetscFunctionReturn(0);
11516a388c36SPeter Brune }
11526a388c36SPeter Brune 
11536a388c36SPeter Brune #undef __FUNCT__
115459405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder"
115559405d5eSPeter Brune /*@
115659405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
115759405d5eSPeter Brune 
115859405d5eSPeter Brune    Input Parameters:
115978bcb3b5SPeter Brune .  linesearch - linesearch context
116059405d5eSPeter Brune 
116159405d5eSPeter Brune    Output Parameters:
11628e557f58SPeter Brune .  order - The order
116359405d5eSPeter Brune 
116478bcb3b5SPeter Brune    Possible Values for order:
11653c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11663c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11673c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
116878bcb3b5SPeter Brune 
116959405d5eSPeter Brune    Level: intermediate
117059405d5eSPeter Brune 
117159405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
117259405d5eSPeter Brune @*/
117359405d5eSPeter Brune 
1174b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
117559405d5eSPeter Brune {
117659405d5eSPeter Brune   PetscFunctionBegin;
117759405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
117859405d5eSPeter Brune   PetscValidPointer(order, 2);
117959405d5eSPeter Brune   *order = linesearch->order;
118059405d5eSPeter Brune   PetscFunctionReturn(0);
118159405d5eSPeter Brune }
118259405d5eSPeter Brune 
118359405d5eSPeter Brune #undef __FUNCT__
118459405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder"
118559405d5eSPeter Brune /*@
118659405d5eSPeter Brune    SNESLineSearchSetOrder - Sets the line search damping paramter.
118759405d5eSPeter Brune 
118859405d5eSPeter Brune    Input Parameters:
118978bcb3b5SPeter Brune .  linesearch - linesearch context
119078bcb3b5SPeter Brune .  order - The damping parameter
119159405d5eSPeter Brune 
119259405d5eSPeter Brune    Level: intermediate
119359405d5eSPeter Brune 
119478bcb3b5SPeter Brune    Possible Values for order:
11953c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11963c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11973c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
119878bcb3b5SPeter Brune 
119959405d5eSPeter Brune    Notes:
120059405d5eSPeter Brune    Variable orders are supported by the following line searches:
120178bcb3b5SPeter Brune +  bt - cubic and quadratic
120278bcb3b5SPeter Brune -  cp - linear and quadratic
120359405d5eSPeter Brune 
120459405d5eSPeter Brune .seealso: SNESLineSearchGetOrder()
120559405d5eSPeter Brune @*/
1206b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
120759405d5eSPeter Brune {
120859405d5eSPeter Brune   PetscFunctionBegin;
120959405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
121059405d5eSPeter Brune   linesearch->order = order;
121159405d5eSPeter Brune   PetscFunctionReturn(0);
121259405d5eSPeter Brune }
121359405d5eSPeter Brune 
121459405d5eSPeter Brune #undef __FUNCT__
1215f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
1216f40b411bSPeter Brune /*@
1217f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1218f40b411bSPeter Brune 
1219f40b411bSPeter Brune    Input Parameters:
122078bcb3b5SPeter Brune .  linesearch - linesearch context
1221f40b411bSPeter Brune 
1222f40b411bSPeter Brune    Output Parameters:
1223f40b411bSPeter Brune +  xnorm - The norm of the current solution
1224f40b411bSPeter Brune .  fnorm - The norm of the current function
1225f40b411bSPeter Brune -  ynorm - The norm of the current update
1226f40b411bSPeter Brune 
1227cd7522eaSPeter Brune    Notes:
1228cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1229cd7522eaSPeter Brune 
123078bcb3b5SPeter Brune    Level: developer
1231f40b411bSPeter Brune 
1232f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1233f40b411bSPeter Brune @*/
1234f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1235bf7f4e0aSPeter Brune {
1236bf7f4e0aSPeter Brune   PetscFunctionBegin;
1237f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1238f5af7f23SKarl Rupp   if (xnorm) *xnorm = linesearch->xnorm;
1239f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
1240f5af7f23SKarl Rupp   if (ynorm) *ynorm = linesearch->ynorm;
1241bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1242bf7f4e0aSPeter Brune }
1243bf7f4e0aSPeter Brune 
1244e7058c64SPeter Brune #undef __FUNCT__
1245f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
1246f40b411bSPeter Brune /*@
1247f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1248f40b411bSPeter Brune 
1249f40b411bSPeter Brune    Input Parameters:
125078bcb3b5SPeter Brune +  linesearch - linesearch context
1251f40b411bSPeter Brune .  xnorm - The norm of the current solution
1252f40b411bSPeter Brune .  fnorm - The norm of the current function
1253f40b411bSPeter Brune -  ynorm - The norm of the current update
1254f40b411bSPeter Brune 
125578bcb3b5SPeter Brune    Level: advanced
1256f40b411bSPeter Brune 
1257f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1258f40b411bSPeter Brune @*/
1259f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
12606a388c36SPeter Brune {
12616a388c36SPeter Brune   PetscFunctionBegin;
1262f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12636a388c36SPeter Brune   linesearch->xnorm = xnorm;
12646a388c36SPeter Brune   linesearch->fnorm = fnorm;
12656a388c36SPeter Brune   linesearch->ynorm = ynorm;
12666a388c36SPeter Brune   PetscFunctionReturn(0);
12676a388c36SPeter Brune }
12686a388c36SPeter Brune 
12696a388c36SPeter Brune #undef __FUNCT__
1270f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
1271f40b411bSPeter Brune /*@
1272f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1273f40b411bSPeter Brune 
1274f40b411bSPeter Brune    Input Parameters:
127578bcb3b5SPeter Brune .  linesearch - linesearch context
1276f40b411bSPeter Brune 
1277f40b411bSPeter Brune    Options Database Keys:
12788e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1279f40b411bSPeter Brune 
1280f40b411bSPeter Brune    Level: intermediate
1281f40b411bSPeter Brune 
128278bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1283f40b411bSPeter Brune @*/
1284f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
12856a388c36SPeter Brune {
12866a388c36SPeter Brune   PetscErrorCode ierr;
12879bd66eb0SPeter Brune   SNES           snes;
1288bf388a1fSBarry Smith 
12896a388c36SPeter Brune   PetscFunctionBegin;
12906a388c36SPeter Brune   if (linesearch->norms) {
12919bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1292f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
12939bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12949bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12959bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
12969bd66eb0SPeter Brune     } else {
12976a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12986a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12996a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13006a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
13016a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13026a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13036a388c36SPeter Brune     }
13049bd66eb0SPeter Brune   }
13056a388c36SPeter Brune   PetscFunctionReturn(0);
13066a388c36SPeter Brune }
13076a388c36SPeter Brune 
13086f263ca3SPeter Brune #undef __FUNCT__
13096f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms"
13106f263ca3SPeter Brune /*@
13116f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
13126f263ca3SPeter Brune 
13136f263ca3SPeter Brune    Input Parameters:
131478bcb3b5SPeter Brune +  linesearch  - linesearch context
131578bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
13166f263ca3SPeter Brune 
13176f263ca3SPeter Brune    Options Database Keys:
13188e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
13196f263ca3SPeter Brune 
13206f263ca3SPeter Brune    Notes:
13211a4f838cSPeter Brune    This is most relevant to the SNESLINESEARCHBASIC line search type.
13226f263ca3SPeter Brune 
13236f263ca3SPeter Brune    Level: intermediate
13246f263ca3SPeter Brune 
13251a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13266f263ca3SPeter Brune @*/
13276f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13286f263ca3SPeter Brune {
13296f263ca3SPeter Brune   PetscFunctionBegin;
13306f263ca3SPeter Brune   linesearch->norms = flg;
13316f263ca3SPeter Brune   PetscFunctionReturn(0);
13326f263ca3SPeter Brune }
13336f263ca3SPeter Brune 
13346a388c36SPeter Brune #undef __FUNCT__
1335f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1336f40b411bSPeter Brune /*@
1337f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1338f40b411bSPeter Brune 
1339f40b411bSPeter Brune    Input Parameters:
134078bcb3b5SPeter Brune .  linesearch - linesearch context
1341f40b411bSPeter Brune 
1342f40b411bSPeter Brune    Output Parameters:
13436232e825SPeter Brune +  X - Solution vector
13446232e825SPeter Brune .  F - Function vector
13456232e825SPeter Brune .  Y - Search direction vector
13466232e825SPeter Brune .  W - Solution work vector
13476232e825SPeter Brune -  G - Function work vector
13486232e825SPeter Brune 
13497bba9028SPeter Brune    Notes:
13507bba9028SPeter Brune    At the beginning of a line search application, X should contain a
13516232e825SPeter Brune    solution and the vector F the function computed at X.  At the end of the
13526232e825SPeter Brune    line search application, X should contain the new solution, and F the
13536232e825SPeter Brune    function evaluated at the new solution.
1354f40b411bSPeter Brune 
135578bcb3b5SPeter Brune    Level: advanced
1356f40b411bSPeter Brune 
1357f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1358f40b411bSPeter Brune @*/
1359bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1360bf388a1fSBarry Smith {
13616a388c36SPeter Brune   PetscFunctionBegin;
1362f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13636a388c36SPeter Brune   if (X) {
13646a388c36SPeter Brune     PetscValidPointer(X, 2);
13656a388c36SPeter Brune     *X = linesearch->vec_sol;
13666a388c36SPeter Brune   }
13676a388c36SPeter Brune   if (F) {
13686a388c36SPeter Brune     PetscValidPointer(F, 3);
13696a388c36SPeter Brune     *F = linesearch->vec_func;
13706a388c36SPeter Brune   }
13716a388c36SPeter Brune   if (Y) {
13726a388c36SPeter Brune     PetscValidPointer(Y, 4);
13736a388c36SPeter Brune     *Y = linesearch->vec_update;
13746a388c36SPeter Brune   }
13756a388c36SPeter Brune   if (W) {
13766a388c36SPeter Brune     PetscValidPointer(W, 5);
13776a388c36SPeter Brune     *W = linesearch->vec_sol_new;
13786a388c36SPeter Brune   }
13796a388c36SPeter Brune   if (G) {
13806a388c36SPeter Brune     PetscValidPointer(G, 6);
13816a388c36SPeter Brune     *G = linesearch->vec_func_new;
13826a388c36SPeter Brune   }
13836a388c36SPeter Brune   PetscFunctionReturn(0);
13846a388c36SPeter Brune }
13856a388c36SPeter Brune 
13866a388c36SPeter Brune #undef __FUNCT__
1387f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1388f40b411bSPeter Brune /*@
1389f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1390f40b411bSPeter Brune 
1391f40b411bSPeter Brune    Input Parameters:
139278bcb3b5SPeter Brune +  linesearch - linesearch context
13936232e825SPeter Brune .  X - Solution vector
13946232e825SPeter Brune .  F - Function vector
13956232e825SPeter Brune .  Y - Search direction vector
13966232e825SPeter Brune .  W - Solution work vector
13976232e825SPeter Brune -  G - Function work vector
1398f40b411bSPeter Brune 
139978bcb3b5SPeter Brune    Level: advanced
1400f40b411bSPeter Brune 
1401f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1402f40b411bSPeter Brune @*/
1403bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1404bf388a1fSBarry Smith {
14056a388c36SPeter Brune   PetscFunctionBegin;
1406f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14076a388c36SPeter Brune   if (X) {
14086a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
14096a388c36SPeter Brune     linesearch->vec_sol = X;
14106a388c36SPeter Brune   }
14116a388c36SPeter Brune   if (F) {
14126a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
14136a388c36SPeter Brune     linesearch->vec_func = F;
14146a388c36SPeter Brune   }
14156a388c36SPeter Brune   if (Y) {
14166a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
14176a388c36SPeter Brune     linesearch->vec_update = Y;
14186a388c36SPeter Brune   }
14196a388c36SPeter Brune   if (W) {
14206a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
14216a388c36SPeter Brune     linesearch->vec_sol_new = W;
14226a388c36SPeter Brune   }
14236a388c36SPeter Brune   if (G) {
14246a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14256a388c36SPeter Brune     linesearch->vec_func_new = G;
14266a388c36SPeter Brune   }
14276a388c36SPeter Brune   PetscFunctionReturn(0);
14286a388c36SPeter Brune }
14296a388c36SPeter Brune 
14306a388c36SPeter Brune #undef __FUNCT__
1431f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1432e7058c64SPeter Brune /*@C
1433f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1434e7058c64SPeter Brune    SNES options in the database.
1435e7058c64SPeter Brune 
1436cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1437e7058c64SPeter Brune 
1438e7058c64SPeter Brune    Input Parameters:
1439e7058c64SPeter Brune +  snes - the SNES context
1440e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1441e7058c64SPeter Brune 
1442e7058c64SPeter Brune    Notes:
1443e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1444e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1445e7058c64SPeter Brune 
1446e7058c64SPeter Brune    Level: advanced
1447e7058c64SPeter Brune 
1448f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1449e7058c64SPeter Brune 
1450e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1451e7058c64SPeter Brune @*/
1452f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1453e7058c64SPeter Brune {
1454e7058c64SPeter Brune   PetscErrorCode ierr;
1455e7058c64SPeter Brune 
1456e7058c64SPeter Brune   PetscFunctionBegin;
1457f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1458e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1459e7058c64SPeter Brune   PetscFunctionReturn(0);
1460e7058c64SPeter Brune }
1461e7058c64SPeter Brune 
1462e7058c64SPeter Brune #undef __FUNCT__
1463f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1464e7058c64SPeter Brune /*@C
1465f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1466f1c6b773SPeter Brune    SNESLineSearch options in the database.
1467e7058c64SPeter Brune 
1468e7058c64SPeter Brune    Not Collective
1469e7058c64SPeter Brune 
1470e7058c64SPeter Brune    Input Parameter:
1471cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1472e7058c64SPeter Brune 
1473e7058c64SPeter Brune    Output Parameter:
1474e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1475e7058c64SPeter Brune 
14768e557f58SPeter Brune    Notes:
14778e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1478e7058c64SPeter Brune    sufficient length to hold the prefix.
1479e7058c64SPeter Brune 
1480e7058c64SPeter Brune    Level: advanced
1481e7058c64SPeter Brune 
1482f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1483e7058c64SPeter Brune 
1484e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1485e7058c64SPeter Brune @*/
1486f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1487e7058c64SPeter Brune {
1488e7058c64SPeter Brune   PetscErrorCode ierr;
1489e7058c64SPeter Brune 
1490e7058c64SPeter Brune   PetscFunctionBegin;
1491f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1492e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1493e7058c64SPeter Brune   PetscFunctionReturn(0);
1494e7058c64SPeter Brune }
1495bf7f4e0aSPeter Brune 
1496bf7f4e0aSPeter Brune #undef __FUNCT__
1497fa0ddf94SBarry Smith #define __FUNCT__ "SNESLineSearchSetWorkVecs"
14988d359177SBarry Smith /*@C
1499fa0ddf94SBarry Smith    SNESLineSearchSetWorkVecs - Gets work vectors for the line search.
1500f40b411bSPeter Brune 
1501f40b411bSPeter Brune    Input Parameter:
1502f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1503f40b411bSPeter Brune -  nwork - the number of work vectors
1504f40b411bSPeter Brune 
1505f40b411bSPeter Brune    Level: developer
1506f40b411bSPeter Brune 
1507fa0ddf94SBarry Smith    Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations
1508cd7522eaSPeter Brune 
1509f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1510f40b411bSPeter Brune 
1511fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs()
1512f40b411bSPeter Brune @*/
1513fa0ddf94SBarry Smith PetscErrorCode  SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork)
1514bf7f4e0aSPeter Brune {
1515bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1516bf388a1fSBarry Smith 
1517bf7f4e0aSPeter Brune   PetscFunctionBegin;
1518bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1519bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
15208d359177SBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1521bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1522bf7f4e0aSPeter Brune }
1523bf7f4e0aSPeter Brune 
1524bf7f4e0aSPeter Brune #undef __FUNCT__
1525f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1526f40b411bSPeter Brune /*@
1527f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1528f40b411bSPeter Brune 
1529f40b411bSPeter Brune    Input Parameters:
153078bcb3b5SPeter Brune .  linesearch - linesearch context
1531f40b411bSPeter Brune 
1532f40b411bSPeter Brune    Output Parameters:
15338e557f58SPeter Brune .  success - The success or failure status
1534f40b411bSPeter Brune 
1535cd7522eaSPeter Brune    Notes:
1536c98378a5SBarry Smith    This is typically called after SNESLineSearchApply() in order to determine if the line-search failed
1537cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1538cd7522eaSPeter Brune 
1539f40b411bSPeter Brune    Level: intermediate
1540f40b411bSPeter Brune 
1541f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1542f40b411bSPeter Brune @*/
1543f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1544bf7f4e0aSPeter Brune {
1545bf7f4e0aSPeter Brune   PetscFunctionBegin;
1546f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15476a388c36SPeter Brune   PetscValidPointer(success, 2);
1548f5af7f23SKarl Rupp   if (success) *success = linesearch->success;
1549bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1550bf7f4e0aSPeter Brune }
1551bf7f4e0aSPeter Brune 
1552bf7f4e0aSPeter Brune #undef __FUNCT__
1553f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1554f40b411bSPeter Brune /*@
1555f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1556f40b411bSPeter Brune 
1557f40b411bSPeter Brune    Input Parameters:
155878bcb3b5SPeter Brune +  linesearch - linesearch context
15598e557f58SPeter Brune -  success - The success or failure status
1560f40b411bSPeter Brune 
1561cd7522eaSPeter Brune    Notes:
1562cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1563cd7522eaSPeter Brune    the success or failure of the line search method.
1564cd7522eaSPeter Brune 
156578bcb3b5SPeter Brune    Level: developer
1566f40b411bSPeter Brune 
1567f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1568f40b411bSPeter Brune @*/
1569f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
15706a388c36SPeter Brune {
15716a388c36SPeter Brune   PetscFunctionBegin;
15725fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15736a388c36SPeter Brune   linesearch->success = success;
15746a388c36SPeter Brune   PetscFunctionReturn(0);
15756a388c36SPeter Brune }
15766a388c36SPeter Brune 
15776a388c36SPeter Brune #undef __FUNCT__
1578f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
15799bd66eb0SPeter Brune /*@C
1580f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
15819bd66eb0SPeter Brune 
15829bd66eb0SPeter Brune    Input Parameters:
15839bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
15849bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
15859bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
15869bd66eb0SPeter Brune 
15879bd66eb0SPeter Brune    Logically Collective on SNES
15889bd66eb0SPeter Brune 
15899bd66eb0SPeter Brune    Calling sequence of projectfunc:
15909bd66eb0SPeter Brune .vb
15919bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
15929bd66eb0SPeter Brune .ve
15939bd66eb0SPeter Brune 
15949bd66eb0SPeter Brune     Input parameters for projectfunc:
15959bd66eb0SPeter Brune +   snes - nonlinear context
15969bd66eb0SPeter Brune -   X - current solution
15979bd66eb0SPeter Brune 
1598cd7522eaSPeter Brune     Output parameters for projectfunc:
15999bd66eb0SPeter Brune .   X - Projected solution
16009bd66eb0SPeter Brune 
16019bd66eb0SPeter Brune    Calling sequence of normfunc:
16029bd66eb0SPeter Brune .vb
16039bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
16049bd66eb0SPeter Brune .ve
16059bd66eb0SPeter Brune 
1606cd7522eaSPeter Brune     Input parameters for normfunc:
16079bd66eb0SPeter Brune +   snes - nonlinear context
16089bd66eb0SPeter Brune .   X - current solution
16099bd66eb0SPeter Brune -   F - current residual
16109bd66eb0SPeter Brune 
1611cd7522eaSPeter Brune     Output parameters for normfunc:
16129bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
16139bd66eb0SPeter Brune 
1614cd7522eaSPeter Brune     Notes:
1615cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1616cd7522eaSPeter Brune 
1617cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1618cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
16199bd66eb0SPeter Brune 
16209bd66eb0SPeter Brune     Level: developer
16219bd66eb0SPeter Brune 
16229bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
16239bd66eb0SPeter Brune 
1624f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16259bd66eb0SPeter Brune @*/
1626f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16279bd66eb0SPeter Brune {
16289bd66eb0SPeter Brune   PetscFunctionBegin;
1629f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16309bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16319bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16329bd66eb0SPeter Brune   PetscFunctionReturn(0);
16339bd66eb0SPeter Brune }
16349bd66eb0SPeter Brune 
16359bd66eb0SPeter Brune #undef __FUNCT__
1636f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
16379bd66eb0SPeter Brune /*@C
1638f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16399bd66eb0SPeter Brune 
16409bd66eb0SPeter Brune    Input Parameters:
16419bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
16429bd66eb0SPeter Brune 
16439bd66eb0SPeter Brune    Output Parameters:
16449bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16459bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16469bd66eb0SPeter Brune 
16479bd66eb0SPeter Brune    Logically Collective on SNES
16489bd66eb0SPeter Brune 
16499bd66eb0SPeter Brune     Level: developer
16509bd66eb0SPeter Brune 
16519bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
16529bd66eb0SPeter Brune 
1653f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16549bd66eb0SPeter Brune @*/
1655f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16569bd66eb0SPeter Brune {
16579bd66eb0SPeter Brune   PetscFunctionBegin;
16589bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16599bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16609bd66eb0SPeter Brune   PetscFunctionReturn(0);
16619bd66eb0SPeter Brune }
16629bd66eb0SPeter Brune 
16639bd66eb0SPeter Brune #undef __FUNCT__
1664f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1665bf7f4e0aSPeter Brune /*@C
16661c84c290SBarry Smith   SNESLineSearchRegister - See SNESLineSearchRegister()
1667bf7f4e0aSPeter Brune 
1668bf7f4e0aSPeter Brune   Level: advanced
1669bf7f4e0aSPeter Brune @*/
1670bdf89e91SBarry Smith PetscErrorCode  SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch))
1671bf7f4e0aSPeter Brune {
1672bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1673bf7f4e0aSPeter Brune 
1674bf7f4e0aSPeter Brune   PetscFunctionBegin;
1675a240a19fSJed Brown   ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr);
1676bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1677bf7f4e0aSPeter Brune }
1678