xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision af0996ce37bc06907c37d8d91773840993d61e62)
1*af0996ceSBarry Smith #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 
22162e0bf5SPeter Brune    Level: developer
23162e0bf5SPeter Brune 
24162e0bf5SPeter Brune    Notes:
25162e0bf5SPeter Brune    The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance
26162e0bf5SPeter Brune    already associated with the SNES.  This function is for developer use.
27f40b411bSPeter Brune 
28cd7522eaSPeter Brune .keywords: LineSearch, create, context
29f40b411bSPeter Brune 
30162e0bf5SPeter 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:
87f190f2fcSBarry Smith    For most cases, this needn't be called by users or 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 /*@
129f190f2fcSBarry Smith    SNESLineSearchReset - Undoes the SNESLineSearchSetUp() 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 
136f190f2fcSBarry Smith    Notes: Usually only called by SNESReset()
137f190f2fcSBarry Smith 
138f190f2fcSBarry Smith    Level: developer
139f40b411bSPeter Brune 
140cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset
141f40b411bSPeter Brune 
142f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp()
143f40b411bSPeter Brune @*/
144f40b411bSPeter Brune 
145bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
146bf388a1fSBarry Smith {
147bf7f4e0aSPeter Brune   PetscErrorCode ierr;
148bf388a1fSBarry Smith 
149bf7f4e0aSPeter Brune   PetscFunctionBegin;
150f5af7f23SKarl Rupp   if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch);
151f5af7f23SKarl Rupp 
152bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
153bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
154bf7f4e0aSPeter Brune 
155bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
156f5af7f23SKarl Rupp 
157bf7f4e0aSPeter Brune   linesearch->nwork       = 0;
158bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
159bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
160bf7f4e0aSPeter Brune }
161bf7f4e0aSPeter Brune 
162ed07d7d7SPeter Brune #undef __FUNCT__
163ed07d7d7SPeter Brune #define __FUNCT__ "SNESLineSearchSetFunction"
164ed07d7d7SPeter Brune /*@C
165f190f2fcSBarry Smith    SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search
166ed07d7d7SPeter Brune 
167ed07d7d7SPeter Brune    Input Parameters:
168ed07d7d7SPeter Brune .  linesearch - the SNESLineSearch context
169f190f2fcSBarry Smith +  func       - function evaluation routine
170ed07d7d7SPeter Brune 
171ed07d7d7SPeter Brune    Level: developer
172ed07d7d7SPeter Brune 
173f190f2fcSBarry Smith    Notes: This is used internally by PETSc and not called by users
174f190f2fcSBarry Smith 
175ed07d7d7SPeter Brune .keywords: get, linesearch, pre-check
176ed07d7d7SPeter Brune 
177f190f2fcSBarry Smith .seealso: SNESSetFunction()
178ed07d7d7SPeter Brune @*/
179ed07d7d7SPeter Brune PetscErrorCode  SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec))
180ed07d7d7SPeter Brune {
181ed07d7d7SPeter Brune   PetscFunctionBegin;
182ed07d7d7SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
183ed07d7d7SPeter Brune   linesearch->ops->snesfunc = func;
184ed07d7d7SPeter Brune   PetscFunctionReturn(0);
185ed07d7d7SPeter Brune }
186ed07d7d7SPeter Brune 
187ed07d7d7SPeter Brune 
1886b2b7091SBarry Smith /*MC
189f190f2fcSBarry Smith     SNESLineSearchPreCheckFunction - form of function passed to check the search direction before line search is called
1906b2b7091SBarry Smith 
1916b2b7091SBarry Smith      Synopsis:
192aaa7dc30SBarry Smith      #include <petscsnes.h>
1936b2b7091SBarry Smith      SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed);
1946b2b7091SBarry Smith 
1956b2b7091SBarry Smith        Input Parameters:
1966b2b7091SBarry Smith +      x - solution vector
1976b2b7091SBarry Smith .      y - search direction vector
1986b2b7091SBarry Smith -      changed - flag to indicate the precheck changed x or y.
1996b2b7091SBarry Smith 
200f190f2fcSBarry Smith      Note: This is NOTE a PETSc function, rather it documents the calling sequence of functions passed to SNESLineSearchSetPreCheck()
201f190f2fcSBarry Smith            and SNESLineSearchGetPreCheck()
202f190f2fcSBarry Smith 
203878cb397SSatish Balay    Level: advanced
204878cb397SSatish Balay 
205f190f2fcSBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck()
2066b2b7091SBarry Smith M*/
2076b2b7091SBarry Smith 
20886d74e61SPeter Brune #undef __FUNCT__
209f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck"
21086d74e61SPeter Brune /*@C
211f190f2fcSBarry Smith    SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but
212df3898eeSBarry Smith          before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that
213f190f2fcSBarry Smith          determined the search direction.
21486d74e61SPeter Brune 
215f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
21686d74e61SPeter Brune 
21786d74e61SPeter Brune    Input Parameters:
218f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
219f190f2fcSBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPreCheckFunction for the calling sequence
220f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
22186d74e61SPeter Brune 
22286d74e61SPeter Brune    Level: intermediate
22386d74e61SPeter Brune 
22486d74e61SPeter Brune .keywords: set, linesearch, pre-check
22586d74e61SPeter Brune 
226f190f2fcSBarry Smith .seealso: SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
22786d74e61SPeter Brune @*/
228f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
22986d74e61SPeter Brune {
2309bd66eb0SPeter Brune   PetscFunctionBegin;
231f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
232f190f2fcSBarry Smith   if (func) linesearch->ops->precheck = func;
23386d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
23486d74e61SPeter Brune   PetscFunctionReturn(0);
23586d74e61SPeter Brune }
23686d74e61SPeter Brune 
23786d74e61SPeter Brune #undef __FUNCT__
238f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck"
23986d74e61SPeter Brune /*@C
24053deb899SBarry Smith    SNESLineSearchGetPreCheck - Gets the pre-check function for the line search routine.
24186d74e61SPeter Brune 
24286d74e61SPeter Brune    Input Parameters:
243f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
24486d74e61SPeter Brune 
24586d74e61SPeter Brune    Output Parameters:
246f190f2fcSBarry Smith +  func       - [optional] function evaluation routine, see SNESLineSearchPreCheckFunction for calling sequence
247f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
24886d74e61SPeter Brune 
24986d74e61SPeter Brune    Level: intermediate
25086d74e61SPeter Brune 
25186d74e61SPeter Brune .keywords: get, linesearch, pre-check
25286d74e61SPeter Brune 
253f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
25486d74e61SPeter Brune @*/
255f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
25686d74e61SPeter Brune {
2579bd66eb0SPeter Brune   PetscFunctionBegin;
258f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
259f190f2fcSBarry Smith   if (func) *func = linesearch->ops->precheck;
26086d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
26186d74e61SPeter Brune   PetscFunctionReturn(0);
26286d74e61SPeter Brune }
26386d74e61SPeter Brune 
2646b2b7091SBarry Smith /*MC
265f190f2fcSBarry Smith     SNESLineSearchPostCheckFunction - form of function that is called after line search is complete
2666b2b7091SBarry Smith 
2676b2b7091SBarry Smith      Synopsis:
268aaa7dc30SBarry Smith      #include <petscsnes.h>
2696b2b7091SBarry Smith      SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y,  Vec w, *changed_y, PetscBool *changed_w);
2706b2b7091SBarry Smith 
2716b2b7091SBarry Smith      Input Parameters:
2726b2b7091SBarry Smith +      x - old solution vector
2736b2b7091SBarry Smith .      y - search direction vector
2746b2b7091SBarry Smith .      w - new solution vector
2756b2b7091SBarry Smith .      changed_y - indicates that the line search changed y
2766b2b7091SBarry Smith -      changed_w - indicates that the line search changed w
2776b2b7091SBarry Smith 
278f190f2fcSBarry Smith      Note: This is NOTE a PETSc function, rather it documents the calling sequence of functions passed to SNESLineSearchSetPostCheck()
279f190f2fcSBarry Smith            and SNESLineSearchGetPostCheck()
280f190f2fcSBarry Smith 
281878cb397SSatish Balay    Level: advanced
2826b2b7091SBarry Smith 
283f190f2fcSBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck()
2846b2b7091SBarry Smith M*/
2856b2b7091SBarry Smith 
28686d74e61SPeter Brune #undef __FUNCT__
287f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck"
28886d74e61SPeter Brune /*@C
289f190f2fcSBarry Smith    SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step
290f190f2fcSBarry Smith        direction and length. Allows the user a chance to change or override the decision of the line search routine
29186d74e61SPeter Brune 
292f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
29386d74e61SPeter Brune 
29486d74e61SPeter Brune    Input Parameters:
295f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
296f190f2fcSBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPostCheckFunction for the calling sequence
297f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
29886d74e61SPeter Brune 
29986d74e61SPeter Brune    Level: intermediate
30086d74e61SPeter Brune 
30186d74e61SPeter Brune .keywords: set, linesearch, post-check
30286d74e61SPeter Brune 
303f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck()
30486d74e61SPeter Brune @*/
305f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx)
30686d74e61SPeter Brune {
30786d74e61SPeter Brune   PetscFunctionBegin;
308f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
309f190f2fcSBarry Smith   if (func) linesearch->ops->postcheck = func;
31086d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
31186d74e61SPeter Brune   PetscFunctionReturn(0);
31286d74e61SPeter Brune }
31386d74e61SPeter Brune 
31486d74e61SPeter Brune #undef __FUNCT__
315f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck"
31686d74e61SPeter Brune /*@C
317f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
31886d74e61SPeter Brune 
31986d74e61SPeter Brune    Input Parameters:
320f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
32186d74e61SPeter Brune 
32286d74e61SPeter Brune    Output Parameters:
323f190f2fcSBarry Smith +  func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheckFunction
324f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
32586d74e61SPeter Brune 
32686d74e61SPeter Brune    Level: intermediate
32786d74e61SPeter Brune 
32886d74e61SPeter Brune .keywords: get, linesearch, post-check
32986d74e61SPeter Brune 
330f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck()
33186d74e61SPeter Brune @*/
332f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx)
33386d74e61SPeter Brune {
3349bd66eb0SPeter Brune   PetscFunctionBegin;
335f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
336f190f2fcSBarry Smith   if (func) *func = linesearch->ops->postcheck;
33786d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
33886d74e61SPeter Brune   PetscFunctionReturn(0);
33986d74e61SPeter Brune }
34086d74e61SPeter Brune 
341bf7f4e0aSPeter Brune #undef __FUNCT__
342f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck"
343f40b411bSPeter Brune /*@
344f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
345f40b411bSPeter Brune 
346cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
347f40b411bSPeter Brune 
348f40b411bSPeter Brune    Input Parameters:
3497b1df9c1SPeter Brune +  linesearch - The linesearch instance.
3507b1df9c1SPeter Brune .  X - The current solution
3517b1df9c1SPeter Brune -  Y - The step direction
352f40b411bSPeter Brune 
353f40b411bSPeter Brune    Output Parameters:
3548e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
355f40b411bSPeter Brune 
356f190f2fcSBarry Smith    Level: developer
357f40b411bSPeter Brune 
358f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
359f40b411bSPeter Brune 
360f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck()
361f40b411bSPeter Brune @*/
3627b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
363bf7f4e0aSPeter Brune {
364bf7f4e0aSPeter Brune   PetscErrorCode ierr;
3655fd66863SKarl Rupp 
366bf7f4e0aSPeter Brune   PetscFunctionBegin;
367bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
3686b2b7091SBarry Smith   if (linesearch->ops->precheck) {
3696b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
37038bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
371bf7f4e0aSPeter Brune   }
372bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
373bf7f4e0aSPeter Brune }
374bf7f4e0aSPeter Brune 
375bf7f4e0aSPeter Brune #undef __FUNCT__
376f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
377f40b411bSPeter Brune /*@
378f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
379f40b411bSPeter Brune 
380cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
381f40b411bSPeter Brune 
382f40b411bSPeter Brune    Input Parameters:
3837b1df9c1SPeter Brune +  linesearch - The linesearch context
3847b1df9c1SPeter Brune .  X - The last solution
3857b1df9c1SPeter Brune .  Y - The step direction
3867b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
387f40b411bSPeter Brune 
388f40b411bSPeter Brune    Output Parameters:
38978bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
39078bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
391f40b411bSPeter Brune 
392f190f2fcSBarry Smith    Level: developer
393f40b411bSPeter Brune 
394f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
395f40b411bSPeter Brune 
396f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck()
397f40b411bSPeter Brune @*/
3987b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
399bf7f4e0aSPeter Brune {
400bf7f4e0aSPeter Brune   PetscErrorCode ierr;
401bf388a1fSBarry Smith 
402bf7f4e0aSPeter Brune   PetscFunctionBegin;
403bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
404bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
4056b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
4066b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
40738bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
40838bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
40986d74e61SPeter Brune   }
41086d74e61SPeter Brune   PetscFunctionReturn(0);
41186d74e61SPeter Brune }
41286d74e61SPeter Brune 
41386d74e61SPeter Brune #undef __FUNCT__
414f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
41586d74e61SPeter Brune /*@C
41686d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
41786d74e61SPeter Brune 
418cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
41986d74e61SPeter Brune 
42086d74e61SPeter Brune    Input Arguments:
42186d74e61SPeter Brune +  linesearch - linesearch context
42286d74e61SPeter Brune .  X - base state for this step
42386d74e61SPeter Brune .  Y - initial correction
424907376e6SBarry Smith -  ctx - context for this function
42586d74e61SPeter Brune 
42686d74e61SPeter Brune    Output Arguments:
42786d74e61SPeter Brune +  Y - correction, possibly modified
42886d74e61SPeter Brune -  changed - flag indicating that Y was modified
42986d74e61SPeter Brune 
43086d74e61SPeter Brune    Options Database Key:
431cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
432cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
43386d74e61SPeter Brune 
43486d74e61SPeter Brune    Level: advanced
43586d74e61SPeter Brune 
43686d74e61SPeter Brune    Notes:
43786d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
43886d74e61SPeter Brune 
43986d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
44086d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
44186d74e61SPeter Brune    is generally not useful when using a Newton linearization.
44286d74e61SPeter Brune 
44386d74e61SPeter Brune    Reference:
44486d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
44586d74e61SPeter Brune 
44686d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
44786d74e61SPeter Brune @*/
448f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
44986d74e61SPeter Brune {
45086d74e61SPeter Brune   PetscErrorCode ierr;
45186d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
45286d74e61SPeter Brune   Vec            Ylast;
45386d74e61SPeter Brune   PetscScalar    dot;
45486d74e61SPeter Brune   PetscInt       iter;
45586d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
45686d74e61SPeter Brune   SNES           snes;
45786d74e61SPeter Brune 
45886d74e61SPeter Brune   PetscFunctionBegin;
459f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
46086d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
46186d74e61SPeter Brune   if (!Ylast) {
46286d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
46386d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
46486d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
46586d74e61SPeter Brune   }
46686d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
46786d74e61SPeter Brune   if (iter < 2) {
46886d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
46986d74e61SPeter Brune     *changed = PETSC_FALSE;
47086d74e61SPeter Brune     PetscFunctionReturn(0);
47186d74e61SPeter Brune   }
47286d74e61SPeter Brune 
47386d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
47486d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
47586d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
47686d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
477255453a1SBarry Smith   theta         = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
47886d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
47986d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
48086d74e61SPeter Brune     /* Modify the step Y */
48186d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
48286d74e61SPeter Brune     ierr  = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
48386d74e61SPeter Brune     ierr  = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
48486d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
48586d74e61SPeter Brune     ierr  = VecCopy(Y,Ylast);CHKERRQ(ierr);
48686d74e61SPeter Brune     ierr  = VecScale(Y,alpha);CHKERRQ(ierr);
487c69d1a72SBarry 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);
48886d74e61SPeter Brune   } else {
489c69d1a72SBarry 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);
49086d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
49186d74e61SPeter Brune     *changed = PETSC_FALSE;
492bf7f4e0aSPeter Brune   }
493bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
494bf7f4e0aSPeter Brune }
495bf7f4e0aSPeter Brune 
496bf7f4e0aSPeter Brune #undef __FUNCT__
497f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
498f40b411bSPeter Brune /*@
499cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
500f40b411bSPeter Brune 
501f1c6b773SPeter Brune    Collective on SNESLineSearch
502f40b411bSPeter Brune 
503f40b411bSPeter Brune    Input Parameters:
5048e557f58SPeter Brune +  linesearch - The linesearch context
5058e557f58SPeter Brune .  X - The current solution
5068e557f58SPeter Brune .  F - The current function
5078e557f58SPeter Brune .  fnorm - The current norm
5088e557f58SPeter Brune -  Y - The search direction
509f40b411bSPeter Brune 
510f40b411bSPeter Brune    Output Parameters:
5118e557f58SPeter Brune +  X - The new solution
5128e557f58SPeter Brune .  F - The new function
5138e557f58SPeter Brune -  fnorm - The new function norm
514f40b411bSPeter Brune 
515cd7522eaSPeter Brune    Options Database Keys:
516d4c6564cSPatrick Farrell + -snes_linesearch_type - basic, bt, l2, cp, nleqerr, shell
517cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
5183c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
519cd7522eaSPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms
5203c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
5213c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
522cd7522eaSPeter Brune 
523cd7522eaSPeter Brune    Notes:
524cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
525cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
526cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
527cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
528cd7522eaSPeter Brune    application of the line search may invoke SNESComputeFunction several times, and
529cd7522eaSPeter Brune    therefore may be fairly expensive.
530cd7522eaSPeter Brune 
531f40b411bSPeter Brune    Level: Intermediate
532f40b411bSPeter Brune 
533f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
534f40b411bSPeter Brune 
535cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction()
536f40b411bSPeter Brune @*/
537bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
538bf388a1fSBarry Smith {
539bf7f4e0aSPeter Brune   PetscErrorCode ierr;
540bf7f4e0aSPeter Brune 
541bf388a1fSBarry Smith   PetscFunctionBegin;
542f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
543bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
544bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
545bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
546bf7f4e0aSPeter Brune 
547bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
548bf7f4e0aSPeter Brune 
549bf7f4e0aSPeter Brune   linesearch->vec_sol    = X;
550bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
551bf7f4e0aSPeter Brune   linesearch->vec_func   = F;
552bf7f4e0aSPeter Brune 
553f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
554bf7f4e0aSPeter Brune 
555f5af7f23SKarl Rupp   if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
556bf7f4e0aSPeter Brune 
557f5af7f23SKarl Rupp   if (fnorm) linesearch->fnorm = *fnorm;
558f5af7f23SKarl Rupp   else {
559bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
560bf7f4e0aSPeter Brune   }
561bf7f4e0aSPeter Brune 
562f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
563bf7f4e0aSPeter Brune 
564bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
565bf7f4e0aSPeter Brune 
566f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
567bf7f4e0aSPeter Brune 
568f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
569bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
570bf7f4e0aSPeter Brune }
571bf7f4e0aSPeter Brune 
572bf7f4e0aSPeter Brune #undef __FUNCT__
573f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
574f40b411bSPeter Brune /*@
575f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
576f40b411bSPeter Brune 
577f1c6b773SPeter Brune    Collective on SNESLineSearch
578f40b411bSPeter Brune 
579f40b411bSPeter Brune    Input Parameters:
5808e557f58SPeter Brune .  linesearch - The linesearch context
581f40b411bSPeter Brune 
582f40b411bSPeter Brune    Level: Intermediate
583f40b411bSPeter Brune 
58478bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy
585f40b411bSPeter Brune 
586cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
587f40b411bSPeter Brune @*/
588bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
589bf388a1fSBarry Smith {
590bf7f4e0aSPeter Brune   PetscErrorCode ierr;
591bf388a1fSBarry Smith 
592bf7f4e0aSPeter Brune   PetscFunctionBegin;
593bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
594f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
595bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
596e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr);
59722d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
598f5af7f23SKarl Rupp   if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch);
599bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
600e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
601bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
602bf7f4e0aSPeter Brune }
603bf7f4e0aSPeter Brune 
604bf7f4e0aSPeter Brune #undef __FUNCT__
605f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
606f40b411bSPeter Brune /*@
607cd7522eaSPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search.
608bf7f4e0aSPeter Brune 
609bf7f4e0aSPeter Brune    Input Parameters:
610bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
611bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
612bf7f4e0aSPeter Brune 
613bf7f4e0aSPeter Brune    Logically Collective on SNES
614bf7f4e0aSPeter Brune 
615bf7f4e0aSPeter Brune    Options Database:
6168e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
617bf7f4e0aSPeter Brune 
618bf7f4e0aSPeter Brune    Level: intermediate
619bf7f4e0aSPeter Brune 
620cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer
621bf7f4e0aSPeter Brune @*/
622f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
623bf7f4e0aSPeter Brune {
624bf7f4e0aSPeter Brune   PetscErrorCode ierr;
625bf388a1fSBarry Smith 
626bf7f4e0aSPeter Brune   PetscFunctionBegin;
627bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
628ce94432eSBarry Smith     ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)linesearch),"stdout",&linesearch->monitor);CHKERRQ(ierr);
629bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
630bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
631bf7f4e0aSPeter Brune   }
632bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
633bf7f4e0aSPeter Brune }
634bf7f4e0aSPeter Brune 
635bf7f4e0aSPeter Brune #undef __FUNCT__
636f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
637f40b411bSPeter Brune /*@
638cd7522eaSPeter Brune    SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor.
6396a388c36SPeter Brune 
640f190f2fcSBarry Smith    Input Parameter:
6418e557f58SPeter Brune .  linesearch - linesearch context
642f40b411bSPeter Brune 
643f190f2fcSBarry Smith    Output Parameter:
6448e557f58SPeter Brune .  monitor - monitor context
645f40b411bSPeter Brune 
646f40b411bSPeter Brune    Logically Collective on SNES
647f40b411bSPeter Brune 
648f40b411bSPeter Brune    Options Database Keys:
6498e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
650f40b411bSPeter Brune 
651f40b411bSPeter Brune    Level: intermediate
652f40b411bSPeter Brune 
653cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer
654f40b411bSPeter Brune @*/
655f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6566a388c36SPeter Brune {
6576a388c36SPeter Brune   PetscFunctionBegin;
658f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6596a388c36SPeter Brune   if (monitor) {
6606a388c36SPeter Brune     PetscValidPointer(monitor, 2);
6616a388c36SPeter Brune     *monitor = linesearch->monitor;
6626a388c36SPeter Brune   }
6636a388c36SPeter Brune   PetscFunctionReturn(0);
6646a388c36SPeter Brune }
6656a388c36SPeter Brune 
6666a388c36SPeter Brune #undef __FUNCT__
667f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
668f40b411bSPeter Brune /*@
669f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
670f40b411bSPeter Brune 
671f40b411bSPeter Brune    Input Parameters:
6728e557f58SPeter Brune .  linesearch - linesearch context
673f40b411bSPeter Brune 
674f40b411bSPeter Brune    Options Database Keys:
675d4c6564cSPatrick Farrell + -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell
6763c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
6775a9b6599SPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch type
67871eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
6791a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
6801a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
6811a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
6821a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
6831a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
684cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
6858e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
686cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
6871a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
6881a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method
689f40b411bSPeter Brune 
690f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
691f40b411bSPeter Brune 
692f40b411bSPeter Brune    Level: intermediate
693f40b411bSPeter Brune 
6943c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard()
695f40b411bSPeter Brune @*/
696bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
697bf388a1fSBarry Smith {
698bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6991a4f838cSPeter Brune   const char     *deft = SNESLINESEARCHBASIC;
700bf7f4e0aSPeter Brune   char           type[256];
701bf7f4e0aSPeter Brune   PetscBool      flg, set;
702bf388a1fSBarry Smith 
703bf7f4e0aSPeter Brune   PetscFunctionBegin;
7040f51fdf8SToby Isaac   ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);
705bf7f4e0aSPeter Brune 
706bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
707f5af7f23SKarl Rupp   if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name;
708a264d7a6SBarry Smith   ierr = PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
709bf7f4e0aSPeter Brune   if (flg) {
710f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
711bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
712f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
713bf7f4e0aSPeter Brune   }
714bf7f4e0aSPeter Brune 
7158afaa268SBarry Smith   ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
716f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
717bf7f4e0aSPeter Brune 
7181a9b3a06SPeter Brune   /* tolerances */
71994ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL);CHKERRQ(ierr);
72094ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL);CHKERRQ(ierr);
72194ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL);CHKERRQ(ierr);
72294ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL);CHKERRQ(ierr);
72394ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL);CHKERRQ(ierr);
72494ae4db5SBarry Smith   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL);CHKERRQ(ierr);
7257a35526eSPeter Brune 
7261a9b3a06SPeter Brune   /* damping parameters */
72794ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL);CHKERRQ(ierr);
7281a9b3a06SPeter Brune 
72994ae4db5SBarry Smith   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL);CHKERRQ(ierr);
7301a9b3a06SPeter Brune 
7311a9b3a06SPeter Brune   /* precheck */
7327a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
7337a35526eSPeter Brune   if (set) {
7347a35526eSPeter Brune     if (flg) {
7357a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
736f5af7f23SKarl Rupp 
7377a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
7380298fd71SBarry Smith                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr);
7397a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
7407a35526eSPeter Brune     } else {
7410298fd71SBarry Smith       ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr);
7427a35526eSPeter Brune     }
7437a35526eSPeter Brune   }
74494ae4db5SBarry Smith   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL);CHKERRQ(ierr);
74594ae4db5SBarry Smith   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL);CHKERRQ(ierr);
7467a35526eSPeter Brune 
7475a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
748e55864a3SBarry Smith     (*linesearch->ops->setfromoptions)(PetscOptionsObject,linesearch);CHKERRQ(ierr);
7495a9b6599SPeter Brune   }
7505a9b6599SPeter Brune 
751bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
752bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
753bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
754bf7f4e0aSPeter Brune }
755bf7f4e0aSPeter Brune 
756bf7f4e0aSPeter Brune #undef __FUNCT__
757f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
758f40b411bSPeter Brune /*@
759f190f2fcSBarry Smith    SNESLineSearchView - Prints useful information about the line search
760f40b411bSPeter Brune 
761f40b411bSPeter Brune    Input Parameters:
7628e557f58SPeter Brune .  linesearch - linesearch context
763f40b411bSPeter Brune 
764f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
765f40b411bSPeter Brune 
766f40b411bSPeter Brune    Level: intermediate
767f40b411bSPeter Brune 
768f190f2fcSBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchMonitor()
769f40b411bSPeter Brune @*/
770bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
771bf388a1fSBarry Smith {
7727f1410a3SPeter Brune   PetscErrorCode ierr;
7737f1410a3SPeter Brune   PetscBool      iascii;
774bf388a1fSBarry Smith 
775bf7f4e0aSPeter Brune   PetscFunctionBegin;
7767f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7777f1410a3SPeter Brune   if (!viewer) {
778ce94432eSBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr);
7797f1410a3SPeter Brune   }
7807f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
7817f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
782f40b411bSPeter Brune 
783251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
7847f1410a3SPeter Brune   if (iascii) {
785dae58748SBarry Smith     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr);
7867f1410a3SPeter Brune     if (linesearch->ops->view) {
7877f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
7887f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
7897f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
7907f1410a3SPeter Brune     }
791c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
792c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
7937f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
7946b2b7091SBarry Smith     if (linesearch->ops->precheck) {
7956b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
7967f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
7977f1410a3SPeter Brune       } else {
7987f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
7997f1410a3SPeter Brune       }
8007f1410a3SPeter Brune     }
8016b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
8027f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
8037f1410a3SPeter Brune     }
8047f1410a3SPeter Brune   }
805bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
806bf7f4e0aSPeter Brune }
807bf7f4e0aSPeter Brune 
808bf7f4e0aSPeter Brune #undef __FUNCT__
809f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
810ea5d4fccSPeter Brune /*@C
811f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
812f40b411bSPeter Brune 
813f190f2fcSBarry Smith    Logically Collective on SNESLineSearch
814f190f2fcSBarry Smith 
815f40b411bSPeter Brune    Input Parameters:
8168e557f58SPeter Brune +  linesearch - linesearch context
817f40b411bSPeter Brune -  type - The type of line search to be used
818f40b411bSPeter Brune 
819cd7522eaSPeter Brune    Available Types:
820cd7522eaSPeter Brune +  basic - Simple damping line search.
8218e557f58SPeter Brune .  bt - Backtracking line search over the L2 norm of the function
8228e557f58SPeter Brune .  l2 - Secant line search over the L2 norm of the function
8238e557f58SPeter Brune .  cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
824d4c6564cSPatrick Farrell .  nleqerr - Affine-covariant error-oriented linesearch
8258e557f58SPeter Brune -  shell - User provided SNESLineSearch implementation
826cd7522eaSPeter Brune 
827f40b411bSPeter Brune    Level: intermediate
828f40b411bSPeter Brune 
829f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
830f40b411bSPeter Brune @*/
83119fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
832bf7f4e0aSPeter Brune {
833f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
834bf7f4e0aSPeter Brune   PetscBool      match;
835bf7f4e0aSPeter Brune 
836bf7f4e0aSPeter Brune   PetscFunctionBegin;
837f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
838bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
839bf7f4e0aSPeter Brune 
840251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
841bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
842bf7f4e0aSPeter Brune 
8431c9cd337SJed Brown   ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr);
844bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
845bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
846bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
847bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
848f5af7f23SKarl Rupp 
8490298fd71SBarry Smith     linesearch->ops->destroy = NULL;
850bf7f4e0aSPeter Brune   }
851f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
852bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
853bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
854bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
855bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
856bf7f4e0aSPeter Brune 
857bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
858bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
859bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
860bf7f4e0aSPeter Brune }
861bf7f4e0aSPeter Brune 
862bf7f4e0aSPeter Brune #undef __FUNCT__
863f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
864f40b411bSPeter Brune /*@
86578bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
866f40b411bSPeter Brune 
867f40b411bSPeter Brune    Input Parameters:
8688e557f58SPeter Brune +  linesearch - linesearch context
869f40b411bSPeter Brune -  snes - The snes instance
870f40b411bSPeter Brune 
87178bcb3b5SPeter Brune    Level: developer
87278bcb3b5SPeter Brune 
87378bcb3b5SPeter Brune    Notes:
874f190f2fcSBarry Smith    This happens automatically when the line search is obtained/created with
8757601faf0SJed Brown    SNESGetLineSearch().  This routine is therefore mainly called within SNES
87678bcb3b5SPeter Brune    implementations.
877f40b411bSPeter Brune 
8788141a3b9SPeter Brune    Level: developer
879f40b411bSPeter Brune 
880cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
881f40b411bSPeter Brune @*/
882bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
883bf388a1fSBarry Smith {
884bf7f4e0aSPeter Brune   PetscFunctionBegin;
885f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
886bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
887bf7f4e0aSPeter Brune   linesearch->snes = snes;
888bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
889bf7f4e0aSPeter Brune }
890bf7f4e0aSPeter Brune 
891bf7f4e0aSPeter Brune #undef __FUNCT__
892f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
893f40b411bSPeter Brune /*@
8948141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
8958141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
8968141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
8978141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
898f40b411bSPeter Brune 
899f40b411bSPeter Brune    Input Parameters:
9008e557f58SPeter Brune .  linesearch - linesearch context
901f40b411bSPeter Brune 
902f40b411bSPeter Brune    Output Parameters:
903f40b411bSPeter Brune .  snes - The snes instance
904f40b411bSPeter Brune 
9058141a3b9SPeter Brune    Level: developer
906f40b411bSPeter Brune 
907cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
908f40b411bSPeter Brune @*/
909bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
910bf388a1fSBarry Smith {
911bf7f4e0aSPeter Brune   PetscFunctionBegin;
912f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9136a388c36SPeter Brune   PetscValidPointer(snes, 2);
914bf7f4e0aSPeter Brune   *snes = linesearch->snes;
915bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
916bf7f4e0aSPeter Brune }
917bf7f4e0aSPeter Brune 
9186a388c36SPeter Brune #undef __FUNCT__
919f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
920f40b411bSPeter Brune /*@
921f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
922f40b411bSPeter Brune 
923f40b411bSPeter Brune    Input Parameters:
9248e557f58SPeter Brune .  linesearch - linesearch context
925f40b411bSPeter Brune 
926f40b411bSPeter Brune    Output Parameters:
927cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
928f40b411bSPeter Brune 
92978bcb3b5SPeter Brune    Level: advanced
93078bcb3b5SPeter Brune 
9318e557f58SPeter Brune    Notes:
9328e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
93378bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
93478bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
93578bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
93678bcb3b5SPeter Brune 
937cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
938f40b411bSPeter Brune @*/
939f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
9406a388c36SPeter Brune {
9416a388c36SPeter Brune   PetscFunctionBegin;
942f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9436a388c36SPeter Brune   PetscValidPointer(lambda, 2);
9446a388c36SPeter Brune   *lambda = linesearch->lambda;
9456a388c36SPeter Brune   PetscFunctionReturn(0);
9466a388c36SPeter Brune }
9476a388c36SPeter Brune 
9486a388c36SPeter Brune #undef __FUNCT__
949f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
950f40b411bSPeter Brune /*@
951f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
952f40b411bSPeter Brune 
953f40b411bSPeter Brune    Input Parameters:
9548e557f58SPeter Brune +  linesearch - linesearch context
955f40b411bSPeter Brune -  lambda - The last steplength.
956f40b411bSPeter Brune 
957cd7522eaSPeter Brune    Notes:
958f190f2fcSBarry Smith    This routine is typically used within implementations of SNESLineSearchApply()
959cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
960cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
961cd7522eaSPeter Brune    as an inner scaling parameter.
962cd7522eaSPeter Brune 
96378bcb3b5SPeter Brune    Level: advanced
964f40b411bSPeter Brune 
965f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
966f40b411bSPeter Brune @*/
967f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
9686a388c36SPeter Brune {
9696a388c36SPeter Brune   PetscFunctionBegin;
970f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9716a388c36SPeter Brune   linesearch->lambda = lambda;
9726a388c36SPeter Brune   PetscFunctionReturn(0);
9736a388c36SPeter Brune }
9746a388c36SPeter Brune 
9756a388c36SPeter Brune #undef  __FUNCT__
976f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
977f40b411bSPeter Brune /*@
9783c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
97978bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
98078bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
98178bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
982f40b411bSPeter Brune 
983f40b411bSPeter Brune    Input Parameters:
9848e557f58SPeter Brune .  linesearch - linesearch context
985f40b411bSPeter Brune 
986f40b411bSPeter Brune    Output Parameters:
987516fe3c3SPeter Brune +  steptol - The minimum steplength
9886cc8e53bSPeter Brune .  maxstep - The maximum steplength
989516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
990516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
991516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
992516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
993f40b411bSPeter Brune 
99478bcb3b5SPeter Brune    Level: intermediate
99578bcb3b5SPeter Brune 
99678bcb3b5SPeter Brune    Notes:
99778bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
9983c7d6663SPeter Brune    the type requires.
999516fe3c3SPeter Brune 
1000f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
1001f40b411bSPeter Brune @*/
1002f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
10036a388c36SPeter Brune {
10046a388c36SPeter Brune   PetscFunctionBegin;
1005f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1006516fe3c3SPeter Brune   if (steptol) {
10076a388c36SPeter Brune     PetscValidPointer(steptol, 2);
10086a388c36SPeter Brune     *steptol = linesearch->steptol;
1009516fe3c3SPeter Brune   }
1010516fe3c3SPeter Brune   if (maxstep) {
1011516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
1012516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
1013516fe3c3SPeter Brune   }
1014516fe3c3SPeter Brune   if (rtol) {
1015516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
1016516fe3c3SPeter Brune     *rtol = linesearch->rtol;
1017516fe3c3SPeter Brune   }
1018516fe3c3SPeter Brune   if (atol) {
1019516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
1020516fe3c3SPeter Brune     *atol = linesearch->atol;
1021516fe3c3SPeter Brune   }
1022516fe3c3SPeter Brune   if (ltol) {
1023516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
1024516fe3c3SPeter Brune     *ltol = linesearch->ltol;
1025516fe3c3SPeter Brune   }
1026516fe3c3SPeter Brune   if (max_its) {
1027516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
1028516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1029516fe3c3SPeter Brune   }
10306a388c36SPeter Brune   PetscFunctionReturn(0);
10316a388c36SPeter Brune }
10326a388c36SPeter Brune 
10336a388c36SPeter Brune #undef  __FUNCT__
1034f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
1035f40b411bSPeter Brune /*@
10363c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
103778bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
103878bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
103978bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1040f40b411bSPeter Brune 
1041f40b411bSPeter Brune    Input Parameters:
10428e557f58SPeter Brune +  linesearch - linesearch context
1043516fe3c3SPeter Brune .  steptol - The minimum steplength
10446cc8e53bSPeter Brune .  maxstep - The maximum steplength
1045516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1046516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1047516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1048516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1049f40b411bSPeter Brune 
105078bcb3b5SPeter Brune    Notes:
10513c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
105278bcb3b5SPeter Brune    place of an argument.
1053f40b411bSPeter Brune 
105478bcb3b5SPeter Brune    Level: intermediate
1055516fe3c3SPeter Brune 
1056f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1057f40b411bSPeter Brune @*/
1058f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
10596a388c36SPeter Brune {
10606a388c36SPeter Brune   PetscFunctionBegin;
1061f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1062d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1063d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1064d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1065d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1066d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1067d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1068d3952184SSatish Balay 
1069d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1070ce94432eSBarry Smith     if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
10716a388c36SPeter Brune     linesearch->steptol = steptol;
1072d3952184SSatish Balay   }
1073d3952184SSatish Balay 
1074d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1075ce94432eSBarry Smith     if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1076516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1077d3952184SSatish Balay   }
1078d3952184SSatish Balay 
1079d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1080ce94432eSBarry 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);
1081516fe3c3SPeter Brune     linesearch->rtol = rtol;
1082d3952184SSatish Balay   }
1083d3952184SSatish Balay 
1084d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1085ce94432eSBarry Smith     if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1086516fe3c3SPeter Brune     linesearch->atol = atol;
1087d3952184SSatish Balay   }
1088d3952184SSatish Balay 
1089d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1090ce94432eSBarry Smith     if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol);
1091516fe3c3SPeter Brune     linesearch->ltol = ltol;
1092d3952184SSatish Balay   }
1093d3952184SSatish Balay 
1094d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1095ce94432eSBarry Smith     if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1096516fe3c3SPeter Brune     linesearch->max_its = max_its;
1097d3952184SSatish Balay   }
10986a388c36SPeter Brune   PetscFunctionReturn(0);
10996a388c36SPeter Brune }
11006a388c36SPeter Brune 
11016a388c36SPeter Brune #undef __FUNCT__
1102f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
1103f40b411bSPeter Brune /*@
1104f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1105f40b411bSPeter Brune 
1106f40b411bSPeter Brune    Input Parameters:
11078e557f58SPeter Brune .  linesearch - linesearch context
1108f40b411bSPeter Brune 
1109f40b411bSPeter Brune    Output Parameters:
11108e557f58SPeter Brune .  damping - The damping parameter
1111f40b411bSPeter Brune 
111278bcb3b5SPeter Brune    Level: advanced
1113f40b411bSPeter Brune 
111478bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1115f40b411bSPeter Brune @*/
1116f40b411bSPeter Brune 
1117f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
11186a388c36SPeter Brune {
11196a388c36SPeter Brune   PetscFunctionBegin;
1120f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11216a388c36SPeter Brune   PetscValidPointer(damping, 2);
11226a388c36SPeter Brune   *damping = linesearch->damping;
11236a388c36SPeter Brune   PetscFunctionReturn(0);
11246a388c36SPeter Brune }
11256a388c36SPeter Brune 
11266a388c36SPeter Brune #undef __FUNCT__
1127f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
1128f40b411bSPeter Brune /*@
1129f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
1130f40b411bSPeter Brune 
1131f40b411bSPeter Brune    Input Parameters:
113278bcb3b5SPeter Brune .  linesearch - linesearch context
113378bcb3b5SPeter Brune .  damping - The damping parameter
1134f40b411bSPeter Brune 
1135f40b411bSPeter Brune    Level: intermediate
1136f40b411bSPeter Brune 
1137cd7522eaSPeter Brune    Notes:
1138cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1139cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
114078bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1141cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1142cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1143cd7522eaSPeter Brune 
1144f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1145f40b411bSPeter Brune @*/
1146f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
11476a388c36SPeter Brune {
11486a388c36SPeter Brune   PetscFunctionBegin;
1149f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11506a388c36SPeter Brune   linesearch->damping = damping;
11516a388c36SPeter Brune   PetscFunctionReturn(0);
11526a388c36SPeter Brune }
11536a388c36SPeter Brune 
11546a388c36SPeter Brune #undef __FUNCT__
115559405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder"
115659405d5eSPeter Brune /*@
115759405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
115859405d5eSPeter Brune 
115959405d5eSPeter Brune    Input Parameters:
116078bcb3b5SPeter Brune .  linesearch - linesearch context
116159405d5eSPeter Brune 
116259405d5eSPeter Brune    Output Parameters:
11638e557f58SPeter Brune .  order - The order
116459405d5eSPeter Brune 
116578bcb3b5SPeter Brune    Possible Values for order:
11663c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11673c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11683c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
116978bcb3b5SPeter Brune 
117059405d5eSPeter Brune    Level: intermediate
117159405d5eSPeter Brune 
117259405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
117359405d5eSPeter Brune @*/
117459405d5eSPeter Brune 
1175b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
117659405d5eSPeter Brune {
117759405d5eSPeter Brune   PetscFunctionBegin;
117859405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
117959405d5eSPeter Brune   PetscValidPointer(order, 2);
118059405d5eSPeter Brune   *order = linesearch->order;
118159405d5eSPeter Brune   PetscFunctionReturn(0);
118259405d5eSPeter Brune }
118359405d5eSPeter Brune 
118459405d5eSPeter Brune #undef __FUNCT__
118559405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder"
118659405d5eSPeter Brune /*@
118759405d5eSPeter Brune    SNESLineSearchSetOrder - Sets the line search damping paramter.
118859405d5eSPeter Brune 
118959405d5eSPeter Brune    Input Parameters:
119078bcb3b5SPeter Brune .  linesearch - linesearch context
119178bcb3b5SPeter Brune .  order - The damping parameter
119259405d5eSPeter Brune 
119359405d5eSPeter Brune    Level: intermediate
119459405d5eSPeter Brune 
119578bcb3b5SPeter Brune    Possible Values for order:
11963c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11973c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11983c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
119978bcb3b5SPeter Brune 
120059405d5eSPeter Brune    Notes:
120159405d5eSPeter Brune    Variable orders are supported by the following line searches:
120278bcb3b5SPeter Brune +  bt - cubic and quadratic
120378bcb3b5SPeter Brune -  cp - linear and quadratic
120459405d5eSPeter Brune 
120559405d5eSPeter Brune .seealso: SNESLineSearchGetOrder()
120659405d5eSPeter Brune @*/
1207b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
120859405d5eSPeter Brune {
120959405d5eSPeter Brune   PetscFunctionBegin;
121059405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
121159405d5eSPeter Brune   linesearch->order = order;
121259405d5eSPeter Brune   PetscFunctionReturn(0);
121359405d5eSPeter Brune }
121459405d5eSPeter Brune 
121559405d5eSPeter Brune #undef __FUNCT__
1216f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
1217f40b411bSPeter Brune /*@
1218f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1219f40b411bSPeter Brune 
1220f40b411bSPeter Brune    Input Parameters:
122178bcb3b5SPeter Brune .  linesearch - linesearch context
1222f40b411bSPeter Brune 
1223f40b411bSPeter Brune    Output Parameters:
1224f40b411bSPeter Brune +  xnorm - The norm of the current solution
1225f40b411bSPeter Brune .  fnorm - The norm of the current function
1226f40b411bSPeter Brune -  ynorm - The norm of the current update
1227f40b411bSPeter Brune 
1228cd7522eaSPeter Brune    Notes:
1229cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1230cd7522eaSPeter Brune 
123178bcb3b5SPeter Brune    Level: developer
1232f40b411bSPeter Brune 
1233f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1234f40b411bSPeter Brune @*/
1235f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1236bf7f4e0aSPeter Brune {
1237bf7f4e0aSPeter Brune   PetscFunctionBegin;
1238f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1239f5af7f23SKarl Rupp   if (xnorm) *xnorm = linesearch->xnorm;
1240f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
1241f5af7f23SKarl Rupp   if (ynorm) *ynorm = linesearch->ynorm;
1242bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1243bf7f4e0aSPeter Brune }
1244bf7f4e0aSPeter Brune 
1245e7058c64SPeter Brune #undef __FUNCT__
1246f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
1247f40b411bSPeter Brune /*@
1248f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1249f40b411bSPeter Brune 
1250f40b411bSPeter Brune    Input Parameters:
125178bcb3b5SPeter Brune +  linesearch - linesearch context
1252f40b411bSPeter Brune .  xnorm - The norm of the current solution
1253f40b411bSPeter Brune .  fnorm - The norm of the current function
1254f40b411bSPeter Brune -  ynorm - The norm of the current update
1255f40b411bSPeter Brune 
125678bcb3b5SPeter Brune    Level: advanced
1257f40b411bSPeter Brune 
1258f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1259f40b411bSPeter Brune @*/
1260f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
12616a388c36SPeter Brune {
12626a388c36SPeter Brune   PetscFunctionBegin;
1263f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12646a388c36SPeter Brune   linesearch->xnorm = xnorm;
12656a388c36SPeter Brune   linesearch->fnorm = fnorm;
12666a388c36SPeter Brune   linesearch->ynorm = ynorm;
12676a388c36SPeter Brune   PetscFunctionReturn(0);
12686a388c36SPeter Brune }
12696a388c36SPeter Brune 
12706a388c36SPeter Brune #undef __FUNCT__
1271f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
1272f40b411bSPeter Brune /*@
1273f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1274f40b411bSPeter Brune 
1275f40b411bSPeter Brune    Input Parameters:
127678bcb3b5SPeter Brune .  linesearch - linesearch context
1277f40b411bSPeter Brune 
1278f40b411bSPeter Brune    Options Database Keys:
12798e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1280f40b411bSPeter Brune 
1281f40b411bSPeter Brune    Level: intermediate
1282f40b411bSPeter Brune 
128378bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1284f40b411bSPeter Brune @*/
1285f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
12866a388c36SPeter Brune {
12876a388c36SPeter Brune   PetscErrorCode ierr;
12889bd66eb0SPeter Brune   SNES           snes;
1289bf388a1fSBarry Smith 
12906a388c36SPeter Brune   PetscFunctionBegin;
12916a388c36SPeter Brune   if (linesearch->norms) {
12929bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1293f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
12949bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12959bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12969bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
12979bd66eb0SPeter Brune     } else {
12986a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12996a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13006a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13016a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
13026a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13036a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13046a388c36SPeter Brune     }
13059bd66eb0SPeter Brune   }
13066a388c36SPeter Brune   PetscFunctionReturn(0);
13076a388c36SPeter Brune }
13086a388c36SPeter Brune 
13096f263ca3SPeter Brune #undef __FUNCT__
13106f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms"
13116f263ca3SPeter Brune /*@
13126f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
13136f263ca3SPeter Brune 
13146f263ca3SPeter Brune    Input Parameters:
131578bcb3b5SPeter Brune +  linesearch  - linesearch context
131678bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
13176f263ca3SPeter Brune 
13186f263ca3SPeter Brune    Options Database Keys:
13198e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
13206f263ca3SPeter Brune 
13216f263ca3SPeter Brune    Notes:
13221a4f838cSPeter Brune    This is most relevant to the SNESLINESEARCHBASIC line search type.
13236f263ca3SPeter Brune 
13246f263ca3SPeter Brune    Level: intermediate
13256f263ca3SPeter Brune 
13261a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13276f263ca3SPeter Brune @*/
13286f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13296f263ca3SPeter Brune {
13306f263ca3SPeter Brune   PetscFunctionBegin;
13316f263ca3SPeter Brune   linesearch->norms = flg;
13326f263ca3SPeter Brune   PetscFunctionReturn(0);
13336f263ca3SPeter Brune }
13346f263ca3SPeter Brune 
13356a388c36SPeter Brune #undef __FUNCT__
1336f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1337f40b411bSPeter Brune /*@
1338f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1339f40b411bSPeter Brune 
1340f40b411bSPeter Brune    Input Parameters:
134178bcb3b5SPeter Brune .  linesearch - linesearch context
1342f40b411bSPeter Brune 
1343f40b411bSPeter Brune    Output Parameters:
13446232e825SPeter Brune +  X - Solution vector
13456232e825SPeter Brune .  F - Function vector
13466232e825SPeter Brune .  Y - Search direction vector
13476232e825SPeter Brune .  W - Solution work vector
13486232e825SPeter Brune -  G - Function work vector
13496232e825SPeter Brune 
13507bba9028SPeter Brune    Notes:
13517bba9028SPeter Brune    At the beginning of a line search application, X should contain a
13526232e825SPeter Brune    solution and the vector F the function computed at X.  At the end of the
13536232e825SPeter Brune    line search application, X should contain the new solution, and F the
13546232e825SPeter Brune    function evaluated at the new solution.
1355f40b411bSPeter Brune 
13562a7a6963SBarry Smith    These vectors are owned by the SNESLineSearch and should not be destroyed by the caller
13572a7a6963SBarry Smith 
135878bcb3b5SPeter Brune    Level: advanced
1359f40b411bSPeter Brune 
1360f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1361f40b411bSPeter Brune @*/
1362bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1363bf388a1fSBarry Smith {
13646a388c36SPeter Brune   PetscFunctionBegin;
1365f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13666a388c36SPeter Brune   if (X) {
13676a388c36SPeter Brune     PetscValidPointer(X, 2);
13686a388c36SPeter Brune     *X = linesearch->vec_sol;
13696a388c36SPeter Brune   }
13706a388c36SPeter Brune   if (F) {
13716a388c36SPeter Brune     PetscValidPointer(F, 3);
13726a388c36SPeter Brune     *F = linesearch->vec_func;
13736a388c36SPeter Brune   }
13746a388c36SPeter Brune   if (Y) {
13756a388c36SPeter Brune     PetscValidPointer(Y, 4);
13766a388c36SPeter Brune     *Y = linesearch->vec_update;
13776a388c36SPeter Brune   }
13786a388c36SPeter Brune   if (W) {
13796a388c36SPeter Brune     PetscValidPointer(W, 5);
13806a388c36SPeter Brune     *W = linesearch->vec_sol_new;
13816a388c36SPeter Brune   }
13826a388c36SPeter Brune   if (G) {
13836a388c36SPeter Brune     PetscValidPointer(G, 6);
13846a388c36SPeter Brune     *G = linesearch->vec_func_new;
13856a388c36SPeter Brune   }
13866a388c36SPeter Brune   PetscFunctionReturn(0);
13876a388c36SPeter Brune }
13886a388c36SPeter Brune 
13896a388c36SPeter Brune #undef __FUNCT__
1390f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1391f40b411bSPeter Brune /*@
1392f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1393f40b411bSPeter Brune 
1394f40b411bSPeter Brune    Input Parameters:
139578bcb3b5SPeter Brune +  linesearch - linesearch context
13966232e825SPeter Brune .  X - Solution vector
13976232e825SPeter Brune .  F - Function vector
13986232e825SPeter Brune .  Y - Search direction vector
13996232e825SPeter Brune .  W - Solution work vector
14006232e825SPeter Brune -  G - Function work vector
1401f40b411bSPeter Brune 
140278bcb3b5SPeter Brune    Level: advanced
1403f40b411bSPeter Brune 
1404f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1405f40b411bSPeter Brune @*/
1406bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1407bf388a1fSBarry Smith {
14086a388c36SPeter Brune   PetscFunctionBegin;
1409f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14106a388c36SPeter Brune   if (X) {
14116a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
14126a388c36SPeter Brune     linesearch->vec_sol = X;
14136a388c36SPeter Brune   }
14146a388c36SPeter Brune   if (F) {
14156a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
14166a388c36SPeter Brune     linesearch->vec_func = F;
14176a388c36SPeter Brune   }
14186a388c36SPeter Brune   if (Y) {
14196a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
14206a388c36SPeter Brune     linesearch->vec_update = Y;
14216a388c36SPeter Brune   }
14226a388c36SPeter Brune   if (W) {
14236a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
14246a388c36SPeter Brune     linesearch->vec_sol_new = W;
14256a388c36SPeter Brune   }
14266a388c36SPeter Brune   if (G) {
14276a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14286a388c36SPeter Brune     linesearch->vec_func_new = G;
14296a388c36SPeter Brune   }
14306a388c36SPeter Brune   PetscFunctionReturn(0);
14316a388c36SPeter Brune }
14326a388c36SPeter Brune 
14336a388c36SPeter Brune #undef __FUNCT__
1434f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1435e7058c64SPeter Brune /*@C
1436f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1437e7058c64SPeter Brune    SNES options in the database.
1438e7058c64SPeter Brune 
1439cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1440e7058c64SPeter Brune 
1441e7058c64SPeter Brune    Input Parameters:
1442e7058c64SPeter Brune +  snes - the SNES context
1443e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1444e7058c64SPeter Brune 
1445e7058c64SPeter Brune    Notes:
1446e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1447e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1448e7058c64SPeter Brune 
1449e7058c64SPeter Brune    Level: advanced
1450e7058c64SPeter Brune 
1451f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1452e7058c64SPeter Brune 
1453e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1454e7058c64SPeter Brune @*/
1455f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1456e7058c64SPeter Brune {
1457e7058c64SPeter Brune   PetscErrorCode ierr;
1458e7058c64SPeter Brune 
1459e7058c64SPeter Brune   PetscFunctionBegin;
1460f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1461e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1462e7058c64SPeter Brune   PetscFunctionReturn(0);
1463e7058c64SPeter Brune }
1464e7058c64SPeter Brune 
1465e7058c64SPeter Brune #undef __FUNCT__
1466f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1467e7058c64SPeter Brune /*@C
1468f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1469f1c6b773SPeter Brune    SNESLineSearch options in the database.
1470e7058c64SPeter Brune 
1471e7058c64SPeter Brune    Not Collective
1472e7058c64SPeter Brune 
1473e7058c64SPeter Brune    Input Parameter:
1474cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1475e7058c64SPeter Brune 
1476e7058c64SPeter Brune    Output Parameter:
1477e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1478e7058c64SPeter Brune 
14798e557f58SPeter Brune    Notes:
14808e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1481e7058c64SPeter Brune    sufficient length to hold the prefix.
1482e7058c64SPeter Brune 
1483e7058c64SPeter Brune    Level: advanced
1484e7058c64SPeter Brune 
1485f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1486e7058c64SPeter Brune 
1487e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1488e7058c64SPeter Brune @*/
1489f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1490e7058c64SPeter Brune {
1491e7058c64SPeter Brune   PetscErrorCode ierr;
1492e7058c64SPeter Brune 
1493e7058c64SPeter Brune   PetscFunctionBegin;
1494f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1495e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1496e7058c64SPeter Brune   PetscFunctionReturn(0);
1497e7058c64SPeter Brune }
1498bf7f4e0aSPeter Brune 
1499bf7f4e0aSPeter Brune #undef __FUNCT__
1500fa0ddf94SBarry Smith #define __FUNCT__ "SNESLineSearchSetWorkVecs"
15018d359177SBarry Smith /*@C
1502fa0ddf94SBarry Smith    SNESLineSearchSetWorkVecs - Gets work vectors for the line search.
1503f40b411bSPeter Brune 
1504f40b411bSPeter Brune    Input Parameter:
1505f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1506f40b411bSPeter Brune -  nwork - the number of work vectors
1507f40b411bSPeter Brune 
1508f40b411bSPeter Brune    Level: developer
1509f40b411bSPeter Brune 
1510fa0ddf94SBarry Smith    Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations
1511cd7522eaSPeter Brune 
1512f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1513f40b411bSPeter Brune 
1514fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs()
1515f40b411bSPeter Brune @*/
1516fa0ddf94SBarry Smith PetscErrorCode  SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork)
1517bf7f4e0aSPeter Brune {
1518bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1519bf388a1fSBarry Smith 
1520bf7f4e0aSPeter Brune   PetscFunctionBegin;
1521bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1522bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
15238d359177SBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1524bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1525bf7f4e0aSPeter Brune }
1526bf7f4e0aSPeter Brune 
1527bf7f4e0aSPeter Brune #undef __FUNCT__
1528f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1529f40b411bSPeter Brune /*@
1530f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1531f40b411bSPeter Brune 
1532f40b411bSPeter Brune    Input Parameters:
153378bcb3b5SPeter Brune .  linesearch - linesearch context
1534f40b411bSPeter Brune 
1535f40b411bSPeter Brune    Output Parameters:
15368e557f58SPeter Brune .  success - The success or failure status
1537f40b411bSPeter Brune 
1538cd7522eaSPeter Brune    Notes:
1539c98378a5SBarry Smith    This is typically called after SNESLineSearchApply() in order to determine if the line-search failed
1540cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1541cd7522eaSPeter Brune 
1542f40b411bSPeter Brune    Level: intermediate
1543f40b411bSPeter Brune 
1544f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1545f40b411bSPeter Brune @*/
1546f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1547bf7f4e0aSPeter Brune {
1548bf7f4e0aSPeter Brune   PetscFunctionBegin;
1549f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15506a388c36SPeter Brune   PetscValidPointer(success, 2);
1551f5af7f23SKarl Rupp   if (success) *success = linesearch->success;
1552bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1553bf7f4e0aSPeter Brune }
1554bf7f4e0aSPeter Brune 
1555bf7f4e0aSPeter Brune #undef __FUNCT__
1556f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1557f40b411bSPeter Brune /*@
1558f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1559f40b411bSPeter Brune 
1560f40b411bSPeter Brune    Input Parameters:
156178bcb3b5SPeter Brune +  linesearch - linesearch context
15628e557f58SPeter Brune -  success - The success or failure status
1563f40b411bSPeter Brune 
1564cd7522eaSPeter Brune    Notes:
1565cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1566cd7522eaSPeter Brune    the success or failure of the line search method.
1567cd7522eaSPeter Brune 
156878bcb3b5SPeter Brune    Level: developer
1569f40b411bSPeter Brune 
1570f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1571f40b411bSPeter Brune @*/
1572f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
15736a388c36SPeter Brune {
15746a388c36SPeter Brune   PetscFunctionBegin;
15755fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15766a388c36SPeter Brune   linesearch->success = success;
15776a388c36SPeter Brune   PetscFunctionReturn(0);
15786a388c36SPeter Brune }
15796a388c36SPeter Brune 
15806a388c36SPeter Brune #undef __FUNCT__
1581f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
15829bd66eb0SPeter Brune /*@C
1583f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
15849bd66eb0SPeter Brune 
15859bd66eb0SPeter Brune    Input Parameters:
15869bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
15879bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
15889bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
15899bd66eb0SPeter Brune 
15909bd66eb0SPeter Brune    Logically Collective on SNES
15919bd66eb0SPeter Brune 
15929bd66eb0SPeter Brune    Calling sequence of projectfunc:
15939bd66eb0SPeter Brune .vb
15949bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
15959bd66eb0SPeter Brune .ve
15969bd66eb0SPeter Brune 
15979bd66eb0SPeter Brune     Input parameters for projectfunc:
15989bd66eb0SPeter Brune +   snes - nonlinear context
15999bd66eb0SPeter Brune -   X - current solution
16009bd66eb0SPeter Brune 
1601cd7522eaSPeter Brune     Output parameters for projectfunc:
16029bd66eb0SPeter Brune .   X - Projected solution
16039bd66eb0SPeter Brune 
16049bd66eb0SPeter Brune    Calling sequence of normfunc:
16059bd66eb0SPeter Brune .vb
16069bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
16079bd66eb0SPeter Brune .ve
16089bd66eb0SPeter Brune 
1609cd7522eaSPeter Brune     Input parameters for normfunc:
16109bd66eb0SPeter Brune +   snes - nonlinear context
16119bd66eb0SPeter Brune .   X - current solution
16129bd66eb0SPeter Brune -   F - current residual
16139bd66eb0SPeter Brune 
1614cd7522eaSPeter Brune     Output parameters for normfunc:
16159bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
16169bd66eb0SPeter Brune 
1617cd7522eaSPeter Brune     Notes:
1618cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1619cd7522eaSPeter Brune 
1620cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1621cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
16229bd66eb0SPeter Brune 
16239bd66eb0SPeter Brune     Level: developer
16249bd66eb0SPeter Brune 
16259bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
16269bd66eb0SPeter Brune 
1627f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16289bd66eb0SPeter Brune @*/
1629f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16309bd66eb0SPeter Brune {
16319bd66eb0SPeter Brune   PetscFunctionBegin;
1632f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16339bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16349bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16359bd66eb0SPeter Brune   PetscFunctionReturn(0);
16369bd66eb0SPeter Brune }
16379bd66eb0SPeter Brune 
16389bd66eb0SPeter Brune #undef __FUNCT__
1639f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
16409bd66eb0SPeter Brune /*@C
1641f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16429bd66eb0SPeter Brune 
16439bd66eb0SPeter Brune    Input Parameters:
1644907376e6SBarry Smith .  linesearch - the line search context, obtain with SNESGetLineSearch()
16459bd66eb0SPeter Brune 
16469bd66eb0SPeter Brune    Output Parameters:
16479bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16489bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16499bd66eb0SPeter Brune 
16509bd66eb0SPeter Brune    Logically Collective on SNES
16519bd66eb0SPeter Brune 
16529bd66eb0SPeter Brune     Level: developer
16539bd66eb0SPeter Brune 
16549bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
16559bd66eb0SPeter Brune 
1656f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16579bd66eb0SPeter Brune @*/
1658f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16599bd66eb0SPeter Brune {
16609bd66eb0SPeter Brune   PetscFunctionBegin;
16619bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16629bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16639bd66eb0SPeter Brune   PetscFunctionReturn(0);
16649bd66eb0SPeter Brune }
16659bd66eb0SPeter Brune 
16669bd66eb0SPeter Brune #undef __FUNCT__
1667f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1668bf7f4e0aSPeter Brune /*@C
16691c84c290SBarry Smith   SNESLineSearchRegister - See SNESLineSearchRegister()
1670bf7f4e0aSPeter Brune 
1671bf7f4e0aSPeter Brune   Level: advanced
1672bf7f4e0aSPeter Brune @*/
1673bdf89e91SBarry Smith PetscErrorCode  SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch))
1674bf7f4e0aSPeter Brune {
1675bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1676bf7f4e0aSPeter Brune 
1677bf7f4e0aSPeter Brune   PetscFunctionBegin;
1678a240a19fSJed Brown   ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr);
1679bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1680bf7f4e0aSPeter Brune }
1681