xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision e04113cf637149666d9c83678a5abc4e1b351bcc)
1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
3f1c6b773SPeter Brune PetscBool         SNESLineSearchRegisterAllCalled = PETSC_FALSE;
40298fd71SBarry Smith PetscFunctionList SNESLineSearchList              = NULL;
5bf7f4e0aSPeter Brune 
6f1c6b773SPeter Brune PetscClassId  SNESLINESEARCH_CLASSID;
7f1c6b773SPeter Brune PetscLogEvent SNESLineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
10f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate"
11f40b411bSPeter Brune /*@
12cd7522eaSPeter Brune    SNESLineSearchCreate - Creates the line search context.
13f40b411bSPeter Brune 
14cd7522eaSPeter Brune    Logically Collective on Comm
15f40b411bSPeter Brune 
16f40b411bSPeter Brune    Input Parameters:
17cd7522eaSPeter Brune .  comm - MPI communicator for the line search (typically from the associated SNES context).
18f40b411bSPeter Brune 
19f40b411bSPeter Brune    Output Parameters:
208e557f58SPeter Brune .  outlinesearch - the new linesearch context
21f40b411bSPeter Brune 
2278bcb3b5SPeter Brune    Level: beginner
23f40b411bSPeter Brune 
24cd7522eaSPeter Brune .keywords: LineSearch, create, context
25f40b411bSPeter Brune 
26f40b411bSPeter Brune .seealso: LineSearchDestroy()
27f40b411bSPeter Brune @*/
28f40b411bSPeter Brune 
29bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch)
30bf388a1fSBarry Smith {
31bf7f4e0aSPeter Brune   PetscErrorCode ierr;
32f1c6b773SPeter Brune   SNESLineSearch linesearch;
33bf388a1fSBarry Smith 
34bf7f4e0aSPeter Brune   PetscFunctionBegin;
35ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
360298fd71SBarry Smith   *outlinesearch = NULL;
37f5af7f23SKarl Rupp 
3867c2884eSBarry Smith   ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr);
39bf7f4e0aSPeter Brune 
400298fd71SBarry Smith   linesearch->ops->precheck  = NULL;
410298fd71SBarry Smith   linesearch->ops->postcheck = NULL;
42bf7f4e0aSPeter Brune 
430298fd71SBarry Smith   linesearch->vec_sol_new  = NULL;
440298fd71SBarry Smith   linesearch->vec_func_new = NULL;
450298fd71SBarry Smith   linesearch->vec_sol      = NULL;
460298fd71SBarry Smith   linesearch->vec_func     = NULL;
470298fd71SBarry Smith   linesearch->vec_update   = NULL;
489bd66eb0SPeter Brune 
49bf7f4e0aSPeter Brune   linesearch->lambda       = 1.0;
50bf7f4e0aSPeter Brune   linesearch->fnorm        = 1.0;
51bf7f4e0aSPeter Brune   linesearch->ynorm        = 1.0;
52bf7f4e0aSPeter Brune   linesearch->xnorm        = 1.0;
53bf7f4e0aSPeter Brune   linesearch->success      = PETSC_TRUE;
54bf7f4e0aSPeter Brune   linesearch->norms        = PETSC_TRUE;
55bf7f4e0aSPeter Brune   linesearch->keeplambda   = PETSC_FALSE;
56bf7f4e0aSPeter Brune   linesearch->damping      = 1.0;
57bf7f4e0aSPeter Brune   linesearch->maxstep      = 1e8;
58bf7f4e0aSPeter Brune   linesearch->steptol      = 1e-12;
59516fe3c3SPeter Brune   linesearch->rtol         = 1e-8;
60516fe3c3SPeter Brune   linesearch->atol         = 1e-15;
61516fe3c3SPeter Brune   linesearch->ltol         = 1e-8;
620298fd71SBarry Smith   linesearch->precheckctx  = NULL;
630298fd71SBarry Smith   linesearch->postcheckctx = NULL;
6459405d5eSPeter Brune   linesearch->max_its      = 1;
65bf7f4e0aSPeter Brune   linesearch->setupcalled  = PETSC_FALSE;
66bf7f4e0aSPeter Brune   *outlinesearch           = linesearch;
67bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
68bf7f4e0aSPeter Brune }
69bf7f4e0aSPeter Brune 
70bf7f4e0aSPeter Brune #undef __FUNCT__
71f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp"
72f40b411bSPeter Brune /*@
7378bcb3b5SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied by allocating
7478bcb3b5SPeter Brune    any required vectors.
75f40b411bSPeter Brune 
76cd7522eaSPeter Brune    Collective on SNESLineSearch
77f40b411bSPeter Brune 
78f40b411bSPeter Brune    Input Parameters:
79f40b411bSPeter Brune .  linesearch - The LineSearch instance.
80f40b411bSPeter Brune 
81cd7522eaSPeter Brune    Notes:
82cd7522eaSPeter Brune    For most cases, this needn't be called outside of SNESLineSearchApply().
83cd7522eaSPeter Brune    The only current case where this is called outside of this is for the VI
8478bcb3b5SPeter Brune    solvers, which modify the solution and work vectors before the first call
85cd7522eaSPeter Brune    of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be
86cd7522eaSPeter Brune    allocated upfront.
87cd7522eaSPeter Brune 
8878bcb3b5SPeter Brune    Level: advanced
89f40b411bSPeter Brune 
90f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp
91f40b411bSPeter Brune 
92f1c6b773SPeter Brune .seealso: SNESLineSearchReset()
93f40b411bSPeter Brune @*/
94f40b411bSPeter Brune 
95bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch)
96bf388a1fSBarry Smith {
97bf7f4e0aSPeter Brune   PetscErrorCode ierr;
98bf388a1fSBarry Smith 
99bf7f4e0aSPeter Brune   PetscFunctionBegin;
100bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
1011a4f838cSPeter Brune     ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr);
102bf7f4e0aSPeter Brune   }
103bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
1049bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
105bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
1069bd66eb0SPeter Brune     }
1079bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
1089bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
1099bd66eb0SPeter Brune     }
110bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
111bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
112bf7f4e0aSPeter Brune     }
113ed07d7d7SPeter Brune     if (!linesearch->ops->snesfunc) {ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunction);CHKERRQ(ierr);}
114bf7f4e0aSPeter Brune     linesearch->lambda      = linesearch->damping;
115bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
116bf7f4e0aSPeter Brune   }
117bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
118bf7f4e0aSPeter Brune }
119bf7f4e0aSPeter Brune 
120bf7f4e0aSPeter Brune #undef __FUNCT__
121f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset"
122f40b411bSPeter Brune 
123f40b411bSPeter Brune /*@
12478bcb3b5SPeter Brune    SNESLineSearchReset - Undoes the SetUp and deletes any Vecs or Mats allocated by the line search.
125f40b411bSPeter Brune 
126f1c6b773SPeter Brune    Collective on SNESLineSearch
127f40b411bSPeter Brune 
128f40b411bSPeter Brune    Input Parameters:
129f40b411bSPeter Brune .  linesearch - The LineSearch instance.
130f40b411bSPeter Brune 
13178bcb3b5SPeter Brune    Level: intermediate
132f40b411bSPeter Brune 
133cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset
134f40b411bSPeter Brune 
135f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp()
136f40b411bSPeter Brune @*/
137f40b411bSPeter Brune 
138bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
139bf388a1fSBarry Smith {
140bf7f4e0aSPeter Brune   PetscErrorCode ierr;
141bf388a1fSBarry Smith 
142bf7f4e0aSPeter Brune   PetscFunctionBegin;
143f5af7f23SKarl Rupp   if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch);
144f5af7f23SKarl Rupp 
145bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
146bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
147bf7f4e0aSPeter Brune 
148bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
149f5af7f23SKarl Rupp 
150bf7f4e0aSPeter Brune   linesearch->nwork       = 0;
151bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
152bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
153bf7f4e0aSPeter Brune }
154bf7f4e0aSPeter Brune 
155ed07d7d7SPeter Brune #undef __FUNCT__
156ed07d7d7SPeter Brune #define __FUNCT__ "SNESLineSearchSetFunction"
157ed07d7d7SPeter Brune /*@C
158ed07d7d7SPeter Brune    SNESLineSearchSetPreCheck - Sets the function evaluation context on the
159ed07d7d7SPeter Brune 
160ed07d7d7SPeter Brune    Input Parameters:
161ed07d7d7SPeter Brune .  linesearch - the SNESLineSearch context
162ed07d7d7SPeter Brune 
163ed07d7d7SPeter Brune    Output Parameters:
164ed07d7d7SPeter Brune +  func       - [optional] function evaluation routine
165ed07d7d7SPeter Brune 
166ed07d7d7SPeter Brune    Level: developer
167ed07d7d7SPeter Brune 
168ed07d7d7SPeter Brune .keywords: get, linesearch, pre-check
169ed07d7d7SPeter Brune 
170ed07d7d7SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
171ed07d7d7SPeter Brune @*/
172ed07d7d7SPeter Brune PetscErrorCode  SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec))
173ed07d7d7SPeter Brune {
174ed07d7d7SPeter Brune   PetscFunctionBegin;
175ed07d7d7SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
176ed07d7d7SPeter Brune   linesearch->ops->snesfunc = func;
177ed07d7d7SPeter Brune   PetscFunctionReturn(0);
178ed07d7d7SPeter Brune }
179ed07d7d7SPeter Brune 
180ed07d7d7SPeter Brune 
1816b2b7091SBarry Smith /*MC
1826b2b7091SBarry Smith     SNESLineSearchPreCheckFunction - functional form passed to check before line search is called
1836b2b7091SBarry Smith 
1846b2b7091SBarry Smith      Synopsis:
1856b2b7091SBarry Smith      #include "petscsnes.h"
1866b2b7091SBarry Smith      SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed);
1876b2b7091SBarry Smith 
1886b2b7091SBarry Smith        Input Parameters:
1896b2b7091SBarry Smith +      x - solution vector
1906b2b7091SBarry Smith .      y - search direction vector
1916b2b7091SBarry Smith -      changed - flag to indicate the precheck changed x or y.
1926b2b7091SBarry Smith 
193878cb397SSatish Balay    Level: advanced
194878cb397SSatish Balay 
1956b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
1966b2b7091SBarry Smith M*/
1976b2b7091SBarry Smith 
19886d74e61SPeter Brune #undef __FUNCT__
199f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck"
20086d74e61SPeter Brune /*@C
201f1c6b773SPeter Brune    SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
20286d74e61SPeter Brune 
203f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
20486d74e61SPeter Brune 
20586d74e61SPeter Brune    Input Parameters:
206f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
2076b2b7091SBarry Smith .  SNESLineSearchPreCheckFunction - [optional] function evaluation routine
20886d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2090298fd71SBarry Smith                 function evaluation routine (may be NULL)
21086d74e61SPeter Brune 
21186d74e61SPeter Brune 
21286d74e61SPeter Brune    Level: intermediate
21386d74e61SPeter Brune 
21486d74e61SPeter Brune .keywords: set, linesearch, pre-check
21586d74e61SPeter Brune 
216f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck()
21786d74e61SPeter Brune @*/
2186b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
21986d74e61SPeter Brune {
2209bd66eb0SPeter Brune   PetscFunctionBegin;
221f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2226b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) linesearch->ops->precheck = SNESLineSearchPreCheckFunction;
22386d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
22486d74e61SPeter Brune   PetscFunctionReturn(0);
22586d74e61SPeter Brune }
22686d74e61SPeter Brune 
22786d74e61SPeter Brune #undef __FUNCT__
228f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck"
22986d74e61SPeter Brune /*@C
230cd7522eaSPeter Brune    SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine.
23186d74e61SPeter Brune 
23286d74e61SPeter Brune    Input Parameters:
233f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
23486d74e61SPeter Brune 
23586d74e61SPeter Brune    Output Parameters:
23686d74e61SPeter Brune +  func       - [optional] function evaluation routine
23786d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2380298fd71SBarry Smith                 function evaluation routine (may be NULL)
23986d74e61SPeter Brune 
24086d74e61SPeter Brune    Level: intermediate
24186d74e61SPeter Brune 
24286d74e61SPeter Brune .keywords: get, linesearch, pre-check
24386d74e61SPeter Brune 
244f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
24586d74e61SPeter Brune @*/
2466b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
24786d74e61SPeter Brune {
2489bd66eb0SPeter Brune   PetscFunctionBegin;
249f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2506b2b7091SBarry Smith   if (SNESLineSearchPreCheckFunction) *SNESLineSearchPreCheckFunction = linesearch->ops->precheck;
25186d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
25286d74e61SPeter Brune   PetscFunctionReturn(0);
25386d74e61SPeter Brune }
25486d74e61SPeter Brune 
2556b2b7091SBarry Smith /*MC
2566b2b7091SBarry Smith     SNESLineSearchPostheckFunction - functional form that is called after line search is complete
2576b2b7091SBarry Smith 
2586b2b7091SBarry Smith      Synopsis:
2596b2b7091SBarry Smith      #include "petscsnes.h"
2606b2b7091SBarry Smith      SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y,  Vec w, *changed_y, PetscBool *changed_w);
2616b2b7091SBarry Smith 
2626b2b7091SBarry Smith      Input Parameters:
2636b2b7091SBarry Smith +      x - old solution vector
2646b2b7091SBarry Smith .      y - search direction vector
2656b2b7091SBarry Smith .      w - new solution vector
2666b2b7091SBarry Smith .      changed_y - indicates that the line search changed y
2676b2b7091SBarry Smith -      changed_w - indicates that the line search changed w
2686b2b7091SBarry Smith 
269878cb397SSatish Balay    Level: advanced
2706b2b7091SBarry Smith 
2716b2b7091SBarry Smith .seealso:   SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
2726b2b7091SBarry Smith M*/
2736b2b7091SBarry Smith 
27486d74e61SPeter Brune #undef __FUNCT__
275f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck"
27686d74e61SPeter Brune /*@C
277f1c6b773SPeter Brune    SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine.
27886d74e61SPeter Brune 
279f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
28086d74e61SPeter Brune 
28186d74e61SPeter Brune    Input Parameters:
282f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
2836b2b7091SBarry Smith .  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
28486d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
2850298fd71SBarry Smith                 function evaluation routine (may be NULL)
28686d74e61SPeter Brune 
28786d74e61SPeter Brune    Level: intermediate
28886d74e61SPeter Brune 
28986d74e61SPeter Brune .keywords: set, linesearch, post-check
29086d74e61SPeter Brune 
291f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck()
29286d74e61SPeter Brune @*/
2936b2b7091SBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx)
29486d74e61SPeter Brune {
29586d74e61SPeter Brune   PetscFunctionBegin;
296f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
2976b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) linesearch->ops->postcheck = SNESLineSearchPostCheckFunction;
29886d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
29986d74e61SPeter Brune   PetscFunctionReturn(0);
30086d74e61SPeter Brune }
30186d74e61SPeter Brune 
30286d74e61SPeter Brune #undef __FUNCT__
303f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck"
30486d74e61SPeter Brune /*@C
305f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
30686d74e61SPeter Brune 
30786d74e61SPeter Brune    Input Parameters:
308f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
30986d74e61SPeter Brune 
31086d74e61SPeter Brune    Output Parameters:
3116b2b7091SBarry Smith +  SNESLineSearchPostCheckFunction - [optional] function evaluation routine
31286d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
3130298fd71SBarry Smith                 function evaluation routine (may be NULL)
31486d74e61SPeter Brune 
31586d74e61SPeter Brune    Level: intermediate
31686d74e61SPeter Brune 
31786d74e61SPeter Brune .keywords: get, linesearch, post-check
31886d74e61SPeter Brune 
319f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck()
32086d74e61SPeter Brune @*/
3216b2b7091SBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx)
32286d74e61SPeter Brune {
3239bd66eb0SPeter Brune   PetscFunctionBegin;
324f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
3256b2b7091SBarry Smith   if (SNESLineSearchPostCheckFunction) *SNESLineSearchPostCheckFunction = linesearch->ops->postcheck;
32686d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
32786d74e61SPeter Brune   PetscFunctionReturn(0);
32886d74e61SPeter Brune }
32986d74e61SPeter Brune 
330bf7f4e0aSPeter Brune #undef __FUNCT__
331f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck"
332f40b411bSPeter Brune /*@
333f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
334f40b411bSPeter Brune 
335cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
336f40b411bSPeter Brune 
337f40b411bSPeter Brune    Input Parameters:
3387b1df9c1SPeter Brune +  linesearch - The linesearch instance.
3397b1df9c1SPeter Brune .  X - The current solution
3407b1df9c1SPeter Brune -  Y - The step direction
341f40b411bSPeter Brune 
342f40b411bSPeter Brune    Output Parameters:
3438e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
344f40b411bSPeter Brune 
345f40b411bSPeter Brune    Level: Beginner
346f40b411bSPeter Brune 
347f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
348f40b411bSPeter Brune 
349f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck()
350f40b411bSPeter Brune @*/
3517b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
352bf7f4e0aSPeter Brune {
353bf7f4e0aSPeter Brune   PetscErrorCode ierr;
3545fd66863SKarl Rupp 
355bf7f4e0aSPeter Brune   PetscFunctionBegin;
356bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
3576b2b7091SBarry Smith   if (linesearch->ops->precheck) {
3586b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
35938bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
360bf7f4e0aSPeter Brune   }
361bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
362bf7f4e0aSPeter Brune }
363bf7f4e0aSPeter Brune 
364bf7f4e0aSPeter Brune #undef __FUNCT__
365f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
366f40b411bSPeter Brune /*@
367f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
368f40b411bSPeter Brune 
369cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
370f40b411bSPeter Brune 
371f40b411bSPeter Brune    Input Parameters:
3727b1df9c1SPeter Brune +  linesearch - The linesearch context
3737b1df9c1SPeter Brune .  X - The last solution
3747b1df9c1SPeter Brune .  Y - The step direction
3757b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
376f40b411bSPeter Brune 
377f40b411bSPeter Brune    Output Parameters:
37878bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
37978bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
380f40b411bSPeter Brune 
381f40b411bSPeter Brune    Level: Intermediate
382f40b411bSPeter Brune 
383f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
384f40b411bSPeter Brune 
385f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck()
386f40b411bSPeter Brune @*/
3877b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
388bf7f4e0aSPeter Brune {
389bf7f4e0aSPeter Brune   PetscErrorCode ierr;
390bf388a1fSBarry Smith 
391bf7f4e0aSPeter Brune   PetscFunctionBegin;
392bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
393bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
3946b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
3956b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
39638bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
39738bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
39886d74e61SPeter Brune   }
39986d74e61SPeter Brune   PetscFunctionReturn(0);
40086d74e61SPeter Brune }
40186d74e61SPeter Brune 
40286d74e61SPeter Brune #undef __FUNCT__
403f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
40486d74e61SPeter Brune /*@C
40586d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
40686d74e61SPeter Brune 
407cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
40886d74e61SPeter Brune 
40986d74e61SPeter Brune    Input Arguments:
41086d74e61SPeter Brune +  linesearch - linesearch context
41186d74e61SPeter Brune .  X - base state for this step
41286d74e61SPeter Brune .  Y - initial correction
41386d74e61SPeter Brune 
41486d74e61SPeter Brune    Output Arguments:
41586d74e61SPeter Brune +  Y - correction, possibly modified
41686d74e61SPeter Brune -  changed - flag indicating that Y was modified
41786d74e61SPeter Brune 
41886d74e61SPeter Brune    Options Database Key:
419cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
420cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
42186d74e61SPeter Brune 
42286d74e61SPeter Brune    Level: advanced
42386d74e61SPeter Brune 
42486d74e61SPeter Brune    Notes:
42586d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
42686d74e61SPeter Brune 
42786d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
42886d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
42986d74e61SPeter Brune    is generally not useful when using a Newton linearization.
43086d74e61SPeter Brune 
43186d74e61SPeter Brune    Reference:
43286d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
43386d74e61SPeter Brune 
43486d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
43586d74e61SPeter Brune @*/
436f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
43786d74e61SPeter Brune {
43886d74e61SPeter Brune   PetscErrorCode ierr;
43986d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
44086d74e61SPeter Brune   Vec            Ylast;
44186d74e61SPeter Brune   PetscScalar    dot;
44286d74e61SPeter Brune   PetscInt       iter;
44386d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
44486d74e61SPeter Brune   SNES           snes;
44586d74e61SPeter Brune 
44686d74e61SPeter Brune   PetscFunctionBegin;
447f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
44886d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
44986d74e61SPeter Brune   if (!Ylast) {
45086d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
45186d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
45286d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
45386d74e61SPeter Brune   }
45486d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
45586d74e61SPeter Brune   if (iter < 2) {
45686d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
45786d74e61SPeter Brune     *changed = PETSC_FALSE;
45886d74e61SPeter Brune     PetscFunctionReturn(0);
45986d74e61SPeter Brune   }
46086d74e61SPeter Brune 
46186d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
46286d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
46386d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
46486d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
46586d74e61SPeter Brune   theta         = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
46686d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
46786d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
46886d74e61SPeter Brune     /* Modify the step Y */
46986d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
47086d74e61SPeter Brune     ierr  = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
47186d74e61SPeter Brune     ierr  = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
47286d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
47386d74e61SPeter Brune     ierr  = VecCopy(Y,Ylast);CHKERRQ(ierr);
47486d74e61SPeter Brune     ierr  = VecScale(Y,alpha);CHKERRQ(ierr);
475c69d1a72SBarry 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);
47686d74e61SPeter Brune   } else {
477c69d1a72SBarry 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);
47886d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
47986d74e61SPeter Brune     *changed = PETSC_FALSE;
480bf7f4e0aSPeter Brune   }
481bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
482bf7f4e0aSPeter Brune }
483bf7f4e0aSPeter Brune 
484bf7f4e0aSPeter Brune #undef __FUNCT__
485f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
486f40b411bSPeter Brune /*@
487cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
488f40b411bSPeter Brune 
489f1c6b773SPeter Brune    Collective on SNESLineSearch
490f40b411bSPeter Brune 
491f40b411bSPeter Brune    Input Parameters:
4928e557f58SPeter Brune +  linesearch - The linesearch context
4938e557f58SPeter Brune .  X - The current solution
4948e557f58SPeter Brune .  F - The current function
4958e557f58SPeter Brune .  fnorm - The current norm
4968e557f58SPeter Brune -  Y - The search direction
497f40b411bSPeter Brune 
498f40b411bSPeter Brune    Output Parameters:
4998e557f58SPeter Brune +  X - The new solution
5008e557f58SPeter Brune .  F - The new function
5018e557f58SPeter Brune -  fnorm - The new function norm
502f40b411bSPeter Brune 
503cd7522eaSPeter Brune    Options Database Keys:
5043c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell
505cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
5063c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
507cd7522eaSPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms
5083c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
5093c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
510cd7522eaSPeter Brune 
511cd7522eaSPeter Brune    Notes:
512cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
513cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
514cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
515cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
516cd7522eaSPeter Brune    application of the line search may invoke SNESComputeFunction several times, and
517cd7522eaSPeter Brune    therefore may be fairly expensive.
518cd7522eaSPeter Brune 
519f40b411bSPeter Brune    Level: Intermediate
520f40b411bSPeter Brune 
521f1c6b773SPeter Brune .keywords: SNESLineSearch, Create
522f40b411bSPeter Brune 
523cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction()
524f40b411bSPeter Brune @*/
525bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
526bf388a1fSBarry Smith {
527bf7f4e0aSPeter Brune   PetscErrorCode ierr;
528bf7f4e0aSPeter Brune 
529bf388a1fSBarry Smith   PetscFunctionBegin;
530f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
531bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
532bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
533bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
534bf7f4e0aSPeter Brune 
535bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
536bf7f4e0aSPeter Brune 
537bf7f4e0aSPeter Brune   linesearch->vec_sol    = X;
538bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
539bf7f4e0aSPeter Brune   linesearch->vec_func   = F;
540bf7f4e0aSPeter Brune 
541f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
542bf7f4e0aSPeter Brune 
543f5af7f23SKarl Rupp   if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
544bf7f4e0aSPeter Brune 
545f5af7f23SKarl Rupp   if (fnorm) linesearch->fnorm = *fnorm;
546f5af7f23SKarl Rupp   else {
547bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
548bf7f4e0aSPeter Brune   }
549bf7f4e0aSPeter Brune 
550f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
551bf7f4e0aSPeter Brune 
552bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
553bf7f4e0aSPeter Brune 
554f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
555bf7f4e0aSPeter Brune 
556f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
557bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
558bf7f4e0aSPeter Brune }
559bf7f4e0aSPeter Brune 
560bf7f4e0aSPeter Brune #undef __FUNCT__
561f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
562f40b411bSPeter Brune /*@
563f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
564f40b411bSPeter Brune 
565f1c6b773SPeter Brune    Collective on SNESLineSearch
566f40b411bSPeter Brune 
567f40b411bSPeter Brune    Input Parameters:
5688e557f58SPeter Brune .  linesearch - The linesearch context
569f40b411bSPeter Brune 
570f40b411bSPeter Brune    Level: Intermediate
571f40b411bSPeter Brune 
57278bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy
573f40b411bSPeter Brune 
574cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
575f40b411bSPeter Brune @*/
576bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
577bf388a1fSBarry Smith {
578bf7f4e0aSPeter Brune   PetscErrorCode ierr;
579bf388a1fSBarry Smith 
580bf7f4e0aSPeter Brune   PetscFunctionBegin;
581bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
582f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
583bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
584*e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr);
58522d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
586f5af7f23SKarl Rupp   if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch);
587bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
588e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
589bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
590bf7f4e0aSPeter Brune }
591bf7f4e0aSPeter Brune 
592bf7f4e0aSPeter Brune #undef __FUNCT__
593f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
594f40b411bSPeter Brune /*@
595cd7522eaSPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search.
596bf7f4e0aSPeter Brune 
597bf7f4e0aSPeter Brune    Input Parameters:
598bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
599bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
600bf7f4e0aSPeter Brune 
601bf7f4e0aSPeter Brune    Logically Collective on SNES
602bf7f4e0aSPeter Brune 
603bf7f4e0aSPeter Brune    Options Database:
6048e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
605bf7f4e0aSPeter Brune 
606bf7f4e0aSPeter Brune    Level: intermediate
607bf7f4e0aSPeter Brune 
608bf7f4e0aSPeter Brune 
609cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer
610bf7f4e0aSPeter Brune @*/
611f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
612bf7f4e0aSPeter Brune {
613bf7f4e0aSPeter Brune   PetscErrorCode ierr;
614bf388a1fSBarry Smith 
615bf7f4e0aSPeter Brune   PetscFunctionBegin;
616bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
617ce94432eSBarry Smith     ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)linesearch),"stdout",&linesearch->monitor);CHKERRQ(ierr);
618bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
619bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
620bf7f4e0aSPeter Brune   }
621bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
622bf7f4e0aSPeter Brune }
623bf7f4e0aSPeter Brune 
624bf7f4e0aSPeter Brune #undef __FUNCT__
625f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
626f40b411bSPeter Brune /*@
627cd7522eaSPeter Brune    SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor.
6286a388c36SPeter Brune 
629f40b411bSPeter Brune    Input Parameters:
6308e557f58SPeter Brune .  linesearch - linesearch context
631f40b411bSPeter Brune 
632f40b411bSPeter Brune    Input Parameters:
6338e557f58SPeter Brune .  monitor - monitor context
634f40b411bSPeter Brune 
635f40b411bSPeter Brune    Logically Collective on SNES
636f40b411bSPeter Brune 
637f40b411bSPeter Brune 
638f40b411bSPeter Brune    Options Database Keys:
6398e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
640f40b411bSPeter Brune 
641f40b411bSPeter Brune    Level: intermediate
642f40b411bSPeter Brune 
643f40b411bSPeter Brune 
644cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer
645f40b411bSPeter Brune @*/
646f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6476a388c36SPeter Brune {
6486a388c36SPeter Brune   PetscFunctionBegin;
649f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6506a388c36SPeter Brune   if (monitor) {
6516a388c36SPeter Brune     PetscValidPointer(monitor, 2);
6526a388c36SPeter Brune     *monitor = linesearch->monitor;
6536a388c36SPeter Brune   }
6546a388c36SPeter Brune   PetscFunctionReturn(0);
6556a388c36SPeter Brune }
6566a388c36SPeter Brune 
6576a388c36SPeter Brune #undef __FUNCT__
658f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
659f40b411bSPeter Brune /*@
660f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
661f40b411bSPeter Brune 
662f40b411bSPeter Brune    Input Parameters:
6638e557f58SPeter Brune .  linesearch - linesearch context
664f40b411bSPeter Brune 
665f40b411bSPeter Brune    Options Database Keys:
6663c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell
6673c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
6685a9b6599SPeter Brune . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch type
66971eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
6701a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
6711a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
6721a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
6731a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
6741a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
675cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches
6768e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
677cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
6781a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
6791a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method
680f40b411bSPeter Brune 
681f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
682f40b411bSPeter Brune 
683f40b411bSPeter Brune    Level: intermediate
684f40b411bSPeter Brune 
6853c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard()
686f40b411bSPeter Brune @*/
687bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
688bf388a1fSBarry Smith {
689bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6901a4f838cSPeter Brune   const char     *deft = SNESLINESEARCHBASIC;
691bf7f4e0aSPeter Brune   char           type[256];
692bf7f4e0aSPeter Brune   PetscBool      flg, set;
693bf388a1fSBarry Smith 
694bf7f4e0aSPeter Brune   PetscFunctionBegin;
695607a6623SBarry Smith   if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);}
696bf7f4e0aSPeter Brune 
697bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
698f5af7f23SKarl Rupp   if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name;
6993c7d6663SPeter Brune   ierr = PetscOptionsList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
700bf7f4e0aSPeter Brune   if (flg) {
701f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
702bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
703f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
704bf7f4e0aSPeter Brune   }
705bf7f4e0aSPeter Brune 
7067a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",
707bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
708f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
709bf7f4e0aSPeter Brune 
7101a9b3a06SPeter Brune   /* tolerances */
71171eef1aeSPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr);
7121a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr);
7131a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
7141a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr);
7151a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr);
7168e557f58SPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
7177a35526eSPeter Brune 
7181a9b3a06SPeter Brune   /* damping parameters */
7191a9b3a06SPeter Brune   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
7201a9b3a06SPeter Brune 
7211a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
7221a9b3a06SPeter Brune 
7231a9b3a06SPeter Brune   /* precheck */
7247a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
7257a35526eSPeter Brune   if (set) {
7267a35526eSPeter Brune     if (flg) {
7277a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
728f5af7f23SKarl Rupp 
7297a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
7300298fd71SBarry Smith                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr);
7317a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
7327a35526eSPeter Brune     } else {
7330298fd71SBarry Smith       ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr);
7347a35526eSPeter Brune     }
7357a35526eSPeter Brune   }
736b000cd8dSPeter Brune   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr);
7371a9b3a06SPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
7387a35526eSPeter Brune 
7395a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
7405a9b6599SPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
7415a9b6599SPeter Brune   }
7425a9b6599SPeter Brune 
743bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
744bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
745bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
746bf7f4e0aSPeter Brune }
747bf7f4e0aSPeter Brune 
748bf7f4e0aSPeter Brune #undef __FUNCT__
749f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
750f40b411bSPeter Brune /*@
751cd7522eaSPeter Brune    SNESLineSearchView - Prints useful information about the line search not
752cd7522eaSPeter Brune    related to an individual call.
753f40b411bSPeter Brune 
754f40b411bSPeter Brune    Input Parameters:
7558e557f58SPeter Brune .  linesearch - linesearch context
756f40b411bSPeter Brune 
757f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
758f40b411bSPeter Brune 
759f40b411bSPeter Brune    Level: intermediate
760f40b411bSPeter Brune 
761f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
762f40b411bSPeter Brune @*/
763bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
764bf388a1fSBarry Smith {
7657f1410a3SPeter Brune   PetscErrorCode ierr;
7667f1410a3SPeter Brune   PetscBool      iascii;
767bf388a1fSBarry Smith 
768bf7f4e0aSPeter Brune   PetscFunctionBegin;
7697f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7707f1410a3SPeter Brune   if (!viewer) {
771ce94432eSBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr);
7727f1410a3SPeter Brune   }
7737f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
7747f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
775f40b411bSPeter Brune 
776251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
7777f1410a3SPeter Brune   if (iascii) {
778dae58748SBarry Smith     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr);
7797f1410a3SPeter Brune     if (linesearch->ops->view) {
7807f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
7817f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
7827f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
7837f1410a3SPeter Brune     }
784c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
785c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
7867f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
7876b2b7091SBarry Smith     if (linesearch->ops->precheck) {
7886b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
7897f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
7907f1410a3SPeter Brune       } else {
7917f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
7927f1410a3SPeter Brune       }
7937f1410a3SPeter Brune     }
7946b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
7957f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
7967f1410a3SPeter Brune     }
7977f1410a3SPeter Brune   }
798bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
799bf7f4e0aSPeter Brune }
800bf7f4e0aSPeter Brune 
801bf7f4e0aSPeter Brune #undef __FUNCT__
802f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
803ea5d4fccSPeter Brune /*@C
804f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
805f40b411bSPeter Brune 
806f40b411bSPeter Brune    Input Parameters:
8078e557f58SPeter Brune +  linesearch - linesearch context
808f40b411bSPeter Brune -  type - The type of line search to be used
809f40b411bSPeter Brune 
810cd7522eaSPeter Brune    Available Types:
811cd7522eaSPeter Brune +  basic - Simple damping line search.
8128e557f58SPeter Brune .  bt - Backtracking line search over the L2 norm of the function
8138e557f58SPeter Brune .  l2 - Secant line search over the L2 norm of the function
8148e557f58SPeter Brune .  cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
8158e557f58SPeter Brune -  shell - User provided SNESLineSearch implementation
816cd7522eaSPeter Brune 
817f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
818f40b411bSPeter Brune 
819f40b411bSPeter Brune    Level: intermediate
820f40b411bSPeter Brune 
821f40b411bSPeter Brune 
822f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
823f40b411bSPeter Brune @*/
82419fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
825bf7f4e0aSPeter Brune {
826f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
827bf7f4e0aSPeter Brune   PetscBool      match;
828bf7f4e0aSPeter Brune 
829bf7f4e0aSPeter Brune   PetscFunctionBegin;
830f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
831bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
832bf7f4e0aSPeter Brune 
833251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
834bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
835bf7f4e0aSPeter Brune 
8361c9cd337SJed Brown   ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr);
837bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
838bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
839bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
840bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
841f5af7f23SKarl Rupp 
8420298fd71SBarry Smith     linesearch->ops->destroy = NULL;
843bf7f4e0aSPeter Brune   }
844f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
845bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
846bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
847bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
848bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
849bf7f4e0aSPeter Brune 
850bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
851bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
852bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
853bf7f4e0aSPeter Brune }
854bf7f4e0aSPeter Brune 
855bf7f4e0aSPeter Brune #undef __FUNCT__
856f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
857f40b411bSPeter Brune /*@
85878bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
859f40b411bSPeter Brune 
860f40b411bSPeter Brune    Input Parameters:
8618e557f58SPeter Brune +  linesearch - linesearch context
862f40b411bSPeter Brune -  snes - The snes instance
863f40b411bSPeter Brune 
86478bcb3b5SPeter Brune    Level: developer
86578bcb3b5SPeter Brune 
86678bcb3b5SPeter Brune    Notes:
86778bcb3b5SPeter Brune    This happens automatically when the line search is gotten/created with
8687601faf0SJed Brown    SNESGetLineSearch().  This routine is therefore mainly called within SNES
86978bcb3b5SPeter Brune    implementations.
870f40b411bSPeter Brune 
8718141a3b9SPeter Brune    Level: developer
872f40b411bSPeter Brune 
873cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
874f40b411bSPeter Brune @*/
875bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
876bf388a1fSBarry Smith {
877bf7f4e0aSPeter Brune   PetscFunctionBegin;
878f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
879bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
880bf7f4e0aSPeter Brune   linesearch->snes = snes;
881bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
882bf7f4e0aSPeter Brune }
883bf7f4e0aSPeter Brune 
884bf7f4e0aSPeter Brune #undef __FUNCT__
885f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
886f40b411bSPeter Brune /*@
8878141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
8888141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
8898141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
8908141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
891f40b411bSPeter Brune 
892f40b411bSPeter Brune    Input Parameters:
8938e557f58SPeter Brune .  linesearch - linesearch context
894f40b411bSPeter Brune 
895f40b411bSPeter Brune    Output Parameters:
896f40b411bSPeter Brune .  snes - The snes instance
897f40b411bSPeter Brune 
8988141a3b9SPeter Brune    Level: developer
899f40b411bSPeter Brune 
900cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
901f40b411bSPeter Brune @*/
902bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
903bf388a1fSBarry Smith {
904bf7f4e0aSPeter Brune   PetscFunctionBegin;
905f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9066a388c36SPeter Brune   PetscValidPointer(snes, 2);
907bf7f4e0aSPeter Brune   *snes = linesearch->snes;
908bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
909bf7f4e0aSPeter Brune }
910bf7f4e0aSPeter Brune 
9116a388c36SPeter Brune #undef __FUNCT__
912f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
913f40b411bSPeter Brune /*@
914f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
915f40b411bSPeter Brune 
916f40b411bSPeter Brune    Input Parameters:
9178e557f58SPeter Brune .  linesearch - linesearch context
918f40b411bSPeter Brune 
919f40b411bSPeter Brune    Output Parameters:
920cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
921f40b411bSPeter Brune 
92278bcb3b5SPeter Brune    Level: advanced
92378bcb3b5SPeter Brune 
9248e557f58SPeter Brune    Notes:
9258e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
92678bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
92778bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
92878bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
92978bcb3b5SPeter Brune 
930f40b411bSPeter Brune 
931cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
932f40b411bSPeter Brune @*/
933f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
9346a388c36SPeter Brune {
9356a388c36SPeter Brune   PetscFunctionBegin;
936f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9376a388c36SPeter Brune   PetscValidPointer(lambda, 2);
9386a388c36SPeter Brune   *lambda = linesearch->lambda;
9396a388c36SPeter Brune   PetscFunctionReturn(0);
9406a388c36SPeter Brune }
9416a388c36SPeter Brune 
9426a388c36SPeter Brune #undef __FUNCT__
943f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
944f40b411bSPeter Brune /*@
945f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
946f40b411bSPeter Brune 
947f40b411bSPeter Brune    Input Parameters:
9488e557f58SPeter Brune +  linesearch - linesearch context
949f40b411bSPeter Brune -  lambda - The last steplength.
950f40b411bSPeter Brune 
951cd7522eaSPeter Brune    Notes:
952cd7522eaSPeter Brune    This routine is typically used within implementations of SNESLineSearchApply
953cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
954cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
955cd7522eaSPeter Brune    as an inner scaling parameter.
956cd7522eaSPeter Brune 
95778bcb3b5SPeter Brune    Level: advanced
958f40b411bSPeter Brune 
959f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
960f40b411bSPeter Brune @*/
961f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
9626a388c36SPeter Brune {
9636a388c36SPeter Brune   PetscFunctionBegin;
964f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9656a388c36SPeter Brune   linesearch->lambda = lambda;
9666a388c36SPeter Brune   PetscFunctionReturn(0);
9676a388c36SPeter Brune }
9686a388c36SPeter Brune 
9696a388c36SPeter Brune #undef  __FUNCT__
970f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
971f40b411bSPeter Brune /*@
9723c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
97378bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
97478bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
97578bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
976f40b411bSPeter Brune 
977f40b411bSPeter Brune    Input Parameters:
9788e557f58SPeter Brune .  linesearch - linesearch context
979f40b411bSPeter Brune 
980f40b411bSPeter Brune    Output Parameters:
981516fe3c3SPeter Brune +  steptol - The minimum steplength
9826cc8e53bSPeter Brune .  maxstep - The maximum steplength
983516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
984516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
985516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
986516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
987f40b411bSPeter Brune 
98878bcb3b5SPeter Brune    Level: intermediate
98978bcb3b5SPeter Brune 
99078bcb3b5SPeter Brune    Notes:
99178bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
9923c7d6663SPeter Brune    the type requires.
993516fe3c3SPeter Brune 
994f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
995f40b411bSPeter Brune @*/
996f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
9976a388c36SPeter Brune {
9986a388c36SPeter Brune   PetscFunctionBegin;
999f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1000516fe3c3SPeter Brune   if (steptol) {
10016a388c36SPeter Brune     PetscValidPointer(steptol, 2);
10026a388c36SPeter Brune     *steptol = linesearch->steptol;
1003516fe3c3SPeter Brune   }
1004516fe3c3SPeter Brune   if (maxstep) {
1005516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
1006516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
1007516fe3c3SPeter Brune   }
1008516fe3c3SPeter Brune   if (rtol) {
1009516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
1010516fe3c3SPeter Brune     *rtol = linesearch->rtol;
1011516fe3c3SPeter Brune   }
1012516fe3c3SPeter Brune   if (atol) {
1013516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
1014516fe3c3SPeter Brune     *atol = linesearch->atol;
1015516fe3c3SPeter Brune   }
1016516fe3c3SPeter Brune   if (ltol) {
1017516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
1018516fe3c3SPeter Brune     *ltol = linesearch->ltol;
1019516fe3c3SPeter Brune   }
1020516fe3c3SPeter Brune   if (max_its) {
1021516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
1022516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1023516fe3c3SPeter Brune   }
10246a388c36SPeter Brune   PetscFunctionReturn(0);
10256a388c36SPeter Brune }
10266a388c36SPeter Brune 
10276a388c36SPeter Brune #undef  __FUNCT__
1028f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
1029f40b411bSPeter Brune /*@
10303c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
103178bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
103278bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
103378bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1034f40b411bSPeter Brune 
1035f40b411bSPeter Brune    Input Parameters:
10368e557f58SPeter Brune +  linesearch - linesearch context
1037516fe3c3SPeter Brune .  steptol - The minimum steplength
10386cc8e53bSPeter Brune .  maxstep - The maximum steplength
1039516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1040516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1041516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1042516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1043f40b411bSPeter Brune 
104478bcb3b5SPeter Brune    Notes:
10453c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
104678bcb3b5SPeter Brune    place of an argument.
1047f40b411bSPeter Brune 
104878bcb3b5SPeter Brune    Level: intermediate
1049516fe3c3SPeter Brune 
1050f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1051f40b411bSPeter Brune @*/
1052f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
10536a388c36SPeter Brune {
10546a388c36SPeter Brune   PetscFunctionBegin;
1055f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1056d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1057d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1058d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1059d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1060d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1061d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1062d3952184SSatish Balay 
1063d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1064ce94432eSBarry Smith     if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
10656a388c36SPeter Brune     linesearch->steptol = steptol;
1066d3952184SSatish Balay   }
1067d3952184SSatish Balay 
1068d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1069ce94432eSBarry Smith     if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1070516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1071d3952184SSatish Balay   }
1072d3952184SSatish Balay 
1073d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1074ce94432eSBarry 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);
1075516fe3c3SPeter Brune     linesearch->rtol = rtol;
1076d3952184SSatish Balay   }
1077d3952184SSatish Balay 
1078d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1079ce94432eSBarry Smith     if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1080516fe3c3SPeter Brune     linesearch->atol = atol;
1081d3952184SSatish Balay   }
1082d3952184SSatish Balay 
1083d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1084ce94432eSBarry Smith     if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol);
1085516fe3c3SPeter Brune     linesearch->ltol = ltol;
1086d3952184SSatish Balay   }
1087d3952184SSatish Balay 
1088d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1089ce94432eSBarry Smith     if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1090516fe3c3SPeter Brune     linesearch->max_its = max_its;
1091d3952184SSatish Balay   }
10926a388c36SPeter Brune   PetscFunctionReturn(0);
10936a388c36SPeter Brune }
10946a388c36SPeter Brune 
10956a388c36SPeter Brune #undef __FUNCT__
1096f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
1097f40b411bSPeter Brune /*@
1098f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1099f40b411bSPeter Brune 
1100f40b411bSPeter Brune    Input Parameters:
11018e557f58SPeter Brune .  linesearch - linesearch context
1102f40b411bSPeter Brune 
1103f40b411bSPeter Brune    Output Parameters:
11048e557f58SPeter Brune .  damping - The damping parameter
1105f40b411bSPeter Brune 
110678bcb3b5SPeter Brune    Level: advanced
1107f40b411bSPeter Brune 
110878bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1109f40b411bSPeter Brune @*/
1110f40b411bSPeter Brune 
1111f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
11126a388c36SPeter Brune {
11136a388c36SPeter Brune   PetscFunctionBegin;
1114f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11156a388c36SPeter Brune   PetscValidPointer(damping, 2);
11166a388c36SPeter Brune   *damping = linesearch->damping;
11176a388c36SPeter Brune   PetscFunctionReturn(0);
11186a388c36SPeter Brune }
11196a388c36SPeter Brune 
11206a388c36SPeter Brune #undef __FUNCT__
1121f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
1122f40b411bSPeter Brune /*@
1123f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
1124f40b411bSPeter Brune 
1125f40b411bSPeter Brune    Input Parameters:
112678bcb3b5SPeter Brune .  linesearch - linesearch context
112778bcb3b5SPeter Brune .  damping - The damping parameter
1128f40b411bSPeter Brune 
1129f40b411bSPeter Brune    Level: intermediate
1130f40b411bSPeter Brune 
1131cd7522eaSPeter Brune    Notes:
1132cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1133cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
113478bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1135cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1136cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1137cd7522eaSPeter Brune 
1138f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1139f40b411bSPeter Brune @*/
1140f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
11416a388c36SPeter Brune {
11426a388c36SPeter Brune   PetscFunctionBegin;
1143f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
11446a388c36SPeter Brune   linesearch->damping = damping;
11456a388c36SPeter Brune   PetscFunctionReturn(0);
11466a388c36SPeter Brune }
11476a388c36SPeter Brune 
11486a388c36SPeter Brune #undef __FUNCT__
114959405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder"
115059405d5eSPeter Brune /*@
115159405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
115259405d5eSPeter Brune 
115359405d5eSPeter Brune    Input Parameters:
115478bcb3b5SPeter Brune .  linesearch - linesearch context
115559405d5eSPeter Brune 
115659405d5eSPeter Brune    Output Parameters:
11578e557f58SPeter Brune .  order - The order
115859405d5eSPeter Brune 
115978bcb3b5SPeter Brune    Possible Values for order:
11603c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11613c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11623c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
116378bcb3b5SPeter Brune 
116459405d5eSPeter Brune    Level: intermediate
116559405d5eSPeter Brune 
116659405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
116759405d5eSPeter Brune @*/
116859405d5eSPeter Brune 
1169b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
117059405d5eSPeter Brune {
117159405d5eSPeter Brune   PetscFunctionBegin;
117259405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
117359405d5eSPeter Brune   PetscValidPointer(order, 2);
117459405d5eSPeter Brune   *order = linesearch->order;
117559405d5eSPeter Brune   PetscFunctionReturn(0);
117659405d5eSPeter Brune }
117759405d5eSPeter Brune 
117859405d5eSPeter Brune #undef __FUNCT__
117959405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder"
118059405d5eSPeter Brune /*@
118159405d5eSPeter Brune    SNESLineSearchSetOrder - Sets the line search damping paramter.
118259405d5eSPeter Brune 
118359405d5eSPeter Brune    Input Parameters:
118478bcb3b5SPeter Brune .  linesearch - linesearch context
118578bcb3b5SPeter Brune .  order - The damping parameter
118659405d5eSPeter Brune 
118759405d5eSPeter Brune    Level: intermediate
118859405d5eSPeter Brune 
118978bcb3b5SPeter Brune    Possible Values for order:
11903c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
11913c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
11923c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
119378bcb3b5SPeter Brune 
119459405d5eSPeter Brune    Notes:
119559405d5eSPeter Brune    Variable orders are supported by the following line searches:
119678bcb3b5SPeter Brune +  bt - cubic and quadratic
119778bcb3b5SPeter Brune -  cp - linear and quadratic
119859405d5eSPeter Brune 
119959405d5eSPeter Brune .seealso: SNESLineSearchGetOrder()
120059405d5eSPeter Brune @*/
1201b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
120259405d5eSPeter Brune {
120359405d5eSPeter Brune   PetscFunctionBegin;
120459405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
120559405d5eSPeter Brune   linesearch->order = order;
120659405d5eSPeter Brune   PetscFunctionReturn(0);
120759405d5eSPeter Brune }
120859405d5eSPeter Brune 
120959405d5eSPeter Brune #undef __FUNCT__
1210f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
1211f40b411bSPeter Brune /*@
1212f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1213f40b411bSPeter Brune 
1214f40b411bSPeter Brune    Input Parameters:
121578bcb3b5SPeter Brune .  linesearch - linesearch context
1216f40b411bSPeter Brune 
1217f40b411bSPeter Brune    Output Parameters:
1218f40b411bSPeter Brune +  xnorm - The norm of the current solution
1219f40b411bSPeter Brune .  fnorm - The norm of the current function
1220f40b411bSPeter Brune -  ynorm - The norm of the current update
1221f40b411bSPeter Brune 
1222cd7522eaSPeter Brune    Notes:
1223cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1224cd7522eaSPeter Brune 
122578bcb3b5SPeter Brune    Level: developer
1226f40b411bSPeter Brune 
1227f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1228f40b411bSPeter Brune @*/
1229f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1230bf7f4e0aSPeter Brune {
1231bf7f4e0aSPeter Brune   PetscFunctionBegin;
1232f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1233f5af7f23SKarl Rupp   if (xnorm) *xnorm = linesearch->xnorm;
1234f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
1235f5af7f23SKarl Rupp   if (ynorm) *ynorm = linesearch->ynorm;
1236bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1237bf7f4e0aSPeter Brune }
1238bf7f4e0aSPeter Brune 
1239e7058c64SPeter Brune #undef __FUNCT__
1240f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
1241f40b411bSPeter Brune /*@
1242f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1243f40b411bSPeter Brune 
1244f40b411bSPeter Brune    Input Parameters:
124578bcb3b5SPeter Brune +  linesearch - linesearch context
1246f40b411bSPeter Brune .  xnorm - The norm of the current solution
1247f40b411bSPeter Brune .  fnorm - The norm of the current function
1248f40b411bSPeter Brune -  ynorm - The norm of the current update
1249f40b411bSPeter Brune 
125078bcb3b5SPeter Brune    Level: advanced
1251f40b411bSPeter Brune 
1252f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1253f40b411bSPeter Brune @*/
1254f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
12556a388c36SPeter Brune {
12566a388c36SPeter Brune   PetscFunctionBegin;
1257f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12586a388c36SPeter Brune   linesearch->xnorm = xnorm;
12596a388c36SPeter Brune   linesearch->fnorm = fnorm;
12606a388c36SPeter Brune   linesearch->ynorm = ynorm;
12616a388c36SPeter Brune   PetscFunctionReturn(0);
12626a388c36SPeter Brune }
12636a388c36SPeter Brune 
12646a388c36SPeter Brune #undef __FUNCT__
1265f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
1266f40b411bSPeter Brune /*@
1267f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1268f40b411bSPeter Brune 
1269f40b411bSPeter Brune    Input Parameters:
127078bcb3b5SPeter Brune .  linesearch - linesearch context
1271f40b411bSPeter Brune 
1272f40b411bSPeter Brune    Options Database Keys:
12738e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1274f40b411bSPeter Brune 
1275f40b411bSPeter Brune    Level: intermediate
1276f40b411bSPeter Brune 
127778bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1278f40b411bSPeter Brune @*/
1279f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
12806a388c36SPeter Brune {
12816a388c36SPeter Brune   PetscErrorCode ierr;
12829bd66eb0SPeter Brune   SNES           snes;
1283bf388a1fSBarry Smith 
12846a388c36SPeter Brune   PetscFunctionBegin;
12856a388c36SPeter Brune   if (linesearch->norms) {
12869bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1287f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
12889bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12899bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12909bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
12919bd66eb0SPeter Brune     } else {
12926a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12936a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12946a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12956a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
12966a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
12976a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
12986a388c36SPeter Brune     }
12999bd66eb0SPeter Brune   }
13006a388c36SPeter Brune   PetscFunctionReturn(0);
13016a388c36SPeter Brune }
13026a388c36SPeter Brune 
13036f263ca3SPeter Brune #undef __FUNCT__
13046f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms"
13056f263ca3SPeter Brune /*@
13066f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
13076f263ca3SPeter Brune 
13086f263ca3SPeter Brune    Input Parameters:
130978bcb3b5SPeter Brune +  linesearch  - linesearch context
131078bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
13116f263ca3SPeter Brune 
13126f263ca3SPeter Brune    Options Database Keys:
13138e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
13146f263ca3SPeter Brune 
13156f263ca3SPeter Brune    Notes:
13161a4f838cSPeter Brune    This is most relevant to the SNESLINESEARCHBASIC line search type.
13176f263ca3SPeter Brune 
13186f263ca3SPeter Brune    Level: intermediate
13196f263ca3SPeter Brune 
13201a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13216f263ca3SPeter Brune @*/
13226f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13236f263ca3SPeter Brune {
13246f263ca3SPeter Brune   PetscFunctionBegin;
13256f263ca3SPeter Brune   linesearch->norms = flg;
13266f263ca3SPeter Brune   PetscFunctionReturn(0);
13276f263ca3SPeter Brune }
13286f263ca3SPeter Brune 
13296a388c36SPeter Brune #undef __FUNCT__
1330f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1331f40b411bSPeter Brune /*@
1332f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1333f40b411bSPeter Brune 
1334f40b411bSPeter Brune    Input Parameters:
133578bcb3b5SPeter Brune .  linesearch - linesearch context
1336f40b411bSPeter Brune 
1337f40b411bSPeter Brune    Output Parameters:
13386232e825SPeter Brune +  X - Solution vector
13396232e825SPeter Brune .  F - Function vector
13406232e825SPeter Brune .  Y - Search direction vector
13416232e825SPeter Brune .  W - Solution work vector
13426232e825SPeter Brune -  G - Function work vector
13436232e825SPeter Brune 
13447bba9028SPeter Brune    Notes:
13457bba9028SPeter Brune    At the beginning of a line search application, X should contain a
13466232e825SPeter Brune    solution and the vector F the function computed at X.  At the end of the
13476232e825SPeter Brune    line search application, X should contain the new solution, and F the
13486232e825SPeter Brune    function evaluated at the new solution.
1349f40b411bSPeter Brune 
135078bcb3b5SPeter Brune    Level: advanced
1351f40b411bSPeter Brune 
1352f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1353f40b411bSPeter Brune @*/
1354bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1355bf388a1fSBarry Smith {
13566a388c36SPeter Brune   PetscFunctionBegin;
1357f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13586a388c36SPeter Brune   if (X) {
13596a388c36SPeter Brune     PetscValidPointer(X, 2);
13606a388c36SPeter Brune     *X = linesearch->vec_sol;
13616a388c36SPeter Brune   }
13626a388c36SPeter Brune   if (F) {
13636a388c36SPeter Brune     PetscValidPointer(F, 3);
13646a388c36SPeter Brune     *F = linesearch->vec_func;
13656a388c36SPeter Brune   }
13666a388c36SPeter Brune   if (Y) {
13676a388c36SPeter Brune     PetscValidPointer(Y, 4);
13686a388c36SPeter Brune     *Y = linesearch->vec_update;
13696a388c36SPeter Brune   }
13706a388c36SPeter Brune   if (W) {
13716a388c36SPeter Brune     PetscValidPointer(W, 5);
13726a388c36SPeter Brune     *W = linesearch->vec_sol_new;
13736a388c36SPeter Brune   }
13746a388c36SPeter Brune   if (G) {
13756a388c36SPeter Brune     PetscValidPointer(G, 6);
13766a388c36SPeter Brune     *G = linesearch->vec_func_new;
13776a388c36SPeter Brune   }
13786a388c36SPeter Brune   PetscFunctionReturn(0);
13796a388c36SPeter Brune }
13806a388c36SPeter Brune 
13816a388c36SPeter Brune #undef __FUNCT__
1382f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1383f40b411bSPeter Brune /*@
1384f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1385f40b411bSPeter Brune 
1386f40b411bSPeter Brune    Input Parameters:
138778bcb3b5SPeter Brune +  linesearch - linesearch context
13886232e825SPeter Brune .  X - Solution vector
13896232e825SPeter Brune .  F - Function vector
13906232e825SPeter Brune .  Y - Search direction vector
13916232e825SPeter Brune .  W - Solution work vector
13926232e825SPeter Brune -  G - Function work vector
1393f40b411bSPeter Brune 
139478bcb3b5SPeter Brune    Level: advanced
1395f40b411bSPeter Brune 
1396f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1397f40b411bSPeter Brune @*/
1398bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1399bf388a1fSBarry Smith {
14006a388c36SPeter Brune   PetscFunctionBegin;
1401f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14026a388c36SPeter Brune   if (X) {
14036a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
14046a388c36SPeter Brune     linesearch->vec_sol = X;
14056a388c36SPeter Brune   }
14066a388c36SPeter Brune   if (F) {
14076a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
14086a388c36SPeter Brune     linesearch->vec_func = F;
14096a388c36SPeter Brune   }
14106a388c36SPeter Brune   if (Y) {
14116a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
14126a388c36SPeter Brune     linesearch->vec_update = Y;
14136a388c36SPeter Brune   }
14146a388c36SPeter Brune   if (W) {
14156a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
14166a388c36SPeter Brune     linesearch->vec_sol_new = W;
14176a388c36SPeter Brune   }
14186a388c36SPeter Brune   if (G) {
14196a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14206a388c36SPeter Brune     linesearch->vec_func_new = G;
14216a388c36SPeter Brune   }
14226a388c36SPeter Brune   PetscFunctionReturn(0);
14236a388c36SPeter Brune }
14246a388c36SPeter Brune 
14256a388c36SPeter Brune #undef __FUNCT__
1426f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1427e7058c64SPeter Brune /*@C
1428f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1429e7058c64SPeter Brune    SNES options in the database.
1430e7058c64SPeter Brune 
1431cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1432e7058c64SPeter Brune 
1433e7058c64SPeter Brune    Input Parameters:
1434e7058c64SPeter Brune +  snes - the SNES context
1435e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1436e7058c64SPeter Brune 
1437e7058c64SPeter Brune    Notes:
1438e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1439e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1440e7058c64SPeter Brune 
1441e7058c64SPeter Brune    Level: advanced
1442e7058c64SPeter Brune 
1443f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1444e7058c64SPeter Brune 
1445e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1446e7058c64SPeter Brune @*/
1447f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1448e7058c64SPeter Brune {
1449e7058c64SPeter Brune   PetscErrorCode ierr;
1450e7058c64SPeter Brune 
1451e7058c64SPeter Brune   PetscFunctionBegin;
1452f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1453e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1454e7058c64SPeter Brune   PetscFunctionReturn(0);
1455e7058c64SPeter Brune }
1456e7058c64SPeter Brune 
1457e7058c64SPeter Brune #undef __FUNCT__
1458f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1459e7058c64SPeter Brune /*@C
1460f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1461f1c6b773SPeter Brune    SNESLineSearch options in the database.
1462e7058c64SPeter Brune 
1463e7058c64SPeter Brune    Not Collective
1464e7058c64SPeter Brune 
1465e7058c64SPeter Brune    Input Parameter:
1466cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1467e7058c64SPeter Brune 
1468e7058c64SPeter Brune    Output Parameter:
1469e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1470e7058c64SPeter Brune 
14718e557f58SPeter Brune    Notes:
14728e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1473e7058c64SPeter Brune    sufficient length to hold the prefix.
1474e7058c64SPeter Brune 
1475e7058c64SPeter Brune    Level: advanced
1476e7058c64SPeter Brune 
1477f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1478e7058c64SPeter Brune 
1479e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1480e7058c64SPeter Brune @*/
1481f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1482e7058c64SPeter Brune {
1483e7058c64SPeter Brune   PetscErrorCode ierr;
1484e7058c64SPeter Brune 
1485e7058c64SPeter Brune   PetscFunctionBegin;
1486f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1487e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1488e7058c64SPeter Brune   PetscFunctionReturn(0);
1489e7058c64SPeter Brune }
1490bf7f4e0aSPeter Brune 
1491bf7f4e0aSPeter Brune #undef __FUNCT__
1492fa0ddf94SBarry Smith #define __FUNCT__ "SNESLineSearchSetWorkVecs"
14938d359177SBarry Smith /*@C
1494fa0ddf94SBarry Smith    SNESLineSearchSetWorkVecs - Gets work vectors for the line search.
1495f40b411bSPeter Brune 
1496f40b411bSPeter Brune    Input Parameter:
1497f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1498f40b411bSPeter Brune -  nwork - the number of work vectors
1499f40b411bSPeter Brune 
1500f40b411bSPeter Brune    Level: developer
1501f40b411bSPeter Brune 
1502fa0ddf94SBarry Smith    Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations
1503cd7522eaSPeter Brune 
1504f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1505f40b411bSPeter Brune 
1506fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs()
1507f40b411bSPeter Brune @*/
1508fa0ddf94SBarry Smith PetscErrorCode  SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork)
1509bf7f4e0aSPeter Brune {
1510bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1511bf388a1fSBarry Smith 
1512bf7f4e0aSPeter Brune   PetscFunctionBegin;
1513bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1514bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
15158d359177SBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1516bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1517bf7f4e0aSPeter Brune }
1518bf7f4e0aSPeter Brune 
1519bf7f4e0aSPeter Brune #undef __FUNCT__
1520f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1521f40b411bSPeter Brune /*@
1522f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1523f40b411bSPeter Brune 
1524f40b411bSPeter Brune    Input Parameters:
152578bcb3b5SPeter Brune .  linesearch - linesearch context
1526f40b411bSPeter Brune 
1527f40b411bSPeter Brune    Output Parameters:
15288e557f58SPeter Brune .  success - The success or failure status
1529f40b411bSPeter Brune 
1530cd7522eaSPeter Brune    Notes:
1531c98378a5SBarry Smith    This is typically called after SNESLineSearchApply() in order to determine if the line-search failed
1532cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1533cd7522eaSPeter Brune 
1534f40b411bSPeter Brune    Level: intermediate
1535f40b411bSPeter Brune 
1536f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1537f40b411bSPeter Brune @*/
1538f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1539bf7f4e0aSPeter Brune {
1540bf7f4e0aSPeter Brune   PetscFunctionBegin;
1541f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15426a388c36SPeter Brune   PetscValidPointer(success, 2);
1543f5af7f23SKarl Rupp   if (success) *success = linesearch->success;
1544bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1545bf7f4e0aSPeter Brune }
1546bf7f4e0aSPeter Brune 
1547bf7f4e0aSPeter Brune #undef __FUNCT__
1548f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1549f40b411bSPeter Brune /*@
1550f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1551f40b411bSPeter Brune 
1552f40b411bSPeter Brune    Input Parameters:
155378bcb3b5SPeter Brune +  linesearch - linesearch context
15548e557f58SPeter Brune -  success - The success or failure status
1555f40b411bSPeter Brune 
1556cd7522eaSPeter Brune    Notes:
1557cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1558cd7522eaSPeter Brune    the success or failure of the line search method.
1559cd7522eaSPeter Brune 
156078bcb3b5SPeter Brune    Level: developer
1561f40b411bSPeter Brune 
1562f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1563f40b411bSPeter Brune @*/
1564f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
15656a388c36SPeter Brune {
15666a388c36SPeter Brune   PetscFunctionBegin;
15675fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
15686a388c36SPeter Brune   linesearch->success = success;
15696a388c36SPeter Brune   PetscFunctionReturn(0);
15706a388c36SPeter Brune }
15716a388c36SPeter Brune 
15726a388c36SPeter Brune #undef __FUNCT__
1573f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
15749bd66eb0SPeter Brune /*@C
1575f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
15769bd66eb0SPeter Brune 
15779bd66eb0SPeter Brune    Input Parameters:
15789bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
15799bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
15809bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
15819bd66eb0SPeter Brune 
15829bd66eb0SPeter Brune    Logically Collective on SNES
15839bd66eb0SPeter Brune 
15849bd66eb0SPeter Brune    Calling sequence of projectfunc:
15859bd66eb0SPeter Brune .vb
15869bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
15879bd66eb0SPeter Brune .ve
15889bd66eb0SPeter Brune 
15899bd66eb0SPeter Brune     Input parameters for projectfunc:
15909bd66eb0SPeter Brune +   snes - nonlinear context
15919bd66eb0SPeter Brune -   X - current solution
15929bd66eb0SPeter Brune 
1593cd7522eaSPeter Brune     Output parameters for projectfunc:
15949bd66eb0SPeter Brune .   X - Projected solution
15959bd66eb0SPeter Brune 
15969bd66eb0SPeter Brune    Calling sequence of normfunc:
15979bd66eb0SPeter Brune .vb
15989bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
15999bd66eb0SPeter Brune .ve
16009bd66eb0SPeter Brune 
1601cd7522eaSPeter Brune     Input parameters for normfunc:
16029bd66eb0SPeter Brune +   snes - nonlinear context
16039bd66eb0SPeter Brune .   X - current solution
16049bd66eb0SPeter Brune -   F - current residual
16059bd66eb0SPeter Brune 
1606cd7522eaSPeter Brune     Output parameters for normfunc:
16079bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
16089bd66eb0SPeter Brune 
1609cd7522eaSPeter Brune     Notes:
1610cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1611cd7522eaSPeter Brune 
1612cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1613cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
16149bd66eb0SPeter Brune 
16159bd66eb0SPeter Brune     Level: developer
16169bd66eb0SPeter Brune 
16179bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
16189bd66eb0SPeter Brune 
1619f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16209bd66eb0SPeter Brune @*/
1621f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16229bd66eb0SPeter Brune {
16239bd66eb0SPeter Brune   PetscFunctionBegin;
1624f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16259bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16269bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16279bd66eb0SPeter Brune   PetscFunctionReturn(0);
16289bd66eb0SPeter Brune }
16299bd66eb0SPeter Brune 
16309bd66eb0SPeter Brune #undef __FUNCT__
1631f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
16329bd66eb0SPeter Brune /*@C
1633f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16349bd66eb0SPeter Brune 
16359bd66eb0SPeter Brune    Input Parameters:
16369bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
16379bd66eb0SPeter Brune 
16389bd66eb0SPeter Brune    Output Parameters:
16399bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16409bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16419bd66eb0SPeter Brune 
16429bd66eb0SPeter Brune    Logically Collective on SNES
16439bd66eb0SPeter Brune 
16449bd66eb0SPeter Brune     Level: developer
16459bd66eb0SPeter Brune 
16469bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
16479bd66eb0SPeter Brune 
1648f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16499bd66eb0SPeter Brune @*/
1650f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16519bd66eb0SPeter Brune {
16529bd66eb0SPeter Brune   PetscFunctionBegin;
16539bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16549bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16559bd66eb0SPeter Brune   PetscFunctionReturn(0);
16569bd66eb0SPeter Brune }
16579bd66eb0SPeter Brune 
16589bd66eb0SPeter Brune #undef __FUNCT__
1659f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1660bf7f4e0aSPeter Brune /*@C
16611c84c290SBarry Smith   SNESLineSearchRegister - See SNESLineSearchRegister()
1662bf7f4e0aSPeter Brune 
1663bf7f4e0aSPeter Brune   Level: advanced
1664bf7f4e0aSPeter Brune @*/
1665bdf89e91SBarry Smith PetscErrorCode  SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch))
1666bf7f4e0aSPeter Brune {
1667bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1668bf7f4e0aSPeter Brune 
1669bf7f4e0aSPeter Brune   PetscFunctionBegin;
1670a240a19fSJed Brown   ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr);
1671bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1672bf7f4e0aSPeter Brune }
1673