xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1af0996ceSBarry Smith #include <petsc/private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
3f1c6b773SPeter Brune PetscBool         SNESLineSearchRegisterAllCalled = PETSC_FALSE;
40298fd71SBarry Smith PetscFunctionList SNESLineSearchList              = NULL;
5bf7f4e0aSPeter Brune 
6f1c6b773SPeter Brune PetscClassId  SNESLINESEARCH_CLASSID;
757a83faaSBarry Smith PetscLogEvent SNESLINESEARCH_Apply;
8bf7f4e0aSPeter Brune 
9dcf2fd19SBarry Smith /*@
10dcf2fd19SBarry Smith    SNESLineSearchMonitorCancel - Clears all the monitor functions for a SNESLineSearch object.
11dcf2fd19SBarry Smith 
12dcf2fd19SBarry Smith    Logically Collective on SNESLineSearch
13dcf2fd19SBarry Smith 
14dcf2fd19SBarry Smith    Input Parameters:
15dcf2fd19SBarry Smith .  ls - the SNESLineSearch context
16dcf2fd19SBarry Smith 
17dcf2fd19SBarry Smith    Options Database Key:
18dcf2fd19SBarry Smith .  -snes_linesearch_monitor_cancel - cancels all monitors that have been hardwired
19dcf2fd19SBarry Smith     into a code by calls to SNESLineSearchMonitorSet(), but does not cancel those
20dcf2fd19SBarry Smith     set via the options database
21dcf2fd19SBarry Smith 
22dcf2fd19SBarry Smith    Notes:
23dcf2fd19SBarry Smith    There is no way to clear one specific monitor from a SNESLineSearch object.
24dcf2fd19SBarry Smith 
25dcf2fd19SBarry Smith    This does not clear the monitor set with SNESLineSearchSetDefaultMonitor() use SNESLineSearchSetDefaultMonitor(ls,NULL) to cancel
26dcf2fd19SBarry Smith    that one.
27dcf2fd19SBarry Smith 
28dcf2fd19SBarry Smith    Level: intermediate
29dcf2fd19SBarry Smith 
3084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorSet()
31dcf2fd19SBarry Smith @*/
32dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchMonitorCancel(SNESLineSearch ls)
33dcf2fd19SBarry Smith {
34dcf2fd19SBarry Smith   PetscInt       i;
35dcf2fd19SBarry Smith 
36dcf2fd19SBarry Smith   PetscFunctionBegin;
37dcf2fd19SBarry Smith   PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1);
38dcf2fd19SBarry Smith   for (i=0; i<ls->numbermonitors; i++) {
39dcf2fd19SBarry Smith     if (ls->monitordestroy[i]) {
40*5f80ce2aSJacob Faibussowitsch       CHKERRQ((*ls->monitordestroy[i])(&ls->monitorcontext[i]));
41dcf2fd19SBarry Smith     }
42dcf2fd19SBarry Smith   }
43dcf2fd19SBarry Smith   ls->numbermonitors = 0;
44dcf2fd19SBarry Smith   PetscFunctionReturn(0);
45dcf2fd19SBarry Smith }
46dcf2fd19SBarry Smith 
47dcf2fd19SBarry Smith /*@
48dcf2fd19SBarry Smith    SNESLineSearchMonitor - runs the user provided monitor routines, if they exist
49dcf2fd19SBarry Smith 
50dcf2fd19SBarry Smith    Collective on SNES
51dcf2fd19SBarry Smith 
52dcf2fd19SBarry Smith    Input Parameters:
53dcf2fd19SBarry Smith .  ls - the linesearch object
54dcf2fd19SBarry Smith 
55dcf2fd19SBarry Smith    Notes:
56dcf2fd19SBarry Smith    This routine is called by the SNES implementations.
57dcf2fd19SBarry Smith    It does not typically need to be called by the user.
58dcf2fd19SBarry Smith 
59dcf2fd19SBarry Smith    Level: developer
60dcf2fd19SBarry Smith 
6184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorSet()
62dcf2fd19SBarry Smith @*/
63dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchMonitor(SNESLineSearch ls)
64dcf2fd19SBarry Smith {
65dcf2fd19SBarry Smith   PetscInt       i,n = ls->numbermonitors;
66dcf2fd19SBarry Smith 
67dcf2fd19SBarry Smith   PetscFunctionBegin;
68dcf2fd19SBarry Smith   for (i=0; i<n; i++) {
69*5f80ce2aSJacob Faibussowitsch     CHKERRQ((*ls->monitorftns[i])(ls,ls->monitorcontext[i]));
70dcf2fd19SBarry Smith   }
71dcf2fd19SBarry Smith   PetscFunctionReturn(0);
72dcf2fd19SBarry Smith }
73dcf2fd19SBarry Smith 
74dcf2fd19SBarry Smith /*@C
75dcf2fd19SBarry Smith    SNESLineSearchMonitorSet - Sets an ADDITIONAL function that is to be used at every
76dcf2fd19SBarry Smith    iteration of the nonlinear solver to display the iteration's
77dcf2fd19SBarry Smith    progress.
78dcf2fd19SBarry Smith 
79dcf2fd19SBarry Smith    Logically Collective on SNESLineSearch
80dcf2fd19SBarry Smith 
81dcf2fd19SBarry Smith    Input Parameters:
82dcf2fd19SBarry Smith +  ls - the SNESLineSearch context
83dcf2fd19SBarry Smith .  f - the monitor function
84dcf2fd19SBarry Smith .  mctx - [optional] user-defined context for private data for the
85dcf2fd19SBarry Smith           monitor routine (use NULL if no context is desired)
86dcf2fd19SBarry Smith -  monitordestroy - [optional] routine that frees monitor context
87dcf2fd19SBarry Smith           (may be NULL)
88dcf2fd19SBarry Smith 
89dcf2fd19SBarry Smith    Notes:
90dcf2fd19SBarry Smith    Several different monitoring routines may be set by calling
91dcf2fd19SBarry Smith    SNESLineSearchMonitorSet() multiple times; all will be called in the
92dcf2fd19SBarry Smith    order in which they were set.
93dcf2fd19SBarry Smith 
9495452b02SPatrick Sanan    Fortran Notes:
9595452b02SPatrick Sanan     Only a single monitor function can be set for each SNESLineSearch object
96dcf2fd19SBarry Smith 
97dcf2fd19SBarry Smith    Level: intermediate
98dcf2fd19SBarry Smith 
9984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorCancel()
100dcf2fd19SBarry Smith @*/
101dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchMonitorSet(SNESLineSearch ls,PetscErrorCode (*f)(SNESLineSearch,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
102dcf2fd19SBarry Smith {
10378064530SBarry Smith   PetscInt       i;
10478064530SBarry Smith   PetscBool      identical;
10578064530SBarry Smith 
106dcf2fd19SBarry Smith   PetscFunctionBegin;
107dcf2fd19SBarry Smith   PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1);
10878064530SBarry Smith   for (i=0; i<ls->numbermonitors;i++) {
109*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMonitorCompare((PetscErrorCode (*)(void))f,mctx,monitordestroy,(PetscErrorCode (*)(void))ls->monitorftns[i],ls->monitorcontext[i],ls->monitordestroy[i],&identical));
11078064530SBarry Smith     if (identical) PetscFunctionReturn(0);
11178064530SBarry Smith   }
112*5f80ce2aSJacob Faibussowitsch   PetscCheck(ls->numbermonitors < MAXSNESLSMONITORS,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
113dcf2fd19SBarry Smith   ls->monitorftns[ls->numbermonitors]          = f;
114dcf2fd19SBarry Smith   ls->monitordestroy[ls->numbermonitors]   = monitordestroy;
115dcf2fd19SBarry Smith   ls->monitorcontext[ls->numbermonitors++] = (void*)mctx;
116dcf2fd19SBarry Smith   PetscFunctionReturn(0);
117dcf2fd19SBarry Smith }
118dcf2fd19SBarry Smith 
119dcf2fd19SBarry Smith /*@C
120dcf2fd19SBarry Smith    SNESLineSearchMonitorSolutionUpdate - Monitors each update a new function value the linesearch tries
121dcf2fd19SBarry Smith 
122dcf2fd19SBarry Smith    Collective on SNESLineSearch
123dcf2fd19SBarry Smith 
124dcf2fd19SBarry Smith    Input Parameters:
125dcf2fd19SBarry Smith +  ls - the SNES linesearch object
126d12e167eSBarry Smith -  vf - the context for the monitor, in this case it is an ASCII PetscViewer and format
127dcf2fd19SBarry Smith 
128dcf2fd19SBarry Smith    Level: intermediate
129dcf2fd19SBarry Smith 
13084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESMonitorSet(), SNESMonitorSolution()
131dcf2fd19SBarry Smith @*/
132d12e167eSBarry Smith PetscErrorCode  SNESLineSearchMonitorSolutionUpdate(SNESLineSearch ls,PetscViewerAndFormat *vf)
133dcf2fd19SBarry Smith {
134d12e167eSBarry Smith   PetscViewer    viewer = vf->viewer;
135dcf2fd19SBarry Smith   Vec            Y,W,G;
136dcf2fd19SBarry Smith 
137dcf2fd19SBarry Smith   PetscFunctionBegin;
138*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchGetVecs(ls,NULL,NULL,&Y,&W,&G));
139*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerPushFormat(viewer,vf->format));
140*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted update to solution \n"));
141*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(Y,viewer));
142*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted new solution \n"));
143*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(W,viewer));
144*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted updated function value\n"));
145*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(G,viewer));
146*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerPopFormat(viewer));
147dcf2fd19SBarry Smith   PetscFunctionReturn(0);
148dcf2fd19SBarry Smith }
149dcf2fd19SBarry Smith 
150f40b411bSPeter Brune /*@
151cd7522eaSPeter Brune    SNESLineSearchCreate - Creates the line search context.
152f40b411bSPeter Brune 
153cd7522eaSPeter Brune    Logically Collective on Comm
154f40b411bSPeter Brune 
155f40b411bSPeter Brune    Input Parameters:
156cd7522eaSPeter Brune .  comm - MPI communicator for the line search (typically from the associated SNES context).
157f40b411bSPeter Brune 
158f40b411bSPeter Brune    Output Parameters:
1598e557f58SPeter Brune .  outlinesearch - the new linesearch context
160f40b411bSPeter Brune 
161162e0bf5SPeter Brune    Level: developer
162162e0bf5SPeter Brune 
163162e0bf5SPeter Brune    Notes:
164162e0bf5SPeter Brune    The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance
165162e0bf5SPeter Brune    already associated with the SNES.  This function is for developer use.
166f40b411bSPeter Brune 
167162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch()
168f40b411bSPeter Brune @*/
169f40b411bSPeter Brune 
170bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch)
171bf388a1fSBarry Smith {
172f1c6b773SPeter Brune   SNESLineSearch linesearch;
173bf388a1fSBarry Smith 
174bf7f4e0aSPeter Brune   PetscFunctionBegin;
175ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
176*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESInitializePackage());
1770298fd71SBarry Smith   *outlinesearch = NULL;
178f5af7f23SKarl Rupp 
179*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(linesearch,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView));
180bf7f4e0aSPeter Brune 
1810298fd71SBarry Smith   linesearch->vec_sol_new  = NULL;
1820298fd71SBarry Smith   linesearch->vec_func_new = NULL;
1830298fd71SBarry Smith   linesearch->vec_sol      = NULL;
1840298fd71SBarry Smith   linesearch->vec_func     = NULL;
1850298fd71SBarry Smith   linesearch->vec_update   = NULL;
1869bd66eb0SPeter Brune 
187bf7f4e0aSPeter Brune   linesearch->lambda       = 1.0;
188bf7f4e0aSPeter Brune   linesearch->fnorm        = 1.0;
189bf7f4e0aSPeter Brune   linesearch->ynorm        = 1.0;
190bf7f4e0aSPeter Brune   linesearch->xnorm        = 1.0;
191422a814eSBarry Smith   linesearch->result       = SNES_LINESEARCH_SUCCEEDED;
192bf7f4e0aSPeter Brune   linesearch->norms        = PETSC_TRUE;
193bf7f4e0aSPeter Brune   linesearch->keeplambda   = PETSC_FALSE;
194bf7f4e0aSPeter Brune   linesearch->damping      = 1.0;
195bf7f4e0aSPeter Brune   linesearch->maxstep      = 1e8;
196bf7f4e0aSPeter Brune   linesearch->steptol      = 1e-12;
197516fe3c3SPeter Brune   linesearch->rtol         = 1e-8;
198516fe3c3SPeter Brune   linesearch->atol         = 1e-15;
199516fe3c3SPeter Brune   linesearch->ltol         = 1e-8;
2000298fd71SBarry Smith   linesearch->precheckctx  = NULL;
2010298fd71SBarry Smith   linesearch->postcheckctx = NULL;
20259405d5eSPeter Brune   linesearch->max_its      = 1;
203bf7f4e0aSPeter Brune   linesearch->setupcalled  = PETSC_FALSE;
2043add74b1SBarry Smith   linesearch->monitor      = NULL;
205bf7f4e0aSPeter Brune   *outlinesearch           = linesearch;
206bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
207bf7f4e0aSPeter Brune }
208bf7f4e0aSPeter Brune 
209f40b411bSPeter Brune /*@
21078bcb3b5SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied by allocating
21178bcb3b5SPeter Brune    any required vectors.
212f40b411bSPeter Brune 
213cd7522eaSPeter Brune    Collective on SNESLineSearch
214f40b411bSPeter Brune 
215f40b411bSPeter Brune    Input Parameters:
216f40b411bSPeter Brune .  linesearch - The LineSearch instance.
217f40b411bSPeter Brune 
218cd7522eaSPeter Brune    Notes:
219f190f2fcSBarry Smith    For most cases, this needn't be called by users or outside of SNESLineSearchApply().
220cd7522eaSPeter Brune    The only current case where this is called outside of this is for the VI
22178bcb3b5SPeter Brune    solvers, which modify the solution and work vectors before the first call
222cd7522eaSPeter Brune    of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be
223cd7522eaSPeter Brune    allocated upfront.
224cd7522eaSPeter Brune 
22578bcb3b5SPeter Brune    Level: advanced
226f40b411bSPeter Brune 
22784238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchReset()
228f40b411bSPeter Brune @*/
229f40b411bSPeter Brune 
230bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch)
231bf388a1fSBarry Smith {
232bf7f4e0aSPeter Brune   PetscFunctionBegin;
233bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
234*5f80ce2aSJacob Faibussowitsch     CHKERRQ(SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC));
235bf7f4e0aSPeter Brune   }
236bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
2379bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
238*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new));
2399bd66eb0SPeter Brune     }
2409bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
241*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new));
2429bd66eb0SPeter Brune     }
243bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
244*5f80ce2aSJacob Faibussowitsch       CHKERRQ((*linesearch->ops->setup)(linesearch));
245bf7f4e0aSPeter Brune     }
246*5f80ce2aSJacob Faibussowitsch     if (!linesearch->ops->snesfunc) CHKERRQ(SNESLineSearchSetFunction(linesearch,SNESComputeFunction));
247bf7f4e0aSPeter Brune     linesearch->lambda      = linesearch->damping;
248bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
249bf7f4e0aSPeter Brune   }
250bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
251bf7f4e0aSPeter Brune }
252bf7f4e0aSPeter Brune 
253f40b411bSPeter Brune /*@
254f190f2fcSBarry Smith    SNESLineSearchReset - Undoes the SNESLineSearchSetUp() and deletes any Vecs or Mats allocated by the line search.
255f40b411bSPeter Brune 
256f1c6b773SPeter Brune    Collective on SNESLineSearch
257f40b411bSPeter Brune 
258f40b411bSPeter Brune    Input Parameters:
259f40b411bSPeter Brune .  linesearch - The LineSearch instance.
260f40b411bSPeter Brune 
26195452b02SPatrick Sanan    Notes:
26295452b02SPatrick Sanan     Usually only called by SNESReset()
263f190f2fcSBarry Smith 
264f190f2fcSBarry Smith    Level: developer
265f40b411bSPeter Brune 
26684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetUp()
267f40b411bSPeter Brune @*/
268f40b411bSPeter Brune 
269bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
270bf388a1fSBarry Smith {
271bf7f4e0aSPeter Brune   PetscFunctionBegin;
272*5f80ce2aSJacob Faibussowitsch   if (linesearch->ops->reset) CHKERRQ((*linesearch->ops->reset)(linesearch));
273f5af7f23SKarl Rupp 
274*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&linesearch->vec_sol_new));
275*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&linesearch->vec_func_new));
276bf7f4e0aSPeter Brune 
277*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroyVecs(linesearch->nwork, &linesearch->work));
278f5af7f23SKarl Rupp 
279bf7f4e0aSPeter Brune   linesearch->nwork       = 0;
280bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
281bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
282bf7f4e0aSPeter Brune }
283bf7f4e0aSPeter Brune 
284ed07d7d7SPeter Brune /*@C
285f190f2fcSBarry Smith    SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search
286ed07d7d7SPeter Brune 
287ed07d7d7SPeter Brune    Input Parameters:
288ed07d7d7SPeter Brune .  linesearch - the SNESLineSearch context
289f190f2fcSBarry Smith +  func       - function evaluation routine
290ed07d7d7SPeter Brune 
291ed07d7d7SPeter Brune    Level: developer
292ed07d7d7SPeter Brune 
29395452b02SPatrick Sanan    Notes:
29495452b02SPatrick Sanan     This is used internally by PETSc and not called by users
295f190f2fcSBarry Smith 
29684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESSetFunction()
297ed07d7d7SPeter Brune @*/
298ed07d7d7SPeter Brune PetscErrorCode  SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec))
299ed07d7d7SPeter Brune {
300ed07d7d7SPeter Brune   PetscFunctionBegin;
301ed07d7d7SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
302ed07d7d7SPeter Brune   linesearch->ops->snesfunc = func;
303ed07d7d7SPeter Brune   PetscFunctionReturn(0);
304ed07d7d7SPeter Brune }
305ed07d7d7SPeter Brune 
30686d74e61SPeter Brune /*@C
307f190f2fcSBarry Smith    SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but
308df3898eeSBarry Smith          before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that
309f190f2fcSBarry Smith          determined the search direction.
31086d74e61SPeter Brune 
311f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
31286d74e61SPeter Brune 
31386d74e61SPeter Brune    Input Parameters:
314f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
31584238204SBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for the calling sequence
316f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
31786d74e61SPeter Brune 
31886d74e61SPeter Brune    Level: intermediate
31986d74e61SPeter Brune 
32084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
32186d74e61SPeter Brune @*/
322f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
32386d74e61SPeter Brune {
3249bd66eb0SPeter Brune   PetscFunctionBegin;
325f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
326f190f2fcSBarry Smith   if (func) linesearch->ops->precheck = func;
32786d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
32886d74e61SPeter Brune   PetscFunctionReturn(0);
32986d74e61SPeter Brune }
33086d74e61SPeter Brune 
33186d74e61SPeter Brune /*@C
33253deb899SBarry Smith    SNESLineSearchGetPreCheck - Gets the pre-check function for the line search routine.
33386d74e61SPeter Brune 
334f899ff85SJose E. Roman    Input Parameter:
335f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
33686d74e61SPeter Brune 
33786d74e61SPeter Brune    Output Parameters:
33884238204SBarry Smith +  func       - [optional] function evaluation routine, see SNESLineSearchPreCheck() for calling sequence
339f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
34086d74e61SPeter Brune 
34186d74e61SPeter Brune    Level: intermediate
34286d74e61SPeter Brune 
34384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
34486d74e61SPeter Brune @*/
345f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
34686d74e61SPeter Brune {
3479bd66eb0SPeter Brune   PetscFunctionBegin;
348f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
349f190f2fcSBarry Smith   if (func) *func = linesearch->ops->precheck;
35086d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
35186d74e61SPeter Brune   PetscFunctionReturn(0);
35286d74e61SPeter Brune }
35386d74e61SPeter Brune 
35486d74e61SPeter Brune /*@C
355f190f2fcSBarry Smith    SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step
356f190f2fcSBarry Smith        direction and length. Allows the user a chance to change or override the decision of the line search routine
35786d74e61SPeter Brune 
358f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
35986d74e61SPeter Brune 
36086d74e61SPeter Brune    Input Parameters:
361f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
36284238204SBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPostCheck()  for the calling sequence
363f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
36486d74e61SPeter Brune 
36586d74e61SPeter Brune    Level: intermediate
36686d74e61SPeter Brune 
36784238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck()
36886d74e61SPeter Brune @*/
369f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx)
37086d74e61SPeter Brune {
37186d74e61SPeter Brune   PetscFunctionBegin;
372f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
373f190f2fcSBarry Smith   if (func) linesearch->ops->postcheck = func;
37486d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
37586d74e61SPeter Brune   PetscFunctionReturn(0);
37686d74e61SPeter Brune }
37786d74e61SPeter Brune 
37886d74e61SPeter Brune /*@C
379f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
38086d74e61SPeter Brune 
381f899ff85SJose E. Roman    Input Parameter:
382f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
38386d74e61SPeter Brune 
38486d74e61SPeter Brune    Output Parameters:
38584238204SBarry Smith +  func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheck()
386f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
38786d74e61SPeter Brune 
38886d74e61SPeter Brune    Level: intermediate
38986d74e61SPeter Brune 
39084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck()
39186d74e61SPeter Brune @*/
392f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx)
39386d74e61SPeter Brune {
3949bd66eb0SPeter Brune   PetscFunctionBegin;
395f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
396f190f2fcSBarry Smith   if (func) *func = linesearch->ops->postcheck;
39786d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
39886d74e61SPeter Brune   PetscFunctionReturn(0);
39986d74e61SPeter Brune }
40086d74e61SPeter Brune 
401f40b411bSPeter Brune /*@
402f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
403f40b411bSPeter Brune 
404cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
405f40b411bSPeter Brune 
406f40b411bSPeter Brune    Input Parameters:
4077b1df9c1SPeter Brune +  linesearch - The linesearch instance.
4087b1df9c1SPeter Brune .  X - The current solution
4097b1df9c1SPeter Brune -  Y - The step direction
410f40b411bSPeter Brune 
411f40b411bSPeter Brune    Output Parameters:
4128e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
413f40b411bSPeter Brune 
414f190f2fcSBarry Smith    Level: developer
415f40b411bSPeter Brune 
41684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck()
417f40b411bSPeter Brune @*/
4187b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
419bf7f4e0aSPeter Brune {
420bf7f4e0aSPeter Brune   PetscFunctionBegin;
421bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
4226b2b7091SBarry Smith   if (linesearch->ops->precheck) {
423*5f80ce2aSJacob Faibussowitsch     CHKERRQ((*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx));
42438bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
425bf7f4e0aSPeter Brune   }
426bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
427bf7f4e0aSPeter Brune }
428bf7f4e0aSPeter Brune 
429f40b411bSPeter Brune /*@
430f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
431f40b411bSPeter Brune 
432cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
433f40b411bSPeter Brune 
434f40b411bSPeter Brune    Input Parameters:
4357b1df9c1SPeter Brune +  linesearch - The linesearch context
4367b1df9c1SPeter Brune .  X - The last solution
4377b1df9c1SPeter Brune .  Y - The step direction
4387b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
439f40b411bSPeter Brune 
440f40b411bSPeter Brune    Output Parameters:
44178bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
44278bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
443f40b411bSPeter Brune 
444f190f2fcSBarry Smith    Level: developer
445f40b411bSPeter Brune 
44684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPrecheck(), SNESLineSearchGetPrecheck()
447f40b411bSPeter Brune @*/
4487b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
449bf7f4e0aSPeter Brune {
450bf7f4e0aSPeter Brune   PetscFunctionBegin;
451bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
452bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
4536b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
454*5f80ce2aSJacob Faibussowitsch     CHKERRQ((*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx));
45538bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
45638bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
45786d74e61SPeter Brune   }
45886d74e61SPeter Brune   PetscFunctionReturn(0);
45986d74e61SPeter Brune }
46086d74e61SPeter Brune 
46186d74e61SPeter Brune /*@C
46286d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
46386d74e61SPeter Brune 
464cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
46586d74e61SPeter Brune 
4664165533cSJose E. Roman    Input Parameters:
46786d74e61SPeter Brune +  linesearch - linesearch context
46886d74e61SPeter Brune .  X - base state for this step
469907376e6SBarry Smith -  ctx - context for this function
47086d74e61SPeter Brune 
47197bb3fdcSJose E. Roman    Input/Output Parameter:
47297bb3fdcSJose E. Roman .  Y - correction, possibly modified
47397bb3fdcSJose E. Roman 
47497bb3fdcSJose E. Roman    Output Parameter:
47597bb3fdcSJose E. Roman .  changed - flag indicating that Y was modified
47686d74e61SPeter Brune 
47786d74e61SPeter Brune    Options Database Key:
478cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
479cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
48086d74e61SPeter Brune 
48186d74e61SPeter Brune    Level: advanced
48286d74e61SPeter Brune 
48386d74e61SPeter Brune    Notes:
48486d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
48586d74e61SPeter Brune 
48686d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
48786d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
48886d74e61SPeter Brune    is generally not useful when using a Newton linearization.
48986d74e61SPeter Brune 
49086d74e61SPeter Brune    Reference:
49186d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
49286d74e61SPeter Brune 
49384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetPreCheck()
49486d74e61SPeter Brune @*/
495f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
49686d74e61SPeter Brune {
49786d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
49886d74e61SPeter Brune   Vec            Ylast;
49986d74e61SPeter Brune   PetscScalar    dot;
50086d74e61SPeter Brune   PetscInt       iter;
50186d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
50286d74e61SPeter Brune   SNES           snes;
50386d74e61SPeter Brune 
50486d74e61SPeter Brune   PetscFunctionBegin;
505*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchGetSNES(linesearch, &snes));
506*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast));
50786d74e61SPeter Brune   if (!Ylast) {
508*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDuplicate(Y,&Ylast));
509*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast));
510*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectDereference((PetscObject)Ylast));
51186d74e61SPeter Brune   }
512*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESGetIterationNumber(snes,&iter));
51386d74e61SPeter Brune   if (iter < 2) {
514*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(Y,Ylast));
51586d74e61SPeter Brune     *changed = PETSC_FALSE;
51686d74e61SPeter Brune     PetscFunctionReturn(0);
51786d74e61SPeter Brune   }
51886d74e61SPeter Brune 
519*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDot(Y,Ylast,&dot));
520*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecNorm(Y,NORM_2,&ynorm));
521*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecNorm(Ylast,NORM_2,&ylastnorm));
52286d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
523255453a1SBarry Smith   theta         = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
52486d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
52586d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
52686d74e61SPeter Brune     /* Modify the step Y */
52786d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
528*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecAXPY(Ylast,-1.0,Y));
529*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecNorm(Ylast,NORM_2,&ydiffnorm));
530f85e2ce2SBarry Smith     alpha = (ydiffnorm > .001*ylastnorm) ? ylastnorm / ydiffnorm : 1000.0;
531*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(Y,Ylast));
532*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecScale(Y,alpha));
533*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(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));
534a47ec85fSBarry Smith     *changed = PETSC_TRUE;
53586d74e61SPeter Brune   } else {
536*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(snes,"Angle %14.12e degrees exceeds threshold %14.12e, no correction applied\n",(double)(theta*180./PETSC_PI),(double)angle));
537*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(Y,Ylast));
53886d74e61SPeter Brune     *changed = PETSC_FALSE;
539bf7f4e0aSPeter Brune   }
540bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
541bf7f4e0aSPeter Brune }
542bf7f4e0aSPeter Brune 
543f40b411bSPeter Brune /*@
544cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
545f40b411bSPeter Brune 
546f1c6b773SPeter Brune    Collective on SNESLineSearch
547f40b411bSPeter Brune 
548f40b411bSPeter Brune    Input Parameters:
5498e557f58SPeter Brune +  linesearch - The linesearch context
5508e557f58SPeter Brune -  Y - The search direction
551f40b411bSPeter Brune 
5526b867d5aSJose E. Roman    Input/Output Parameters:
5536b867d5aSJose E. Roman +  X - The current solution, on output the new solution
5546b867d5aSJose E. Roman .  F - The current function, on output the new function
5556b867d5aSJose E. Roman -  fnorm - The current norm, on output the new function norm
556f40b411bSPeter Brune 
557cd7522eaSPeter Brune    Options Database Keys:
558d4c6564cSPatrick Farrell + -snes_linesearch_type - basic, bt, l2, cp, nleqerr, shell
559dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches
5601fe24845SBarry Smith . -snes_linesearch_damping - The linesearch damping parameter, default is 1.0 (no damping)
5611fe24845SBarry Smith . -snes_linesearch_norms   - Turn on/off the linesearch norms computation (SNESLineSearchSetComputeNorms())
5623c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
5633c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
564cd7522eaSPeter Brune 
565cd7522eaSPeter Brune    Notes:
566cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
567cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
568cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
569cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
57084238204SBarry Smith    application of the line search may invoke SNESComputeFunction() several times, and
571cd7522eaSPeter Brune    therefore may be fairly expensive.
572cd7522eaSPeter Brune 
573f40b411bSPeter Brune    Level: Intermediate
574f40b411bSPeter Brune 
57584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction(), SNESLineSearchSetComputeNorms(),
5761fe24845SBarry Smith           SNESLineSearchType, SNESLineSearchSetType()
577f40b411bSPeter Brune @*/
578bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
579bf388a1fSBarry Smith {
580bf388a1fSBarry Smith   PetscFunctionBegin;
581f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
582bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
583bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
584064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(Y,VEC_CLASSID,5);
585bf7f4e0aSPeter Brune 
586422a814eSBarry Smith   linesearch->result = SNES_LINESEARCH_SUCCEEDED;
587bf7f4e0aSPeter Brune 
588bf7f4e0aSPeter Brune   linesearch->vec_sol    = X;
589bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
590bf7f4e0aSPeter Brune   linesearch->vec_func   = F;
591bf7f4e0aSPeter Brune 
592*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchSetUp(linesearch));
593bf7f4e0aSPeter Brune 
594f5af7f23SKarl Rupp   if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
595bf7f4e0aSPeter Brune 
596f5af7f23SKarl Rupp   if (fnorm) linesearch->fnorm = *fnorm;
597f5af7f23SKarl Rupp   else {
598*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecNorm(F, NORM_2, &linesearch->fnorm));
599bf7f4e0aSPeter Brune   }
600bf7f4e0aSPeter Brune 
601*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(SNESLINESEARCH_Apply,linesearch,X,F,Y));
602bf7f4e0aSPeter Brune 
603*5f80ce2aSJacob Faibussowitsch   CHKERRQ((*linesearch->ops->apply)(linesearch));
604bf7f4e0aSPeter Brune 
605*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(SNESLINESEARCH_Apply,linesearch,X,F,Y));
606bf7f4e0aSPeter Brune 
607f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
608bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
609bf7f4e0aSPeter Brune }
610bf7f4e0aSPeter Brune 
611f40b411bSPeter Brune /*@
612f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
613f40b411bSPeter Brune 
614f1c6b773SPeter Brune    Collective on SNESLineSearch
615f40b411bSPeter Brune 
616f40b411bSPeter Brune    Input Parameters:
6178e557f58SPeter Brune .  linesearch - The linesearch context
618f40b411bSPeter Brune 
61984238204SBarry Smith    Level: developer
620f40b411bSPeter Brune 
62184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
622f40b411bSPeter Brune @*/
623bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
624bf388a1fSBarry Smith {
625bf7f4e0aSPeter Brune   PetscFunctionBegin;
626bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
627f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
6289e5d0892SLisandro Dalcin   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = NULL; PetscFunctionReturn(0);}
629*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSAWsViewOff((PetscObject)*linesearch));
630*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchReset(*linesearch));
631f5af7f23SKarl Rupp   if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch);
632*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&(*linesearch)->monitor));
633*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchMonitorCancel((*linesearch)));
634*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(linesearch));
635bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
636bf7f4e0aSPeter Brune }
637bf7f4e0aSPeter Brune 
638f40b411bSPeter Brune /*@
639dcf2fd19SBarry Smith    SNESLineSearchSetDefaultMonitor - Turns on/off printing useful information and debugging output about the line search.
640bf7f4e0aSPeter Brune 
641bf7f4e0aSPeter Brune    Input Parameters:
642dcf2fd19SBarry Smith +  linesearch - the linesearch object
643dcf2fd19SBarry Smith -  viewer - an ASCII PetscViewer or NULL to turn off monitor
644bf7f4e0aSPeter Brune 
645dcf2fd19SBarry Smith    Logically Collective on SNESLineSearch
646bf7f4e0aSPeter Brune 
647bf7f4e0aSPeter Brune    Options Database:
648dcf2fd19SBarry Smith .   -snes_linesearch_monitor [:filename] - enables the monitor
649bf7f4e0aSPeter Brune 
650bf7f4e0aSPeter Brune    Level: intermediate
651bf7f4e0aSPeter Brune 
652dcf2fd19SBarry Smith    Developer Note: This monitor is implemented differently than the other SNESLineSearchMonitors that are set with
653d12e167eSBarry Smith      SNESLineSearchMonitorSet() since it is called in many locations of the line search routines to display aspects of the
654d12e167eSBarry Smith      line search that are not visible to the other monitors.
655dcf2fd19SBarry Smith 
65684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetDefaultMonitor(), PetscViewer, SNESLineSearchSetMonitor()
657bf7f4e0aSPeter Brune @*/
658dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchSetDefaultMonitor(SNESLineSearch linesearch, PetscViewer viewer)
659bf7f4e0aSPeter Brune {
660bf7f4e0aSPeter Brune   PetscFunctionBegin;
661*5f80ce2aSJacob Faibussowitsch   if (viewer) CHKERRQ(PetscObjectReference((PetscObject)viewer));
662*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&linesearch->monitor));
663dcf2fd19SBarry Smith   linesearch->monitor = viewer;
664bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
665bf7f4e0aSPeter Brune }
666bf7f4e0aSPeter Brune 
667f40b411bSPeter Brune /*@
668dcf2fd19SBarry Smith    SNESLineSearchGetDefaultMonitor - Gets the PetscViewer instance for the line search monitor.
6696a388c36SPeter Brune 
670f190f2fcSBarry Smith    Input Parameter:
6718e557f58SPeter Brune .  linesearch - linesearch context
672f40b411bSPeter Brune 
673f190f2fcSBarry Smith    Output Parameter:
6748e557f58SPeter Brune .  monitor - monitor context
675f40b411bSPeter Brune 
676f40b411bSPeter Brune    Logically Collective on SNES
677f40b411bSPeter Brune 
678f40b411bSPeter Brune    Options Database Keys:
6798e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
680f40b411bSPeter Brune 
681f40b411bSPeter Brune    Level: intermediate
682f40b411bSPeter Brune 
68384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetDefaultMonitor(), PetscViewer
684f40b411bSPeter Brune @*/
685dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchGetDefaultMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
6866a388c36SPeter Brune {
6876a388c36SPeter Brune   PetscFunctionBegin;
688f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
6896a388c36SPeter Brune   *monitor = linesearch->monitor;
6906a388c36SPeter Brune   PetscFunctionReturn(0);
6916a388c36SPeter Brune }
6926a388c36SPeter Brune 
693dcf2fd19SBarry Smith /*@C
694dcf2fd19SBarry Smith    SNESLineSearchMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user
695dcf2fd19SBarry Smith 
696dcf2fd19SBarry Smith    Collective on SNESLineSearch
697dcf2fd19SBarry Smith 
698dcf2fd19SBarry Smith    Input Parameters:
699dcf2fd19SBarry Smith +  ls - LineSearch object you wish to monitor
700dcf2fd19SBarry Smith .  name - the monitor type one is seeking
701dcf2fd19SBarry Smith .  help - message indicating what monitoring is done
702dcf2fd19SBarry Smith .  manual - manual page for the monitor
703dcf2fd19SBarry Smith .  monitor - the monitor function
704dcf2fd19SBarry Smith -  monitorsetup - a function that is called once ONLY if the user selected this monitor that may set additional features of the SNESLineSearch or PetscViewer objects
705dcf2fd19SBarry Smith 
706dcf2fd19SBarry Smith    Level: developer
707dcf2fd19SBarry Smith 
708dcf2fd19SBarry Smith .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
709dcf2fd19SBarry Smith           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
710dcf2fd19SBarry Smith           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
711dcf2fd19SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
712dcf2fd19SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
713dcf2fd19SBarry Smith           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
714dcf2fd19SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
715dcf2fd19SBarry Smith @*/
716d12e167eSBarry Smith PetscErrorCode  SNESLineSearchMonitorSetFromOptions(SNESLineSearch ls,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(SNESLineSearch,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(SNESLineSearch,PetscViewerAndFormat*))
717dcf2fd19SBarry Smith {
718dcf2fd19SBarry Smith   PetscViewer       viewer;
719dcf2fd19SBarry Smith   PetscViewerFormat format;
720dcf2fd19SBarry Smith   PetscBool         flg;
721dcf2fd19SBarry Smith 
722dcf2fd19SBarry Smith   PetscFunctionBegin;
723*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetViewer(PetscObjectComm((PetscObject)ls),((PetscObject) ls)->options,((PetscObject)ls)->prefix,name,&viewer,&format,&flg));
724dcf2fd19SBarry Smith   if (flg) {
725d12e167eSBarry Smith     PetscViewerAndFormat *vf;
726*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerAndFormatCreate(viewer,format,&vf));
727*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectDereference((PetscObject)viewer));
728dcf2fd19SBarry Smith     if (monitorsetup) {
729*5f80ce2aSJacob Faibussowitsch       CHKERRQ((*monitorsetup)(ls,vf));
730dcf2fd19SBarry Smith     }
731*5f80ce2aSJacob Faibussowitsch     CHKERRQ(SNESLineSearchMonitorSet(ls,(PetscErrorCode (*)(SNESLineSearch,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy));
732dcf2fd19SBarry Smith   }
733dcf2fd19SBarry Smith   PetscFunctionReturn(0);
734dcf2fd19SBarry Smith }
735dcf2fd19SBarry Smith 
736f40b411bSPeter Brune /*@
737f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
738f40b411bSPeter Brune 
739f899ff85SJose E. Roman    Input Parameter:
7408e557f58SPeter Brune .  linesearch - linesearch context
741f40b411bSPeter Brune 
742f40b411bSPeter Brune    Options Database Keys:
743d4c6564cSPatrick Farrell + -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell
7443c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
7451fe24845SBarry Smith . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch typem (SNESLineSearchSetComputeNorms())
74671eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
7471a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
7481a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
7491a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
7501a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
7511a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
752dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches
753dcf2fd19SBarry Smith . -snes_linesearch_monitor_solution_update [viewer:filename:format] - view each update tried by line search routine
7548e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
755cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
7561a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
757d8d34be6SBarry Smith - -snes_linesearch_precheck_picard_angle - Angle used in Picard precheck method
758f40b411bSPeter Brune 
759f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
760f40b411bSPeter Brune 
761f40b411bSPeter Brune    Level: intermediate
762f40b411bSPeter Brune 
7631fe24845SBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard(),
7641fe24845SBarry Smith           SNESLineSearchType, SNESLineSearchSetComputeNorms()
765f40b411bSPeter Brune @*/
766bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
767bf388a1fSBarry Smith {
768bf7f4e0aSPeter Brune   PetscErrorCode    ierr;
7691a4f838cSPeter Brune   const char        *deft = SNESLINESEARCHBASIC;
770bf7f4e0aSPeter Brune   char              type[256];
771bf7f4e0aSPeter Brune   PetscBool         flg, set;
772dcf2fd19SBarry Smith   PetscViewer       viewer;
773bf388a1fSBarry Smith 
774bf7f4e0aSPeter Brune   PetscFunctionBegin;
775*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchRegisterAll());
776bf7f4e0aSPeter Brune 
777bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
778f5af7f23SKarl Rupp   if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name;
779*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg));
780bf7f4e0aSPeter Brune   if (flg) {
781*5f80ce2aSJacob Faibussowitsch     CHKERRQ(SNESLineSearchSetType(linesearch,type));
782bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
783*5f80ce2aSJacob Faibussowitsch     CHKERRQ(SNESLineSearchSetType(linesearch,deft));
784bf7f4e0aSPeter Brune   }
785bf7f4e0aSPeter Brune 
786*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetViewer(PetscObjectComm((PetscObject)linesearch),((PetscObject) linesearch)->options,((PetscObject)linesearch)->prefix,"-snes_linesearch_monitor",&viewer,NULL,&set));
787dcf2fd19SBarry Smith   if (set) {
788*5f80ce2aSJacob Faibussowitsch     CHKERRQ(SNESLineSearchSetDefaultMonitor(linesearch,viewer));
789*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
790dcf2fd19SBarry Smith   }
791*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESLineSearchMonitorSetFromOptions(linesearch,"-snes_linesearch_monitor_solution_update","View correction at each iteration","SNESLineSearchMonitorSolutionUpdate",SNESLineSearchMonitorSolutionUpdate,NULL));
792bf7f4e0aSPeter Brune 
7931a9b3a06SPeter Brune   /* tolerances */
794*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL));
795*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL));
796*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL));
797*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL));
798*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL));
799*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL));
8007a35526eSPeter Brune 
8011a9b3a06SPeter Brune   /* damping parameters */
802*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL));
8031a9b3a06SPeter Brune 
804*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL));
8051a9b3a06SPeter Brune 
8061a9b3a06SPeter Brune   /* precheck */
807*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set));
8087a35526eSPeter Brune   if (set) {
8097a35526eSPeter Brune     if (flg) {
8107a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
811f5af7f23SKarl Rupp 
8127a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
8130298fd71SBarry Smith                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr);
814*5f80ce2aSJacob Faibussowitsch       CHKERRQ(SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle));
8157a35526eSPeter Brune     } else {
816*5f80ce2aSJacob Faibussowitsch       CHKERRQ(SNESLineSearchSetPreCheck(linesearch,NULL,NULL));
8177a35526eSPeter Brune     }
8187a35526eSPeter Brune   }
819*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL));
820*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL));
8217a35526eSPeter Brune 
8225a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
823*5f80ce2aSJacob Faibussowitsch     CHKERRQ((*linesearch->ops->setfromoptions)(PetscOptionsObject,linesearch));
8245a9b6599SPeter Brune   }
8255a9b6599SPeter Brune 
826*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)linesearch));
827bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
828bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
829bf7f4e0aSPeter Brune }
830bf7f4e0aSPeter Brune 
831f40b411bSPeter Brune /*@
832f190f2fcSBarry Smith    SNESLineSearchView - Prints useful information about the line search
833f40b411bSPeter Brune 
834f40b411bSPeter Brune    Input Parameters:
8358e557f58SPeter Brune .  linesearch - linesearch context
836f40b411bSPeter Brune 
837f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
838f40b411bSPeter Brune 
839f40b411bSPeter Brune    Level: intermediate
840f40b411bSPeter Brune 
841dcf2fd19SBarry Smith .seealso: SNESLineSearchCreate()
842f40b411bSPeter Brune @*/
843bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
844bf388a1fSBarry Smith {
8457f1410a3SPeter Brune   PetscBool      iascii;
846bf388a1fSBarry Smith 
847bf7f4e0aSPeter Brune   PetscFunctionBegin;
8487f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
8497f1410a3SPeter Brune   if (!viewer) {
850*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer));
8517f1410a3SPeter Brune   }
8527f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
8537f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
854f40b411bSPeter Brune 
855*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
8567f1410a3SPeter Brune   if (iascii) {
857*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer));
8587f1410a3SPeter Brune     if (linesearch->ops->view) {
859*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPushTab(viewer));
860*5f80ce2aSJacob Faibussowitsch       CHKERRQ((*linesearch->ops->view)(linesearch,viewer));
861*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPopTab(viewer));
8627f1410a3SPeter Brune     }
863*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol));
864*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol));
865*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its));
8666b2b7091SBarry Smith     if (linesearch->ops->precheck) {
8676b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
868*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its));
8697f1410a3SPeter Brune       } else {
870*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its));
8717f1410a3SPeter Brune       }
8727f1410a3SPeter Brune     }
8736b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
874*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its));
8757f1410a3SPeter Brune     }
8767f1410a3SPeter Brune   }
877bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
878bf7f4e0aSPeter Brune }
879bf7f4e0aSPeter Brune 
880ea5d4fccSPeter Brune /*@C
881a80ff896SJed Brown    SNESLineSearchGetType - Gets the linesearch type
882a80ff896SJed Brown 
883a80ff896SJed Brown    Logically Collective on SNESLineSearch
884a80ff896SJed Brown 
885a80ff896SJed Brown    Input Parameters:
886a80ff896SJed Brown .  linesearch - linesearch context
887a80ff896SJed Brown 
888a80ff896SJed Brown    Output Parameters:
889a80ff896SJed Brown -  type - The type of line search, or NULL if not set
890a80ff896SJed Brown 
891a80ff896SJed Brown    Level: intermediate
892a80ff896SJed Brown 
893a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchSetType()
894a80ff896SJed Brown @*/
895a80ff896SJed Brown PetscErrorCode SNESLineSearchGetType(SNESLineSearch linesearch, SNESLineSearchType *type)
896a80ff896SJed Brown {
897a80ff896SJed Brown   PetscFunctionBegin;
898a80ff896SJed Brown   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
899a80ff896SJed Brown   PetscValidCharPointer(type,2);
900a80ff896SJed Brown   *type = ((PetscObject)linesearch)->type_name;
901a80ff896SJed Brown   PetscFunctionReturn(0);
902a80ff896SJed Brown }
903a80ff896SJed Brown 
904a80ff896SJed Brown /*@C
905f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
906f40b411bSPeter Brune 
907f190f2fcSBarry Smith    Logically Collective on SNESLineSearch
908f190f2fcSBarry Smith 
909f40b411bSPeter Brune    Input Parameters:
9108e557f58SPeter Brune +  linesearch - linesearch context
911f40b411bSPeter Brune -  type - The type of line search to be used
912f40b411bSPeter Brune 
913cd7522eaSPeter Brune    Available Types:
9141fe24845SBarry Smith +  SNESLINESEARCHBASIC - Simple damping line search, defaults to using the full Newton step
9151fe24845SBarry Smith .  SNESLINESEARCHBT - Backtracking line search over the L2 norm of the function
9161fe24845SBarry Smith .  SNESLINESEARCHL2 - Secant line search over the L2 norm of the function
9171fe24845SBarry Smith .  SNESLINESEARCHCP - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
9181fe24845SBarry Smith .  SNESLINESEARCHNLEQERR - Affine-covariant error-oriented linesearch
9191fe24845SBarry Smith -  SNESLINESEARCHSHELL - User provided SNESLineSearch implementation
9201fe24845SBarry Smith 
9211fe24845SBarry Smith    Options Database:
9221fe24845SBarry Smith .  -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell
923cd7522eaSPeter Brune 
924f40b411bSPeter Brune    Level: intermediate
925f40b411bSPeter Brune 
926a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchGetType()
927f40b411bSPeter Brune @*/
92819fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
929bf7f4e0aSPeter Brune {
930bf7f4e0aSPeter Brune   PetscBool      match;
931*5f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(SNESLineSearch);
932bf7f4e0aSPeter Brune 
933bf7f4e0aSPeter Brune   PetscFunctionBegin;
934f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
935bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
936bf7f4e0aSPeter Brune 
937*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)linesearch,type,&match));
938bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
939bf7f4e0aSPeter Brune 
940*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListFind(SNESLineSearchList,type,&r));
941*5f80ce2aSJacob Faibussowitsch   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
942bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
943bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
944*5f80ce2aSJacob Faibussowitsch     CHKERRQ((*(linesearch)->ops->destroy)(linesearch));
9450298fd71SBarry Smith     linesearch->ops->destroy = NULL;
946bf7f4e0aSPeter Brune   }
947f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
9489e5d0892SLisandro Dalcin   linesearch->ops->apply          = NULL;
9499e5d0892SLisandro Dalcin   linesearch->ops->view           = NULL;
9509e5d0892SLisandro Dalcin   linesearch->ops->setfromoptions = NULL;
9519e5d0892SLisandro Dalcin   linesearch->ops->destroy        = NULL;
952bf7f4e0aSPeter Brune 
953*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)linesearch,type));
954*5f80ce2aSJacob Faibussowitsch   CHKERRQ((*r)(linesearch));
955bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
956bf7f4e0aSPeter Brune }
957bf7f4e0aSPeter Brune 
958f40b411bSPeter Brune /*@
95978bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
960f40b411bSPeter Brune 
961f40b411bSPeter Brune    Input Parameters:
9628e557f58SPeter Brune +  linesearch - linesearch context
963f40b411bSPeter Brune -  snes - The snes instance
964f40b411bSPeter Brune 
96578bcb3b5SPeter Brune    Level: developer
96678bcb3b5SPeter Brune 
96778bcb3b5SPeter Brune    Notes:
968f190f2fcSBarry Smith    This happens automatically when the line search is obtained/created with
9697601faf0SJed Brown    SNESGetLineSearch().  This routine is therefore mainly called within SNES
97078bcb3b5SPeter Brune    implementations.
971f40b411bSPeter Brune 
9728141a3b9SPeter Brune    Level: developer
973f40b411bSPeter Brune 
974cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
975f40b411bSPeter Brune @*/
976bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
977bf388a1fSBarry Smith {
978bf7f4e0aSPeter Brune   PetscFunctionBegin;
979f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
980bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
981bf7f4e0aSPeter Brune   linesearch->snes = snes;
982bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
983bf7f4e0aSPeter Brune }
984bf7f4e0aSPeter Brune 
985f40b411bSPeter Brune /*@
9868141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
9878141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
9888141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
9898141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
990f40b411bSPeter Brune 
991f40b411bSPeter Brune    Input Parameters:
9928e557f58SPeter Brune .  linesearch - linesearch context
993f40b411bSPeter Brune 
994f40b411bSPeter Brune    Output Parameters:
995f40b411bSPeter Brune .  snes - The snes instance
996f40b411bSPeter Brune 
9978141a3b9SPeter Brune    Level: developer
998f40b411bSPeter Brune 
999cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
1000f40b411bSPeter Brune @*/
1001bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
1002bf388a1fSBarry Smith {
1003bf7f4e0aSPeter Brune   PetscFunctionBegin;
1004f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10056a388c36SPeter Brune   PetscValidPointer(snes,2);
1006bf7f4e0aSPeter Brune   *snes = linesearch->snes;
1007bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1008bf7f4e0aSPeter Brune }
1009bf7f4e0aSPeter Brune 
1010f40b411bSPeter Brune /*@
1011f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
1012f40b411bSPeter Brune 
1013f40b411bSPeter Brune    Input Parameters:
10148e557f58SPeter Brune .  linesearch - linesearch context
1015f40b411bSPeter Brune 
1016f40b411bSPeter Brune    Output Parameters:
1017cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
1018f40b411bSPeter Brune 
101978bcb3b5SPeter Brune    Level: advanced
102078bcb3b5SPeter Brune 
10218e557f58SPeter Brune    Notes:
10228e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
102378bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
102478bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
102578bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
102678bcb3b5SPeter Brune 
1027cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
1028f40b411bSPeter Brune @*/
1029f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
10306a388c36SPeter Brune {
10316a388c36SPeter Brune   PetscFunctionBegin;
1032f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1033534a8f05SLisandro Dalcin   PetscValidRealPointer(lambda, 2);
10346a388c36SPeter Brune   *lambda = linesearch->lambda;
10356a388c36SPeter Brune   PetscFunctionReturn(0);
10366a388c36SPeter Brune }
10376a388c36SPeter Brune 
1038f40b411bSPeter Brune /*@
1039f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
1040f40b411bSPeter Brune 
1041f40b411bSPeter Brune    Input Parameters:
10428e557f58SPeter Brune +  linesearch - linesearch context
1043f40b411bSPeter Brune -  lambda - The last steplength.
1044f40b411bSPeter Brune 
1045cd7522eaSPeter Brune    Notes:
1046f190f2fcSBarry Smith    This routine is typically used within implementations of SNESLineSearchApply()
1047cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
1048cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
1049cd7522eaSPeter Brune    as an inner scaling parameter.
1050cd7522eaSPeter Brune 
105178bcb3b5SPeter Brune    Level: advanced
1052f40b411bSPeter Brune 
1053f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
1054f40b411bSPeter Brune @*/
1055f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
10566a388c36SPeter Brune {
10576a388c36SPeter Brune   PetscFunctionBegin;
1058f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10596a388c36SPeter Brune   linesearch->lambda = lambda;
10606a388c36SPeter Brune   PetscFunctionReturn(0);
10616a388c36SPeter Brune }
10626a388c36SPeter Brune 
1063f40b411bSPeter Brune /*@
10643c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
106578bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
106678bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
106778bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1068f40b411bSPeter Brune 
1069f899ff85SJose E. Roman    Input Parameter:
10708e557f58SPeter Brune .  linesearch - linesearch context
1071f40b411bSPeter Brune 
1072f40b411bSPeter Brune    Output Parameters:
1073516fe3c3SPeter Brune +  steptol - The minimum steplength
10746cc8e53bSPeter Brune .  maxstep - The maximum steplength
1075516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1076516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1077516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1078516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1079f40b411bSPeter Brune 
108078bcb3b5SPeter Brune    Level: intermediate
108178bcb3b5SPeter Brune 
108278bcb3b5SPeter Brune    Notes:
108378bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
10843c7d6663SPeter Brune    the type requires.
1085516fe3c3SPeter Brune 
1086f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
1087f40b411bSPeter Brune @*/
1088f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
10896a388c36SPeter Brune {
10906a388c36SPeter Brune   PetscFunctionBegin;
1091f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1092516fe3c3SPeter Brune   if (steptol) {
1093534a8f05SLisandro Dalcin     PetscValidRealPointer(steptol, 2);
10946a388c36SPeter Brune     *steptol = linesearch->steptol;
1095516fe3c3SPeter Brune   }
1096516fe3c3SPeter Brune   if (maxstep) {
1097534a8f05SLisandro Dalcin     PetscValidRealPointer(maxstep, 3);
1098516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
1099516fe3c3SPeter Brune   }
1100516fe3c3SPeter Brune   if (rtol) {
1101534a8f05SLisandro Dalcin     PetscValidRealPointer(rtol, 4);
1102516fe3c3SPeter Brune     *rtol = linesearch->rtol;
1103516fe3c3SPeter Brune   }
1104516fe3c3SPeter Brune   if (atol) {
1105534a8f05SLisandro Dalcin     PetscValidRealPointer(atol, 5);
1106516fe3c3SPeter Brune     *atol = linesearch->atol;
1107516fe3c3SPeter Brune   }
1108516fe3c3SPeter Brune   if (ltol) {
1109534a8f05SLisandro Dalcin     PetscValidRealPointer(ltol, 6);
1110516fe3c3SPeter Brune     *ltol = linesearch->ltol;
1111516fe3c3SPeter Brune   }
1112516fe3c3SPeter Brune   if (max_its) {
1113534a8f05SLisandro Dalcin     PetscValidIntPointer(max_its, 7);
1114516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1115516fe3c3SPeter Brune   }
11166a388c36SPeter Brune   PetscFunctionReturn(0);
11176a388c36SPeter Brune }
11186a388c36SPeter Brune 
1119f40b411bSPeter Brune /*@
11203c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
112178bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
112278bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
112378bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1124f40b411bSPeter Brune 
1125f40b411bSPeter Brune    Input Parameters:
11268e557f58SPeter Brune +  linesearch - linesearch context
1127516fe3c3SPeter Brune .  steptol - The minimum steplength
11286cc8e53bSPeter Brune .  maxstep - The maximum steplength
1129516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1130516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1131516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1132516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1133f40b411bSPeter Brune 
113478bcb3b5SPeter Brune    Notes:
11353c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
113678bcb3b5SPeter Brune    place of an argument.
1137f40b411bSPeter Brune 
113878bcb3b5SPeter Brune    Level: intermediate
1139516fe3c3SPeter Brune 
1140f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1141f40b411bSPeter Brune @*/
1142f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
11436a388c36SPeter Brune {
11446a388c36SPeter Brune   PetscFunctionBegin;
1145f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1146d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1147d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1148d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1149d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1150d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1151d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1152d3952184SSatish Balay 
1153d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1154*5f80ce2aSJacob Faibussowitsch     PetscCheck(steptol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
11556a388c36SPeter Brune     linesearch->steptol = steptol;
1156d3952184SSatish Balay   }
1157d3952184SSatish Balay 
1158d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1159*5f80ce2aSJacob Faibussowitsch     PetscCheck(maxstep >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1160516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1161d3952184SSatish Balay   }
1162d3952184SSatish Balay 
1163d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1164*5f80ce2aSJacob Faibussowitsch     PetscCheck(rtol >= 0.0 && 1.0 < rtol,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol);
1165516fe3c3SPeter Brune     linesearch->rtol = rtol;
1166d3952184SSatish Balay   }
1167d3952184SSatish Balay 
1168d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1169*5f80ce2aSJacob Faibussowitsch     PetscCheck(atol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1170516fe3c3SPeter Brune     linesearch->atol = atol;
1171d3952184SSatish Balay   }
1172d3952184SSatish Balay 
1173d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
1174*5f80ce2aSJacob Faibussowitsch     PetscCheck(ltol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Lambda tolerance %14.12e must be non-negative",(double)ltol);
1175516fe3c3SPeter Brune     linesearch->ltol = ltol;
1176d3952184SSatish Balay   }
1177d3952184SSatish Balay 
1178d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1179*5f80ce2aSJacob Faibussowitsch     PetscCheck(max_its >= 0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1180516fe3c3SPeter Brune     linesearch->max_its = max_its;
1181d3952184SSatish Balay   }
11826a388c36SPeter Brune   PetscFunctionReturn(0);
11836a388c36SPeter Brune }
11846a388c36SPeter Brune 
1185f40b411bSPeter Brune /*@
1186f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1187f40b411bSPeter Brune 
1188f40b411bSPeter Brune    Input Parameters:
11898e557f58SPeter Brune .  linesearch - linesearch context
1190f40b411bSPeter Brune 
1191f40b411bSPeter Brune    Output Parameters:
11928e557f58SPeter Brune .  damping - The damping parameter
1193f40b411bSPeter Brune 
119478bcb3b5SPeter Brune    Level: advanced
1195f40b411bSPeter Brune 
119678bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1197f40b411bSPeter Brune @*/
1198f40b411bSPeter Brune 
1199f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
12006a388c36SPeter Brune {
12016a388c36SPeter Brune   PetscFunctionBegin;
1202f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1203534a8f05SLisandro Dalcin   PetscValidRealPointer(damping, 2);
12046a388c36SPeter Brune   *damping = linesearch->damping;
12056a388c36SPeter Brune   PetscFunctionReturn(0);
12066a388c36SPeter Brune }
12076a388c36SPeter Brune 
1208f40b411bSPeter Brune /*@
1209fd292e60Sprj-    SNESLineSearchSetDamping - Sets the line search damping parameter.
1210f40b411bSPeter Brune 
1211f40b411bSPeter Brune    Input Parameters:
121203fd4120SBarry Smith +  linesearch - linesearch context
121303fd4120SBarry Smith -  damping - The damping parameter
1214f40b411bSPeter Brune 
121503fd4120SBarry Smith    Options Database:
121603fd4120SBarry Smith .   -snes_linesearch_damping
1217f40b411bSPeter Brune    Level: intermediate
1218f40b411bSPeter Brune 
1219cd7522eaSPeter Brune    Notes:
1220cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1221cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
122278bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1223cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1224cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1225cd7522eaSPeter Brune 
1226f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1227f40b411bSPeter Brune @*/
1228f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
12296a388c36SPeter Brune {
12306a388c36SPeter Brune   PetscFunctionBegin;
1231f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12326a388c36SPeter Brune   linesearch->damping = damping;
12336a388c36SPeter Brune   PetscFunctionReturn(0);
12346a388c36SPeter Brune }
12356a388c36SPeter Brune 
123659405d5eSPeter Brune /*@
123759405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
123859405d5eSPeter Brune 
123959405d5eSPeter Brune    Input Parameters:
124078bcb3b5SPeter Brune .  linesearch - linesearch context
124159405d5eSPeter Brune 
124259405d5eSPeter Brune    Output Parameters:
12438e557f58SPeter Brune .  order - The order
124459405d5eSPeter Brune 
124578bcb3b5SPeter Brune    Possible Values for order:
12463c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
12473c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
12483c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
124978bcb3b5SPeter Brune 
125059405d5eSPeter Brune    Level: intermediate
125159405d5eSPeter Brune 
125259405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
125359405d5eSPeter Brune @*/
125459405d5eSPeter Brune 
1255b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
125659405d5eSPeter Brune {
125759405d5eSPeter Brune   PetscFunctionBegin;
125859405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1259534a8f05SLisandro Dalcin   PetscValidIntPointer(order, 2);
126059405d5eSPeter Brune   *order = linesearch->order;
126159405d5eSPeter Brune   PetscFunctionReturn(0);
126259405d5eSPeter Brune }
126359405d5eSPeter Brune 
126459405d5eSPeter Brune /*@
12651f8196a2SJed Brown    SNESLineSearchSetOrder - Sets the maximum order of the polynomial fit used in the line search
126659405d5eSPeter Brune 
126759405d5eSPeter Brune    Input Parameters:
1268a2b725a8SWilliam Gropp +  linesearch - linesearch context
1269a2b725a8SWilliam Gropp -  order - The damping parameter
127059405d5eSPeter Brune 
127159405d5eSPeter Brune    Level: intermediate
127259405d5eSPeter Brune 
127378bcb3b5SPeter Brune    Possible Values for order:
12743c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
12753c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
12763c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
127778bcb3b5SPeter Brune 
127859405d5eSPeter Brune    Notes:
127959405d5eSPeter Brune    Variable orders are supported by the following line searches:
128078bcb3b5SPeter Brune +  bt - cubic and quadratic
128178bcb3b5SPeter Brune -  cp - linear and quadratic
128259405d5eSPeter Brune 
12831f8196a2SJed Brown .seealso: SNESLineSearchGetOrder(), SNESLineSearchSetDamping()
128459405d5eSPeter Brune @*/
1285b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
128659405d5eSPeter Brune {
128759405d5eSPeter Brune   PetscFunctionBegin;
128859405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
128959405d5eSPeter Brune   linesearch->order = order;
129059405d5eSPeter Brune   PetscFunctionReturn(0);
129159405d5eSPeter Brune }
129259405d5eSPeter Brune 
1293f40b411bSPeter Brune /*@
1294f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1295f40b411bSPeter Brune 
1296f899ff85SJose E. Roman    Input Parameter:
129778bcb3b5SPeter Brune .  linesearch - linesearch context
1298f40b411bSPeter Brune 
1299f40b411bSPeter Brune    Output Parameters:
1300f40b411bSPeter Brune +  xnorm - The norm of the current solution
1301f40b411bSPeter Brune .  fnorm - The norm of the current function
1302f40b411bSPeter Brune -  ynorm - The norm of the current update
1303f40b411bSPeter Brune 
1304cd7522eaSPeter Brune    Notes:
1305cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1306cd7522eaSPeter Brune 
130778bcb3b5SPeter Brune    Level: developer
1308f40b411bSPeter Brune 
1309f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1310f40b411bSPeter Brune @*/
1311f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1312bf7f4e0aSPeter Brune {
1313bf7f4e0aSPeter Brune   PetscFunctionBegin;
1314f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1315f5af7f23SKarl Rupp   if (xnorm) *xnorm = linesearch->xnorm;
1316f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
1317f5af7f23SKarl Rupp   if (ynorm) *ynorm = linesearch->ynorm;
1318bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1319bf7f4e0aSPeter Brune }
1320bf7f4e0aSPeter Brune 
1321f40b411bSPeter Brune /*@
1322f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1323f40b411bSPeter Brune 
1324f40b411bSPeter Brune    Input Parameters:
132578bcb3b5SPeter Brune +  linesearch - linesearch context
1326f40b411bSPeter Brune .  xnorm - The norm of the current solution
1327f40b411bSPeter Brune .  fnorm - The norm of the current function
1328f40b411bSPeter Brune -  ynorm - The norm of the current update
1329f40b411bSPeter Brune 
133078bcb3b5SPeter Brune    Level: advanced
1331f40b411bSPeter Brune 
1332f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1333f40b411bSPeter Brune @*/
1334f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
13356a388c36SPeter Brune {
13366a388c36SPeter Brune   PetscFunctionBegin;
1337f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13386a388c36SPeter Brune   linesearch->xnorm = xnorm;
13396a388c36SPeter Brune   linesearch->fnorm = fnorm;
13406a388c36SPeter Brune   linesearch->ynorm = ynorm;
13416a388c36SPeter Brune   PetscFunctionReturn(0);
13426a388c36SPeter Brune }
13436a388c36SPeter Brune 
1344f40b411bSPeter Brune /*@
1345f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1346f40b411bSPeter Brune 
1347f40b411bSPeter Brune    Input Parameters:
134878bcb3b5SPeter Brune .  linesearch - linesearch context
1349f40b411bSPeter Brune 
1350f40b411bSPeter Brune    Options Database Keys:
13518e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1352f40b411bSPeter Brune 
1353f40b411bSPeter Brune    Level: intermediate
1354f40b411bSPeter Brune 
135578bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1356f40b411bSPeter Brune @*/
1357f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
13586a388c36SPeter Brune {
13599bd66eb0SPeter Brune   SNES           snes;
1360bf388a1fSBarry Smith 
13616a388c36SPeter Brune   PetscFunctionBegin;
13626a388c36SPeter Brune   if (linesearch->norms) {
13639bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1364*5f80ce2aSJacob Faibussowitsch       CHKERRQ(SNESLineSearchGetSNES(linesearch, &snes));
1365*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm));
1366*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm));
1367*5f80ce2aSJacob Faibussowitsch       CHKERRQ((*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm));
13689bd66eb0SPeter Brune     } else {
1369*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm));
1370*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm));
1371*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm));
1372*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm));
1373*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm));
1374*5f80ce2aSJacob Faibussowitsch       CHKERRQ(VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm));
13756a388c36SPeter Brune     }
13769bd66eb0SPeter Brune   }
13776a388c36SPeter Brune   PetscFunctionReturn(0);
13786a388c36SPeter Brune }
13796a388c36SPeter Brune 
13806f263ca3SPeter Brune /*@
13816f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
13826f263ca3SPeter Brune 
13836f263ca3SPeter Brune    Input Parameters:
138478bcb3b5SPeter Brune +  linesearch  - linesearch context
138578bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
13866f263ca3SPeter Brune 
13876f263ca3SPeter Brune    Options Database Keys:
13881f8196a2SJed Brown .   -snes_linesearch_norms <true> - Turns on/off computation of the norms for basic linesearch
13896f263ca3SPeter Brune 
13906f263ca3SPeter Brune    Notes:
13911f8196a2SJed Brown    This is most relevant to the SNESLINESEARCHBASIC line search type since most line searches have a stopping criteria involving the norm.
13926f263ca3SPeter Brune 
13936f263ca3SPeter Brune    Level: intermediate
13946f263ca3SPeter Brune 
13951a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
13966f263ca3SPeter Brune @*/
13976f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
13986f263ca3SPeter Brune {
13996f263ca3SPeter Brune   PetscFunctionBegin;
14006f263ca3SPeter Brune   linesearch->norms = flg;
14016f263ca3SPeter Brune   PetscFunctionReturn(0);
14026f263ca3SPeter Brune }
14036f263ca3SPeter Brune 
1404f40b411bSPeter Brune /*@
1405f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1406f40b411bSPeter Brune 
1407f899ff85SJose E. Roman    Input Parameter:
140878bcb3b5SPeter Brune .  linesearch - linesearch context
1409f40b411bSPeter Brune 
1410f40b411bSPeter Brune    Output Parameters:
14116232e825SPeter Brune +  X - Solution vector
14126232e825SPeter Brune .  F - Function vector
14136232e825SPeter Brune .  Y - Search direction vector
14146232e825SPeter Brune .  W - Solution work vector
14156232e825SPeter Brune -  G - Function work vector
14166232e825SPeter Brune 
14177bba9028SPeter Brune    Notes:
14187bba9028SPeter Brune    At the beginning of a line search application, X should contain a
14196232e825SPeter Brune    solution and the vector F the function computed at X.  At the end of the
14206232e825SPeter Brune    line search application, X should contain the new solution, and F the
14216232e825SPeter Brune    function evaluated at the new solution.
1422f40b411bSPeter Brune 
14232a7a6963SBarry Smith    These vectors are owned by the SNESLineSearch and should not be destroyed by the caller
14242a7a6963SBarry Smith 
142578bcb3b5SPeter Brune    Level: advanced
1426f40b411bSPeter Brune 
1427f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1428f40b411bSPeter Brune @*/
1429bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1430bf388a1fSBarry Smith {
14316a388c36SPeter Brune   PetscFunctionBegin;
1432f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14336a388c36SPeter Brune   if (X) {
14346a388c36SPeter Brune     PetscValidPointer(X, 2);
14356a388c36SPeter Brune     *X = linesearch->vec_sol;
14366a388c36SPeter Brune   }
14376a388c36SPeter Brune   if (F) {
14386a388c36SPeter Brune     PetscValidPointer(F, 3);
14396a388c36SPeter Brune     *F = linesearch->vec_func;
14406a388c36SPeter Brune   }
14416a388c36SPeter Brune   if (Y) {
14426a388c36SPeter Brune     PetscValidPointer(Y, 4);
14436a388c36SPeter Brune     *Y = linesearch->vec_update;
14446a388c36SPeter Brune   }
14456a388c36SPeter Brune   if (W) {
14466a388c36SPeter Brune     PetscValidPointer(W, 5);
14476a388c36SPeter Brune     *W = linesearch->vec_sol_new;
14486a388c36SPeter Brune   }
14496a388c36SPeter Brune   if (G) {
14506a388c36SPeter Brune     PetscValidPointer(G, 6);
14516a388c36SPeter Brune     *G = linesearch->vec_func_new;
14526a388c36SPeter Brune   }
14536a388c36SPeter Brune   PetscFunctionReturn(0);
14546a388c36SPeter Brune }
14556a388c36SPeter Brune 
1456f40b411bSPeter Brune /*@
1457f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1458f40b411bSPeter Brune 
1459f40b411bSPeter Brune    Input Parameters:
146078bcb3b5SPeter Brune +  linesearch - linesearch context
14616232e825SPeter Brune .  X - Solution vector
14626232e825SPeter Brune .  F - Function vector
14636232e825SPeter Brune .  Y - Search direction vector
14646232e825SPeter Brune .  W - Solution work vector
14656232e825SPeter Brune -  G - Function work vector
1466f40b411bSPeter Brune 
146778bcb3b5SPeter Brune    Level: advanced
1468f40b411bSPeter Brune 
1469f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1470f40b411bSPeter Brune @*/
1471bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1472bf388a1fSBarry Smith {
14736a388c36SPeter Brune   PetscFunctionBegin;
1474f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14756a388c36SPeter Brune   if (X) {
14766a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
14776a388c36SPeter Brune     linesearch->vec_sol = X;
14786a388c36SPeter Brune   }
14796a388c36SPeter Brune   if (F) {
14806a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
14816a388c36SPeter Brune     linesearch->vec_func = F;
14826a388c36SPeter Brune   }
14836a388c36SPeter Brune   if (Y) {
14846a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
14856a388c36SPeter Brune     linesearch->vec_update = Y;
14866a388c36SPeter Brune   }
14876a388c36SPeter Brune   if (W) {
14886a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
14896a388c36SPeter Brune     linesearch->vec_sol_new = W;
14906a388c36SPeter Brune   }
14916a388c36SPeter Brune   if (G) {
14926a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
14936a388c36SPeter Brune     linesearch->vec_func_new = G;
14946a388c36SPeter Brune   }
14956a388c36SPeter Brune   PetscFunctionReturn(0);
14966a388c36SPeter Brune }
14976a388c36SPeter Brune 
1498e7058c64SPeter Brune /*@C
1499f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1500e7058c64SPeter Brune    SNES options in the database.
1501e7058c64SPeter Brune 
1502cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1503e7058c64SPeter Brune 
1504e7058c64SPeter Brune    Input Parameters:
1505e7058c64SPeter Brune +  snes - the SNES context
1506e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1507e7058c64SPeter Brune 
1508e7058c64SPeter Brune    Notes:
1509e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1510e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1511e7058c64SPeter Brune 
1512e7058c64SPeter Brune    Level: advanced
1513e7058c64SPeter Brune 
1514e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1515e7058c64SPeter Brune @*/
1516f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1517e7058c64SPeter Brune {
1518e7058c64SPeter Brune   PetscFunctionBegin;
1519f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1520*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix));
1521e7058c64SPeter Brune   PetscFunctionReturn(0);
1522e7058c64SPeter Brune }
1523e7058c64SPeter Brune 
1524e7058c64SPeter Brune /*@C
1525f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1526f1c6b773SPeter Brune    SNESLineSearch options in the database.
1527e7058c64SPeter Brune 
1528e7058c64SPeter Brune    Not Collective
1529e7058c64SPeter Brune 
1530e7058c64SPeter Brune    Input Parameter:
1531cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1532e7058c64SPeter Brune 
1533e7058c64SPeter Brune    Output Parameter:
1534e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1535e7058c64SPeter Brune 
15368e557f58SPeter Brune    Notes:
15378e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1538e7058c64SPeter Brune    sufficient length to hold the prefix.
1539e7058c64SPeter Brune 
1540e7058c64SPeter Brune    Level: advanced
1541e7058c64SPeter Brune 
1542e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1543e7058c64SPeter Brune @*/
1544f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1545e7058c64SPeter Brune {
1546e7058c64SPeter Brune   PetscFunctionBegin;
1547f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1548*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix));
1549e7058c64SPeter Brune   PetscFunctionReturn(0);
1550e7058c64SPeter Brune }
1551bf7f4e0aSPeter Brune 
15528d359177SBarry Smith /*@C
1553fa0ddf94SBarry Smith    SNESLineSearchSetWorkVecs - Gets work vectors for the line search.
1554f40b411bSPeter Brune 
1555d8d19677SJose E. Roman    Input Parameters:
1556f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1557f40b411bSPeter Brune -  nwork - the number of work vectors
1558f40b411bSPeter Brune 
1559f40b411bSPeter Brune    Level: developer
1560f40b411bSPeter Brune 
1561fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs()
1562f40b411bSPeter Brune @*/
1563fa0ddf94SBarry Smith PetscErrorCode  SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork)
1564bf7f4e0aSPeter Brune {
1565bf7f4e0aSPeter Brune   PetscFunctionBegin;
1566bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1567*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work));
15688d359177SBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1569bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1570bf7f4e0aSPeter Brune }
1571bf7f4e0aSPeter Brune 
1572f40b411bSPeter Brune /*@
1573422a814eSBarry Smith    SNESLineSearchGetReason - Gets the success/failure status of the last line search application
1574f40b411bSPeter Brune 
1575f40b411bSPeter Brune    Input Parameters:
157678bcb3b5SPeter Brune .  linesearch - linesearch context
1577f40b411bSPeter Brune 
1578f40b411bSPeter Brune    Output Parameters:
1579422a814eSBarry Smith .  result - The success or failure status
1580f40b411bSPeter Brune 
1581cd7522eaSPeter Brune    Notes:
1582c98378a5SBarry Smith    This is typically called after SNESLineSearchApply() in order to determine if the line-search failed
1583cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1584cd7522eaSPeter Brune 
1585f40b411bSPeter Brune    Level: intermediate
1586f40b411bSPeter Brune 
1587422a814eSBarry Smith .seealso: SNESLineSearchSetReason(), SNESLineSearchReason
1588f40b411bSPeter Brune @*/
1589422a814eSBarry Smith PetscErrorCode  SNESLineSearchGetReason(SNESLineSearch linesearch, SNESLineSearchReason *result)
1590bf7f4e0aSPeter Brune {
1591bf7f4e0aSPeter Brune   PetscFunctionBegin;
1592f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1593422a814eSBarry Smith   PetscValidPointer(result, 2);
1594422a814eSBarry Smith   *result = linesearch->result;
1595bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1596bf7f4e0aSPeter Brune }
1597bf7f4e0aSPeter Brune 
1598f40b411bSPeter Brune /*@
1599422a814eSBarry Smith    SNESLineSearchSetReason - Sets the success/failure status of the last line search application
1600f40b411bSPeter Brune 
1601f40b411bSPeter Brune    Input Parameters:
160278bcb3b5SPeter Brune +  linesearch - linesearch context
1603422a814eSBarry Smith -  result - The success or failure status
1604f40b411bSPeter Brune 
1605cd7522eaSPeter Brune    Notes:
1606cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1607cd7522eaSPeter Brune    the success or failure of the line search method.
1608cd7522eaSPeter Brune 
160978bcb3b5SPeter Brune    Level: developer
1610f40b411bSPeter Brune 
1611422a814eSBarry Smith .seealso: SNESLineSearchGetSResult()
1612f40b411bSPeter Brune @*/
1613422a814eSBarry Smith PetscErrorCode  SNESLineSearchSetReason(SNESLineSearch linesearch, SNESLineSearchReason result)
16146a388c36SPeter Brune {
16156a388c36SPeter Brune   PetscFunctionBegin;
16165fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1617422a814eSBarry Smith   linesearch->result = result;
16186a388c36SPeter Brune   PetscFunctionReturn(0);
16196a388c36SPeter Brune }
16206a388c36SPeter Brune 
16219bd66eb0SPeter Brune /*@C
1622f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
16239bd66eb0SPeter Brune 
16249bd66eb0SPeter Brune    Input Parameters:
16259bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
16269bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
16279bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16289bd66eb0SPeter Brune 
16299bd66eb0SPeter Brune    Logically Collective on SNES
16309bd66eb0SPeter Brune 
16319bd66eb0SPeter Brune    Calling sequence of projectfunc:
16329bd66eb0SPeter Brune .vb
16339bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
16349bd66eb0SPeter Brune .ve
16359bd66eb0SPeter Brune 
16369bd66eb0SPeter Brune     Input parameters for projectfunc:
16379bd66eb0SPeter Brune +   snes - nonlinear context
16389bd66eb0SPeter Brune -   X - current solution
16399bd66eb0SPeter Brune 
1640cd7522eaSPeter Brune     Output parameters for projectfunc:
16419bd66eb0SPeter Brune .   X - Projected solution
16429bd66eb0SPeter Brune 
16439bd66eb0SPeter Brune    Calling sequence of normfunc:
16449bd66eb0SPeter Brune .vb
16459bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
16469bd66eb0SPeter Brune .ve
16479bd66eb0SPeter Brune 
1648cd7522eaSPeter Brune     Input parameters for normfunc:
16499bd66eb0SPeter Brune +   snes - nonlinear context
16509bd66eb0SPeter Brune .   X - current solution
16519bd66eb0SPeter Brune -   F - current residual
16529bd66eb0SPeter Brune 
1653cd7522eaSPeter Brune     Output parameters for normfunc:
16549bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
16559bd66eb0SPeter Brune 
1656cd7522eaSPeter Brune     Notes:
1657cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1658cd7522eaSPeter Brune 
1659cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1660cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
16619bd66eb0SPeter Brune 
16629bd66eb0SPeter Brune     Level: developer
16639bd66eb0SPeter Brune 
1664f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16659bd66eb0SPeter Brune @*/
166625acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16679bd66eb0SPeter Brune {
16689bd66eb0SPeter Brune   PetscFunctionBegin;
1669f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16709bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16719bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
16729bd66eb0SPeter Brune   PetscFunctionReturn(0);
16739bd66eb0SPeter Brune }
16749bd66eb0SPeter Brune 
16759bd66eb0SPeter Brune /*@C
1676f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
16779bd66eb0SPeter Brune 
1678f899ff85SJose E. Roman    Input Parameter:
1679907376e6SBarry Smith .  linesearch - the line search context, obtain with SNESGetLineSearch()
16809bd66eb0SPeter Brune 
16819bd66eb0SPeter Brune    Output Parameters:
16829bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
16839bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16849bd66eb0SPeter Brune 
16859bd66eb0SPeter Brune    Logically Collective on SNES
16869bd66eb0SPeter Brune 
16879bd66eb0SPeter Brune     Level: developer
16889bd66eb0SPeter Brune 
1689f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
16909bd66eb0SPeter Brune @*/
169125acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
16929bd66eb0SPeter Brune {
16939bd66eb0SPeter Brune   PetscFunctionBegin;
16949bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
16959bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
16969bd66eb0SPeter Brune   PetscFunctionReturn(0);
16979bd66eb0SPeter Brune }
16989bd66eb0SPeter Brune 
1699bf7f4e0aSPeter Brune /*@C
17001c84c290SBarry Smith   SNESLineSearchRegister - See SNESLineSearchRegister()
1701bf7f4e0aSPeter Brune 
1702bf7f4e0aSPeter Brune   Level: advanced
1703bf7f4e0aSPeter Brune @*/
1704bdf89e91SBarry Smith PetscErrorCode  SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch))
1705bf7f4e0aSPeter Brune {
1706bf7f4e0aSPeter Brune   PetscFunctionBegin;
1707*5f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESInitializePackage());
1708*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListAdd(&SNESLineSearchList,sname,function));
1709bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1710bf7f4e0aSPeter Brune }
1711