xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 68fb48e8a37a6974ab643917b34b701ac5abf1e9)
19e764e56SPeter Brune #include <private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
3f1c6b773SPeter Brune PetscBool  SNESLineSearchRegisterAllCalled = PETSC_FALSE;
4f1c6b773SPeter Brune PetscFList SNESLineSearchList              = PETSC_NULL;
5bf7f4e0aSPeter Brune 
6f1c6b773SPeter Brune PetscClassId   SNESLINESEARCH_CLASSID;
7f1c6b773SPeter Brune PetscLogEvent  SNESLineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
10f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate"
11f40b411bSPeter Brune /*@
12f1c6b773SPeter Brune    SNESLineSearchCreate - Creates the line search.
13f40b411bSPeter Brune 
14f40b411bSPeter Brune    Collective on LineSearch
15f40b411bSPeter Brune 
16f40b411bSPeter Brune    Input Parameters:
17f40b411bSPeter Brune .  comm - MPI communicator for the line search
18f40b411bSPeter Brune 
19f40b411bSPeter Brune    Output Parameters:
20f40b411bSPeter Brune .  outlinesearch - the line search instance.
21f40b411bSPeter Brune 
22f40b411bSPeter Brune    Level: Beginner
23f40b411bSPeter Brune 
24f40b411bSPeter Brune    .keywords: LineSearch, Create
25f40b411bSPeter Brune 
26f40b411bSPeter Brune    .seealso: LineSearchDestroy()
27f40b411bSPeter Brune @*/
28f40b411bSPeter Brune 
29f1c6b773SPeter Brune PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch) {
30bf7f4e0aSPeter Brune   PetscErrorCode      ierr;
31f1c6b773SPeter Brune   SNESLineSearch     linesearch;
32bf7f4e0aSPeter Brune   PetscFunctionBegin;
33ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
34ea5d4fccSPeter Brune   *outlinesearch = PETSC_NULL;
35f1c6b773SPeter Brune   ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, 0,
36f1c6b773SPeter Brune                            "SNESLineSearch","Line-search method","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr);
37bf7f4e0aSPeter Brune 
38bf7f4e0aSPeter Brune   linesearch->ops->precheckstep = PETSC_NULL;
39bf7f4e0aSPeter Brune   linesearch->ops->postcheckstep = PETSC_NULL;
40bf7f4e0aSPeter Brune 
419bd66eb0SPeter Brune   linesearch->vec_sol_new   = PETSC_NULL;
429bd66eb0SPeter Brune   linesearch->vec_func_new  = PETSC_NULL;
439bd66eb0SPeter Brune   linesearch->vec_sol       = PETSC_NULL;
449bd66eb0SPeter Brune   linesearch->vec_func      = PETSC_NULL;
459bd66eb0SPeter Brune   linesearch->vec_update    = PETSC_NULL;
469bd66eb0SPeter Brune 
47bf7f4e0aSPeter Brune   linesearch->lambda        = 1.0;
48bf7f4e0aSPeter Brune   linesearch->fnorm         = 1.0;
49bf7f4e0aSPeter Brune   linesearch->ynorm         = 1.0;
50bf7f4e0aSPeter Brune   linesearch->xnorm         = 1.0;
51bf7f4e0aSPeter Brune   linesearch->success       = PETSC_TRUE;
52bf7f4e0aSPeter Brune   linesearch->norms         = PETSC_TRUE;
53bf7f4e0aSPeter Brune   linesearch->keeplambda    = PETSC_FALSE;
54bf7f4e0aSPeter Brune   linesearch->damping       = 1.0;
55bf7f4e0aSPeter Brune   linesearch->maxstep       = 1e8;
56bf7f4e0aSPeter Brune   linesearch->steptol       = 1e-12;
57516fe3c3SPeter Brune   linesearch->rtol          = 1e-8;
58516fe3c3SPeter Brune   linesearch->atol          = 1e-15;
59516fe3c3SPeter Brune   linesearch->ltol          = 1e-8;
60bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
61bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
62516fe3c3SPeter Brune   linesearch->max_its       = 3;
63bf7f4e0aSPeter Brune   linesearch->setupcalled   = PETSC_FALSE;
64bf7f4e0aSPeter Brune   *outlinesearch            = linesearch;
65bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
66bf7f4e0aSPeter Brune }
67bf7f4e0aSPeter Brune 
68bf7f4e0aSPeter Brune #undef __FUNCT__
69f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp"
70f40b411bSPeter Brune /*@
71f1c6b773SPeter Brune    SNESLineSearchSetUp - Prepares the line search for being applied.
72f40b411bSPeter Brune 
73f40b411bSPeter Brune    Collective on LineSearch
74f40b411bSPeter Brune 
75f40b411bSPeter Brune    Input Parameters:
76f40b411bSPeter Brune .  linesearch - The LineSearch instance.
77f40b411bSPeter Brune 
78f40b411bSPeter Brune    Level: Intermediate
79f40b411bSPeter Brune 
80f1c6b773SPeter Brune    .keywords: SNESLineSearch, SetUp
81f40b411bSPeter Brune 
82f1c6b773SPeter Brune    .seealso: SNESLineSearchReset()
83f40b411bSPeter Brune @*/
84f40b411bSPeter Brune 
85f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) {
86bf7f4e0aSPeter Brune   PetscErrorCode ierr;
87bf7f4e0aSPeter Brune   PetscFunctionBegin;
88bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
89f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,SNES_LINESEARCH_BASIC);CHKERRQ(ierr);
90bf7f4e0aSPeter Brune   }
91bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
929bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
93bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
949bd66eb0SPeter Brune     }
959bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
969bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
979bd66eb0SPeter Brune     }
98bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
99bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
100bf7f4e0aSPeter Brune     }
101bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping;
102bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
103bf7f4e0aSPeter Brune   }
104bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
105bf7f4e0aSPeter Brune }
106bf7f4e0aSPeter Brune 
107bf7f4e0aSPeter Brune #undef __FUNCT__
108f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset"
109f40b411bSPeter Brune 
110f40b411bSPeter Brune /*@
111f1c6b773SPeter Brune    SNESLineSearchReset - Tears down the structures required for application
112f40b411bSPeter Brune 
113f1c6b773SPeter Brune    Collective on SNESLineSearch
114f40b411bSPeter Brune 
115f40b411bSPeter Brune    Input Parameters:
116f40b411bSPeter Brune .  linesearch - The LineSearch instance.
117f40b411bSPeter Brune 
118f40b411bSPeter Brune    Level: Intermediate
119f40b411bSPeter Brune 
120f1c6b773SPeter Brune    .keywords: SNESLineSearch, Create
121f40b411bSPeter Brune 
122f1c6b773SPeter Brune    .seealso: SNESLineSearchSetUp()
123f40b411bSPeter Brune @*/
124f40b411bSPeter Brune 
125f1c6b773SPeter Brune PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) {
126bf7f4e0aSPeter Brune   PetscErrorCode ierr;
127bf7f4e0aSPeter Brune   PetscFunctionBegin;
128bf7f4e0aSPeter Brune   if (linesearch->ops->reset) {
129bf7f4e0aSPeter Brune     (*linesearch->ops->reset)(linesearch);
130bf7f4e0aSPeter Brune   }
131bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
132bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
133bf7f4e0aSPeter Brune 
134bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
135bf7f4e0aSPeter Brune   linesearch->nwork = 0;
136bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
137bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
138bf7f4e0aSPeter Brune }
139bf7f4e0aSPeter Brune 
14086d74e61SPeter Brune 
14186d74e61SPeter Brune #undef __FUNCT__
142f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck"
14386d74e61SPeter Brune /*@C
144f1c6b773SPeter Brune    SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
14586d74e61SPeter Brune 
146f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
14786d74e61SPeter Brune 
14886d74e61SPeter Brune    Input Parameters:
149f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
15086d74e61SPeter Brune .  func       - [optional] function evaluation routine
15186d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
15286d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
15386d74e61SPeter Brune 
15486d74e61SPeter Brune    Calling sequence of func:
155f1c6b773SPeter Brune $    func (SNESLineSearch snes,Vec x,Vec y, PetscBool *changed);
15686d74e61SPeter Brune 
15786d74e61SPeter Brune +  x - solution vector
15886d74e61SPeter Brune .  y - search direction vector
15986d74e61SPeter Brune -  changed - flag to indicate the precheck changed something.
16086d74e61SPeter Brune 
16186d74e61SPeter Brune    Level: intermediate
16286d74e61SPeter Brune 
16386d74e61SPeter Brune .keywords: set, linesearch, pre-check
16486d74e61SPeter Brune 
165f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck()
16686d74e61SPeter Brune @*/
167f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetPreCheck(SNESLineSearch linesearch, SNESLineSearchPreCheckFunc func,void *ctx)
16886d74e61SPeter Brune {
1699bd66eb0SPeter Brune   PetscFunctionBegin;
170f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
17186d74e61SPeter Brune   if (func) linesearch->ops->precheckstep = func;
17286d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
17386d74e61SPeter Brune   PetscFunctionReturn(0);
17486d74e61SPeter Brune }
17586d74e61SPeter Brune 
17686d74e61SPeter Brune 
17786d74e61SPeter Brune #undef __FUNCT__
178f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck"
17986d74e61SPeter Brune /*@C
180f1c6b773SPeter Brune    SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
18186d74e61SPeter Brune 
18286d74e61SPeter Brune    Input Parameters:
183f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
18486d74e61SPeter Brune 
18586d74e61SPeter Brune    Output Parameters:
18686d74e61SPeter Brune +  func       - [optional] function evaluation routine
18786d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
18886d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
18986d74e61SPeter Brune 
19086d74e61SPeter Brune    Level: intermediate
19186d74e61SPeter Brune 
19286d74e61SPeter Brune .keywords: get, linesearch, pre-check
19386d74e61SPeter Brune 
194f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck()
19586d74e61SPeter Brune @*/
196f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetPreCheck(SNESLineSearch linesearch, SNESLineSearchPreCheckFunc *func,void **ctx)
19786d74e61SPeter Brune {
1989bd66eb0SPeter Brune   PetscFunctionBegin;
199f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
20086d74e61SPeter Brune   if (func) *func = linesearch->ops->precheckstep;
20186d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
20286d74e61SPeter Brune   PetscFunctionReturn(0);
20386d74e61SPeter Brune }
20486d74e61SPeter Brune 
20586d74e61SPeter Brune 
20686d74e61SPeter Brune #undef __FUNCT__
207f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck"
20886d74e61SPeter Brune /*@C
209f1c6b773SPeter Brune    SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine.
21086d74e61SPeter Brune 
211f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
21286d74e61SPeter Brune 
21386d74e61SPeter Brune    Input Parameters:
214f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
21586d74e61SPeter Brune .  func       - [optional] function evaluation routine
21686d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
21786d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
21886d74e61SPeter Brune 
21986d74e61SPeter Brune    Calling sequence of func:
220f1c6b773SPeter Brune $    func (SNESLineSearch linesearch,Vec x, Vec w, Vec y, PetscBool *changed_w, *changed_y);
22186d74e61SPeter Brune 
22286d74e61SPeter Brune +  x - old solution vector
22386d74e61SPeter Brune .  y - search direction vector
22486d74e61SPeter Brune .  w - new solution vector
22586d74e61SPeter Brune .  changed_y - indicates that the line search changed y.
22686d74e61SPeter Brune .  changed_w - indicates that the line search changed w.
22786d74e61SPeter Brune 
22886d74e61SPeter Brune    Level: intermediate
22986d74e61SPeter Brune 
23086d74e61SPeter Brune .keywords: set, linesearch, post-check
23186d74e61SPeter Brune 
232f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck()
23386d74e61SPeter Brune @*/
234f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetPostCheck(SNESLineSearch linesearch, SNESLineSearchPostCheckFunc func,void *ctx)
23586d74e61SPeter Brune {
23686d74e61SPeter Brune   PetscFunctionBegin;
237f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
23886d74e61SPeter Brune   if (func) linesearch->ops->postcheckstep = func;
23986d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
24086d74e61SPeter Brune   PetscFunctionReturn(0);
24186d74e61SPeter Brune }
24286d74e61SPeter Brune 
24386d74e61SPeter Brune 
24486d74e61SPeter Brune #undef __FUNCT__
245f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck"
24686d74e61SPeter Brune /*@C
247f1c6b773SPeter Brune    SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine.
24886d74e61SPeter Brune 
24986d74e61SPeter Brune    Input Parameters:
250f1c6b773SPeter Brune .  linesearch - the SNESLineSearch context
25186d74e61SPeter Brune 
25286d74e61SPeter Brune    Output Parameters:
25386d74e61SPeter Brune +  func       - [optional] function evaluation routine
25486d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
25586d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
25686d74e61SPeter Brune 
25786d74e61SPeter Brune    Level: intermediate
25886d74e61SPeter Brune 
25986d74e61SPeter Brune .keywords: get, linesearch, post-check
26086d74e61SPeter Brune 
261f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck()
26286d74e61SPeter Brune @*/
263f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetPostCheck(SNESLineSearch linesearch, SNESLineSearchPostCheckFunc *func,void **ctx)
26486d74e61SPeter Brune {
2659bd66eb0SPeter Brune   PetscFunctionBegin;
266f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
26786d74e61SPeter Brune   if (func) *func = linesearch->ops->postcheckstep;
26886d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
26986d74e61SPeter Brune   PetscFunctionReturn(0);
27086d74e61SPeter Brune }
27186d74e61SPeter Brune 
27286d74e61SPeter Brune 
273bf7f4e0aSPeter Brune #undef __FUNCT__
274f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck"
275f40b411bSPeter Brune /*@
276f1c6b773SPeter Brune    SNESLineSearchPreCheck - Prepares the line search for being applied.
277f40b411bSPeter Brune 
278f1c6b773SPeter Brune    Collective on SNESLineSearch
279f40b411bSPeter Brune 
280f40b411bSPeter Brune    Input Parameters:
281f40b411bSPeter Brune .  linesearch - The linesearch instance.
282f40b411bSPeter Brune 
283f40b411bSPeter Brune    Output Parameters:
284f40b411bSPeter Brune .  changed - Indicator if the pre-check has changed anything.
285f40b411bSPeter Brune 
286f40b411bSPeter Brune    Level: Beginner
287f40b411bSPeter Brune 
288f1c6b773SPeter Brune    .keywords: SNESLineSearch, Create
289f40b411bSPeter Brune 
290f1c6b773SPeter Brune    .seealso: SNESLineSearchPostCheck()
291f40b411bSPeter Brune @*/
292f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch, PetscBool * changed)
293bf7f4e0aSPeter Brune {
294bf7f4e0aSPeter Brune   PetscErrorCode ierr;
295bf7f4e0aSPeter Brune   PetscFunctionBegin;
296bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
297bf7f4e0aSPeter Brune   if (linesearch->ops->precheckstep) {
298c87759e9SPeter Brune     ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed, linesearch->precheckctx);CHKERRQ(ierr);
299bf7f4e0aSPeter Brune   }
300bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
301bf7f4e0aSPeter Brune }
302bf7f4e0aSPeter Brune 
303bf7f4e0aSPeter Brune #undef __FUNCT__
304f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck"
305f40b411bSPeter Brune /*@
306f1c6b773SPeter Brune    SNESLineSearchPostCheck - Prepares the line search for being applied.
307f40b411bSPeter Brune 
308f1c6b773SPeter Brune    Collective on SNESLineSearch
309f40b411bSPeter Brune 
310f40b411bSPeter Brune    Input Parameters:
311f40b411bSPeter Brune .  linesearch - The linesearch instance.
312f40b411bSPeter Brune 
313f40b411bSPeter Brune    Output Parameters:
314*68fb48e8SJed Brown +  changed_Y - Indicator if the direction has been changed.
315*68fb48e8SJed Brown -  changed_W - Indicator if the solution has been changed.
316f40b411bSPeter Brune 
317f40b411bSPeter Brune    Level: Intermediate
318f40b411bSPeter Brune 
319f1c6b773SPeter Brune    .keywords: SNESLineSearch, Create
320f40b411bSPeter Brune 
321f1c6b773SPeter Brune    .seealso: SNESLineSearchPreCheck()
322f40b411bSPeter Brune @*/
323f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch, PetscBool * changed_Y, PetscBool * changed_W)
324bf7f4e0aSPeter Brune {
325bf7f4e0aSPeter Brune   PetscErrorCode ierr;
326bf7f4e0aSPeter Brune   PetscFunctionBegin;
327bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
328bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
329bf7f4e0aSPeter Brune   if (linesearch->ops->postcheckstep) {
330c87759e9SPeter Brune     ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, linesearch->vec_sol_new, changed_Y, changed_W, linesearch->postcheckctx);CHKERRQ(ierr);
33186d74e61SPeter Brune   }
33286d74e61SPeter Brune   PetscFunctionReturn(0);
33386d74e61SPeter Brune }
33486d74e61SPeter Brune 
33586d74e61SPeter Brune 
33686d74e61SPeter Brune #undef __FUNCT__
337f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard"
33886d74e61SPeter Brune /*@C
33986d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
34086d74e61SPeter Brune 
34186d74e61SPeter Brune    Logically Collective
34286d74e61SPeter Brune 
34386d74e61SPeter Brune    Input Arguments:
34486d74e61SPeter Brune +  linesearch - linesearch context
34586d74e61SPeter Brune .  X - base state for this step
34686d74e61SPeter Brune .  Y - initial correction
34786d74e61SPeter Brune 
34886d74e61SPeter Brune    Output Arguments:
34986d74e61SPeter Brune +  Y - correction, possibly modified
35086d74e61SPeter Brune -  changed - flag indicating that Y was modified
35186d74e61SPeter Brune 
35286d74e61SPeter Brune    Options Database Key:
35386d74e61SPeter Brune +  -snes_ls_precheck_picard - activate this routine
35486d74e61SPeter Brune -  -snes_ls_precheck_picard_angle - angle
35586d74e61SPeter Brune 
35686d74e61SPeter Brune    Level: advanced
35786d74e61SPeter Brune 
35886d74e61SPeter Brune    Notes:
35986d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
36086d74e61SPeter Brune 
36186d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
36286d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
36386d74e61SPeter Brune    is generally not useful when using a Newton linearization.
36486d74e61SPeter Brune 
36586d74e61SPeter Brune    Reference:
36686d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
36786d74e61SPeter Brune 
36886d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
36986d74e61SPeter Brune @*/
370f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx)
37186d74e61SPeter Brune {
37286d74e61SPeter Brune   PetscErrorCode ierr;
37386d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
37486d74e61SPeter Brune   Vec            Ylast;
37586d74e61SPeter Brune   PetscScalar    dot;
376c87759e9SPeter Brune 
37786d74e61SPeter Brune   PetscInt       iter;
37886d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
37986d74e61SPeter Brune   SNES           snes;
38086d74e61SPeter Brune 
38186d74e61SPeter Brune   PetscFunctionBegin;
382f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
38386d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
38486d74e61SPeter Brune   if (!Ylast) {
38586d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
38686d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
38786d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
38886d74e61SPeter Brune   }
38986d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
39086d74e61SPeter Brune   if (iter < 2) {
39186d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
39286d74e61SPeter Brune     *changed = PETSC_FALSE;
39386d74e61SPeter Brune     PetscFunctionReturn(0);
39486d74e61SPeter Brune   }
39586d74e61SPeter Brune 
39686d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
39786d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
39886d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
39986d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
40086d74e61SPeter Brune   theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
40186d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
40286d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
40386d74e61SPeter Brune     /* Modify the step Y */
40486d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
40586d74e61SPeter Brune     ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
40686d74e61SPeter Brune     ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
40786d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
40886d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
40986d74e61SPeter Brune     ierr = VecScale(Y,alpha);CHKERRQ(ierr);
41086d74e61SPeter Brune     ierr = PetscInfo3(snes,"Angle %G degrees less than threshold %G, corrected step by alpha=%G\n",theta*180./PETSC_PI,angle,alpha);CHKERRQ(ierr);
41186d74e61SPeter Brune   } else {
41286d74e61SPeter Brune     ierr = PetscInfo2(snes,"Angle %G degrees exceeds threshold %G, no correction applied\n",theta*180./PETSC_PI,angle);CHKERRQ(ierr);
41386d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
41486d74e61SPeter Brune     *changed = PETSC_FALSE;
415bf7f4e0aSPeter Brune   }
416bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
417bf7f4e0aSPeter Brune }
418bf7f4e0aSPeter Brune 
419bf7f4e0aSPeter Brune #undef __FUNCT__
420f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply"
421f40b411bSPeter Brune /*@
422f1c6b773SPeter Brune    SNESLineSearchApply - Computes the line-search update
423f40b411bSPeter Brune 
424f1c6b773SPeter Brune    Collective on SNESLineSearch
425f40b411bSPeter Brune 
426f40b411bSPeter Brune    Input Parameters:
427f40b411bSPeter Brune +  linesearch - The linesearch instance.
428f40b411bSPeter Brune .  X - The current solution.
429f40b411bSPeter Brune .  F - The current function.
430f40b411bSPeter Brune .  fnorm - The current norm.
431f40b411bSPeter Brune .  Y - The search direction.
432f40b411bSPeter Brune 
433f40b411bSPeter Brune    Output Parameters:
434f40b411bSPeter Brune +  X - The new solution.
435f40b411bSPeter Brune .  F - The new function.
436f40b411bSPeter Brune -  fnorm - The new function norm.
437f40b411bSPeter Brune 
438f40b411bSPeter Brune    Level: Intermediate
439f40b411bSPeter Brune 
440f1c6b773SPeter Brune    .keywords: SNESLineSearch, Create
441f40b411bSPeter Brune 
442f1c6b773SPeter Brune    .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck()
443f40b411bSPeter Brune @*/
444f1c6b773SPeter Brune PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
445bf7f4e0aSPeter Brune   PetscErrorCode ierr;
446bf7f4e0aSPeter Brune   PetscFunctionBegin;
447bf7f4e0aSPeter Brune 
448bf7f4e0aSPeter Brune   /* check the pointers */
449f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
450bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
451bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
452bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
453bf7f4e0aSPeter Brune 
454bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
455bf7f4e0aSPeter Brune 
456bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
457bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
458bf7f4e0aSPeter Brune   linesearch->vec_func = F;
459bf7f4e0aSPeter Brune 
460f1c6b773SPeter Brune   ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr);
461bf7f4e0aSPeter Brune 
462bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
463bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
464bf7f4e0aSPeter Brune 
465bf7f4e0aSPeter Brune   if (fnorm) {
466bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
467bf7f4e0aSPeter Brune   } else {
468bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
469bf7f4e0aSPeter Brune   }
470bf7f4e0aSPeter Brune 
471f1c6b773SPeter Brune   ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
472bf7f4e0aSPeter Brune 
473bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
474bf7f4e0aSPeter Brune 
475f1c6b773SPeter Brune   ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
476bf7f4e0aSPeter Brune 
477bf7f4e0aSPeter Brune   if (fnorm)
478bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
479bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
480bf7f4e0aSPeter Brune }
481bf7f4e0aSPeter Brune 
482bf7f4e0aSPeter Brune #undef __FUNCT__
483f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy"
484f40b411bSPeter Brune /*@
485f1c6b773SPeter Brune    SNESLineSearchDestroy - Destroys the line search instance.
486f40b411bSPeter Brune 
487f1c6b773SPeter Brune    Collective on SNESLineSearch
488f40b411bSPeter Brune 
489f40b411bSPeter Brune    Input Parameters:
490f40b411bSPeter Brune .  linesearch - The linesearch instance.
491f40b411bSPeter Brune 
492f40b411bSPeter Brune    Level: Intermediate
493f40b411bSPeter Brune 
494f1c6b773SPeter Brune    .keywords: SNESLineSearch, Create
495f40b411bSPeter Brune 
496f1c6b773SPeter Brune    .seealso: SNESLineSearchCreate(), SNESLineSearchReset()
497f40b411bSPeter Brune @*/
498f1c6b773SPeter Brune PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) {
499bf7f4e0aSPeter Brune   PetscErrorCode ierr;
500bf7f4e0aSPeter Brune   PetscFunctionBegin;
501bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
502f1c6b773SPeter Brune   PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1);
503bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
504bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
505f1c6b773SPeter Brune   ierr = SNESLineSearchReset(*linesearch);
506bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
507bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
508bf7f4e0aSPeter Brune   }
509bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
510e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
511bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
512bf7f4e0aSPeter Brune }
513bf7f4e0aSPeter Brune 
514bf7f4e0aSPeter Brune #undef __FUNCT__
515f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor"
516f40b411bSPeter Brune /*@
517f1c6b773SPeter Brune    SNESLineSearchSetMonitor - Turns on/off printing useful things about the line search.
518bf7f4e0aSPeter Brune 
519bf7f4e0aSPeter Brune    Input Parameters:
520bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
521bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
522bf7f4e0aSPeter Brune 
523bf7f4e0aSPeter Brune    Logically Collective on SNES
524bf7f4e0aSPeter Brune 
525bf7f4e0aSPeter Brune    Options Database:
526f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
527bf7f4e0aSPeter Brune 
528bf7f4e0aSPeter Brune    Level: intermediate
529bf7f4e0aSPeter Brune 
530bf7f4e0aSPeter Brune 
531f1c6b773SPeter Brune .seealso: SNESLineSearchGetMonitor()
532bf7f4e0aSPeter Brune @*/
533f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg)
534bf7f4e0aSPeter Brune {
535bf7f4e0aSPeter Brune 
536bf7f4e0aSPeter Brune   PetscErrorCode ierr;
537bf7f4e0aSPeter Brune   PetscFunctionBegin;
538bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
539bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
540bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
541bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
542bf7f4e0aSPeter Brune   }
543bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
544bf7f4e0aSPeter Brune }
545bf7f4e0aSPeter Brune 
546bf7f4e0aSPeter Brune #undef __FUNCT__
547f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor"
548f40b411bSPeter Brune /*@
549f1c6b773SPeter Brune    SNESLineSearchGetMonitor - Gets the monitor instance for the line search
5506a388c36SPeter Brune 
551f40b411bSPeter Brune    Input Parameters:
552f40b411bSPeter Brune .  linesearch - linesearch context.
553f40b411bSPeter Brune 
554f40b411bSPeter Brune    Input Parameters:
555f40b411bSPeter Brune .  monitor - monitor context.
556f40b411bSPeter Brune 
557f40b411bSPeter Brune    Logically Collective on SNES
558f40b411bSPeter Brune 
559f40b411bSPeter Brune 
560f40b411bSPeter Brune    Options Database Keys:
561f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
562f40b411bSPeter Brune 
563f40b411bSPeter Brune    Level: intermediate
564f40b411bSPeter Brune 
565f40b411bSPeter Brune 
566f1c6b773SPeter Brune .seealso: SNESLineSearchSetMonitor()
567f40b411bSPeter Brune @*/
568f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor)
5696a388c36SPeter Brune {
5706a388c36SPeter Brune 
5716a388c36SPeter Brune   PetscFunctionBegin;
572f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
5736a388c36SPeter Brune   if (monitor) {
5746a388c36SPeter Brune     PetscValidPointer(monitor, 2);
5756a388c36SPeter Brune     *monitor = linesearch->monitor;
5766a388c36SPeter Brune   }
5776a388c36SPeter Brune   PetscFunctionReturn(0);
5786a388c36SPeter Brune }
5796a388c36SPeter Brune 
5806a388c36SPeter Brune #undef __FUNCT__
581f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions"
582f40b411bSPeter Brune /*@
583f1c6b773SPeter Brune    SNESLineSearchSetFromOptions - Sets options for the line search
584f40b411bSPeter Brune 
585f40b411bSPeter Brune    Input Parameters:
586f40b411bSPeter Brune .  linesearch - linesearch context.
587f40b411bSPeter Brune 
588f40b411bSPeter Brune    Options Database Keys:
589f40b411bSPeter Brune + -linesearch_type - The Line search method
590f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches
591f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter.
592f40b411bSPeter Brune . -linesearch_norms   - Turn on/off the linesearch norms
593f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess.
594f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches.
595f40b411bSPeter Brune 
596f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
597f40b411bSPeter Brune 
598f40b411bSPeter Brune    Level: intermediate
599f40b411bSPeter Brune 
600f40b411bSPeter Brune 
601f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
602f40b411bSPeter Brune @*/
603f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch) {
604bf7f4e0aSPeter Brune   PetscErrorCode ierr;
605f1c6b773SPeter Brune   const char     *deft = SNES_LINESEARCH_BASIC;
606bf7f4e0aSPeter Brune   char           type[256];
607bf7f4e0aSPeter Brune   PetscBool      flg, set;
608bf7f4e0aSPeter Brune   PetscFunctionBegin;
609f1c6b773SPeter Brune   if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
610bf7f4e0aSPeter Brune 
611bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
612bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
613bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
614bf7f4e0aSPeter Brune   }
615f1c6b773SPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
616bf7f4e0aSPeter Brune   if (flg) {
617f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr);
618bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
619f1c6b773SPeter Brune     ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
620bf7f4e0aSPeter Brune   }
621bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
622bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
623bf7f4e0aSPeter Brune   }
624bf7f4e0aSPeter Brune 
625f1c6b773SPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",
626bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
627f1c6b773SPeter Brune   if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
628bf7f4e0aSPeter Brune 
629f1c6b773SPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
630f1c6b773SPeter Brune   ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","SNESLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
631f1c6b773SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
632f1c6b773SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
633bf7f4e0aSPeter Brune   ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
634bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
635bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
636bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
637bf7f4e0aSPeter Brune }
638bf7f4e0aSPeter Brune 
639bf7f4e0aSPeter Brune #undef __FUNCT__
640f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView"
641f40b411bSPeter Brune /*@
642f1c6b773SPeter Brune    SNESLineSearchView - Views useful information for the line search.
643f40b411bSPeter Brune 
644f40b411bSPeter Brune    Input Parameters:
645f40b411bSPeter Brune .  linesearch - linesearch context.
646f40b411bSPeter Brune 
647f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
648f40b411bSPeter Brune 
649f40b411bSPeter Brune    Level: intermediate
650f40b411bSPeter Brune 
651f40b411bSPeter Brune 
652f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
653f40b411bSPeter Brune @*/
654f1c6b773SPeter Brune PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch) {
655bf7f4e0aSPeter Brune   PetscFunctionBegin;
656f40b411bSPeter Brune 
657bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
658bf7f4e0aSPeter Brune }
659bf7f4e0aSPeter Brune 
660bf7f4e0aSPeter Brune #undef __FUNCT__
661f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType"
662ea5d4fccSPeter Brune /*@C
663f1c6b773SPeter Brune    SNESLineSearchSetType - Sets the linesearch type
664f40b411bSPeter Brune 
665f40b411bSPeter Brune    Input Parameters:
666f40b411bSPeter Brune +  linesearch - linesearch context.
667f40b411bSPeter Brune -  type - The type of line search to be used
668f40b411bSPeter Brune 
669f1c6b773SPeter Brune    Logically Collective on SNESLineSearch
670f40b411bSPeter Brune 
671f40b411bSPeter Brune    Level: intermediate
672f40b411bSPeter Brune 
673f40b411bSPeter Brune 
674f1c6b773SPeter Brune .seealso: SNESLineSearchCreate()
675f40b411bSPeter Brune @*/
676f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, const SNESLineSearchType type)
677bf7f4e0aSPeter Brune {
678bf7f4e0aSPeter Brune 
679f1c6b773SPeter Brune   PetscErrorCode ierr,(*r)(SNESLineSearch);
680bf7f4e0aSPeter Brune   PetscBool      match;
681bf7f4e0aSPeter Brune 
682bf7f4e0aSPeter Brune   PetscFunctionBegin;
683f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
684bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
685bf7f4e0aSPeter Brune 
686bf7f4e0aSPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
687bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
688bf7f4e0aSPeter Brune 
689f1c6b773SPeter Brune   ierr =  PetscFListFind(SNESLineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
690bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
691bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
692bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
693bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
694bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
695bf7f4e0aSPeter Brune   }
696f1c6b773SPeter Brune   /* Reinitialize function pointers in SNESLineSearchOps structure */
697bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
698bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
699bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
700bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
701bf7f4e0aSPeter Brune 
702bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
703bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
704bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
705bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
706bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
707bf7f4e0aSPeter Brune   }
708bf7f4e0aSPeter Brune #endif
709bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
710bf7f4e0aSPeter Brune }
711bf7f4e0aSPeter Brune 
712bf7f4e0aSPeter Brune #undef __FUNCT__
713f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES"
714f40b411bSPeter Brune /*@
715f1c6b773SPeter Brune    SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation
716f40b411bSPeter Brune 
717f40b411bSPeter Brune    Input Parameters:
718f40b411bSPeter Brune +  linesearch - linesearch context.
719f40b411bSPeter Brune -  snes - The snes instance
720f40b411bSPeter Brune 
721f40b411bSPeter Brune    Level: intermediate
722f40b411bSPeter Brune 
723f40b411bSPeter Brune 
724f1c6b773SPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs()
725f40b411bSPeter Brune @*/
726f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes){
727bf7f4e0aSPeter Brune   PetscFunctionBegin;
728f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
729bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
730bf7f4e0aSPeter Brune   linesearch->snes = snes;
731bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
732bf7f4e0aSPeter Brune }
733bf7f4e0aSPeter Brune 
734bf7f4e0aSPeter Brune #undef __FUNCT__
735f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES"
736f40b411bSPeter Brune /*@
737f1c6b773SPeter Brune    SNESLineSearchGetSNES - Gets the SNES for the linesearch for function evaluation
738f40b411bSPeter Brune 
739f40b411bSPeter Brune    Input Parameters:
740f40b411bSPeter Brune .  linesearch - linesearch context.
741f40b411bSPeter Brune 
742f40b411bSPeter Brune    Output Parameters:
743f40b411bSPeter Brune .  snes - The snes instance
744f40b411bSPeter Brune 
745f40b411bSPeter Brune    Level: intermediate
746f40b411bSPeter Brune 
747f1c6b773SPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs()
748f40b411bSPeter Brune @*/
749f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes){
750bf7f4e0aSPeter Brune   PetscFunctionBegin;
751f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7526a388c36SPeter Brune   PetscValidPointer(snes, 2);
753bf7f4e0aSPeter Brune   *snes = linesearch->snes;
754bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
755bf7f4e0aSPeter Brune }
756bf7f4e0aSPeter Brune 
7576a388c36SPeter Brune #undef __FUNCT__
758f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda"
759f40b411bSPeter Brune /*@
760f1c6b773SPeter Brune    SNESLineSearchGetLambda - Gets the last linesearch steplength discovered.
761f40b411bSPeter Brune 
762f40b411bSPeter Brune    Input Parameters:
763f40b411bSPeter Brune .  linesearch - linesearch context.
764f40b411bSPeter Brune 
765f40b411bSPeter Brune    Output Parameters:
766f40b411bSPeter Brune .  lambda - The last steplength.
767f40b411bSPeter Brune 
768f40b411bSPeter Brune    Level: intermediate
769f40b411bSPeter Brune 
770f1c6b773SPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs()
771f40b411bSPeter Brune @*/
772f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda)
7736a388c36SPeter Brune {
7746a388c36SPeter Brune   PetscFunctionBegin;
775f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7766a388c36SPeter Brune   PetscValidPointer(lambda, 2);
7776a388c36SPeter Brune   *lambda = linesearch->lambda;
7786a388c36SPeter Brune   PetscFunctionReturn(0);
7796a388c36SPeter Brune }
7806a388c36SPeter Brune 
7816a388c36SPeter Brune #undef __FUNCT__
782f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda"
783f40b411bSPeter Brune /*@
784f1c6b773SPeter Brune    SNESLineSearchSetLambda - Sets the linesearch steplength.
785f40b411bSPeter Brune 
786f40b411bSPeter Brune    Input Parameters:
787f40b411bSPeter Brune +  linesearch - linesearch context.
788f40b411bSPeter Brune -  lambda - The last steplength.
789f40b411bSPeter Brune 
790f40b411bSPeter Brune    Level: intermediate
791f40b411bSPeter Brune 
792f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda()
793f40b411bSPeter Brune @*/
794f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda)
7956a388c36SPeter Brune {
7966a388c36SPeter Brune   PetscFunctionBegin;
797f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
7986a388c36SPeter Brune   linesearch->lambda = lambda;
7996a388c36SPeter Brune   PetscFunctionReturn(0);
8006a388c36SPeter Brune }
8016a388c36SPeter Brune 
8026a388c36SPeter Brune #undef  __FUNCT__
803f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances"
804f40b411bSPeter Brune /*@
805f1c6b773SPeter Brune    SNESLineSearchGetTolerances - Gets the tolerances for the method
806f40b411bSPeter Brune 
807f40b411bSPeter Brune    Input Parameters:
808f40b411bSPeter Brune .  linesearch - linesearch context.
809f40b411bSPeter Brune 
810f40b411bSPeter Brune    Output Parameters:
811516fe3c3SPeter Brune +  steptol - The minimum steplength
812516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
813516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
814516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
815516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
816f40b411bSPeter Brune 
817f40b411bSPeter Brune 
818516fe3c3SPeter Brune    Level: advanced
819516fe3c3SPeter Brune 
820f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances()
821f40b411bSPeter Brune @*/
822f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
8236a388c36SPeter Brune {
8246a388c36SPeter Brune   PetscFunctionBegin;
825f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
826516fe3c3SPeter Brune   if (steptol) {
8276a388c36SPeter Brune     PetscValidPointer(steptol, 2);
8286a388c36SPeter Brune     *steptol = linesearch->steptol;
829516fe3c3SPeter Brune   }
830516fe3c3SPeter Brune   if (maxstep) {
831516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
832516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
833516fe3c3SPeter Brune   }
834516fe3c3SPeter Brune   if (rtol) {
835516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
836516fe3c3SPeter Brune     *rtol = linesearch->rtol;
837516fe3c3SPeter Brune   }
838516fe3c3SPeter Brune   if (atol) {
839516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
840516fe3c3SPeter Brune     *atol = linesearch->atol;
841516fe3c3SPeter Brune   }
842516fe3c3SPeter Brune   if (ltol) {
843516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
844516fe3c3SPeter Brune     *ltol = linesearch->ltol;
845516fe3c3SPeter Brune   }
846516fe3c3SPeter Brune   if (max_its) {
847516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
848516fe3c3SPeter Brune     *max_its = linesearch->max_its;
849516fe3c3SPeter Brune   }
8506a388c36SPeter Brune   PetscFunctionReturn(0);
8516a388c36SPeter Brune }
8526a388c36SPeter Brune 
8536a388c36SPeter Brune #undef  __FUNCT__
854f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances"
855f40b411bSPeter Brune /*@
856f1c6b773SPeter Brune    SNESLineSearchSetTolerances - Sets the tolerances for the method
857f40b411bSPeter Brune 
858f40b411bSPeter Brune    Input Parameters:
859516fe3c3SPeter Brune +  linesearch - linesearch context.
860516fe3c3SPeter Brune .  steptol - The minimum steplength
861516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
862516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
863516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
864516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
865f40b411bSPeter Brune 
866f40b411bSPeter Brune 
867516fe3c3SPeter Brune    Level: advanced
868516fe3c3SPeter Brune 
869f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances()
870f40b411bSPeter Brune @*/
871f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
8726a388c36SPeter Brune {
8736a388c36SPeter Brune   PetscFunctionBegin;
874f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
8756a388c36SPeter Brune   linesearch->steptol = steptol;
876516fe3c3SPeter Brune   linesearch->maxstep = maxstep;
877516fe3c3SPeter Brune   linesearch->rtol = rtol;
878516fe3c3SPeter Brune   linesearch->atol = atol;
879516fe3c3SPeter Brune   linesearch->ltol = ltol;
880516fe3c3SPeter Brune   linesearch->max_its = max_its;
8816a388c36SPeter Brune   PetscFunctionReturn(0);
8826a388c36SPeter Brune }
8836a388c36SPeter Brune 
884516fe3c3SPeter Brune 
8856a388c36SPeter Brune #undef __FUNCT__
886f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping"
887f40b411bSPeter Brune /*@
888f1c6b773SPeter Brune    SNESLineSearchGetDamping - Gets the line search damping parameter.
889f40b411bSPeter Brune 
890f40b411bSPeter Brune    Input Parameters:
891f40b411bSPeter Brune .  linesearch - linesearch context.
892f40b411bSPeter Brune 
893f40b411bSPeter Brune    Output Parameters:
894f40b411bSPeter Brune .  damping - The damping parameter.
895f40b411bSPeter Brune 
896f40b411bSPeter Brune    Level: intermediate
897f40b411bSPeter Brune 
898f1c6b773SPeter Brune .seealso: SNESLineSearchGetStepTolerance()
899f40b411bSPeter Brune @*/
900f40b411bSPeter Brune 
901f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping)
9026a388c36SPeter Brune {
9036a388c36SPeter Brune   PetscFunctionBegin;
904f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9056a388c36SPeter Brune   PetscValidPointer(damping, 2);
9066a388c36SPeter Brune   *damping = linesearch->damping;
9076a388c36SPeter Brune   PetscFunctionReturn(0);
9086a388c36SPeter Brune }
9096a388c36SPeter Brune 
9106a388c36SPeter Brune #undef __FUNCT__
911f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping"
912f40b411bSPeter Brune /*@
913f1c6b773SPeter Brune    SNESLineSearchSetDamping - Sets the line search damping paramter.
914f40b411bSPeter Brune 
915f40b411bSPeter Brune    Input Parameters:
916f40b411bSPeter Brune .  linesearch - linesearch context.
917f40b411bSPeter Brune .  damping - The damping parameter.
918f40b411bSPeter Brune 
919f40b411bSPeter Brune    Level: intermediate
920f40b411bSPeter Brune 
921f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping()
922f40b411bSPeter Brune @*/
923f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping)
9246a388c36SPeter Brune {
9256a388c36SPeter Brune   PetscFunctionBegin;
926f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9276a388c36SPeter Brune   linesearch->damping = damping;
9286a388c36SPeter Brune   PetscFunctionReturn(0);
9296a388c36SPeter Brune }
9306a388c36SPeter Brune 
9316a388c36SPeter Brune #undef __FUNCT__
932f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms"
933f40b411bSPeter Brune /*@
934f1c6b773SPeter Brune    SNESLineSearchGetNorms - Gets the norms for for X, Y, and F.
935f40b411bSPeter Brune 
936f40b411bSPeter Brune    Input Parameters:
937f40b411bSPeter Brune .  linesearch - linesearch context.
938f40b411bSPeter Brune 
939f40b411bSPeter Brune    Output Parameters:
940f40b411bSPeter Brune +  xnorm - The norm of the current solution
941f40b411bSPeter Brune .  fnorm - The norm of the current function
942f40b411bSPeter Brune -  ynorm - The norm of the current update
943f40b411bSPeter Brune 
944f40b411bSPeter Brune    Level: intermediate
945f40b411bSPeter Brune 
946f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs()
947f40b411bSPeter Brune @*/
948f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
949bf7f4e0aSPeter Brune {
950bf7f4e0aSPeter Brune   PetscFunctionBegin;
951f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
952bf7f4e0aSPeter Brune   if (xnorm) {
953bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
954bf7f4e0aSPeter Brune   }
955bf7f4e0aSPeter Brune   if (fnorm) {
956bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
957bf7f4e0aSPeter Brune   }
958bf7f4e0aSPeter Brune   if (ynorm) {
959bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
960bf7f4e0aSPeter Brune   }
961bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
962bf7f4e0aSPeter Brune }
963bf7f4e0aSPeter Brune 
964e7058c64SPeter Brune #undef __FUNCT__
965f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms"
966f40b411bSPeter Brune /*@
967f1c6b773SPeter Brune    SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
968f40b411bSPeter Brune 
969f40b411bSPeter Brune    Input Parameters:
970f40b411bSPeter Brune +  linesearch - linesearch context.
971f40b411bSPeter Brune .  xnorm - The norm of the current solution
972f40b411bSPeter Brune .  fnorm - The norm of the current function
973f40b411bSPeter Brune -  ynorm - The norm of the current update
974f40b411bSPeter Brune 
975f40b411bSPeter Brune    Level: intermediate
976f40b411bSPeter Brune 
977f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
978f40b411bSPeter Brune @*/
979f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
9806a388c36SPeter Brune {
9816a388c36SPeter Brune   PetscFunctionBegin;
982f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
9836a388c36SPeter Brune   linesearch->xnorm = xnorm;
9846a388c36SPeter Brune   linesearch->fnorm = fnorm;
9856a388c36SPeter Brune   linesearch->ynorm = ynorm;
9866a388c36SPeter Brune   PetscFunctionReturn(0);
9876a388c36SPeter Brune }
9886a388c36SPeter Brune 
9896a388c36SPeter Brune #undef __FUNCT__
990f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms"
991f40b411bSPeter Brune /*@
992f1c6b773SPeter Brune    SNESLineSearchComputeNorms - Computes the norms of X, F, and Y.
993f40b411bSPeter Brune 
994f40b411bSPeter Brune    Input Parameters:
995f40b411bSPeter Brune .  linesearch - linesearch context.
996f40b411bSPeter Brune 
997f40b411bSPeter Brune    Options Database Keys:
998f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
999f40b411bSPeter Brune 
1000f40b411bSPeter Brune    Level: intermediate
1001f40b411bSPeter Brune 
1002f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms()
1003f40b411bSPeter Brune @*/
1004f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch)
10056a388c36SPeter Brune {
10066a388c36SPeter Brune   PetscErrorCode ierr;
10079bd66eb0SPeter Brune   SNES snes;
10086a388c36SPeter Brune   PetscFunctionBegin;
10096a388c36SPeter Brune   if (linesearch->norms) {
10109bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1011f1c6b773SPeter Brune       ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
10129bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10139bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10149bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
10159bd66eb0SPeter Brune     } else {
10166a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10176a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10186a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10196a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10206a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10216a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10226a388c36SPeter Brune     }
10239bd66eb0SPeter Brune   }
10246a388c36SPeter Brune   PetscFunctionReturn(0);
10256a388c36SPeter Brune }
10266a388c36SPeter Brune 
10276a388c36SPeter Brune #undef __FUNCT__
1028f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs"
1029f40b411bSPeter Brune /*@
1030f1c6b773SPeter Brune    SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context
1031f40b411bSPeter Brune 
1032f40b411bSPeter Brune    Input Parameters:
1033f40b411bSPeter Brune .  linesearch - linesearch context.
1034f40b411bSPeter Brune 
1035f40b411bSPeter Brune    Output Parameters:
1036f40b411bSPeter Brune +  X - The old solution
1037f40b411bSPeter Brune .  F - The old function
1038f40b411bSPeter Brune .  Y - The search direction
1039f40b411bSPeter Brune .  W - The new solution
1040f40b411bSPeter Brune -  G - The new function
1041f40b411bSPeter Brune 
1042f40b411bSPeter Brune    Level: intermediate
1043f40b411bSPeter Brune 
1044f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs()
1045f40b411bSPeter Brune @*/
1046f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
10476a388c36SPeter Brune   PetscFunctionBegin;
1048f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10496a388c36SPeter Brune   if (X) {
10506a388c36SPeter Brune     PetscValidPointer(X, 2);
10516a388c36SPeter Brune     *X = linesearch->vec_sol;
10526a388c36SPeter Brune   }
10536a388c36SPeter Brune   if (F) {
10546a388c36SPeter Brune     PetscValidPointer(F, 3);
10556a388c36SPeter Brune     *F = linesearch->vec_func;
10566a388c36SPeter Brune   }
10576a388c36SPeter Brune   if (Y) {
10586a388c36SPeter Brune     PetscValidPointer(Y, 4);
10596a388c36SPeter Brune     *Y = linesearch->vec_update;
10606a388c36SPeter Brune   }
10616a388c36SPeter Brune   if (W) {
10626a388c36SPeter Brune     PetscValidPointer(W, 5);
10636a388c36SPeter Brune     *W = linesearch->vec_sol_new;
10646a388c36SPeter Brune   }
10656a388c36SPeter Brune   if (G) {
10666a388c36SPeter Brune     PetscValidPointer(G, 6);
10676a388c36SPeter Brune     *G = linesearch->vec_func_new;
10686a388c36SPeter Brune   }
10696a388c36SPeter Brune 
10706a388c36SPeter Brune   PetscFunctionReturn(0);
10716a388c36SPeter Brune }
10726a388c36SPeter Brune 
10736a388c36SPeter Brune #undef __FUNCT__
1074f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs"
1075f40b411bSPeter Brune /*@
1076f1c6b773SPeter Brune    SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context
1077f40b411bSPeter Brune 
1078f40b411bSPeter Brune    Input Parameters:
1079f40b411bSPeter Brune +  linesearch - linesearch context.
1080f40b411bSPeter Brune .  X - The old solution
1081f40b411bSPeter Brune .  F - The old function
1082f40b411bSPeter Brune .  Y - The search direction
1083f40b411bSPeter Brune .  W - The new solution
1084f40b411bSPeter Brune -  G - The new function
1085f40b411bSPeter Brune 
1086f40b411bSPeter Brune    Level: intermediate
1087f40b411bSPeter Brune 
1088f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs()
1089f40b411bSPeter Brune @*/
1090f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
10916a388c36SPeter Brune   PetscFunctionBegin;
1092f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
10936a388c36SPeter Brune   if (X) {
10946a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
10956a388c36SPeter Brune     linesearch->vec_sol = X;
10966a388c36SPeter Brune   }
10976a388c36SPeter Brune   if (F) {
10986a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
10996a388c36SPeter Brune     linesearch->vec_func = F;
11006a388c36SPeter Brune   }
11016a388c36SPeter Brune   if (Y) {
11026a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
11036a388c36SPeter Brune     linesearch->vec_update = Y;
11046a388c36SPeter Brune   }
11056a388c36SPeter Brune   if (W) {
11066a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
11076a388c36SPeter Brune     linesearch->vec_sol_new = W;
11086a388c36SPeter Brune   }
11096a388c36SPeter Brune   if (G) {
11106a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
11116a388c36SPeter Brune     linesearch->vec_func_new = G;
11126a388c36SPeter Brune   }
11136a388c36SPeter Brune 
11146a388c36SPeter Brune   PetscFunctionReturn(0);
11156a388c36SPeter Brune }
11166a388c36SPeter Brune 
11176a388c36SPeter Brune #undef __FUNCT__
1118f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix"
1119e7058c64SPeter Brune /*@C
1120f1c6b773SPeter Brune    SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1121e7058c64SPeter Brune    SNES options in the database.
1122e7058c64SPeter Brune 
1123e7058c64SPeter Brune    Logically Collective on SNES
1124e7058c64SPeter Brune 
1125e7058c64SPeter Brune    Input Parameters:
1126e7058c64SPeter Brune +  snes - the SNES context
1127e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1128e7058c64SPeter Brune 
1129e7058c64SPeter Brune    Notes:
1130e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1131e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1132e7058c64SPeter Brune 
1133e7058c64SPeter Brune    Level: advanced
1134e7058c64SPeter Brune 
1135f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database
1136e7058c64SPeter Brune 
1137e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1138e7058c64SPeter Brune @*/
1139f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[])
1140e7058c64SPeter Brune {
1141e7058c64SPeter Brune   PetscErrorCode ierr;
1142e7058c64SPeter Brune 
1143e7058c64SPeter Brune   PetscFunctionBegin;
1144f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1145e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1146e7058c64SPeter Brune   PetscFunctionReturn(0);
1147e7058c64SPeter Brune }
1148e7058c64SPeter Brune 
1149e7058c64SPeter Brune #undef __FUNCT__
1150f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix"
1151e7058c64SPeter Brune /*@C
1152f1c6b773SPeter Brune    SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
1153f1c6b773SPeter Brune    SNESLineSearch options in the database.
1154e7058c64SPeter Brune 
1155e7058c64SPeter Brune    Not Collective
1156e7058c64SPeter Brune 
1157e7058c64SPeter Brune    Input Parameter:
1158e7058c64SPeter Brune .  snes - the SNES context
1159e7058c64SPeter Brune 
1160e7058c64SPeter Brune    Output Parameter:
1161e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1162e7058c64SPeter Brune 
1163e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
1164e7058c64SPeter Brune    sufficient length to hold the prefix.
1165e7058c64SPeter Brune 
1166e7058c64SPeter Brune    Level: advanced
1167e7058c64SPeter Brune 
1168f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database
1169e7058c64SPeter Brune 
1170e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1171e7058c64SPeter Brune @*/
1172f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[])
1173e7058c64SPeter Brune {
1174e7058c64SPeter Brune   PetscErrorCode ierr;
1175e7058c64SPeter Brune 
1176e7058c64SPeter Brune   PetscFunctionBegin;
1177f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
1178e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1179e7058c64SPeter Brune   PetscFunctionReturn(0);
1180e7058c64SPeter Brune }
1181bf7f4e0aSPeter Brune 
1182bf7f4e0aSPeter Brune #undef __FUNCT__
1183f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetWork"
1184f40b411bSPeter Brune /*@
1185f1c6b773SPeter Brune    SNESLineSearchGetWork - Gets work vectors for the line search.
1186f40b411bSPeter Brune 
1187f40b411bSPeter Brune    Input Parameter:
1188f1c6b773SPeter Brune +  linesearch - the SNESLineSearch context
1189f40b411bSPeter Brune -  nwork - the number of work vectors
1190f40b411bSPeter Brune 
1191f40b411bSPeter Brune    Level: developer
1192f40b411bSPeter Brune 
1193f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector
1194f40b411bSPeter Brune 
1195f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1196f40b411bSPeter Brune @*/
1197f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetWork(SNESLineSearch linesearch, PetscInt nwork)
1198bf7f4e0aSPeter Brune {
1199bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1200bf7f4e0aSPeter Brune   PetscFunctionBegin;
1201bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1202bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
1203bf7f4e0aSPeter Brune   } else {
1204bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1205bf7f4e0aSPeter Brune   }
1206bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1207bf7f4e0aSPeter Brune }
1208bf7f4e0aSPeter Brune 
12096a388c36SPeter Brune 
1210bf7f4e0aSPeter Brune #undef __FUNCT__
1211f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess"
1212f40b411bSPeter Brune /*@
1213f1c6b773SPeter Brune    SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application
1214f40b411bSPeter Brune 
1215f40b411bSPeter Brune    Input Parameters:
1216f40b411bSPeter Brune .  linesearch - linesearch context.
1217f40b411bSPeter Brune 
1218f40b411bSPeter Brune    Output Parameters:
1219f40b411bSPeter Brune .  success - The success or failure status.
1220f40b411bSPeter Brune 
1221f40b411bSPeter Brune    Level: intermediate
1222f40b411bSPeter Brune 
1223f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess()
1224f40b411bSPeter Brune @*/
1225f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success)
1226bf7f4e0aSPeter Brune {
1227bf7f4e0aSPeter Brune   PetscFunctionBegin;
1228f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12296a388c36SPeter Brune   PetscValidPointer(success, 2);
1230bf7f4e0aSPeter Brune   if (success) {
1231bf7f4e0aSPeter Brune     *success = linesearch->success;
1232bf7f4e0aSPeter Brune   }
1233bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1234bf7f4e0aSPeter Brune }
1235bf7f4e0aSPeter Brune 
1236bf7f4e0aSPeter Brune #undef __FUNCT__
1237f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess"
1238f40b411bSPeter Brune /*@
1239f1c6b773SPeter Brune    SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application
1240f40b411bSPeter Brune 
1241f40b411bSPeter Brune    Input Parameters:
1242f40b411bSPeter Brune +  linesearch - linesearch context.
1243f40b411bSPeter Brune -  success - The success or failure status.
1244f40b411bSPeter Brune 
1245f40b411bSPeter Brune    Level: intermediate
1246f40b411bSPeter Brune 
1247f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess()
1248f40b411bSPeter Brune @*/
1249f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success)
12506a388c36SPeter Brune {
1251f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
12526a388c36SPeter Brune   PetscFunctionBegin;
12536a388c36SPeter Brune   linesearch->success = success;
12546a388c36SPeter Brune   PetscFunctionReturn(0);
12556a388c36SPeter Brune }
12566a388c36SPeter Brune 
12576a388c36SPeter Brune #undef __FUNCT__
1258f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions"
12599bd66eb0SPeter Brune /*@C
1260f1c6b773SPeter Brune    SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
12619bd66eb0SPeter Brune 
12629bd66eb0SPeter Brune    Input Parameters:
12639bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
12649bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
12659bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
12669bd66eb0SPeter Brune 
12679bd66eb0SPeter Brune    Logically Collective on SNES
12689bd66eb0SPeter Brune 
12699bd66eb0SPeter Brune    Calling sequence of projectfunc:
12709bd66eb0SPeter Brune .vb
12719bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
12729bd66eb0SPeter Brune .ve
12739bd66eb0SPeter Brune 
12749bd66eb0SPeter Brune     Input parameters for projectfunc:
12759bd66eb0SPeter Brune +   snes - nonlinear context
12769bd66eb0SPeter Brune -   X - current solution
12779bd66eb0SPeter Brune 
12789bd66eb0SPeter Brune     Output parameters for func:
12799bd66eb0SPeter Brune .   X - Projected solution
12809bd66eb0SPeter Brune 
12819bd66eb0SPeter Brune    Calling sequence of normfunc:
12829bd66eb0SPeter Brune .vb
12839bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
12849bd66eb0SPeter Brune .ve
12859bd66eb0SPeter Brune 
12869bd66eb0SPeter Brune     Input parameters for projectfunc:
12879bd66eb0SPeter Brune +   snes - nonlinear context
12889bd66eb0SPeter Brune .   X - current solution
12899bd66eb0SPeter Brune -   F - current residual
12909bd66eb0SPeter Brune 
12919bd66eb0SPeter Brune     Output parameters for func:
12929bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
12939bd66eb0SPeter Brune 
12949bd66eb0SPeter Brune 
12959bd66eb0SPeter Brune     Level: developer
12969bd66eb0SPeter Brune 
12979bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
12989bd66eb0SPeter Brune 
1299f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck()
13009bd66eb0SPeter Brune @*/
1301f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc)
13029bd66eb0SPeter Brune {
13039bd66eb0SPeter Brune   PetscFunctionBegin;
1304f1c6b773SPeter Brune   PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1);
13059bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
13069bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
13079bd66eb0SPeter Brune   PetscFunctionReturn(0);
13089bd66eb0SPeter Brune }
13099bd66eb0SPeter Brune 
13109bd66eb0SPeter Brune #undef __FUNCT__
1311f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions"
13129bd66eb0SPeter Brune /*@C
1313f1c6b773SPeter Brune    SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
13149bd66eb0SPeter Brune 
13159bd66eb0SPeter Brune    Input Parameters:
13169bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
13179bd66eb0SPeter Brune 
13189bd66eb0SPeter Brune    Output Parameters:
13199bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
13209bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
13219bd66eb0SPeter Brune 
13229bd66eb0SPeter Brune    Logically Collective on SNES
13239bd66eb0SPeter Brune 
13249bd66eb0SPeter Brune     Level: developer
13259bd66eb0SPeter Brune 
13269bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
13279bd66eb0SPeter Brune 
1328f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck()
13299bd66eb0SPeter Brune @*/
1330f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc)
13319bd66eb0SPeter Brune {
13329bd66eb0SPeter Brune   PetscFunctionBegin;
13339bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
13349bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
13359bd66eb0SPeter Brune   PetscFunctionReturn(0);
13369bd66eb0SPeter Brune }
13379bd66eb0SPeter Brune 
13389bd66eb0SPeter Brune #undef __FUNCT__
1339f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister"
1340bf7f4e0aSPeter Brune /*@C
1341f1c6b773SPeter Brune   SNESLineSearchRegister - See SNESLineSearchRegisterDynamic()
1342bf7f4e0aSPeter Brune 
1343bf7f4e0aSPeter Brune   Level: advanced
1344bf7f4e0aSPeter Brune @*/
1345f1c6b773SPeter Brune PetscErrorCode  SNESLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNESLineSearch))
1346bf7f4e0aSPeter Brune {
1347bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1348bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1349bf7f4e0aSPeter Brune 
1350bf7f4e0aSPeter Brune   PetscFunctionBegin;
1351bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
1352f1c6b773SPeter Brune   ierr = PetscFListAdd(&SNESLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1353bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1354bf7f4e0aSPeter Brune }
1355