xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 4165533ce9fbcd1440639b2ad505faa054a49d0c)
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   PetscErrorCode ierr;
35dcf2fd19SBarry Smith   PetscInt       i;
36dcf2fd19SBarry Smith 
37dcf2fd19SBarry Smith   PetscFunctionBegin;
38dcf2fd19SBarry Smith   PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1);
39dcf2fd19SBarry Smith   for (i=0; i<ls->numbermonitors; i++) {
40dcf2fd19SBarry Smith     if (ls->monitordestroy[i]) {
41dcf2fd19SBarry Smith       ierr = (*ls->monitordestroy[i])(&ls->monitorcontext[i]);CHKERRQ(ierr);
42dcf2fd19SBarry Smith     }
43dcf2fd19SBarry Smith   }
44dcf2fd19SBarry Smith   ls->numbermonitors = 0;
45dcf2fd19SBarry Smith   PetscFunctionReturn(0);
46dcf2fd19SBarry Smith }
47dcf2fd19SBarry Smith 
48dcf2fd19SBarry Smith /*@
49dcf2fd19SBarry Smith    SNESLineSearchMonitor - runs the user provided monitor routines, if they exist
50dcf2fd19SBarry Smith 
51dcf2fd19SBarry Smith    Collective on SNES
52dcf2fd19SBarry Smith 
53dcf2fd19SBarry Smith    Input Parameters:
54dcf2fd19SBarry Smith .  ls - the linesearch object
55dcf2fd19SBarry Smith 
56dcf2fd19SBarry Smith    Notes:
57dcf2fd19SBarry Smith    This routine is called by the SNES implementations.
58dcf2fd19SBarry Smith    It does not typically need to be called by the user.
59dcf2fd19SBarry Smith 
60dcf2fd19SBarry Smith    Level: developer
61dcf2fd19SBarry Smith 
6284238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorSet()
63dcf2fd19SBarry Smith @*/
64dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchMonitor(SNESLineSearch ls)
65dcf2fd19SBarry Smith {
66dcf2fd19SBarry Smith   PetscErrorCode ierr;
67dcf2fd19SBarry Smith   PetscInt       i,n = ls->numbermonitors;
68dcf2fd19SBarry Smith 
69dcf2fd19SBarry Smith   PetscFunctionBegin;
70dcf2fd19SBarry Smith   for (i=0; i<n; i++) {
71dcf2fd19SBarry Smith     ierr = (*ls->monitorftns[i])(ls,ls->monitorcontext[i]);CHKERRQ(ierr);
72dcf2fd19SBarry Smith   }
73dcf2fd19SBarry Smith   PetscFunctionReturn(0);
74dcf2fd19SBarry Smith }
75dcf2fd19SBarry Smith 
76dcf2fd19SBarry Smith /*@C
77dcf2fd19SBarry Smith    SNESLineSearchMonitorSet - Sets an ADDITIONAL function that is to be used at every
78dcf2fd19SBarry Smith    iteration of the nonlinear solver to display the iteration's
79dcf2fd19SBarry Smith    progress.
80dcf2fd19SBarry Smith 
81dcf2fd19SBarry Smith    Logically Collective on SNESLineSearch
82dcf2fd19SBarry Smith 
83dcf2fd19SBarry Smith    Input Parameters:
84dcf2fd19SBarry Smith +  ls - the SNESLineSearch context
85dcf2fd19SBarry Smith .  f - the monitor function
86dcf2fd19SBarry Smith .  mctx - [optional] user-defined context for private data for the
87dcf2fd19SBarry Smith           monitor routine (use NULL if no context is desired)
88dcf2fd19SBarry Smith -  monitordestroy - [optional] routine that frees monitor context
89dcf2fd19SBarry Smith           (may be NULL)
90dcf2fd19SBarry Smith 
91dcf2fd19SBarry Smith    Notes:
92dcf2fd19SBarry Smith    Several different monitoring routines may be set by calling
93dcf2fd19SBarry Smith    SNESLineSearchMonitorSet() multiple times; all will be called in the
94dcf2fd19SBarry Smith    order in which they were set.
95dcf2fd19SBarry Smith 
9695452b02SPatrick Sanan    Fortran Notes:
9795452b02SPatrick Sanan     Only a single monitor function can be set for each SNESLineSearch object
98dcf2fd19SBarry Smith 
99dcf2fd19SBarry Smith    Level: intermediate
100dcf2fd19SBarry Smith 
10184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorCancel()
102dcf2fd19SBarry Smith @*/
103dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchMonitorSet(SNESLineSearch ls,PetscErrorCode (*f)(SNESLineSearch,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**))
104dcf2fd19SBarry Smith {
10578064530SBarry Smith   PetscErrorCode ierr;
10678064530SBarry Smith   PetscInt       i;
10778064530SBarry Smith   PetscBool      identical;
10878064530SBarry Smith 
109dcf2fd19SBarry Smith   PetscFunctionBegin;
110dcf2fd19SBarry Smith   PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1);
11178064530SBarry Smith   for (i=0; i<ls->numbermonitors;i++) {
11278064530SBarry Smith     ierr = PetscMonitorCompare((PetscErrorCode (*)(void))f,mctx,monitordestroy,(PetscErrorCode (*)(void))ls->monitorftns[i],ls->monitorcontext[i],ls->monitordestroy[i],&identical);CHKERRQ(ierr);
11378064530SBarry Smith     if (identical) PetscFunctionReturn(0);
11478064530SBarry Smith   }
115dcf2fd19SBarry Smith   if (ls->numbermonitors >= MAXSNESLSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set");
116dcf2fd19SBarry Smith   ls->monitorftns[ls->numbermonitors]          = f;
117dcf2fd19SBarry Smith   ls->monitordestroy[ls->numbermonitors]   = monitordestroy;
118dcf2fd19SBarry Smith   ls->monitorcontext[ls->numbermonitors++] = (void*)mctx;
119dcf2fd19SBarry Smith   PetscFunctionReturn(0);
120dcf2fd19SBarry Smith }
121dcf2fd19SBarry Smith 
122dcf2fd19SBarry Smith /*@C
123dcf2fd19SBarry Smith    SNESLineSearchMonitorSolutionUpdate - Monitors each update a new function value the linesearch tries
124dcf2fd19SBarry Smith 
125dcf2fd19SBarry Smith    Collective on SNESLineSearch
126dcf2fd19SBarry Smith 
127dcf2fd19SBarry Smith    Input Parameters:
128dcf2fd19SBarry Smith +  ls - the SNES linesearch object
129d12e167eSBarry Smith -  vf - the context for the monitor, in this case it is an ASCII PetscViewer and format
130dcf2fd19SBarry Smith 
131dcf2fd19SBarry Smith    Level: intermediate
132dcf2fd19SBarry Smith 
13384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESMonitorSet(), SNESMonitorSolution()
134dcf2fd19SBarry Smith @*/
135d12e167eSBarry Smith PetscErrorCode  SNESLineSearchMonitorSolutionUpdate(SNESLineSearch ls,PetscViewerAndFormat *vf)
136dcf2fd19SBarry Smith {
137dcf2fd19SBarry Smith   PetscErrorCode ierr;
138d12e167eSBarry Smith   PetscViewer    viewer = vf->viewer;
139dcf2fd19SBarry Smith   Vec            Y,W,G;
140dcf2fd19SBarry Smith 
141dcf2fd19SBarry Smith   PetscFunctionBegin;
142dcf2fd19SBarry Smith   ierr = SNESLineSearchGetVecs(ls,NULL,NULL,&Y,&W,&G);CHKERRQ(ierr);
143d12e167eSBarry Smith   ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr);
144dcf2fd19SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted update to solution \n");CHKERRQ(ierr);
145dcf2fd19SBarry Smith   ierr = VecView(Y,viewer);CHKERRQ(ierr);
146dcf2fd19SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted new solution \n");CHKERRQ(ierr);
147dcf2fd19SBarry Smith   ierr = VecView(W,viewer);CHKERRQ(ierr);
148dcf2fd19SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted updated function value\n");CHKERRQ(ierr);
149dcf2fd19SBarry Smith   ierr = VecView(G,viewer);CHKERRQ(ierr);
150d12e167eSBarry Smith   ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
151dcf2fd19SBarry Smith   PetscFunctionReturn(0);
152dcf2fd19SBarry Smith }
153dcf2fd19SBarry Smith 
154f40b411bSPeter Brune /*@
155cd7522eaSPeter Brune    SNESLineSearchCreate - Creates the line search context.
156f40b411bSPeter Brune 
157cd7522eaSPeter Brune    Logically Collective on Comm
158f40b411bSPeter Brune 
159f40b411bSPeter Brune    Input Parameters:
160cd7522eaSPeter Brune .  comm - MPI communicator for the line search (typically from the associated SNES context).
161f40b411bSPeter Brune 
162f40b411bSPeter Brune    Output Parameters:
1638e557f58SPeter Brune .  outlinesearch - the new linesearch context
164f40b411bSPeter Brune 
165162e0bf5SPeter Brune    Level: developer
166162e0bf5SPeter Brune 
167162e0bf5SPeter Brune    Notes:
168162e0bf5SPeter Brune    The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance
169162e0bf5SPeter Brune    already associated with the SNES.  This function is for developer use.
170f40b411bSPeter Brune 
171162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch()
172f40b411bSPeter Brune @*/
173f40b411bSPeter Brune 
174bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch)
175bf388a1fSBarry Smith {
176bf7f4e0aSPeter Brune   PetscErrorCode ierr;
177f1c6b773SPeter Brune   SNESLineSearch linesearch;
178bf388a1fSBarry Smith 
179bf7f4e0aSPeter Brune   PetscFunctionBegin;
180ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
181f34a81feSMatthew G. Knepley   ierr = SNESInitializePackage();CHKERRQ(ierr);
1820298fd71SBarry Smith   *outlinesearch = NULL;
183f5af7f23SKarl Rupp 
18473107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(linesearch,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr);
185bf7f4e0aSPeter Brune 
1860298fd71SBarry Smith   linesearch->vec_sol_new  = NULL;
1870298fd71SBarry Smith   linesearch->vec_func_new = NULL;
1880298fd71SBarry Smith   linesearch->vec_sol      = NULL;
1890298fd71SBarry Smith   linesearch->vec_func     = NULL;
1900298fd71SBarry Smith   linesearch->vec_update   = NULL;
1919bd66eb0SPeter Brune 
192bf7f4e0aSPeter Brune   linesearch->lambda       = 1.0;
193bf7f4e0aSPeter Brune   linesearch->fnorm        = 1.0;
194bf7f4e0aSPeter Brune   linesearch->ynorm        = 1.0;
195bf7f4e0aSPeter Brune   linesearch->xnorm        = 1.0;
196422a814eSBarry Smith   linesearch->result       = SNES_LINESEARCH_SUCCEEDED;
197bf7f4e0aSPeter Brune   linesearch->norms        = PETSC_TRUE;
198bf7f4e0aSPeter Brune   linesearch->keeplambda   = PETSC_FALSE;
199bf7f4e0aSPeter Brune   linesearch->damping      = 1.0;
200bf7f4e0aSPeter Brune   linesearch->maxstep      = 1e8;
201bf7f4e0aSPeter Brune   linesearch->steptol      = 1e-12;
202516fe3c3SPeter Brune   linesearch->rtol         = 1e-8;
203516fe3c3SPeter Brune   linesearch->atol         = 1e-15;
204516fe3c3SPeter Brune   linesearch->ltol         = 1e-8;
2050298fd71SBarry Smith   linesearch->precheckctx  = NULL;
2060298fd71SBarry Smith   linesearch->postcheckctx = NULL;
20759405d5eSPeter Brune   linesearch->max_its      = 1;
208bf7f4e0aSPeter Brune   linesearch->setupcalled  = PETSC_FALSE;
2093add74b1SBarry Smith   linesearch->monitor      = NULL;
210bf7f4e0aSPeter Brune   *outlinesearch           = linesearch;
211bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
212bf7f4e0aSPeter Brune }
213bf7f4e0aSPeter Brune 
214f40b411bSPeter Brune /*@
21578bcb3b5SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied by allocating
21678bcb3b5SPeter Brune    any required vectors.
217f40b411bSPeter Brune 
218cd7522eaSPeter Brune    Collective on SNESLineSearch
219f40b411bSPeter Brune 
220f40b411bSPeter Brune    Input Parameters:
221f40b411bSPeter Brune .  linesearch - The LineSearch instance.
222f40b411bSPeter Brune 
223cd7522eaSPeter Brune    Notes:
224f190f2fcSBarry Smith    For most cases, this needn't be called by users or outside of SNESLineSearchApply().
225cd7522eaSPeter Brune    The only current case where this is called outside of this is for the VI
22678bcb3b5SPeter Brune    solvers, which modify the solution and work vectors before the first call
227cd7522eaSPeter Brune    of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be
228cd7522eaSPeter Brune    allocated upfront.
229cd7522eaSPeter Brune 
23078bcb3b5SPeter Brune    Level: advanced
231f40b411bSPeter Brune 
23284238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchReset()
233f40b411bSPeter Brune @*/
234f40b411bSPeter Brune 
235bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch)
236bf388a1fSBarry Smith {
237bf7f4e0aSPeter Brune   PetscErrorCode ierr;
238bf388a1fSBarry Smith 
239bf7f4e0aSPeter Brune   PetscFunctionBegin;
240bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
2411a4f838cSPeter Brune     ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr);
242bf7f4e0aSPeter Brune   }
243bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
2449bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
245bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
2469bd66eb0SPeter Brune     }
2479bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
2489bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
2499bd66eb0SPeter Brune     }
250bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
251bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
252bf7f4e0aSPeter Brune     }
253ed07d7d7SPeter Brune     if (!linesearch->ops->snesfunc) {ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunction);CHKERRQ(ierr);}
254bf7f4e0aSPeter Brune     linesearch->lambda      = linesearch->damping;
255bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
256bf7f4e0aSPeter Brune   }
257bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
258bf7f4e0aSPeter Brune }
259bf7f4e0aSPeter Brune 
260f40b411bSPeter Brune /*@
261f190f2fcSBarry Smith    SNESLineSearchReset - Undoes the SNESLineSearchSetUp() and deletes any Vecs or Mats allocated by the line search.
262f40b411bSPeter Brune 
263f1c6b773SPeter Brune    Collective on SNESLineSearch
264f40b411bSPeter Brune 
265f40b411bSPeter Brune    Input Parameters:
266f40b411bSPeter Brune .  linesearch - The LineSearch instance.
267f40b411bSPeter Brune 
26895452b02SPatrick Sanan    Notes:
26995452b02SPatrick Sanan     Usually only called by SNESReset()
270f190f2fcSBarry Smith 
271f190f2fcSBarry Smith    Level: developer
272f40b411bSPeter Brune 
27384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetUp()
274f40b411bSPeter Brune @*/
275f40b411bSPeter Brune 
276bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch)
277bf388a1fSBarry Smith {
278bf7f4e0aSPeter Brune   PetscErrorCode ierr;
279bf388a1fSBarry Smith 
280bf7f4e0aSPeter Brune   PetscFunctionBegin;
281f5af7f23SKarl Rupp   if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch);
282f5af7f23SKarl Rupp 
283bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
284bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
285bf7f4e0aSPeter Brune 
286bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
287f5af7f23SKarl Rupp 
288bf7f4e0aSPeter Brune   linesearch->nwork       = 0;
289bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
290bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
291bf7f4e0aSPeter Brune }
292bf7f4e0aSPeter Brune 
293ed07d7d7SPeter Brune /*@C
294f190f2fcSBarry Smith    SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search
295ed07d7d7SPeter Brune 
296ed07d7d7SPeter Brune    Input Parameters:
297ed07d7d7SPeter Brune .  linesearch - the SNESLineSearch context
298f190f2fcSBarry Smith +  func       - function evaluation routine
299ed07d7d7SPeter Brune 
300ed07d7d7SPeter Brune    Level: developer
301ed07d7d7SPeter Brune 
30295452b02SPatrick Sanan    Notes:
30395452b02SPatrick Sanan     This is used internally by PETSc and not called by users
304f190f2fcSBarry Smith 
30584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESSetFunction()
306ed07d7d7SPeter Brune @*/
307ed07d7d7SPeter Brune PetscErrorCode  SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec))
308ed07d7d7SPeter Brune {
309ed07d7d7SPeter Brune   PetscFunctionBegin;
310ed07d7d7SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
311ed07d7d7SPeter Brune   linesearch->ops->snesfunc = func;
312ed07d7d7SPeter Brune   PetscFunctionReturn(0);
313ed07d7d7SPeter Brune }
314ed07d7d7SPeter Brune 
31586d74e61SPeter Brune /*@C
316f190f2fcSBarry Smith    SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but
317df3898eeSBarry Smith          before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that
318f190f2fcSBarry Smith          determined the search direction.
31986d74e61SPeter Brune 
320f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
32186d74e61SPeter Brune 
32286d74e61SPeter Brune    Input Parameters:
323f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
32484238204SBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for the calling sequence
325f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
32686d74e61SPeter Brune 
32786d74e61SPeter Brune    Level: intermediate
32886d74e61SPeter Brune 
32984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
33086d74e61SPeter Brune @*/
331f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx)
33286d74e61SPeter Brune {
3339bd66eb0SPeter Brune   PetscFunctionBegin;
334f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
335f190f2fcSBarry Smith   if (func) linesearch->ops->precheck = func;
33686d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
33786d74e61SPeter Brune   PetscFunctionReturn(0);
33886d74e61SPeter Brune }
33986d74e61SPeter Brune 
34086d74e61SPeter Brune /*@C
34153deb899SBarry Smith    SNESLineSearchGetPreCheck - Gets the pre-check function for the line search routine.
34286d74e61SPeter Brune 
343f899ff85SJose E. Roman    Input Parameter:
344f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
34586d74e61SPeter Brune 
34686d74e61SPeter Brune    Output Parameters:
34784238204SBarry Smith +  func       - [optional] function evaluation routine, see SNESLineSearchPreCheck() for calling sequence
348f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
34986d74e61SPeter Brune 
35086d74e61SPeter Brune    Level: intermediate
35186d74e61SPeter Brune 
35284238204SBarry Smith .seealso: SNESGetLineSearch(), SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck()
35386d74e61SPeter Brune @*/
354f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx)
35586d74e61SPeter Brune {
3569bd66eb0SPeter Brune   PetscFunctionBegin;
357f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
358f190f2fcSBarry Smith   if (func) *func = linesearch->ops->precheck;
35986d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
36086d74e61SPeter Brune   PetscFunctionReturn(0);
36186d74e61SPeter Brune }
36286d74e61SPeter Brune 
36386d74e61SPeter Brune /*@C
364f190f2fcSBarry Smith    SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step
365f190f2fcSBarry Smith        direction and length. Allows the user a chance to change or override the decision of the line search routine
36686d74e61SPeter Brune 
367f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
36886d74e61SPeter Brune 
36986d74e61SPeter Brune    Input Parameters:
370f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
37184238204SBarry Smith .  func - [optional] function evaluation routine, see SNESLineSearchPostCheck()  for the calling sequence
372f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
37386d74e61SPeter Brune 
37486d74e61SPeter Brune    Level: intermediate
37586d74e61SPeter Brune 
37684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck()
37786d74e61SPeter Brune @*/
378f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx)
37986d74e61SPeter Brune {
38086d74e61SPeter Brune   PetscFunctionBegin;
381f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
382f190f2fcSBarry Smith   if (func) linesearch->ops->postcheck = func;
38386d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
38486d74e61SPeter Brune   PetscFunctionReturn(0);
38586d74e61SPeter Brune }
38686d74e61SPeter Brune 
38786d74e61SPeter Brune /*@C
388f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
38986d74e61SPeter Brune 
390f899ff85SJose E. Roman    Input Parameter:
391f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
39286d74e61SPeter Brune 
39386d74e61SPeter Brune    Output Parameters:
39484238204SBarry Smith +  func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheck()
395f190f2fcSBarry Smith -  ctx        - [optional] user-defined context for private data for the function evaluation routine (may be NULL)
39686d74e61SPeter Brune 
39786d74e61SPeter Brune    Level: intermediate
39886d74e61SPeter Brune 
39984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck()
40086d74e61SPeter Brune @*/
401f190f2fcSBarry Smith PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx)
40286d74e61SPeter Brune {
4039bd66eb0SPeter Brune   PetscFunctionBegin;
404f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
405f190f2fcSBarry Smith   if (func) *func = linesearch->ops->postcheck;
40686d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
40786d74e61SPeter Brune   PetscFunctionReturn(0);
40886d74e61SPeter Brune }
40986d74e61SPeter Brune 
410f40b411bSPeter Brune /*@
411f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
412f40b411bSPeter Brune 
413cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
414f40b411bSPeter Brune 
415f40b411bSPeter Brune    Input Parameters:
4167b1df9c1SPeter Brune +  linesearch - The linesearch instance.
4177b1df9c1SPeter Brune .  X - The current solution
4187b1df9c1SPeter Brune -  Y - The step direction
419f40b411bSPeter Brune 
420f40b411bSPeter Brune    Output Parameters:
4218e557f58SPeter Brune .  changed - Indicator that the precheck routine has changed anything
422f40b411bSPeter Brune 
423f190f2fcSBarry Smith    Level: developer
424f40b411bSPeter Brune 
42584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck()
426f40b411bSPeter Brune @*/
4277b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
428bf7f4e0aSPeter Brune {
429bf7f4e0aSPeter Brune   PetscErrorCode ierr;
4305fd66863SKarl Rupp 
431bf7f4e0aSPeter Brune   PetscFunctionBegin;
432bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
4336b2b7091SBarry Smith   if (linesearch->ops->precheck) {
4346b2b7091SBarry Smith     ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr);
43538bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed,4);
436bf7f4e0aSPeter Brune   }
437bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
438bf7f4e0aSPeter Brune }
439bf7f4e0aSPeter Brune 
440f40b411bSPeter Brune /*@
441f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
442f40b411bSPeter Brune 
443cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
444f40b411bSPeter Brune 
445f40b411bSPeter Brune    Input Parameters:
4467b1df9c1SPeter Brune +  linesearch - The linesearch context
4477b1df9c1SPeter Brune .  X - The last solution
4487b1df9c1SPeter Brune .  Y - The step direction
4497b1df9c1SPeter Brune -  W - The updated solution, W = X + lambda*Y for some lambda
450f40b411bSPeter Brune 
451f40b411bSPeter Brune    Output Parameters:
45278bcb3b5SPeter Brune +  changed_Y - Indicator if the direction Y has been changed.
45378bcb3b5SPeter Brune -  changed_W - Indicator if the new candidate solution W has been changed.
454f40b411bSPeter Brune 
455f190f2fcSBarry Smith    Level: developer
456f40b411bSPeter Brune 
45784238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPrecheck(), SNESLineSearchGetPrecheck()
458f40b411bSPeter Brune @*/
4597b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W)
460bf7f4e0aSPeter Brune {
461bf7f4e0aSPeter Brune   PetscErrorCode ierr;
462bf388a1fSBarry Smith 
463bf7f4e0aSPeter Brune   PetscFunctionBegin;
464bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
465bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
4666b2b7091SBarry Smith   if (linesearch->ops->postcheck) {
4676b2b7091SBarry Smith     ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr);
46838bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5);
46938bcdd5aSPeter Brune     PetscValidLogicalCollectiveBool(linesearch,*changed_W,6);
47086d74e61SPeter Brune   }
47186d74e61SPeter Brune   PetscFunctionReturn(0);
47286d74e61SPeter Brune }
47386d74e61SPeter Brune 
47486d74e61SPeter Brune /*@C
47586d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
47686d74e61SPeter Brune 
477cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
47886d74e61SPeter Brune 
479*4165533cSJose E. Roman    Input Parameters:
48086d74e61SPeter Brune +  linesearch - linesearch context
48186d74e61SPeter Brune .  X - base state for this step
48286d74e61SPeter Brune .  Y - initial correction
483907376e6SBarry Smith -  ctx - context for this function
48486d74e61SPeter Brune 
485*4165533cSJose E. Roman    Output Parameters:
48686d74e61SPeter Brune +  Y - correction, possibly modified
48786d74e61SPeter Brune -  changed - flag indicating that Y was modified
48886d74e61SPeter Brune 
48986d74e61SPeter Brune    Options Database Key:
490cd7522eaSPeter Brune +  -snes_linesearch_precheck_picard - activate this routine
491cd7522eaSPeter Brune -  -snes_linesearch_precheck_picard_angle - angle
49286d74e61SPeter Brune 
49386d74e61SPeter Brune    Level: advanced
49486d74e61SPeter Brune 
49586d74e61SPeter Brune    Notes:
49686d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
49786d74e61SPeter Brune 
49886d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
49986d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
50086d74e61SPeter Brune    is generally not useful when using a Newton linearization.
50186d74e61SPeter Brune 
50286d74e61SPeter Brune    Reference:
50386d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
50486d74e61SPeter Brune 
50584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetPreCheck()
50686d74e61SPeter Brune @*/
507f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
50886d74e61SPeter Brune {
50986d74e61SPeter Brune   PetscErrorCode ierr;
51086d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
51186d74e61SPeter Brune   Vec            Ylast;
51286d74e61SPeter Brune   PetscScalar    dot;
51386d74e61SPeter Brune   PetscInt       iter;
51486d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
51586d74e61SPeter Brune   SNES           snes;
51686d74e61SPeter Brune 
51786d74e61SPeter Brune   PetscFunctionBegin;
518f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
51986d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
52086d74e61SPeter Brune   if (!Ylast) {
52186d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
52286d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
52386d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
52486d74e61SPeter Brune   }
52586d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
52686d74e61SPeter Brune   if (iter < 2) {
52786d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
52886d74e61SPeter Brune     *changed = PETSC_FALSE;
52986d74e61SPeter Brune     PetscFunctionReturn(0);
53086d74e61SPeter Brune   }
53186d74e61SPeter Brune 
53286d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
53386d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
53486d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
53586d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
536255453a1SBarry Smith   theta         = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
53786d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
53886d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
53986d74e61SPeter Brune     /* Modify the step Y */
54086d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
54186d74e61SPeter Brune     ierr  = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
54286d74e61SPeter Brune     ierr  = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
543f85e2ce2SBarry Smith     alpha = (ydiffnorm > .001*ylastnorm) ? ylastnorm / ydiffnorm : 1000.0;
54486d74e61SPeter Brune     ierr  = VecCopy(Y,Ylast);CHKERRQ(ierr);
54586d74e61SPeter Brune     ierr  = VecScale(Y,alpha);CHKERRQ(ierr);
546c69d1a72SBarry Smith     ierr  = PetscInfo3(snes,"Angle %14.12e degrees less than threshold %14.12e, corrected step by alpha=%14.12e\n",(double)(theta*180./PETSC_PI),(double)angle,(double)alpha);CHKERRQ(ierr);
547a47ec85fSBarry Smith     *changed = PETSC_TRUE;
54886d74e61SPeter Brune   } else {
549c69d1a72SBarry Smith     ierr     = PetscInfo2(snes,"Angle %14.12e degrees exceeds threshold %14.12e, no correction applied\n",(double)(theta*180./PETSC_PI),(double)angle);CHKERRQ(ierr);
55086d74e61SPeter Brune     ierr     = VecCopy(Y,Ylast);CHKERRQ(ierr);
55186d74e61SPeter Brune     *changed = PETSC_FALSE;
552bf7f4e0aSPeter Brune   }
553bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
554bf7f4e0aSPeter Brune }
555bf7f4e0aSPeter Brune 
556f40b411bSPeter Brune /*@
557cd7522eaSPeter Brune    SNESLineSearchApply - Computes the line-search update.
558f40b411bSPeter Brune 
559f1c6b773SPeter Brune    Collective on SNESLineSearch
560f40b411bSPeter Brune 
561f40b411bSPeter Brune    Input Parameters:
5628e557f58SPeter Brune +  linesearch - The linesearch context
5638e557f58SPeter Brune -  Y - The search direction
564f40b411bSPeter Brune 
5656b867d5aSJose E. Roman    Input/Output Parameters:
5666b867d5aSJose E. Roman +  X - The current solution, on output the new solution
5676b867d5aSJose E. Roman .  F - The current function, on output the new function
5686b867d5aSJose E. Roman -  fnorm - The current norm, on output the new function norm
569f40b411bSPeter Brune 
570cd7522eaSPeter Brune    Options Database Keys:
571d4c6564cSPatrick Farrell + -snes_linesearch_type - basic, bt, l2, cp, nleqerr, shell
572dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches
5731fe24845SBarry Smith . -snes_linesearch_damping - The linesearch damping parameter, default is 1.0 (no damping)
5741fe24845SBarry Smith . -snes_linesearch_norms   - Turn on/off the linesearch norms computation (SNESLineSearchSetComputeNorms())
5753c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess
5763c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches
577cd7522eaSPeter Brune 
578cd7522eaSPeter Brune    Notes:
579cd7522eaSPeter Brune    This is typically called from within a SNESSolve() implementation in order to
580cd7522eaSPeter Brune    help with convergence of the nonlinear method.  Various SNES types use line searches
581cd7522eaSPeter Brune    in different ways, but the overarching theme is that a line search is used to determine
582cd7522eaSPeter Brune    an optimal damping parameter of a step at each iteration of the method.  Each
58384238204SBarry Smith    application of the line search may invoke SNESComputeFunction() several times, and
584cd7522eaSPeter Brune    therefore may be fairly expensive.
585cd7522eaSPeter Brune 
586f40b411bSPeter Brune    Level: Intermediate
587f40b411bSPeter Brune 
58884238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction(), SNESLineSearchSetComputeNorms(),
5891fe24845SBarry Smith           SNESLineSearchType, SNESLineSearchSetType()
590f40b411bSPeter Brune @*/
591bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y)
592bf388a1fSBarry Smith {
593bf7f4e0aSPeter Brune   PetscErrorCode ierr;
594bf7f4e0aSPeter Brune 
595bf388a1fSBarry Smith   PetscFunctionBegin;
596f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
597bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
598bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
599064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(Y,VEC_CLASSID,5);
600bf7f4e0aSPeter Brune 
601422a814eSBarry Smith   linesearch->result = SNES_LINESEARCH_SUCCEEDED;
602bf7f4e0aSPeter Brune 
603bf7f4e0aSPeter Brune   linesearch->vec_sol    = X;
604bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
605bf7f4e0aSPeter Brune   linesearch->vec_func   = F;
606bf7f4e0aSPeter Brune 
607f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
608bf7f4e0aSPeter Brune 
609f5af7f23SKarl Rupp   if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
610bf7f4e0aSPeter Brune 
611f5af7f23SKarl Rupp   if (fnorm) linesearch->fnorm = *fnorm;
612f5af7f23SKarl Rupp   else {
613bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
614bf7f4e0aSPeter Brune   }
615bf7f4e0aSPeter Brune 
61657a83faaSBarry Smith   ierr = PetscLogEventBegin(SNESLINESEARCH_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
617bf7f4e0aSPeter Brune 
618bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
619bf7f4e0aSPeter Brune 
62057a83faaSBarry Smith   ierr = PetscLogEventEnd(SNESLINESEARCH_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
621bf7f4e0aSPeter Brune 
622f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
623bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
624bf7f4e0aSPeter Brune }
625bf7f4e0aSPeter Brune 
626f40b411bSPeter Brune /*@
627f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
628f40b411bSPeter Brune 
629f1c6b773SPeter Brune    Collective on SNESLineSearch
630f40b411bSPeter Brune 
631f40b411bSPeter Brune    Input Parameters:
6328e557f58SPeter Brune .  linesearch - The linesearch context
633f40b411bSPeter Brune 
63484238204SBarry Smith    Level: developer
635f40b411bSPeter Brune 
63684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy()
637f40b411bSPeter Brune @*/
638bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch)
639bf388a1fSBarry Smith {
640bf7f4e0aSPeter Brune   PetscErrorCode ierr;
641bf388a1fSBarry Smith 
642bf7f4e0aSPeter Brune   PetscFunctionBegin;
643bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
644f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
6459e5d0892SLisandro Dalcin   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = NULL; PetscFunctionReturn(0);}
646e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr);
64722d28d08SBarry Smith   ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr);
648f5af7f23SKarl Rupp   if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch);
649bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
650dcf2fd19SBarry Smith   ierr = SNESLineSearchMonitorCancel((*linesearch));CHKERRQ(ierr);
651e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
652bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
653bf7f4e0aSPeter Brune }
654bf7f4e0aSPeter Brune 
655f40b411bSPeter Brune /*@
656dcf2fd19SBarry Smith    SNESLineSearchSetDefaultMonitor - Turns on/off printing useful information and debugging output about the line search.
657bf7f4e0aSPeter Brune 
658bf7f4e0aSPeter Brune    Input Parameters:
659dcf2fd19SBarry Smith +  linesearch - the linesearch object
660dcf2fd19SBarry Smith -  viewer - an ASCII PetscViewer or NULL to turn off monitor
661bf7f4e0aSPeter Brune 
662dcf2fd19SBarry Smith    Logically Collective on SNESLineSearch
663bf7f4e0aSPeter Brune 
664bf7f4e0aSPeter Brune    Options Database:
665dcf2fd19SBarry Smith .   -snes_linesearch_monitor [:filename] - enables the monitor
666bf7f4e0aSPeter Brune 
667bf7f4e0aSPeter Brune    Level: intermediate
668bf7f4e0aSPeter Brune 
669dcf2fd19SBarry Smith    Developer Note: This monitor is implemented differently than the other SNESLineSearchMonitors that are set with
670d12e167eSBarry Smith      SNESLineSearchMonitorSet() since it is called in many locations of the line search routines to display aspects of the
671d12e167eSBarry Smith      line search that are not visible to the other monitors.
672dcf2fd19SBarry Smith 
67384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetDefaultMonitor(), PetscViewer, SNESLineSearchSetMonitor()
674bf7f4e0aSPeter Brune @*/
675dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchSetDefaultMonitor(SNESLineSearch linesearch, PetscViewer viewer)
676bf7f4e0aSPeter Brune {
677bf7f4e0aSPeter Brune   PetscErrorCode ierr;
678bf388a1fSBarry Smith 
679bf7f4e0aSPeter Brune   PetscFunctionBegin;
680dcf2fd19SBarry Smith   if (viewer) {ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);}
681bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
682dcf2fd19SBarry Smith   linesearch->monitor = viewer;
683bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
684bf7f4e0aSPeter Brune }
685bf7f4e0aSPeter Brune 
686f40b411bSPeter Brune /*@
687dcf2fd19SBarry Smith    SNESLineSearchGetDefaultMonitor - Gets the PetscViewer instance for the line search monitor.
6886a388c36SPeter Brune 
689f190f2fcSBarry Smith    Input Parameter:
6908e557f58SPeter Brune .  linesearch - linesearch context
691f40b411bSPeter Brune 
692f190f2fcSBarry Smith    Output Parameter:
6938e557f58SPeter Brune .  monitor - monitor context
694f40b411bSPeter Brune 
695f40b411bSPeter Brune    Logically Collective on SNES
696f40b411bSPeter Brune 
697f40b411bSPeter Brune    Options Database Keys:
6988e557f58SPeter Brune .   -snes_linesearch_monitor - enables the monitor
699f40b411bSPeter Brune 
700f40b411bSPeter Brune    Level: intermediate
701f40b411bSPeter Brune 
70284238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetDefaultMonitor(), PetscViewer
703f40b411bSPeter Brune @*/
704dcf2fd19SBarry Smith PetscErrorCode  SNESLineSearchGetDefaultMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
7056a388c36SPeter Brune {
7066a388c36SPeter Brune   PetscFunctionBegin;
707f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7086a388c36SPeter Brune   *monitor = linesearch->monitor;
7096a388c36SPeter Brune   PetscFunctionReturn(0);
7106a388c36SPeter Brune }
7116a388c36SPeter Brune 
712dcf2fd19SBarry Smith /*@C
713dcf2fd19SBarry Smith    SNESLineSearchMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user
714dcf2fd19SBarry Smith 
715dcf2fd19SBarry Smith    Collective on SNESLineSearch
716dcf2fd19SBarry Smith 
717dcf2fd19SBarry Smith    Input Parameters:
718dcf2fd19SBarry Smith +  ls - LineSearch object you wish to monitor
719dcf2fd19SBarry Smith .  name - the monitor type one is seeking
720dcf2fd19SBarry Smith .  help - message indicating what monitoring is done
721dcf2fd19SBarry Smith .  manual - manual page for the monitor
722dcf2fd19SBarry Smith .  monitor - the monitor function
723dcf2fd19SBarry 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
724dcf2fd19SBarry Smith 
725dcf2fd19SBarry Smith    Level: developer
726dcf2fd19SBarry Smith 
727dcf2fd19SBarry Smith .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
728dcf2fd19SBarry Smith           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
729dcf2fd19SBarry Smith           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
730dcf2fd19SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
731dcf2fd19SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
732dcf2fd19SBarry Smith           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
733dcf2fd19SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
734dcf2fd19SBarry Smith @*/
735d12e167eSBarry Smith PetscErrorCode  SNESLineSearchMonitorSetFromOptions(SNESLineSearch ls,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(SNESLineSearch,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(SNESLineSearch,PetscViewerAndFormat*))
736dcf2fd19SBarry Smith {
737dcf2fd19SBarry Smith   PetscErrorCode    ierr;
738dcf2fd19SBarry Smith   PetscViewer       viewer;
739dcf2fd19SBarry Smith   PetscViewerFormat format;
740dcf2fd19SBarry Smith   PetscBool         flg;
741dcf2fd19SBarry Smith 
742dcf2fd19SBarry Smith   PetscFunctionBegin;
74316413a6aSBarry Smith   ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ls),((PetscObject) ls)->options,((PetscObject)ls)->prefix,name,&viewer,&format,&flg);CHKERRQ(ierr);
744dcf2fd19SBarry Smith   if (flg) {
745d12e167eSBarry Smith     PetscViewerAndFormat *vf;
746d12e167eSBarry Smith     ierr = PetscViewerAndFormatCreate(viewer,format,&vf);CHKERRQ(ierr);
747d12e167eSBarry Smith     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
748dcf2fd19SBarry Smith     if (monitorsetup) {
749d12e167eSBarry Smith       ierr = (*monitorsetup)(ls,vf);CHKERRQ(ierr);
750dcf2fd19SBarry Smith     }
751d12e167eSBarry Smith     ierr = SNESLineSearchMonitorSet(ls,(PetscErrorCode (*)(SNESLineSearch,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);CHKERRQ(ierr);
752dcf2fd19SBarry Smith   }
753dcf2fd19SBarry Smith   PetscFunctionReturn(0);
754dcf2fd19SBarry Smith }
755dcf2fd19SBarry Smith 
756f40b411bSPeter Brune /*@
757f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
758f40b411bSPeter Brune 
759f899ff85SJose E. Roman    Input Parameter:
7608e557f58SPeter Brune .  linesearch - linesearch context
761f40b411bSPeter Brune 
762f40b411bSPeter Brune    Options Database Keys:
763d4c6564cSPatrick Farrell + -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell
7643c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3.  Most types only support certain orders (bt supports 2 or 3)
7651fe24845SBarry Smith . -snes_linesearch_norms   - Turn on/off the linesearch norms for the basic linesearch typem (SNESLineSearchSetComputeNorms())
76671eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length
7671a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size
7681a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches
7691a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches
7701a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches
7711a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches
772dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches
773dcf2fd19SBarry Smith . -snes_linesearch_monitor_solution_update [viewer:filename:format] - view each update tried by line search routine
7748e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter
775cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess.
7761a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method
777d8d34be6SBarry Smith - -snes_linesearch_precheck_picard_angle - Angle used in Picard precheck method
778f40b411bSPeter Brune 
779f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
780f40b411bSPeter Brune 
781f40b411bSPeter Brune    Level: intermediate
782f40b411bSPeter Brune 
7831fe24845SBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard(),
7841fe24845SBarry Smith           SNESLineSearchType, SNESLineSearchSetComputeNorms()
785f40b411bSPeter Brune @*/
786bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch)
787bf388a1fSBarry Smith {
788bf7f4e0aSPeter Brune   PetscErrorCode    ierr;
7891a4f838cSPeter Brune   const char        *deft = SNESLINESEARCHBASIC;
790bf7f4e0aSPeter Brune   char              type[256];
791bf7f4e0aSPeter Brune   PetscBool         flg, set;
792dcf2fd19SBarry Smith   PetscViewer       viewer;
793bf388a1fSBarry Smith 
794bf7f4e0aSPeter Brune   PetscFunctionBegin;
7950f51fdf8SToby Isaac   ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);
796bf7f4e0aSPeter Brune 
797bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
798f5af7f23SKarl Rupp   if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name;
799a264d7a6SBarry Smith   ierr = PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
800bf7f4e0aSPeter Brune   if (flg) {
801f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
802bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
803f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
804bf7f4e0aSPeter Brune   }
805bf7f4e0aSPeter Brune 
80616413a6aSBarry Smith   ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)linesearch),((PetscObject) linesearch)->options,((PetscObject)linesearch)->prefix,"-snes_linesearch_monitor",&viewer,NULL,&set);CHKERRQ(ierr);
807dcf2fd19SBarry Smith   if (set) {
808dcf2fd19SBarry Smith     ierr = SNESLineSearchSetDefaultMonitor(linesearch,viewer);CHKERRQ(ierr);
809dcf2fd19SBarry Smith     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
810dcf2fd19SBarry Smith   }
811dcf2fd19SBarry Smith   ierr = SNESLineSearchMonitorSetFromOptions(linesearch,"-snes_linesearch_monitor_solution_update","View correction at each iteration","SNESLineSearchMonitorSolutionUpdate",SNESLineSearchMonitorSolutionUpdate,NULL);CHKERRQ(ierr);
812bf7f4e0aSPeter Brune 
8131a9b3a06SPeter Brune   /* tolerances */
81494ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL);CHKERRQ(ierr);
81594ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL);CHKERRQ(ierr);
81694ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL);CHKERRQ(ierr);
81794ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL);CHKERRQ(ierr);
81894ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL);CHKERRQ(ierr);
81994ae4db5SBarry Smith   ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL);CHKERRQ(ierr);
8207a35526eSPeter Brune 
8211a9b3a06SPeter Brune   /* damping parameters */
82294ae4db5SBarry Smith   ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL);CHKERRQ(ierr);
8231a9b3a06SPeter Brune 
82494ae4db5SBarry Smith   ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL);CHKERRQ(ierr);
8251a9b3a06SPeter Brune 
8261a9b3a06SPeter Brune   /* precheck */
8277a35526eSPeter Brune   ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr);
8287a35526eSPeter Brune   if (set) {
8297a35526eSPeter Brune     if (flg) {
8307a35526eSPeter Brune       linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */
831f5af7f23SKarl Rupp 
8327a35526eSPeter Brune       ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction",
8330298fd71SBarry Smith                               "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr);
8347a35526eSPeter Brune       ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr);
8357a35526eSPeter Brune     } else {
8360298fd71SBarry Smith       ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr);
8377a35526eSPeter Brune     }
8387a35526eSPeter Brune   }
83994ae4db5SBarry Smith   ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL);CHKERRQ(ierr);
84094ae4db5SBarry Smith   ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL);CHKERRQ(ierr);
8417a35526eSPeter Brune 
8425a9b6599SPeter Brune   if (linesearch->ops->setfromoptions) {
843e55864a3SBarry Smith     (*linesearch->ops->setfromoptions)(PetscOptionsObject,linesearch);CHKERRQ(ierr);
8445a9b6599SPeter Brune   }
8455a9b6599SPeter Brune 
8460633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)linesearch);CHKERRQ(ierr);
847bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
848bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
849bf7f4e0aSPeter Brune }
850bf7f4e0aSPeter Brune 
851f40b411bSPeter Brune /*@
852f190f2fcSBarry Smith    SNESLineSearchView - Prints useful information about the line search
853f40b411bSPeter Brune 
854f40b411bSPeter Brune    Input Parameters:
8558e557f58SPeter Brune .  linesearch - linesearch context
856f40b411bSPeter Brune 
857f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
858f40b411bSPeter Brune 
859f40b411bSPeter Brune    Level: intermediate
860f40b411bSPeter Brune 
861dcf2fd19SBarry Smith .seealso: SNESLineSearchCreate()
862f40b411bSPeter Brune @*/
863bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer)
864bf388a1fSBarry Smith {
8657f1410a3SPeter Brune   PetscErrorCode ierr;
8667f1410a3SPeter Brune   PetscBool      iascii;
867bf388a1fSBarry Smith 
868bf7f4e0aSPeter Brune   PetscFunctionBegin;
8697f1410a3SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
8707f1410a3SPeter Brune   if (!viewer) {
871ce94432eSBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr);
8727f1410a3SPeter Brune   }
8737f1410a3SPeter Brune   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
8747f1410a3SPeter Brune   PetscCheckSameComm(linesearch,1,viewer,2);
875f40b411bSPeter Brune 
876251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
8777f1410a3SPeter Brune   if (iascii) {
878dae58748SBarry Smith     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr);
8797f1410a3SPeter Brune     if (linesearch->ops->view) {
8807f1410a3SPeter Brune       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
8817f1410a3SPeter Brune       ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr);
8827f1410a3SPeter Brune       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
8837f1410a3SPeter Brune     }
884c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr);
885c69d1a72SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr);
8867f1410a3SPeter Brune     ierr = PetscViewerASCIIPrintf(viewer,"  maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr);
8876b2b7091SBarry Smith     if (linesearch->ops->precheck) {
8886b2b7091SBarry Smith       if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) {
8897f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr);
8907f1410a3SPeter Brune       } else {
8917f1410a3SPeter Brune         ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr);
8927f1410a3SPeter Brune       }
8937f1410a3SPeter Brune     }
8946b2b7091SBarry Smith     if (linesearch->ops->postcheck) {
8957f1410a3SPeter Brune       ierr = PetscViewerASCIIPrintf(viewer,"  using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr);
8967f1410a3SPeter Brune     }
8977f1410a3SPeter Brune   }
898bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
899bf7f4e0aSPeter Brune }
900bf7f4e0aSPeter Brune 
901ea5d4fccSPeter Brune /*@C
902a80ff896SJed Brown    SNESLineSearchGetType - Gets the linesearch type
903a80ff896SJed Brown 
904a80ff896SJed Brown    Logically Collective on SNESLineSearch
905a80ff896SJed Brown 
906a80ff896SJed Brown    Input Parameters:
907a80ff896SJed Brown .  linesearch - linesearch context
908a80ff896SJed Brown 
909a80ff896SJed Brown    Output Parameters:
910a80ff896SJed Brown -  type - The type of line search, or NULL if not set
911a80ff896SJed Brown 
912a80ff896SJed Brown    Level: intermediate
913a80ff896SJed Brown 
914a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchSetType()
915a80ff896SJed Brown @*/
916a80ff896SJed Brown PetscErrorCode SNESLineSearchGetType(SNESLineSearch linesearch, SNESLineSearchType *type)
917a80ff896SJed Brown {
918a80ff896SJed Brown   PetscFunctionBegin;
919a80ff896SJed Brown   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
920a80ff896SJed Brown   PetscValidCharPointer(type,2);
921a80ff896SJed Brown   *type = ((PetscObject)linesearch)->type_name;
922a80ff896SJed Brown   PetscFunctionReturn(0);
923a80ff896SJed Brown }
924a80ff896SJed Brown 
925a80ff896SJed Brown /*@C
926f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
927f40b411bSPeter Brune 
928f190f2fcSBarry Smith    Logically Collective on SNESLineSearch
929f190f2fcSBarry Smith 
930f40b411bSPeter Brune    Input Parameters:
9318e557f58SPeter Brune +  linesearch - linesearch context
932f40b411bSPeter Brune -  type - The type of line search to be used
933f40b411bSPeter Brune 
934cd7522eaSPeter Brune    Available Types:
9351fe24845SBarry Smith +  SNESLINESEARCHBASIC - Simple damping line search, defaults to using the full Newton step
9361fe24845SBarry Smith .  SNESLINESEARCHBT - Backtracking line search over the L2 norm of the function
9371fe24845SBarry Smith .  SNESLINESEARCHL2 - Secant line search over the L2 norm of the function
9381fe24845SBarry Smith .  SNESLINESEARCHCP - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x)
9391fe24845SBarry Smith .  SNESLINESEARCHNLEQERR - Affine-covariant error-oriented linesearch
9401fe24845SBarry Smith -  SNESLINESEARCHSHELL - User provided SNESLineSearch implementation
9411fe24845SBarry Smith 
9421fe24845SBarry Smith    Options Database:
9431fe24845SBarry Smith .  -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell
944cd7522eaSPeter Brune 
945f40b411bSPeter Brune    Level: intermediate
946f40b411bSPeter Brune 
947a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchGetType()
948f40b411bSPeter Brune @*/
94919fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type)
950bf7f4e0aSPeter Brune {
951f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
952bf7f4e0aSPeter Brune   PetscBool      match;
953bf7f4e0aSPeter Brune 
954bf7f4e0aSPeter Brune   PetscFunctionBegin;
955f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
956bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
957bf7f4e0aSPeter Brune 
958251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
959bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
960bf7f4e0aSPeter Brune 
9611c9cd337SJed Brown   ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr);
962bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
963bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
964bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
965bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
9660298fd71SBarry Smith     linesearch->ops->destroy = NULL;
967bf7f4e0aSPeter Brune   }
968f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
9699e5d0892SLisandro Dalcin   linesearch->ops->apply          = NULL;
9709e5d0892SLisandro Dalcin   linesearch->ops->view           = NULL;
9719e5d0892SLisandro Dalcin   linesearch->ops->setfromoptions = NULL;
9729e5d0892SLisandro Dalcin   linesearch->ops->destroy        = NULL;
973bf7f4e0aSPeter Brune 
974bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
975bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
976bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
977bf7f4e0aSPeter Brune }
978bf7f4e0aSPeter Brune 
979f40b411bSPeter Brune /*@
98078bcb3b5SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation.
981f40b411bSPeter Brune 
982f40b411bSPeter Brune    Input Parameters:
9838e557f58SPeter Brune +  linesearch - linesearch context
984f40b411bSPeter Brune -  snes - The snes instance
985f40b411bSPeter Brune 
98678bcb3b5SPeter Brune    Level: developer
98778bcb3b5SPeter Brune 
98878bcb3b5SPeter Brune    Notes:
989f190f2fcSBarry Smith    This happens automatically when the line search is obtained/created with
9907601faf0SJed Brown    SNESGetLineSearch().  This routine is therefore mainly called within SNES
99178bcb3b5SPeter Brune    implementations.
992f40b411bSPeter Brune 
9938141a3b9SPeter Brune    Level: developer
994f40b411bSPeter Brune 
995cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
996f40b411bSPeter Brune @*/
997bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes)
998bf388a1fSBarry Smith {
999bf7f4e0aSPeter Brune   PetscFunctionBegin;
1000f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1001bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
1002bf7f4e0aSPeter Brune   linesearch->snes = snes;
1003bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1004bf7f4e0aSPeter Brune }
1005bf7f4e0aSPeter Brune 
1006f40b411bSPeter Brune /*@
10078141a3b9SPeter Brune    SNESLineSearchGetSNES - Gets the SNES instance associated with the line search.
10088141a3b9SPeter Brune    Having an associated SNES is necessary because most line search implementations must be able to
10098141a3b9SPeter Brune    evaluate the function using SNESComputeFunction() for the associated SNES.  This routine
10108141a3b9SPeter Brune    is used in the line search implementations when one must get this associated SNES instance.
1011f40b411bSPeter Brune 
1012f40b411bSPeter Brune    Input Parameters:
10138e557f58SPeter Brune .  linesearch - linesearch context
1014f40b411bSPeter Brune 
1015f40b411bSPeter Brune    Output Parameters:
1016f40b411bSPeter Brune .  snes - The snes instance
1017f40b411bSPeter Brune 
10188141a3b9SPeter Brune    Level: developer
1019f40b411bSPeter Brune 
1020cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES
1021f40b411bSPeter Brune @*/
1022bf388a1fSBarry Smith PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes)
1023bf388a1fSBarry Smith {
1024bf7f4e0aSPeter Brune   PetscFunctionBegin;
1025f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10266a388c36SPeter Brune   PetscValidPointer(snes, 2);
1027bf7f4e0aSPeter Brune   *snes = linesearch->snes;
1028bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1029bf7f4e0aSPeter Brune }
1030bf7f4e0aSPeter Brune 
1031f40b411bSPeter Brune /*@
1032f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
1033f40b411bSPeter Brune 
1034f40b411bSPeter Brune    Input Parameters:
10358e557f58SPeter Brune .  linesearch - linesearch context
1036f40b411bSPeter Brune 
1037f40b411bSPeter Brune    Output Parameters:
1038cd7522eaSPeter Brune .  lambda - The last steplength computed during SNESLineSearchApply()
1039f40b411bSPeter Brune 
104078bcb3b5SPeter Brune    Level: advanced
104178bcb3b5SPeter Brune 
10428e557f58SPeter Brune    Notes:
10438e557f58SPeter Brune    This is useful in methods where the solver is ill-scaled and
104478bcb3b5SPeter Brune    requires some adaptive notion of the difference in scale between the
104578bcb3b5SPeter Brune    solution and the function.  For instance, SNESQN may be scaled by the
104678bcb3b5SPeter Brune    line search lambda using the argument -snes_qn_scaling ls.
104778bcb3b5SPeter Brune 
1048cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply()
1049f40b411bSPeter Brune @*/
1050f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
10516a388c36SPeter Brune {
10526a388c36SPeter Brune   PetscFunctionBegin;
1053f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1054534a8f05SLisandro Dalcin   PetscValidRealPointer(lambda, 2);
10556a388c36SPeter Brune   *lambda = linesearch->lambda;
10566a388c36SPeter Brune   PetscFunctionReturn(0);
10576a388c36SPeter Brune }
10586a388c36SPeter Brune 
1059f40b411bSPeter Brune /*@
1060f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
1061f40b411bSPeter Brune 
1062f40b411bSPeter Brune    Input Parameters:
10638e557f58SPeter Brune +  linesearch - linesearch context
1064f40b411bSPeter Brune -  lambda - The last steplength.
1065f40b411bSPeter Brune 
1066cd7522eaSPeter Brune    Notes:
1067f190f2fcSBarry Smith    This routine is typically used within implementations of SNESLineSearchApply()
1068cd7522eaSPeter Brune    to set the final steplength.  This routine (and SNESLineSearchGetLambda()) were
1069cd7522eaSPeter Brune    added in order to facilitate Quasi-Newton methods that use the previous steplength
1070cd7522eaSPeter Brune    as an inner scaling parameter.
1071cd7522eaSPeter Brune 
107278bcb3b5SPeter Brune    Level: advanced
1073f40b411bSPeter Brune 
1074f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
1075f40b411bSPeter Brune @*/
1076f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
10776a388c36SPeter Brune {
10786a388c36SPeter Brune   PetscFunctionBegin;
1079f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10806a388c36SPeter Brune   linesearch->lambda = lambda;
10816a388c36SPeter Brune   PetscFunctionReturn(0);
10826a388c36SPeter Brune }
10836a388c36SPeter Brune 
1084f40b411bSPeter Brune /*@
10853c7d6663SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the linesearch.  These include
108678bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
108778bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
108878bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1089f40b411bSPeter Brune 
1090f899ff85SJose E. Roman    Input Parameter:
10918e557f58SPeter Brune .  linesearch - linesearch context
1092f40b411bSPeter Brune 
1093f40b411bSPeter Brune    Output Parameters:
1094516fe3c3SPeter Brune +  steptol - The minimum steplength
10956cc8e53bSPeter Brune .  maxstep - The maximum steplength
1096516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1097516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1098516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1099516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1100f40b411bSPeter Brune 
110178bcb3b5SPeter Brune    Level: intermediate
110278bcb3b5SPeter Brune 
110378bcb3b5SPeter Brune    Notes:
110478bcb3b5SPeter Brune    Different line searches may implement these parameters slightly differently as
11053c7d6663SPeter Brune    the type requires.
1106516fe3c3SPeter Brune 
1107f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
1108f40b411bSPeter Brune @*/
1109f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
11106a388c36SPeter Brune {
11116a388c36SPeter Brune   PetscFunctionBegin;
1112f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1113516fe3c3SPeter Brune   if (steptol) {
1114534a8f05SLisandro Dalcin     PetscValidRealPointer(steptol, 2);
11156a388c36SPeter Brune     *steptol = linesearch->steptol;
1116516fe3c3SPeter Brune   }
1117516fe3c3SPeter Brune   if (maxstep) {
1118534a8f05SLisandro Dalcin     PetscValidRealPointer(maxstep, 3);
1119516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
1120516fe3c3SPeter Brune   }
1121516fe3c3SPeter Brune   if (rtol) {
1122534a8f05SLisandro Dalcin     PetscValidRealPointer(rtol, 4);
1123516fe3c3SPeter Brune     *rtol = linesearch->rtol;
1124516fe3c3SPeter Brune   }
1125516fe3c3SPeter Brune   if (atol) {
1126534a8f05SLisandro Dalcin     PetscValidRealPointer(atol, 5);
1127516fe3c3SPeter Brune     *atol = linesearch->atol;
1128516fe3c3SPeter Brune   }
1129516fe3c3SPeter Brune   if (ltol) {
1130534a8f05SLisandro Dalcin     PetscValidRealPointer(ltol, 6);
1131516fe3c3SPeter Brune     *ltol = linesearch->ltol;
1132516fe3c3SPeter Brune   }
1133516fe3c3SPeter Brune   if (max_its) {
1134534a8f05SLisandro Dalcin     PetscValidIntPointer(max_its, 7);
1135516fe3c3SPeter Brune     *max_its = linesearch->max_its;
1136516fe3c3SPeter Brune   }
11376a388c36SPeter Brune   PetscFunctionReturn(0);
11386a388c36SPeter Brune }
11396a388c36SPeter Brune 
1140f40b411bSPeter Brune /*@
11413c7d6663SPeter Brune    SNESLineSearchSetTolerances -  Gets the tolerances for the linesearch.  These include
114278bcb3b5SPeter Brune    tolerances for the relative and absolute change in the function norm, the change
114378bcb3b5SPeter Brune    in lambda for iterative line searches, the minimum steplength, the maximum steplength,
114478bcb3b5SPeter Brune    and the maximum number of iterations the line search procedure may take.
1145f40b411bSPeter Brune 
1146f40b411bSPeter Brune    Input Parameters:
11478e557f58SPeter Brune +  linesearch - linesearch context
1148516fe3c3SPeter Brune .  steptol - The minimum steplength
11496cc8e53bSPeter Brune .  maxstep - The maximum steplength
1150516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
1151516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
1152516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
1153516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
1154f40b411bSPeter Brune 
115578bcb3b5SPeter Brune    Notes:
11563c7d6663SPeter Brune    The user may choose to not set any of the tolerances using PETSC_DEFAULT in
115778bcb3b5SPeter Brune    place of an argument.
1158f40b411bSPeter Brune 
115978bcb3b5SPeter Brune    Level: intermediate
1160516fe3c3SPeter Brune 
1161f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
1162f40b411bSPeter Brune @*/
1163f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
11646a388c36SPeter Brune {
11656a388c36SPeter Brune   PetscFunctionBegin;
1166f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1167d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,steptol,2);
1168d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,maxstep,3);
1169d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,rtol,4);
1170d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,atol,5);
1171d3952184SSatish Balay   PetscValidLogicalCollectiveReal(linesearch,ltol,6);
1172d3952184SSatish Balay   PetscValidLogicalCollectiveInt(linesearch,max_its,7);
1173d3952184SSatish Balay 
1174d3952184SSatish Balay   if (steptol!= PETSC_DEFAULT) {
1175ce94432eSBarry Smith     if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol);
11766a388c36SPeter Brune     linesearch->steptol = steptol;
1177d3952184SSatish Balay   }
1178d3952184SSatish Balay 
1179d3952184SSatish Balay   if (maxstep!= PETSC_DEFAULT) {
1180ce94432eSBarry Smith     if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep);
1181516fe3c3SPeter Brune     linesearch->maxstep = maxstep;
1182d3952184SSatish Balay   }
1183d3952184SSatish Balay 
1184d3952184SSatish Balay   if (rtol != PETSC_DEFAULT) {
1185ce94432eSBarry Smith     if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol);
1186516fe3c3SPeter Brune     linesearch->rtol = rtol;
1187d3952184SSatish Balay   }
1188d3952184SSatish Balay 
1189d3952184SSatish Balay   if (atol != PETSC_DEFAULT) {
1190ce94432eSBarry Smith     if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol);
1191516fe3c3SPeter Brune     linesearch->atol = atol;
1192d3952184SSatish Balay   }
1193d3952184SSatish Balay 
1194d3952184SSatish Balay   if (ltol != PETSC_DEFAULT) {
11952479783cSJose E. Roman     if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Lambda tolerance %14.12e must be non-negative",(double)ltol);
1196516fe3c3SPeter Brune     linesearch->ltol = ltol;
1197d3952184SSatish Balay   }
1198d3952184SSatish Balay 
1199d3952184SSatish Balay   if (max_its != PETSC_DEFAULT) {
1200ce94432eSBarry Smith     if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its);
1201516fe3c3SPeter Brune     linesearch->max_its = max_its;
1202d3952184SSatish Balay   }
12036a388c36SPeter Brune   PetscFunctionReturn(0);
12046a388c36SPeter Brune }
12056a388c36SPeter Brune 
1206f40b411bSPeter Brune /*@
1207f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
1208f40b411bSPeter Brune 
1209f40b411bSPeter Brune    Input Parameters:
12108e557f58SPeter Brune .  linesearch - linesearch context
1211f40b411bSPeter Brune 
1212f40b411bSPeter Brune    Output Parameters:
12138e557f58SPeter Brune .  damping - The damping parameter
1214f40b411bSPeter Brune 
121578bcb3b5SPeter Brune    Level: advanced
1216f40b411bSPeter Brune 
121778bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN
1218f40b411bSPeter Brune @*/
1219f40b411bSPeter Brune 
1220f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
12216a388c36SPeter Brune {
12226a388c36SPeter Brune   PetscFunctionBegin;
1223f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1224534a8f05SLisandro Dalcin   PetscValidRealPointer(damping, 2);
12256a388c36SPeter Brune   *damping = linesearch->damping;
12266a388c36SPeter Brune   PetscFunctionReturn(0);
12276a388c36SPeter Brune }
12286a388c36SPeter Brune 
1229f40b411bSPeter Brune /*@
1230fd292e60Sprj-    SNESLineSearchSetDamping - Sets the line search damping parameter.
1231f40b411bSPeter Brune 
1232f40b411bSPeter Brune    Input Parameters:
123303fd4120SBarry Smith +  linesearch - linesearch context
123403fd4120SBarry Smith -  damping - The damping parameter
1235f40b411bSPeter Brune 
123603fd4120SBarry Smith    Options Database:
123703fd4120SBarry Smith .   -snes_linesearch_damping
1238f40b411bSPeter Brune    Level: intermediate
1239f40b411bSPeter Brune 
1240cd7522eaSPeter Brune    Notes:
1241cd7522eaSPeter Brune    The basic line search merely takes the update step scaled by the damping parameter.
1242cd7522eaSPeter Brune    The use of the damping parameter in the l2 and cp line searches is much more subtle;
124378bcb3b5SPeter Brune    it is used as a starting point in calculating the secant step. However, the eventual
1244cd7522eaSPeter Brune    step may be of greater length than the damping parameter.  In the bt line search it is
1245cd7522eaSPeter Brune    used as the maximum possible step length, as the bt line search only backtracks.
1246cd7522eaSPeter Brune 
1247f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
1248f40b411bSPeter Brune @*/
1249f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
12506a388c36SPeter Brune {
12516a388c36SPeter Brune   PetscFunctionBegin;
1252f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12536a388c36SPeter Brune   linesearch->damping = damping;
12546a388c36SPeter Brune   PetscFunctionReturn(0);
12556a388c36SPeter Brune }
12566a388c36SPeter Brune 
125759405d5eSPeter Brune /*@
125859405d5eSPeter Brune    SNESLineSearchGetOrder - Gets the line search approximation order.
125959405d5eSPeter Brune 
126059405d5eSPeter Brune    Input Parameters:
126178bcb3b5SPeter Brune .  linesearch - linesearch context
126259405d5eSPeter Brune 
126359405d5eSPeter Brune    Output Parameters:
12648e557f58SPeter Brune .  order - The order
126559405d5eSPeter Brune 
126678bcb3b5SPeter Brune    Possible Values for order:
12673c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
12683c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
12693c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
127078bcb3b5SPeter Brune 
127159405d5eSPeter Brune    Level: intermediate
127259405d5eSPeter Brune 
127359405d5eSPeter Brune .seealso: SNESLineSearchSetOrder()
127459405d5eSPeter Brune @*/
127559405d5eSPeter Brune 
1276b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order)
127759405d5eSPeter Brune {
127859405d5eSPeter Brune   PetscFunctionBegin;
127959405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1280534a8f05SLisandro Dalcin   PetscValidIntPointer(order, 2);
128159405d5eSPeter Brune   *order = linesearch->order;
128259405d5eSPeter Brune   PetscFunctionReturn(0);
128359405d5eSPeter Brune }
128459405d5eSPeter Brune 
128559405d5eSPeter Brune /*@
12861f8196a2SJed Brown    SNESLineSearchSetOrder - Sets the maximum order of the polynomial fit used in the line search
128759405d5eSPeter Brune 
128859405d5eSPeter Brune    Input Parameters:
1289a2b725a8SWilliam Gropp +  linesearch - linesearch context
1290a2b725a8SWilliam Gropp -  order - The damping parameter
129159405d5eSPeter Brune 
129259405d5eSPeter Brune    Level: intermediate
129359405d5eSPeter Brune 
129478bcb3b5SPeter Brune    Possible Values for order:
12953c7d6663SPeter Brune +  1 or SNES_LINESEARCH_ORDER_LINEAR - linear order
12963c7d6663SPeter Brune .  2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order
12973c7d6663SPeter Brune -  3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order
129878bcb3b5SPeter Brune 
129959405d5eSPeter Brune    Notes:
130059405d5eSPeter Brune    Variable orders are supported by the following line searches:
130178bcb3b5SPeter Brune +  bt - cubic and quadratic
130278bcb3b5SPeter Brune -  cp - linear and quadratic
130359405d5eSPeter Brune 
13041f8196a2SJed Brown .seealso: SNESLineSearchGetOrder(), SNESLineSearchSetDamping()
130559405d5eSPeter Brune @*/
1306b000cd8dSPeter Brune PetscErrorCode  SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order)
130759405d5eSPeter Brune {
130859405d5eSPeter Brune   PetscFunctionBegin;
130959405d5eSPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
131059405d5eSPeter Brune   linesearch->order = order;
131159405d5eSPeter Brune   PetscFunctionReturn(0);
131259405d5eSPeter Brune }
131359405d5eSPeter Brune 
1314f40b411bSPeter Brune /*@
1315f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
1316f40b411bSPeter Brune 
1317f899ff85SJose E. Roman    Input Parameter:
131878bcb3b5SPeter Brune .  linesearch - linesearch context
1319f40b411bSPeter Brune 
1320f40b411bSPeter Brune    Output Parameters:
1321f40b411bSPeter Brune +  xnorm - The norm of the current solution
1322f40b411bSPeter Brune .  fnorm - The norm of the current function
1323f40b411bSPeter Brune -  ynorm - The norm of the current update
1324f40b411bSPeter Brune 
1325cd7522eaSPeter Brune    Notes:
1326cd7522eaSPeter Brune    This function is mainly called from SNES implementations.
1327cd7522eaSPeter Brune 
132878bcb3b5SPeter Brune    Level: developer
1329f40b411bSPeter Brune 
1330f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
1331f40b411bSPeter Brune @*/
1332f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
1333bf7f4e0aSPeter Brune {
1334bf7f4e0aSPeter Brune   PetscFunctionBegin;
1335f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1336f5af7f23SKarl Rupp   if (xnorm) *xnorm = linesearch->xnorm;
1337f5af7f23SKarl Rupp   if (fnorm) *fnorm = linesearch->fnorm;
1338f5af7f23SKarl Rupp   if (ynorm) *ynorm = linesearch->ynorm;
1339bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1340bf7f4e0aSPeter Brune }
1341bf7f4e0aSPeter Brune 
1342f40b411bSPeter Brune /*@
1343f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
1344f40b411bSPeter Brune 
1345f40b411bSPeter Brune    Input Parameters:
134678bcb3b5SPeter Brune +  linesearch - linesearch context
1347f40b411bSPeter Brune .  xnorm - The norm of the current solution
1348f40b411bSPeter Brune .  fnorm - The norm of the current function
1349f40b411bSPeter Brune -  ynorm - The norm of the current update
1350f40b411bSPeter Brune 
135178bcb3b5SPeter Brune    Level: advanced
1352f40b411bSPeter Brune 
1353f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1354f40b411bSPeter Brune @*/
1355f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
13566a388c36SPeter Brune {
13576a388c36SPeter Brune   PetscFunctionBegin;
1358f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13596a388c36SPeter Brune   linesearch->xnorm = xnorm;
13606a388c36SPeter Brune   linesearch->fnorm = fnorm;
13616a388c36SPeter Brune   linesearch->ynorm = ynorm;
13626a388c36SPeter Brune   PetscFunctionReturn(0);
13636a388c36SPeter Brune }
13646a388c36SPeter Brune 
1365f40b411bSPeter Brune /*@
1366f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
1367f40b411bSPeter Brune 
1368f40b411bSPeter Brune    Input Parameters:
136978bcb3b5SPeter Brune .  linesearch - linesearch context
1370f40b411bSPeter Brune 
1371f40b411bSPeter Brune    Options Database Keys:
13728e557f58SPeter Brune .   -snes_linesearch_norms - turn norm computation on or off
1373f40b411bSPeter Brune 
1374f40b411bSPeter Brune    Level: intermediate
1375f40b411bSPeter Brune 
137678bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms()
1377f40b411bSPeter Brune @*/
1378f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
13796a388c36SPeter Brune {
13806a388c36SPeter Brune   PetscErrorCode ierr;
13819bd66eb0SPeter Brune   SNES           snes;
1382bf388a1fSBarry Smith 
13836a388c36SPeter Brune   PetscFunctionBegin;
13846a388c36SPeter Brune   if (linesearch->norms) {
13859bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1386f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
13879bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13889bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13899bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
13909bd66eb0SPeter Brune     } else {
13916a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
13926a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13936a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13946a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
13956a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
13966a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
13976a388c36SPeter Brune     }
13989bd66eb0SPeter Brune   }
13996a388c36SPeter Brune   PetscFunctionReturn(0);
14006a388c36SPeter Brune }
14016a388c36SPeter Brune 
14026f263ca3SPeter Brune /*@
14036f263ca3SPeter Brune    SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search.
14046f263ca3SPeter Brune 
14056f263ca3SPeter Brune    Input Parameters:
140678bcb3b5SPeter Brune +  linesearch  - linesearch context
140778bcb3b5SPeter Brune -  flg  - indicates whether or not to compute norms
14086f263ca3SPeter Brune 
14096f263ca3SPeter Brune    Options Database Keys:
14101f8196a2SJed Brown .   -snes_linesearch_norms <true> - Turns on/off computation of the norms for basic linesearch
14116f263ca3SPeter Brune 
14126f263ca3SPeter Brune    Notes:
14131f8196a2SJed Brown    This is most relevant to the SNESLINESEARCHBASIC line search type since most line searches have a stopping criteria involving the norm.
14146f263ca3SPeter Brune 
14156f263ca3SPeter Brune    Level: intermediate
14166f263ca3SPeter Brune 
14171a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC
14186f263ca3SPeter Brune @*/
14196f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg)
14206f263ca3SPeter Brune {
14216f263ca3SPeter Brune   PetscFunctionBegin;
14226f263ca3SPeter Brune   linesearch->norms = flg;
14236f263ca3SPeter Brune   PetscFunctionReturn(0);
14246f263ca3SPeter Brune }
14256f263ca3SPeter Brune 
1426f40b411bSPeter Brune /*@
1427f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1428f40b411bSPeter Brune 
1429f899ff85SJose E. Roman    Input Parameter:
143078bcb3b5SPeter Brune .  linesearch - linesearch context
1431f40b411bSPeter Brune 
1432f40b411bSPeter Brune    Output Parameters:
14336232e825SPeter Brune +  X - Solution vector
14346232e825SPeter Brune .  F - Function vector
14356232e825SPeter Brune .  Y - Search direction vector
14366232e825SPeter Brune .  W - Solution work vector
14376232e825SPeter Brune -  G - Function work vector
14386232e825SPeter Brune 
14397bba9028SPeter Brune    Notes:
14407bba9028SPeter Brune    At the beginning of a line search application, X should contain a
14416232e825SPeter Brune    solution and the vector F the function computed at X.  At the end of the
14426232e825SPeter Brune    line search application, X should contain the new solution, and F the
14436232e825SPeter Brune    function evaluated at the new solution.
1444f40b411bSPeter Brune 
14452a7a6963SBarry Smith    These vectors are owned by the SNESLineSearch and should not be destroyed by the caller
14462a7a6963SBarry Smith 
144778bcb3b5SPeter Brune    Level: advanced
1448f40b411bSPeter Brune 
1449f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1450f40b411bSPeter Brune @*/
1451bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G)
1452bf388a1fSBarry Smith {
14536a388c36SPeter Brune   PetscFunctionBegin;
1454f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14556a388c36SPeter Brune   if (X) {
14566a388c36SPeter Brune     PetscValidPointer(X, 2);
14576a388c36SPeter Brune     *X = linesearch->vec_sol;
14586a388c36SPeter Brune   }
14596a388c36SPeter Brune   if (F) {
14606a388c36SPeter Brune     PetscValidPointer(F, 3);
14616a388c36SPeter Brune     *F = linesearch->vec_func;
14626a388c36SPeter Brune   }
14636a388c36SPeter Brune   if (Y) {
14646a388c36SPeter Brune     PetscValidPointer(Y, 4);
14656a388c36SPeter Brune     *Y = linesearch->vec_update;
14666a388c36SPeter Brune   }
14676a388c36SPeter Brune   if (W) {
14686a388c36SPeter Brune     PetscValidPointer(W, 5);
14696a388c36SPeter Brune     *W = linesearch->vec_sol_new;
14706a388c36SPeter Brune   }
14716a388c36SPeter Brune   if (G) {
14726a388c36SPeter Brune     PetscValidPointer(G, 6);
14736a388c36SPeter Brune     *G = linesearch->vec_func_new;
14746a388c36SPeter Brune   }
14756a388c36SPeter Brune   PetscFunctionReturn(0);
14766a388c36SPeter Brune }
14776a388c36SPeter Brune 
1478f40b411bSPeter Brune /*@
1479f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1480f40b411bSPeter Brune 
1481f40b411bSPeter Brune    Input Parameters:
148278bcb3b5SPeter Brune +  linesearch - linesearch context
14836232e825SPeter Brune .  X - Solution vector
14846232e825SPeter Brune .  F - Function vector
14856232e825SPeter Brune .  Y - Search direction vector
14866232e825SPeter Brune .  W - Solution work vector
14876232e825SPeter Brune -  G - Function work vector
1488f40b411bSPeter Brune 
148978bcb3b5SPeter Brune    Level: advanced
1490f40b411bSPeter Brune 
1491f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1492f40b411bSPeter Brune @*/
1493bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G)
1494bf388a1fSBarry Smith {
14956a388c36SPeter Brune   PetscFunctionBegin;
1496f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
14976a388c36SPeter Brune   if (X) {
14986a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
14996a388c36SPeter Brune     linesearch->vec_sol = X;
15006a388c36SPeter Brune   }
15016a388c36SPeter Brune   if (F) {
15026a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
15036a388c36SPeter Brune     linesearch->vec_func = F;
15046a388c36SPeter Brune   }
15056a388c36SPeter Brune   if (Y) {
15066a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
15076a388c36SPeter Brune     linesearch->vec_update = Y;
15086a388c36SPeter Brune   }
15096a388c36SPeter Brune   if (W) {
15106a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
15116a388c36SPeter Brune     linesearch->vec_sol_new = W;
15126a388c36SPeter Brune   }
15136a388c36SPeter Brune   if (G) {
15146a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
15156a388c36SPeter Brune     linesearch->vec_func_new = G;
15166a388c36SPeter Brune   }
15176a388c36SPeter Brune   PetscFunctionReturn(0);
15186a388c36SPeter Brune }
15196a388c36SPeter Brune 
1520e7058c64SPeter Brune /*@C
1521f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1522e7058c64SPeter Brune    SNES options in the database.
1523e7058c64SPeter Brune 
1524cd7522eaSPeter Brune    Logically Collective on SNESLineSearch
1525e7058c64SPeter Brune 
1526e7058c64SPeter Brune    Input Parameters:
1527e7058c64SPeter Brune +  snes - the SNES context
1528e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1529e7058c64SPeter Brune 
1530e7058c64SPeter Brune    Notes:
1531e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1532e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1533e7058c64SPeter Brune 
1534e7058c64SPeter Brune    Level: advanced
1535e7058c64SPeter Brune 
1536e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1537e7058c64SPeter Brune @*/
1538f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1539e7058c64SPeter Brune {
1540e7058c64SPeter Brune   PetscErrorCode ierr;
1541e7058c64SPeter Brune 
1542e7058c64SPeter Brune   PetscFunctionBegin;
1543f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1544e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1545e7058c64SPeter Brune   PetscFunctionReturn(0);
1546e7058c64SPeter Brune }
1547e7058c64SPeter Brune 
1548e7058c64SPeter Brune /*@C
1549f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1550f1c6b773SPeter Brune    SNESLineSearch options in the database.
1551e7058c64SPeter Brune 
1552e7058c64SPeter Brune    Not Collective
1553e7058c64SPeter Brune 
1554e7058c64SPeter Brune    Input Parameter:
1555cd7522eaSPeter Brune .  linesearch - the SNESLineSearch context
1556e7058c64SPeter Brune 
1557e7058c64SPeter Brune    Output Parameter:
1558e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1559e7058c64SPeter Brune 
15608e557f58SPeter Brune    Notes:
15618e557f58SPeter Brune    On the fortran side, the user should pass in a string 'prefix' of
1562e7058c64SPeter Brune    sufficient length to hold the prefix.
1563e7058c64SPeter Brune 
1564e7058c64SPeter Brune    Level: advanced
1565e7058c64SPeter Brune 
1566e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1567e7058c64SPeter Brune @*/
1568f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1569e7058c64SPeter Brune {
1570e7058c64SPeter Brune   PetscErrorCode ierr;
1571e7058c64SPeter Brune 
1572e7058c64SPeter Brune   PetscFunctionBegin;
1573f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1574e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1575e7058c64SPeter Brune   PetscFunctionReturn(0);
1576e7058c64SPeter Brune }
1577bf7f4e0aSPeter Brune 
15788d359177SBarry Smith /*@C
1579fa0ddf94SBarry Smith    SNESLineSearchSetWorkVecs - Gets work vectors for the line search.
1580f40b411bSPeter Brune 
1581d8d19677SJose E. Roman    Input Parameters:
1582f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1583f40b411bSPeter Brune -  nwork - the number of work vectors
1584f40b411bSPeter Brune 
1585f40b411bSPeter Brune    Level: developer
1586f40b411bSPeter Brune 
1587fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs()
1588f40b411bSPeter Brune @*/
1589fa0ddf94SBarry Smith PetscErrorCode  SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork)
1590bf7f4e0aSPeter Brune {
1591bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1592bf388a1fSBarry Smith 
1593bf7f4e0aSPeter Brune   PetscFunctionBegin;
1594bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1595bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
15968d359177SBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1597bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1598bf7f4e0aSPeter Brune }
1599bf7f4e0aSPeter Brune 
1600f40b411bSPeter Brune /*@
1601422a814eSBarry Smith    SNESLineSearchGetReason - Gets the success/failure status of the last line search application
1602f40b411bSPeter Brune 
1603f40b411bSPeter Brune    Input Parameters:
160478bcb3b5SPeter Brune .  linesearch - linesearch context
1605f40b411bSPeter Brune 
1606f40b411bSPeter Brune    Output Parameters:
1607422a814eSBarry Smith .  result - The success or failure status
1608f40b411bSPeter Brune 
1609cd7522eaSPeter Brune    Notes:
1610c98378a5SBarry Smith    This is typically called after SNESLineSearchApply() in order to determine if the line-search failed
1611cd7522eaSPeter Brune    (and set the SNES convergence accordingly).
1612cd7522eaSPeter Brune 
1613f40b411bSPeter Brune    Level: intermediate
1614f40b411bSPeter Brune 
1615422a814eSBarry Smith .seealso: SNESLineSearchSetReason(), SNESLineSearchReason
1616f40b411bSPeter Brune @*/
1617422a814eSBarry Smith PetscErrorCode  SNESLineSearchGetReason(SNESLineSearch linesearch, SNESLineSearchReason *result)
1618bf7f4e0aSPeter Brune {
1619bf7f4e0aSPeter Brune   PetscFunctionBegin;
1620f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1621422a814eSBarry Smith   PetscValidPointer(result, 2);
1622422a814eSBarry Smith   *result = linesearch->result;
1623bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1624bf7f4e0aSPeter Brune }
1625bf7f4e0aSPeter Brune 
1626f40b411bSPeter Brune /*@
1627422a814eSBarry Smith    SNESLineSearchSetReason - Sets the success/failure status of the last line search application
1628f40b411bSPeter Brune 
1629f40b411bSPeter Brune    Input Parameters:
163078bcb3b5SPeter Brune +  linesearch - linesearch context
1631422a814eSBarry Smith -  result - The success or failure status
1632f40b411bSPeter Brune 
1633cd7522eaSPeter Brune    Notes:
1634cd7522eaSPeter Brune    This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set
1635cd7522eaSPeter Brune    the success or failure of the line search method.
1636cd7522eaSPeter Brune 
163778bcb3b5SPeter Brune    Level: developer
1638f40b411bSPeter Brune 
1639422a814eSBarry Smith .seealso: SNESLineSearchGetSResult()
1640f40b411bSPeter Brune @*/
1641422a814eSBarry Smith PetscErrorCode  SNESLineSearchSetReason(SNESLineSearch linesearch, SNESLineSearchReason result)
16426a388c36SPeter Brune {
16436a388c36SPeter Brune   PetscFunctionBegin;
16445fd66863SKarl Rupp   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1645422a814eSBarry Smith   linesearch->result = result;
16466a388c36SPeter Brune   PetscFunctionReturn(0);
16476a388c36SPeter Brune }
16486a388c36SPeter Brune 
16499bd66eb0SPeter Brune /*@C
1650f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
16519bd66eb0SPeter Brune 
16529bd66eb0SPeter Brune    Input Parameters:
16539bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
16549bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
16559bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
16569bd66eb0SPeter Brune 
16579bd66eb0SPeter Brune    Logically Collective on SNES
16589bd66eb0SPeter Brune 
16599bd66eb0SPeter Brune    Calling sequence of projectfunc:
16609bd66eb0SPeter Brune .vb
16619bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
16629bd66eb0SPeter Brune .ve
16639bd66eb0SPeter Brune 
16649bd66eb0SPeter Brune     Input parameters for projectfunc:
16659bd66eb0SPeter Brune +   snes - nonlinear context
16669bd66eb0SPeter Brune -   X - current solution
16679bd66eb0SPeter Brune 
1668cd7522eaSPeter Brune     Output parameters for projectfunc:
16699bd66eb0SPeter Brune .   X - Projected solution
16709bd66eb0SPeter Brune 
16719bd66eb0SPeter Brune    Calling sequence of normfunc:
16729bd66eb0SPeter Brune .vb
16739bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
16749bd66eb0SPeter Brune .ve
16759bd66eb0SPeter Brune 
1676cd7522eaSPeter Brune     Input parameters for normfunc:
16779bd66eb0SPeter Brune +   snes - nonlinear context
16789bd66eb0SPeter Brune .   X - current solution
16799bd66eb0SPeter Brune -   F - current residual
16809bd66eb0SPeter Brune 
1681cd7522eaSPeter Brune     Output parameters for normfunc:
16829bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
16839bd66eb0SPeter Brune 
1684cd7522eaSPeter Brune     Notes:
1685cd7522eaSPeter Brune     The VI solvers require projection of the solution to the feasible set.  projectfunc should implement this.
1686cd7522eaSPeter Brune 
1687cd7522eaSPeter Brune     The VI solvers require special evaluation of the function norm such that the norm is only calculated
1688cd7522eaSPeter Brune     on the inactive set.  This should be implemented by normfunc.
16899bd66eb0SPeter Brune 
16909bd66eb0SPeter Brune     Level: developer
16919bd66eb0SPeter Brune 
1692f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
16939bd66eb0SPeter Brune @*/
169425acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
16959bd66eb0SPeter Brune {
16969bd66eb0SPeter Brune   PetscFunctionBegin;
1697f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
16989bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
16999bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
17009bd66eb0SPeter Brune   PetscFunctionReturn(0);
17019bd66eb0SPeter Brune }
17029bd66eb0SPeter Brune 
17039bd66eb0SPeter Brune /*@C
1704f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
17059bd66eb0SPeter Brune 
1706f899ff85SJose E. Roman    Input Parameter:
1707907376e6SBarry Smith .  linesearch - the line search context, obtain with SNESGetLineSearch()
17089bd66eb0SPeter Brune 
17099bd66eb0SPeter Brune    Output Parameters:
17109bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
17119bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
17129bd66eb0SPeter Brune 
17139bd66eb0SPeter Brune    Logically Collective on SNES
17149bd66eb0SPeter Brune 
17159bd66eb0SPeter Brune     Level: developer
17169bd66eb0SPeter Brune 
1717f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
17189bd66eb0SPeter Brune @*/
171925acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
17209bd66eb0SPeter Brune {
17219bd66eb0SPeter Brune   PetscFunctionBegin;
17229bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
17239bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
17249bd66eb0SPeter Brune   PetscFunctionReturn(0);
17259bd66eb0SPeter Brune }
17269bd66eb0SPeter Brune 
1727bf7f4e0aSPeter Brune /*@C
17281c84c290SBarry Smith   SNESLineSearchRegister - See SNESLineSearchRegister()
1729bf7f4e0aSPeter Brune 
1730bf7f4e0aSPeter Brune   Level: advanced
1731bf7f4e0aSPeter Brune @*/
1732bdf89e91SBarry Smith PetscErrorCode  SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch))
1733bf7f4e0aSPeter Brune {
1734bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1735bf7f4e0aSPeter Brune 
1736bf7f4e0aSPeter Brune   PetscFunctionBegin;
17371d36bdfdSBarry Smith   ierr = SNESInitializePackage();CHKERRQ(ierr);
1738a240a19fSJed Brown   ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr);
1739bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1740bf7f4e0aSPeter Brune }
1741