xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision 9bd66eb0dc31efbcccaa04c7c4d5de114a77b297)
19e764e56SPeter Brune #include <private/linesearchimpl.h> /*I "petscsnes.h" I*/
2bf7f4e0aSPeter Brune 
36188f407SPeter Brune PetscBool  PetscLineSearchRegisterAllCalled = PETSC_FALSE;
46188f407SPeter Brune PetscFList PetscLineSearchList              = PETSC_NULL;
5bf7f4e0aSPeter Brune 
66188f407SPeter Brune PetscClassId   PETSCLINESEARCH_CLASSID;
76188f407SPeter Brune PetscLogEvent  PetscLineSearch_Apply;
8bf7f4e0aSPeter Brune 
9bf7f4e0aSPeter Brune #undef __FUNCT__
106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate"
11f40b411bSPeter Brune /*@
126188f407SPeter Brune    PetscLineSearchCreate - 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 
296188f407SPeter Brune PetscErrorCode PetscLineSearchCreate(MPI_Comm comm, PetscLineSearch * outlinesearch) {
30bf7f4e0aSPeter Brune   PetscErrorCode ierr;
316188f407SPeter Brune   PetscLineSearch     linesearch;
32bf7f4e0aSPeter Brune   PetscFunctionBegin;
336188f407SPeter Brune   ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,PETSCLINESEARCH_CLASSID, 0,
346188f407SPeter Brune                            "LineSearch","Line-search method","LineSearch",comm,PetscLineSearchDestroy,PetscLineSearchView);CHKERRQ(ierr);
35bf7f4e0aSPeter Brune 
36bf7f4e0aSPeter Brune   linesearch->ops->precheckstep = PETSC_NULL;
37bf7f4e0aSPeter Brune   linesearch->ops->postcheckstep = PETSC_NULL;
38bf7f4e0aSPeter Brune 
39*9bd66eb0SPeter Brune   linesearch->vec_sol_new   = PETSC_NULL;
40*9bd66eb0SPeter Brune   linesearch->vec_func_new  = PETSC_NULL;
41*9bd66eb0SPeter Brune   linesearch->vec_sol       = PETSC_NULL;
42*9bd66eb0SPeter Brune   linesearch->vec_func      = PETSC_NULL;
43*9bd66eb0SPeter Brune   linesearch->vec_update    = PETSC_NULL;
44*9bd66eb0SPeter Brune 
45bf7f4e0aSPeter Brune   linesearch->lambda        = 1.0;
46bf7f4e0aSPeter Brune   linesearch->fnorm         = 1.0;
47bf7f4e0aSPeter Brune   linesearch->ynorm         = 1.0;
48bf7f4e0aSPeter Brune   linesearch->xnorm         = 1.0;
49bf7f4e0aSPeter Brune   linesearch->success       = PETSC_TRUE;
50bf7f4e0aSPeter Brune   linesearch->norms         = PETSC_TRUE;
51bf7f4e0aSPeter Brune   linesearch->keeplambda    = PETSC_FALSE;
52bf7f4e0aSPeter Brune   linesearch->damping       = 1.0;
53bf7f4e0aSPeter Brune   linesearch->maxstep       = 1e8;
54bf7f4e0aSPeter Brune   linesearch->steptol       = 1e-12;
55516fe3c3SPeter Brune   linesearch->rtol          = 1e-8;
56516fe3c3SPeter Brune   linesearch->atol          = 1e-15;
57516fe3c3SPeter Brune   linesearch->ltol          = 1e-8;
58bf7f4e0aSPeter Brune   linesearch->precheckctx   = PETSC_NULL;
59bf7f4e0aSPeter Brune   linesearch->postcheckctx  = PETSC_NULL;
60516fe3c3SPeter Brune   linesearch->max_its       = 3;
61bf7f4e0aSPeter Brune   linesearch->setupcalled   = PETSC_FALSE;
62bf7f4e0aSPeter Brune   *outlinesearch            = linesearch;
63bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
64bf7f4e0aSPeter Brune }
65bf7f4e0aSPeter Brune 
66bf7f4e0aSPeter Brune #undef __FUNCT__
676188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetUp"
68f40b411bSPeter Brune /*@
696188f407SPeter Brune    PetscLineSearchSetUp - Prepares the line search for being applied.
70f40b411bSPeter Brune 
71f40b411bSPeter Brune    Collective on LineSearch
72f40b411bSPeter Brune 
73f40b411bSPeter Brune    Input Parameters:
74f40b411bSPeter Brune .  linesearch - The LineSearch instance.
75f40b411bSPeter Brune 
76f40b411bSPeter Brune    Level: Intermediate
77f40b411bSPeter Brune 
786188f407SPeter Brune    .keywords: PetscLineSearch, SetUp
79f40b411bSPeter Brune 
806188f407SPeter Brune    .seealso: PetscLineSearchReset()
81f40b411bSPeter Brune @*/
82f40b411bSPeter Brune 
836188f407SPeter Brune PetscErrorCode PetscLineSearchSetUp(PetscLineSearch linesearch) {
84bf7f4e0aSPeter Brune   PetscErrorCode ierr;
85bf7f4e0aSPeter Brune   PetscFunctionBegin;
86bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
876188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,PETSCLINESEARCHBASIC);CHKERRQ(ierr);
88bf7f4e0aSPeter Brune   }
89bf7f4e0aSPeter Brune   if (!linesearch->setupcalled) {
90*9bd66eb0SPeter Brune     if (!linesearch->vec_sol_new) {
91bf7f4e0aSPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr);
92*9bd66eb0SPeter Brune     }
93*9bd66eb0SPeter Brune     if (!linesearch->vec_func_new) {
94*9bd66eb0SPeter Brune       ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr);
95*9bd66eb0SPeter Brune     }
96bf7f4e0aSPeter Brune     if (linesearch->ops->setup) {
97bf7f4e0aSPeter Brune       ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr);
98bf7f4e0aSPeter Brune     }
99bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping;
100bf7f4e0aSPeter Brune     linesearch->setupcalled = PETSC_TRUE;
101bf7f4e0aSPeter Brune   }
102bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
103bf7f4e0aSPeter Brune }
104bf7f4e0aSPeter Brune 
105bf7f4e0aSPeter Brune #undef __FUNCT__
1066188f407SPeter Brune #define __FUNCT__ "PetscLineSearchReset"
107f40b411bSPeter Brune 
108f40b411bSPeter Brune /*@
1096188f407SPeter Brune    PetscLineSearchReset - Tears down the structures required for application
110f40b411bSPeter Brune 
1116188f407SPeter Brune    Collective on PetscLineSearch
112f40b411bSPeter Brune 
113f40b411bSPeter Brune    Input Parameters:
114f40b411bSPeter Brune .  linesearch - The LineSearch instance.
115f40b411bSPeter Brune 
116f40b411bSPeter Brune    Level: Intermediate
117f40b411bSPeter Brune 
1186188f407SPeter Brune    .keywords: PetscLineSearch, Create
119f40b411bSPeter Brune 
1206188f407SPeter Brune    .seealso: PetscLineSearchSetUp()
121f40b411bSPeter Brune @*/
122f40b411bSPeter Brune 
1236188f407SPeter Brune PetscErrorCode PetscLineSearchReset(PetscLineSearch linesearch) {
124bf7f4e0aSPeter Brune   PetscErrorCode ierr;
125bf7f4e0aSPeter Brune   PetscFunctionBegin;
126bf7f4e0aSPeter Brune   if (linesearch->ops->reset) {
127bf7f4e0aSPeter Brune     (*linesearch->ops->reset)(linesearch);
128bf7f4e0aSPeter Brune   }
129bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr);
130bf7f4e0aSPeter Brune   ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr);
131bf7f4e0aSPeter Brune 
132bf7f4e0aSPeter Brune   ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr);
133bf7f4e0aSPeter Brune   linesearch->nwork = 0;
134bf7f4e0aSPeter Brune   linesearch->setupcalled = PETSC_FALSE;
135bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
136bf7f4e0aSPeter Brune }
137bf7f4e0aSPeter Brune 
13886d74e61SPeter Brune 
13986d74e61SPeter Brune #undef __FUNCT__
14086d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPreCheck"
14186d74e61SPeter Brune /*@C
14286d74e61SPeter Brune    PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
14386d74e61SPeter Brune 
14486d74e61SPeter Brune    Logically Collective on PetscLineSearch
14586d74e61SPeter Brune 
14686d74e61SPeter Brune    Input Parameters:
14786d74e61SPeter Brune +  linesearch - the PetscLineSearch context
14886d74e61SPeter Brune .  func       - [optional] function evaluation routine
14986d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
15086d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
15186d74e61SPeter Brune 
15286d74e61SPeter Brune    Calling sequence of func:
15386d74e61SPeter Brune $    func (PetscLineSearch snes,Vec x,Vec y, PetscBool *changed);
15486d74e61SPeter Brune 
15586d74e61SPeter Brune +  x - solution vector
15686d74e61SPeter Brune .  y - search direction vector
15786d74e61SPeter Brune -  changed - flag to indicate the precheck changed something.
15886d74e61SPeter Brune 
15986d74e61SPeter Brune    Level: intermediate
16086d74e61SPeter Brune 
16186d74e61SPeter Brune .keywords: set, linesearch, pre-check
16286d74e61SPeter Brune 
16386d74e61SPeter Brune .seealso: PetscLineSearchSetPostCheck()
16486d74e61SPeter Brune @*/
16586d74e61SPeter Brune PetscErrorCode  PetscLineSearchSetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc func,void *ctx)
16686d74e61SPeter Brune {
167*9bd66eb0SPeter Brune   PetscFunctionBegin;
16886d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
16986d74e61SPeter Brune   if (func) linesearch->ops->precheckstep = func;
17086d74e61SPeter Brune   if (ctx) linesearch->precheckctx = ctx;
17186d74e61SPeter Brune   PetscFunctionReturn(0);
17286d74e61SPeter Brune }
17386d74e61SPeter Brune 
17486d74e61SPeter Brune 
17586d74e61SPeter Brune #undef __FUNCT__
17686d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPreCheck"
17786d74e61SPeter Brune /*@C
17886d74e61SPeter Brune    PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
17986d74e61SPeter Brune 
18086d74e61SPeter Brune    Input Parameters:
18186d74e61SPeter Brune .  linesearch - the PetscLineSearch context
18286d74e61SPeter Brune 
18386d74e61SPeter Brune    Output Parameters:
18486d74e61SPeter Brune +  func       - [optional] function evaluation routine
18586d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
18686d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
18786d74e61SPeter Brune 
18886d74e61SPeter Brune    Level: intermediate
18986d74e61SPeter Brune 
19086d74e61SPeter Brune .keywords: get, linesearch, pre-check
19186d74e61SPeter Brune 
19286d74e61SPeter Brune .seealso: PetscLineSearchGetPostCheck(), PetscLineSearchSetPreCheck()
19386d74e61SPeter Brune @*/
19486d74e61SPeter Brune PetscErrorCode  PetscLineSearchGetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc *func,void **ctx)
19586d74e61SPeter Brune {
196*9bd66eb0SPeter Brune   PetscFunctionBegin;
19786d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
19886d74e61SPeter Brune   if (func) *func = linesearch->ops->precheckstep;
19986d74e61SPeter Brune   if (ctx) *ctx = linesearch->precheckctx;
20086d74e61SPeter Brune   PetscFunctionReturn(0);
20186d74e61SPeter Brune }
20286d74e61SPeter Brune 
20386d74e61SPeter Brune 
20486d74e61SPeter Brune #undef __FUNCT__
20586d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPostCheck"
20686d74e61SPeter Brune /*@C
20786d74e61SPeter Brune    PetscLineSearchSetPostCheck - Sets a post-check function for the line search routine.
20886d74e61SPeter Brune 
20986d74e61SPeter Brune    Logically Collective on PetscLineSearch
21086d74e61SPeter Brune 
21186d74e61SPeter Brune    Input Parameters:
21286d74e61SPeter Brune +  linesearch - the PetscLineSearch context
21386d74e61SPeter Brune .  func       - [optional] function evaluation routine
21486d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
21586d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
21686d74e61SPeter Brune 
21786d74e61SPeter Brune    Calling sequence of func:
21886d74e61SPeter Brune $    func (PetscLineSearch linesearch,Vec x, Vec w, Vec y, PetscBool *changed_w, *changed_y);
21986d74e61SPeter Brune 
22086d74e61SPeter Brune +  x - old solution vector
22186d74e61SPeter Brune .  y - search direction vector
22286d74e61SPeter Brune .  w - new solution vector
22386d74e61SPeter Brune .  changed_y - indicates that the line search changed y.
22486d74e61SPeter Brune .  changed_w - indicates that the line search changed w.
22586d74e61SPeter Brune 
22686d74e61SPeter Brune    Level: intermediate
22786d74e61SPeter Brune 
22886d74e61SPeter Brune .keywords: set, linesearch, post-check
22986d74e61SPeter Brune 
23086d74e61SPeter Brune .seealso: PetscLineSearchSetPreCheck()
23186d74e61SPeter Brune @*/
23286d74e61SPeter Brune PetscErrorCode  PetscLineSearchSetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc func,void *ctx)
23386d74e61SPeter Brune {
23486d74e61SPeter Brune   PetscFunctionBegin;
23586d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
23686d74e61SPeter Brune   if (func) linesearch->ops->postcheckstep = func;
23786d74e61SPeter Brune   if (ctx) linesearch->postcheckctx = ctx;
23886d74e61SPeter Brune   PetscFunctionReturn(0);
23986d74e61SPeter Brune }
24086d74e61SPeter Brune 
24186d74e61SPeter Brune 
24286d74e61SPeter Brune #undef __FUNCT__
24386d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPostCheck"
24486d74e61SPeter Brune /*@C
24586d74e61SPeter Brune    PetscLineSearchGetPostCheck - Gets the post-check function for the line search routine.
24686d74e61SPeter Brune 
24786d74e61SPeter Brune    Input Parameters:
24886d74e61SPeter Brune .  linesearch - the PetscLineSearch context
24986d74e61SPeter Brune 
25086d74e61SPeter Brune    Output Parameters:
25186d74e61SPeter Brune +  func       - [optional] function evaluation routine
25286d74e61SPeter Brune -  ctx        - [optional] user-defined context for private data for the
25386d74e61SPeter Brune                 function evaluation routine (may be PETSC_NULL)
25486d74e61SPeter Brune 
25586d74e61SPeter Brune    Level: intermediate
25686d74e61SPeter Brune 
25786d74e61SPeter Brune .keywords: get, linesearch, post-check
25886d74e61SPeter Brune 
25986d74e61SPeter Brune .seealso: PetscLineSearchGetPreCheck(), PetscLineSearchSetPostCheck()
26086d74e61SPeter Brune @*/
26186d74e61SPeter Brune PetscErrorCode  PetscLineSearchGetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc *func,void **ctx)
26286d74e61SPeter Brune {
263*9bd66eb0SPeter Brune   PetscFunctionBegin;
26486d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
26586d74e61SPeter Brune   if (func) *func = linesearch->ops->postcheckstep;
26686d74e61SPeter Brune   if (ctx) *ctx = linesearch->postcheckctx;
26786d74e61SPeter Brune   PetscFunctionReturn(0);
26886d74e61SPeter Brune }
26986d74e61SPeter Brune 
27086d74e61SPeter Brune 
271bf7f4e0aSPeter Brune #undef __FUNCT__
2726188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheck"
273f40b411bSPeter Brune /*@
2746188f407SPeter Brune    PetscLineSearchPreCheck - Prepares the line search for being applied.
275f40b411bSPeter Brune 
2766188f407SPeter Brune    Collective on PetscLineSearch
277f40b411bSPeter Brune 
278f40b411bSPeter Brune    Input Parameters:
279f40b411bSPeter Brune .  linesearch - The linesearch instance.
280f40b411bSPeter Brune 
281f40b411bSPeter Brune    Output Parameters:
282f40b411bSPeter Brune .  changed - Indicator if the pre-check has changed anything.
283f40b411bSPeter Brune 
284f40b411bSPeter Brune    Level: Beginner
285f40b411bSPeter Brune 
2866188f407SPeter Brune    .keywords: PetscLineSearch, Create
287f40b411bSPeter Brune 
2886188f407SPeter Brune    .seealso: PetscLineSearchPostCheck()
289f40b411bSPeter Brune @*/
2906188f407SPeter Brune PetscErrorCode PetscLineSearchPreCheck(PetscLineSearch linesearch, PetscBool * changed)
291bf7f4e0aSPeter Brune {
292bf7f4e0aSPeter Brune   PetscErrorCode ierr;
293bf7f4e0aSPeter Brune   PetscFunctionBegin;
294bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
295bf7f4e0aSPeter Brune   if (linesearch->ops->precheckstep) {
296bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr);
297bf7f4e0aSPeter Brune   }
298bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
299bf7f4e0aSPeter Brune }
300bf7f4e0aSPeter Brune 
301bf7f4e0aSPeter Brune #undef __FUNCT__
3026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPostCheck"
303f40b411bSPeter Brune /*@
3046188f407SPeter Brune    PetscLineSearchPostCheck - Prepares the line search for being applied.
305f40b411bSPeter Brune 
3066188f407SPeter Brune    Collective on PetscLineSearch
307f40b411bSPeter Brune 
308f40b411bSPeter Brune    Input Parameters:
309f40b411bSPeter Brune .  linesearch - The linesearch instance.
310f40b411bSPeter Brune 
311f40b411bSPeter Brune    Output Parameters:
31286d74e61SPeter Brune +  changed_Y - Indicator if the solution has been changed.
31386d74e61SPeter Brune -  changed_W - Indicator if the direction has been changed.
314f40b411bSPeter Brune 
315f40b411bSPeter Brune    Level: Intermediate
316f40b411bSPeter Brune 
3176188f407SPeter Brune    .keywords: PetscLineSearch, Create
318f40b411bSPeter Brune 
3196188f407SPeter Brune    .seealso: PetscLineSearchPreCheck()
320f40b411bSPeter Brune @*/
32186d74e61SPeter Brune PetscErrorCode PetscLineSearchPostCheck(PetscLineSearch linesearch, PetscBool * changed_Y, PetscBool * changed_W)
322bf7f4e0aSPeter Brune {
323bf7f4e0aSPeter Brune   PetscErrorCode ierr;
324bf7f4e0aSPeter Brune   PetscFunctionBegin;
325bf7f4e0aSPeter Brune   *changed_Y = PETSC_FALSE;
326bf7f4e0aSPeter Brune   *changed_W = PETSC_FALSE;
327bf7f4e0aSPeter Brune   if (linesearch->ops->postcheckstep) {
32886d74e61SPeter Brune     ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, linesearch->vec_sol_new, changed_Y, changed_W);CHKERRQ(ierr);
32986d74e61SPeter Brune   }
33086d74e61SPeter Brune   PetscFunctionReturn(0);
33186d74e61SPeter Brune }
33286d74e61SPeter Brune 
33386d74e61SPeter Brune 
33486d74e61SPeter Brune #undef __FUNCT__
33586d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheckPicard"
33686d74e61SPeter Brune /*@C
33786d74e61SPeter Brune    SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration
33886d74e61SPeter Brune 
33986d74e61SPeter Brune    Logically Collective
34086d74e61SPeter Brune 
34186d74e61SPeter Brune    Input Arguments:
34286d74e61SPeter Brune +  linesearch - linesearch context
34386d74e61SPeter Brune .  X - base state for this step
34486d74e61SPeter Brune .  Y - initial correction
34586d74e61SPeter Brune 
34686d74e61SPeter Brune    Output Arguments:
34786d74e61SPeter Brune +  Y - correction, possibly modified
34886d74e61SPeter Brune -  changed - flag indicating that Y was modified
34986d74e61SPeter Brune 
35086d74e61SPeter Brune    Options Database Key:
35186d74e61SPeter Brune +  -snes_ls_precheck_picard - activate this routine
35286d74e61SPeter Brune -  -snes_ls_precheck_picard_angle - angle
35386d74e61SPeter Brune 
35486d74e61SPeter Brune    Level: advanced
35586d74e61SPeter Brune 
35686d74e61SPeter Brune    Notes:
35786d74e61SPeter Brune    This function should be passed to SNESLineSearchSetPreCheck()
35886d74e61SPeter Brune 
35986d74e61SPeter Brune    The justification for this method involves the linear convergence of a Picard iteration
36086d74e61SPeter Brune    so the Picard linearization should be provided in place of the "Jacobian". This correction
36186d74e61SPeter Brune    is generally not useful when using a Newton linearization.
36286d74e61SPeter Brune 
36386d74e61SPeter Brune    Reference:
36486d74e61SPeter Brune    Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology.
36586d74e61SPeter Brune 
36686d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck()
36786d74e61SPeter Brune @*/
36886d74e61SPeter Brune PetscErrorCode PetscLineSearchPreCheckPicard(PetscLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
36986d74e61SPeter Brune {
37086d74e61SPeter Brune   PetscErrorCode ierr;
37186d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
37286d74e61SPeter Brune   Vec            Ylast;
37386d74e61SPeter Brune   PetscScalar    dot;
37486d74e61SPeter Brune   PetscInt       iter;
37586d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
37686d74e61SPeter Brune   SNES           snes;
37786d74e61SPeter Brune 
37886d74e61SPeter Brune   PetscFunctionBegin;
37986d74e61SPeter Brune   ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
38086d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
38186d74e61SPeter Brune   if (!Ylast) {
38286d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
38386d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
38486d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
38586d74e61SPeter Brune   }
38686d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
38786d74e61SPeter Brune   if (iter < 2) {
38886d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
38986d74e61SPeter Brune     *changed = PETSC_FALSE;
39086d74e61SPeter Brune     PetscFunctionReturn(0);
39186d74e61SPeter Brune   }
39286d74e61SPeter Brune 
39386d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
39486d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
39586d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
39686d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
39786d74e61SPeter Brune   theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
39886d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
39986d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
40086d74e61SPeter Brune     /* Modify the step Y */
40186d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
40286d74e61SPeter Brune     ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
40386d74e61SPeter Brune     ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
40486d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
40586d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
40686d74e61SPeter Brune     ierr = VecScale(Y,alpha);CHKERRQ(ierr);
40786d74e61SPeter 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);
40886d74e61SPeter Brune   } else {
40986d74e61SPeter Brune     ierr = PetscInfo2(snes,"Angle %G degrees exceeds threshold %G, no correction applied\n",theta*180./PETSC_PI,angle);CHKERRQ(ierr);
41086d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
41186d74e61SPeter Brune     *changed = PETSC_FALSE;
412bf7f4e0aSPeter Brune   }
413bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
414bf7f4e0aSPeter Brune }
415bf7f4e0aSPeter Brune 
416bf7f4e0aSPeter Brune #undef __FUNCT__
4176188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply"
418f40b411bSPeter Brune /*@
4196188f407SPeter Brune    PetscLineSearchApply - Computes the line-search update
420f40b411bSPeter Brune 
4216188f407SPeter Brune    Collective on PetscLineSearch
422f40b411bSPeter Brune 
423f40b411bSPeter Brune    Input Parameters:
424f40b411bSPeter Brune +  linesearch - The linesearch instance.
425f40b411bSPeter Brune .  X - The current solution.
426f40b411bSPeter Brune .  F - The current function.
427f40b411bSPeter Brune .  fnorm - The current norm.
428f40b411bSPeter Brune .  Y - The search direction.
429f40b411bSPeter Brune 
430f40b411bSPeter Brune    Output Parameters:
431f40b411bSPeter Brune +  X - The new solution.
432f40b411bSPeter Brune .  F - The new function.
433f40b411bSPeter Brune -  fnorm - The new function norm.
434f40b411bSPeter Brune 
435f40b411bSPeter Brune    Level: Intermediate
436f40b411bSPeter Brune 
4376188f407SPeter Brune    .keywords: PetscLineSearch, Create
438f40b411bSPeter Brune 
4396188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchPreCheck(), PetscLineSearchPostCheck()
440f40b411bSPeter Brune @*/
4416188f407SPeter Brune PetscErrorCode PetscLineSearchApply(PetscLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
442bf7f4e0aSPeter Brune   PetscErrorCode ierr;
443bf7f4e0aSPeter Brune   PetscFunctionBegin;
444bf7f4e0aSPeter Brune 
445bf7f4e0aSPeter Brune   /* check the pointers */
4466188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
447bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
448bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
449bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
450bf7f4e0aSPeter Brune 
451bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
452bf7f4e0aSPeter Brune 
453bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
454bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
455bf7f4e0aSPeter Brune   linesearch->vec_func = F;
456bf7f4e0aSPeter Brune 
4576188f407SPeter Brune   ierr = PetscLineSearchSetUp(linesearch);CHKERRQ(ierr);
458bf7f4e0aSPeter Brune 
459bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
460bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
461bf7f4e0aSPeter Brune 
462bf7f4e0aSPeter Brune   if (fnorm) {
463bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
464bf7f4e0aSPeter Brune   } else {
465bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
466bf7f4e0aSPeter Brune   }
467bf7f4e0aSPeter Brune 
4686188f407SPeter Brune   ierr = PetscLogEventBegin(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
469bf7f4e0aSPeter Brune 
470bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
471bf7f4e0aSPeter Brune 
4726188f407SPeter Brune   ierr = PetscLogEventEnd(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
473bf7f4e0aSPeter Brune 
474bf7f4e0aSPeter Brune   if (fnorm)
475bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
476bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
477bf7f4e0aSPeter Brune }
478bf7f4e0aSPeter Brune 
479bf7f4e0aSPeter Brune #undef __FUNCT__
4806188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy"
481f40b411bSPeter Brune /*@
4826188f407SPeter Brune    PetscLineSearchDestroy - Destroys the line search instance.
483f40b411bSPeter Brune 
4846188f407SPeter Brune    Collective on PetscLineSearch
485f40b411bSPeter Brune 
486f40b411bSPeter Brune    Input Parameters:
487f40b411bSPeter Brune .  linesearch - The linesearch instance.
488f40b411bSPeter Brune 
489f40b411bSPeter Brune    Level: Intermediate
490f40b411bSPeter Brune 
4916188f407SPeter Brune    .keywords: PetscLineSearch, Create
492f40b411bSPeter Brune 
4936188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchReset()
494f40b411bSPeter Brune @*/
4956188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy(PetscLineSearch * linesearch) {
496bf7f4e0aSPeter Brune   PetscErrorCode ierr;
497bf7f4e0aSPeter Brune   PetscFunctionBegin;
498bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
4996188f407SPeter Brune   PetscValidHeaderSpecific((*linesearch),PETSCLINESEARCH_CLASSID,1);
500bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
501bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
5026188f407SPeter Brune   ierr = PetscLineSearchReset(*linesearch);
503bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
504bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
505bf7f4e0aSPeter Brune   }
506bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
507e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
508bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
509bf7f4e0aSPeter Brune }
510bf7f4e0aSPeter Brune 
511bf7f4e0aSPeter Brune #undef __FUNCT__
5126188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetMonitor"
513f40b411bSPeter Brune /*@
5146188f407SPeter Brune    PetscLineSearchSetMonitor - Turns on/off printing useful things about the line search.
515bf7f4e0aSPeter Brune 
516bf7f4e0aSPeter Brune    Input Parameters:
517bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
518bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
519bf7f4e0aSPeter Brune 
520bf7f4e0aSPeter Brune    Logically Collective on SNES
521bf7f4e0aSPeter Brune 
522bf7f4e0aSPeter Brune    Options Database:
523f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
524bf7f4e0aSPeter Brune 
525bf7f4e0aSPeter Brune    Level: intermediate
526bf7f4e0aSPeter Brune 
527bf7f4e0aSPeter Brune 
5286188f407SPeter Brune .seealso: PetscLineSearchGetMonitor()
529bf7f4e0aSPeter Brune @*/
5306188f407SPeter Brune PetscErrorCode  PetscLineSearchSetMonitor(PetscLineSearch linesearch, PetscBool flg)
531bf7f4e0aSPeter Brune {
532bf7f4e0aSPeter Brune 
533bf7f4e0aSPeter Brune   PetscErrorCode ierr;
534bf7f4e0aSPeter Brune   PetscFunctionBegin;
535bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
536bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
537bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
538bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
539bf7f4e0aSPeter Brune   }
540bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
541bf7f4e0aSPeter Brune }
542bf7f4e0aSPeter Brune 
543bf7f4e0aSPeter Brune #undef __FUNCT__
5446188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetMonitor"
545f40b411bSPeter Brune /*@
5466188f407SPeter Brune    PetscLineSearchGetMonitor - Gets the monitor instance for the line search
5476a388c36SPeter Brune 
548f40b411bSPeter Brune    Input Parameters:
549f40b411bSPeter Brune .  linesearch - linesearch context.
550f40b411bSPeter Brune 
551f40b411bSPeter Brune    Input Parameters:
552f40b411bSPeter Brune .  monitor - monitor context.
553f40b411bSPeter Brune 
554f40b411bSPeter Brune    Logically Collective on SNES
555f40b411bSPeter Brune 
556f40b411bSPeter Brune 
557f40b411bSPeter Brune    Options Database Keys:
558f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
559f40b411bSPeter Brune 
560f40b411bSPeter Brune    Level: intermediate
561f40b411bSPeter Brune 
562f40b411bSPeter Brune 
5636188f407SPeter Brune .seealso: PetscLineSearchSetMonitor()
564f40b411bSPeter Brune @*/
5656188f407SPeter Brune PetscErrorCode  PetscLineSearchGetMonitor(PetscLineSearch linesearch, PetscViewer *monitor)
5666a388c36SPeter Brune {
5676a388c36SPeter Brune 
5686a388c36SPeter Brune   PetscFunctionBegin;
5696188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
5706a388c36SPeter Brune   if (monitor) {
5716a388c36SPeter Brune     PetscValidPointer(monitor, 2);
5726a388c36SPeter Brune     *monitor = linesearch->monitor;
5736a388c36SPeter Brune   }
5746a388c36SPeter Brune   PetscFunctionReturn(0);
5756a388c36SPeter Brune }
5766a388c36SPeter Brune 
5776a388c36SPeter Brune #undef __FUNCT__
5786188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetFromOptions"
579f40b411bSPeter Brune /*@
5806188f407SPeter Brune    PetscLineSearchSetFromOptions - Sets options for the line search
581f40b411bSPeter Brune 
582f40b411bSPeter Brune    Input Parameters:
583f40b411bSPeter Brune .  linesearch - linesearch context.
584f40b411bSPeter Brune 
585f40b411bSPeter Brune    Options Database Keys:
586f40b411bSPeter Brune + -linesearch_type - The Line search method
587f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches
588f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter.
589f40b411bSPeter Brune . -linesearch_norms   - Turn on/off the linesearch norms
590f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess.
591f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches.
592f40b411bSPeter Brune 
5936188f407SPeter Brune    Logically Collective on PetscLineSearch
594f40b411bSPeter Brune 
595f40b411bSPeter Brune    Level: intermediate
596f40b411bSPeter Brune 
597f40b411bSPeter Brune 
5986188f407SPeter Brune .seealso: PetscLineSearchCreate()
599f40b411bSPeter Brune @*/
6006188f407SPeter Brune PetscErrorCode PetscLineSearchSetFromOptions(PetscLineSearch linesearch) {
601bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6026188f407SPeter Brune   const char     *deft = PETSCLINESEARCHBASIC;
603bf7f4e0aSPeter Brune   char           type[256];
604bf7f4e0aSPeter Brune   PetscBool      flg, set;
605bf7f4e0aSPeter Brune   PetscFunctionBegin;
6066188f407SPeter Brune   if (!PetscLineSearchRegisterAllCalled) {ierr = PetscLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
607bf7f4e0aSPeter Brune 
608bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
609bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
610bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
611bf7f4e0aSPeter Brune   }
6126188f407SPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","PetscLineSearchSetType",PetscLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
613bf7f4e0aSPeter Brune   if (flg) {
6146188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,type);CHKERRQ(ierr);
615bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
6166188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
617bf7f4e0aSPeter Brune   }
618bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
619bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
620bf7f4e0aSPeter Brune   }
621bf7f4e0aSPeter Brune 
6226188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESPetscLineSearchSetMonitor",
623bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
6246188f407SPeter Brune   if (set) {ierr = PetscLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
625bf7f4e0aSPeter Brune 
6266188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","PetscLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
6276188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","PetscLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
6286188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","PetscLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
6296188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","PetscLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
630bf7f4e0aSPeter Brune   ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
631bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
632bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
633bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
634bf7f4e0aSPeter Brune }
635bf7f4e0aSPeter Brune 
636bf7f4e0aSPeter Brune #undef __FUNCT__
6376188f407SPeter Brune #define __FUNCT__ "PetscLineSearchView"
638f40b411bSPeter Brune /*@
6396188f407SPeter Brune    PetscLineSearchView - Views useful information for the line search.
640f40b411bSPeter Brune 
641f40b411bSPeter Brune    Input Parameters:
642f40b411bSPeter Brune .  linesearch - linesearch context.
643f40b411bSPeter Brune 
6446188f407SPeter Brune    Logically Collective on PetscLineSearch
645f40b411bSPeter Brune 
646f40b411bSPeter Brune    Level: intermediate
647f40b411bSPeter Brune 
648f40b411bSPeter Brune 
6496188f407SPeter Brune .seealso: PetscLineSearchCreate()
650f40b411bSPeter Brune @*/
6516188f407SPeter Brune PetscErrorCode PetscLineSearchView(PetscLineSearch linesearch) {
652bf7f4e0aSPeter Brune   PetscFunctionBegin;
653f40b411bSPeter Brune 
654bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
655bf7f4e0aSPeter Brune }
656bf7f4e0aSPeter Brune 
657bf7f4e0aSPeter Brune #undef __FUNCT__
6586188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetType"
659f40b411bSPeter Brune /*@
6606188f407SPeter Brune    PetscLineSearchSetType - Sets the linesearch type
661f40b411bSPeter Brune 
662f40b411bSPeter Brune    Input Parameters:
663f40b411bSPeter Brune +  linesearch - linesearch context.
664f40b411bSPeter Brune -  type - The type of line search to be used
665f40b411bSPeter Brune 
6666188f407SPeter Brune    Logically Collective on PetscLineSearch
667f40b411bSPeter Brune 
668f40b411bSPeter Brune    Level: intermediate
669f40b411bSPeter Brune 
670f40b411bSPeter Brune 
6716188f407SPeter Brune .seealso: PetscLineSearchCreate()
672f40b411bSPeter Brune @*/
6736188f407SPeter Brune PetscErrorCode PetscLineSearchSetType(PetscLineSearch linesearch, const PetscLineSearchType type)
674bf7f4e0aSPeter Brune {
675bf7f4e0aSPeter Brune 
6766188f407SPeter Brune   PetscErrorCode ierr,(*r)(PetscLineSearch);
677bf7f4e0aSPeter Brune   PetscBool      match;
678bf7f4e0aSPeter Brune 
679bf7f4e0aSPeter Brune   PetscFunctionBegin;
6806188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
681bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
682bf7f4e0aSPeter Brune 
683bf7f4e0aSPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
684bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
685bf7f4e0aSPeter Brune 
6866188f407SPeter Brune   ierr =  PetscFListFind(PetscLineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
687bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
688bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
689bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
690bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
691bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
692bf7f4e0aSPeter Brune   }
6936188f407SPeter Brune   /* Reinitialize function pointers in PetscLineSearchOps structure */
694bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
695bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
696bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
697bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
698bf7f4e0aSPeter Brune 
699bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
700bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
701bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
702bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
703bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
704bf7f4e0aSPeter Brune   }
705bf7f4e0aSPeter Brune #endif
706bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
707bf7f4e0aSPeter Brune }
708bf7f4e0aSPeter Brune 
709bf7f4e0aSPeter Brune #undef __FUNCT__
7106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSNES"
711f40b411bSPeter Brune /*@
7126188f407SPeter Brune    PetscLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation
713f40b411bSPeter Brune 
714f40b411bSPeter Brune    Input Parameters:
715f40b411bSPeter Brune +  linesearch - linesearch context.
716f40b411bSPeter Brune -  snes - The snes instance
717f40b411bSPeter Brune 
718f40b411bSPeter Brune    Level: intermediate
719f40b411bSPeter Brune 
720f40b411bSPeter Brune 
7216188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
722f40b411bSPeter Brune @*/
7236188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSNES(PetscLineSearch linesearch, SNES snes){
724bf7f4e0aSPeter Brune   PetscFunctionBegin;
7256188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
726bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
727bf7f4e0aSPeter Brune   linesearch->snes = snes;
728bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
729bf7f4e0aSPeter Brune }
730bf7f4e0aSPeter Brune 
731bf7f4e0aSPeter Brune #undef __FUNCT__
7326188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSNES"
733f40b411bSPeter Brune /*@
7346188f407SPeter Brune    PetscLineSearchGetSNES - Gets the SNES for the linesearch for function evaluation
735f40b411bSPeter Brune 
736f40b411bSPeter Brune    Input Parameters:
737f40b411bSPeter Brune .  linesearch - linesearch context.
738f40b411bSPeter Brune 
739f40b411bSPeter Brune    Output Parameters:
740f40b411bSPeter Brune .  snes - The snes instance
741f40b411bSPeter Brune 
742f40b411bSPeter Brune    Level: intermediate
743f40b411bSPeter Brune 
7446188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
745f40b411bSPeter Brune @*/
7466188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSNES(PetscLineSearch linesearch, SNES *snes){
747bf7f4e0aSPeter Brune   PetscFunctionBegin;
7486188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7496a388c36SPeter Brune   PetscValidPointer(snes, 2);
750bf7f4e0aSPeter Brune   *snes = linesearch->snes;
751bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
752bf7f4e0aSPeter Brune }
753bf7f4e0aSPeter Brune 
7546a388c36SPeter Brune #undef __FUNCT__
7556188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetLambda"
756f40b411bSPeter Brune /*@
7576188f407SPeter Brune    PetscLineSearchGetLambda - Gets the last linesearch steplength discovered.
758f40b411bSPeter Brune 
759f40b411bSPeter Brune    Input Parameters:
760f40b411bSPeter Brune .  linesearch - linesearch context.
761f40b411bSPeter Brune 
762f40b411bSPeter Brune    Output Parameters:
763f40b411bSPeter Brune .  lambda - The last steplength.
764f40b411bSPeter Brune 
765f40b411bSPeter Brune    Level: intermediate
766f40b411bSPeter Brune 
7676188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
768f40b411bSPeter Brune @*/
7696188f407SPeter Brune PetscErrorCode  PetscLineSearchGetLambda(PetscLineSearch linesearch,PetscReal *lambda)
7706a388c36SPeter Brune {
7716a388c36SPeter Brune   PetscFunctionBegin;
7726188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7736a388c36SPeter Brune   PetscValidPointer(lambda, 2);
7746a388c36SPeter Brune   *lambda = linesearch->lambda;
7756a388c36SPeter Brune   PetscFunctionReturn(0);
7766a388c36SPeter Brune }
7776a388c36SPeter Brune 
7786a388c36SPeter Brune #undef __FUNCT__
7796188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetLambda"
780f40b411bSPeter Brune /*@
7816188f407SPeter Brune    PetscLineSearchSetLambda - Sets the linesearch steplength.
782f40b411bSPeter Brune 
783f40b411bSPeter Brune    Input Parameters:
784f40b411bSPeter Brune +  linesearch - linesearch context.
785f40b411bSPeter Brune -  lambda - The last steplength.
786f40b411bSPeter Brune 
787f40b411bSPeter Brune    Level: intermediate
788f40b411bSPeter Brune 
7896188f407SPeter Brune .seealso: PetscLineSearchGetLambda()
790f40b411bSPeter Brune @*/
7916188f407SPeter Brune PetscErrorCode  PetscLineSearchSetLambda(PetscLineSearch linesearch, PetscReal lambda)
7926a388c36SPeter Brune {
7936a388c36SPeter Brune   PetscFunctionBegin;
7946188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7956a388c36SPeter Brune   linesearch->lambda = lambda;
7966a388c36SPeter Brune   PetscFunctionReturn(0);
7976a388c36SPeter Brune }
7986a388c36SPeter Brune 
7996a388c36SPeter Brune #undef  __FUNCT__
8006188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetTolerances"
801f40b411bSPeter Brune /*@
8026188f407SPeter Brune    PetscLineSearchGetTolerances - Gets the tolerances for the method
803f40b411bSPeter Brune 
804f40b411bSPeter Brune    Input Parameters:
805f40b411bSPeter Brune .  linesearch - linesearch context.
806f40b411bSPeter Brune 
807f40b411bSPeter Brune    Output Parameters:
808516fe3c3SPeter Brune +  steptol - The minimum steplength
809516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
810516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
811516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
812516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
813f40b411bSPeter Brune 
814f40b411bSPeter Brune 
815516fe3c3SPeter Brune    Level: advanced
816516fe3c3SPeter Brune 
8176188f407SPeter Brune .seealso: PetscLineSearchSetTolerances()
818f40b411bSPeter Brune @*/
8196188f407SPeter Brune PetscErrorCode  PetscLineSearchGetTolerances(PetscLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
8206a388c36SPeter Brune {
8216a388c36SPeter Brune   PetscFunctionBegin;
8226188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
823516fe3c3SPeter Brune   if (steptol) {
8246a388c36SPeter Brune     PetscValidPointer(steptol, 2);
8256a388c36SPeter Brune     *steptol = linesearch->steptol;
826516fe3c3SPeter Brune   }
827516fe3c3SPeter Brune   if (maxstep) {
828516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
829516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
830516fe3c3SPeter Brune   }
831516fe3c3SPeter Brune   if (rtol) {
832516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
833516fe3c3SPeter Brune     *rtol = linesearch->rtol;
834516fe3c3SPeter Brune   }
835516fe3c3SPeter Brune   if (atol) {
836516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
837516fe3c3SPeter Brune     *atol = linesearch->atol;
838516fe3c3SPeter Brune   }
839516fe3c3SPeter Brune   if (ltol) {
840516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
841516fe3c3SPeter Brune     *ltol = linesearch->ltol;
842516fe3c3SPeter Brune   }
843516fe3c3SPeter Brune   if (max_its) {
844516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
845516fe3c3SPeter Brune     *max_its = linesearch->max_its;
846516fe3c3SPeter Brune   }
8476a388c36SPeter Brune   PetscFunctionReturn(0);
8486a388c36SPeter Brune }
8496a388c36SPeter Brune 
8506a388c36SPeter Brune #undef  __FUNCT__
8516188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetTolerances"
852f40b411bSPeter Brune /*@
8536188f407SPeter Brune    PetscLineSearchSetTolerances - Sets the tolerances for the method
854f40b411bSPeter Brune 
855f40b411bSPeter Brune    Input Parameters:
856516fe3c3SPeter Brune +  linesearch - linesearch context.
857516fe3c3SPeter Brune .  steptol - The minimum steplength
858516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
859516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
860516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
861516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
862f40b411bSPeter Brune 
863f40b411bSPeter Brune 
864516fe3c3SPeter Brune    Level: advanced
865516fe3c3SPeter Brune 
8666188f407SPeter Brune .seealso: PetscLineSearchGetTolerances()
867f40b411bSPeter Brune @*/
8686188f407SPeter Brune PetscErrorCode  PetscLineSearchSetTolerances(PetscLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
8696a388c36SPeter Brune {
8706a388c36SPeter Brune   PetscFunctionBegin;
8716188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
8726a388c36SPeter Brune   linesearch->steptol = steptol;
873516fe3c3SPeter Brune   linesearch->maxstep = maxstep;
874516fe3c3SPeter Brune   linesearch->rtol = rtol;
875516fe3c3SPeter Brune   linesearch->atol = atol;
876516fe3c3SPeter Brune   linesearch->ltol = ltol;
877516fe3c3SPeter Brune   linesearch->max_its = max_its;
8786a388c36SPeter Brune   PetscFunctionReturn(0);
8796a388c36SPeter Brune }
8806a388c36SPeter Brune 
881516fe3c3SPeter Brune 
8826a388c36SPeter Brune #undef __FUNCT__
8836188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetDamping"
884f40b411bSPeter Brune /*@
8856188f407SPeter Brune    PetscLineSearchGetDamping - Gets the line search damping parameter.
886f40b411bSPeter Brune 
887f40b411bSPeter Brune    Input Parameters:
888f40b411bSPeter Brune .  linesearch - linesearch context.
889f40b411bSPeter Brune 
890f40b411bSPeter Brune    Output Parameters:
891f40b411bSPeter Brune .  damping - The damping parameter.
892f40b411bSPeter Brune 
893f40b411bSPeter Brune    Level: intermediate
894f40b411bSPeter Brune 
8956188f407SPeter Brune .seealso: PetscLineSearchGetStepTolerance()
896f40b411bSPeter Brune @*/
897f40b411bSPeter Brune 
8986188f407SPeter Brune PetscErrorCode  PetscLineSearchGetDamping(PetscLineSearch linesearch,PetscReal *damping)
8996a388c36SPeter Brune {
9006a388c36SPeter Brune   PetscFunctionBegin;
9016188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9026a388c36SPeter Brune   PetscValidPointer(damping, 2);
9036a388c36SPeter Brune   *damping = linesearch->damping;
9046a388c36SPeter Brune   PetscFunctionReturn(0);
9056a388c36SPeter Brune }
9066a388c36SPeter Brune 
9076a388c36SPeter Brune #undef __FUNCT__
9086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetDamping"
909f40b411bSPeter Brune /*@
9106188f407SPeter Brune    PetscLineSearchSetDamping - Sets the line search damping paramter.
911f40b411bSPeter Brune 
912f40b411bSPeter Brune    Input Parameters:
913f40b411bSPeter Brune .  linesearch - linesearch context.
914f40b411bSPeter Brune .  damping - The damping parameter.
915f40b411bSPeter Brune 
916f40b411bSPeter Brune    Level: intermediate
917f40b411bSPeter Brune 
9186188f407SPeter Brune .seealso: PetscLineSearchGetDamping()
919f40b411bSPeter Brune @*/
9206188f407SPeter Brune PetscErrorCode  PetscLineSearchSetDamping(PetscLineSearch linesearch,PetscReal damping)
9216a388c36SPeter Brune {
9226a388c36SPeter Brune   PetscFunctionBegin;
9236188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9246a388c36SPeter Brune   linesearch->damping = damping;
9256a388c36SPeter Brune   PetscFunctionReturn(0);
9266a388c36SPeter Brune }
9276a388c36SPeter Brune 
9286a388c36SPeter Brune #undef __FUNCT__
9296188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetNorms"
930f40b411bSPeter Brune /*@
9316188f407SPeter Brune    PetscLineSearchGetNorms - Gets the norms for for X, Y, and F.
932f40b411bSPeter Brune 
933f40b411bSPeter Brune    Input Parameters:
934f40b411bSPeter Brune .  linesearch - linesearch context.
935f40b411bSPeter Brune 
936f40b411bSPeter Brune    Output Parameters:
937f40b411bSPeter Brune +  xnorm - The norm of the current solution
938f40b411bSPeter Brune .  fnorm - The norm of the current function
939f40b411bSPeter Brune -  ynorm - The norm of the current update
940f40b411bSPeter Brune 
941f40b411bSPeter Brune    Level: intermediate
942f40b411bSPeter Brune 
9436188f407SPeter Brune .seealso: PetscLineSearchSetNorms() PetscLineSearchGetVecs()
944f40b411bSPeter Brune @*/
9456188f407SPeter Brune PetscErrorCode  PetscLineSearchGetNorms(PetscLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
946bf7f4e0aSPeter Brune {
947bf7f4e0aSPeter Brune   PetscFunctionBegin;
9486188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
949bf7f4e0aSPeter Brune   if (xnorm) {
950bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
951bf7f4e0aSPeter Brune   }
952bf7f4e0aSPeter Brune   if (fnorm) {
953bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
954bf7f4e0aSPeter Brune   }
955bf7f4e0aSPeter Brune   if (ynorm) {
956bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
957bf7f4e0aSPeter Brune   }
958bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
959bf7f4e0aSPeter Brune }
960bf7f4e0aSPeter Brune 
961e7058c64SPeter Brune #undef __FUNCT__
9626188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetNorms"
963f40b411bSPeter Brune /*@
9646188f407SPeter Brune    PetscLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
965f40b411bSPeter Brune 
966f40b411bSPeter Brune    Input Parameters:
967f40b411bSPeter Brune +  linesearch - linesearch context.
968f40b411bSPeter Brune .  xnorm - The norm of the current solution
969f40b411bSPeter Brune .  fnorm - The norm of the current function
970f40b411bSPeter Brune -  ynorm - The norm of the current update
971f40b411bSPeter Brune 
972f40b411bSPeter Brune    Level: intermediate
973f40b411bSPeter Brune 
9746188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
975f40b411bSPeter Brune @*/
9766188f407SPeter Brune PetscErrorCode  PetscLineSearchSetNorms(PetscLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
9776a388c36SPeter Brune {
9786a388c36SPeter Brune   PetscFunctionBegin;
9796188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9806a388c36SPeter Brune   linesearch->xnorm = xnorm;
9816a388c36SPeter Brune   linesearch->fnorm = fnorm;
9826a388c36SPeter Brune   linesearch->ynorm = ynorm;
9836a388c36SPeter Brune   PetscFunctionReturn(0);
9846a388c36SPeter Brune }
9856a388c36SPeter Brune 
9866a388c36SPeter Brune #undef __FUNCT__
9876188f407SPeter Brune #define __FUNCT__ "PetscLineSearchComputeNorms"
988f40b411bSPeter Brune /*@
9896188f407SPeter Brune    PetscLineSearchComputeNorms - Computes the norms of X, F, and Y.
990f40b411bSPeter Brune 
991f40b411bSPeter Brune    Input Parameters:
992f40b411bSPeter Brune .  linesearch - linesearch context.
993f40b411bSPeter Brune 
994f40b411bSPeter Brune    Options Database Keys:
995f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
996f40b411bSPeter Brune 
997f40b411bSPeter Brune    Level: intermediate
998f40b411bSPeter Brune 
9996188f407SPeter Brune .seealso: PetscLineSearchGetNorms, PetscLineSearchSetNorms()
1000f40b411bSPeter Brune @*/
10016188f407SPeter Brune PetscErrorCode PetscLineSearchComputeNorms(PetscLineSearch linesearch)
10026a388c36SPeter Brune {
10036a388c36SPeter Brune   PetscErrorCode ierr;
1004*9bd66eb0SPeter Brune   SNES snes;
10056a388c36SPeter Brune   PetscFunctionBegin;
10066a388c36SPeter Brune   if (linesearch->norms) {
1007*9bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
1008*9bd66eb0SPeter Brune       ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
1009*9bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
1010*9bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
1011*9bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
1012*9bd66eb0SPeter Brune     } else {
10136a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10146a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10156a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10166a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10176a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10186a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10196a388c36SPeter Brune     }
1020*9bd66eb0SPeter Brune   }
10216a388c36SPeter Brune   PetscFunctionReturn(0);
10226a388c36SPeter Brune }
10236a388c36SPeter Brune 
10246a388c36SPeter Brune #undef __FUNCT__
10256188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetVecs"
1026f40b411bSPeter Brune /*@
10276188f407SPeter Brune    PetscLineSearchGetVecs - Gets the vectors from the PetscLineSearch context
1028f40b411bSPeter Brune 
1029f40b411bSPeter Brune    Input Parameters:
1030f40b411bSPeter Brune .  linesearch - linesearch context.
1031f40b411bSPeter Brune 
1032f40b411bSPeter Brune    Output Parameters:
1033f40b411bSPeter Brune +  X - The old solution
1034f40b411bSPeter Brune .  F - The old function
1035f40b411bSPeter Brune .  Y - The search direction
1036f40b411bSPeter Brune .  W - The new solution
1037f40b411bSPeter Brune -  G - The new function
1038f40b411bSPeter Brune 
1039f40b411bSPeter Brune    Level: intermediate
1040f40b411bSPeter Brune 
10416188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
1042f40b411bSPeter Brune @*/
10436188f407SPeter Brune PetscErrorCode PetscLineSearchGetVecs(PetscLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
10446a388c36SPeter Brune   PetscFunctionBegin;
10456188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
10466a388c36SPeter Brune   if (X) {
10476a388c36SPeter Brune     PetscValidPointer(X, 2);
10486a388c36SPeter Brune     *X = linesearch->vec_sol;
10496a388c36SPeter Brune   }
10506a388c36SPeter Brune   if (F) {
10516a388c36SPeter Brune     PetscValidPointer(F, 3);
10526a388c36SPeter Brune     *F = linesearch->vec_func;
10536a388c36SPeter Brune   }
10546a388c36SPeter Brune   if (Y) {
10556a388c36SPeter Brune     PetscValidPointer(Y, 4);
10566a388c36SPeter Brune     *Y = linesearch->vec_update;
10576a388c36SPeter Brune   }
10586a388c36SPeter Brune   if (W) {
10596a388c36SPeter Brune     PetscValidPointer(W, 5);
10606a388c36SPeter Brune     *W = linesearch->vec_sol_new;
10616a388c36SPeter Brune   }
10626a388c36SPeter Brune   if (G) {
10636a388c36SPeter Brune     PetscValidPointer(G, 6);
10646a388c36SPeter Brune     *G = linesearch->vec_func_new;
10656a388c36SPeter Brune   }
10666a388c36SPeter Brune 
10676a388c36SPeter Brune   PetscFunctionReturn(0);
10686a388c36SPeter Brune }
10696a388c36SPeter Brune 
10706a388c36SPeter Brune #undef __FUNCT__
10716188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetVecs"
1072f40b411bSPeter Brune /*@
10736188f407SPeter Brune    PetscLineSearchSetVecs - Sets the vectors on the PetscLineSearch context
1074f40b411bSPeter Brune 
1075f40b411bSPeter Brune    Input Parameters:
1076f40b411bSPeter Brune +  linesearch - linesearch context.
1077f40b411bSPeter Brune .  X - The old solution
1078f40b411bSPeter Brune .  F - The old function
1079f40b411bSPeter Brune .  Y - The search direction
1080f40b411bSPeter Brune .  W - The new solution
1081f40b411bSPeter Brune -  G - The new function
1082f40b411bSPeter Brune 
1083f40b411bSPeter Brune    Level: intermediate
1084f40b411bSPeter Brune 
10856188f407SPeter Brune .seealso: PetscLineSearchSetNorms(), PetscLineSearchGetVecs()
1086f40b411bSPeter Brune @*/
10876188f407SPeter Brune PetscErrorCode PetscLineSearchSetVecs(PetscLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
10886a388c36SPeter Brune   PetscFunctionBegin;
10896188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
10906a388c36SPeter Brune   if (X) {
10916a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
10926a388c36SPeter Brune     linesearch->vec_sol = X;
10936a388c36SPeter Brune   }
10946a388c36SPeter Brune   if (F) {
10956a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
10966a388c36SPeter Brune     linesearch->vec_func = F;
10976a388c36SPeter Brune   }
10986a388c36SPeter Brune   if (Y) {
10996a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
11006a388c36SPeter Brune     linesearch->vec_update = Y;
11016a388c36SPeter Brune   }
11026a388c36SPeter Brune   if (W) {
11036a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
11046a388c36SPeter Brune     linesearch->vec_sol_new = W;
11056a388c36SPeter Brune   }
11066a388c36SPeter Brune   if (G) {
11076a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
11086a388c36SPeter Brune     linesearch->vec_func_new = G;
11096a388c36SPeter Brune   }
11106a388c36SPeter Brune 
11116a388c36SPeter Brune   PetscFunctionReturn(0);
11126a388c36SPeter Brune }
11136a388c36SPeter Brune 
11146a388c36SPeter Brune #undef __FUNCT__
11156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchAppendOptionsPrefix"
1116e7058c64SPeter Brune /*@C
11176188f407SPeter Brune    PetscLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1118e7058c64SPeter Brune    SNES options in the database.
1119e7058c64SPeter Brune 
1120e7058c64SPeter Brune    Logically Collective on SNES
1121e7058c64SPeter Brune 
1122e7058c64SPeter Brune    Input Parameters:
1123e7058c64SPeter Brune +  snes - the SNES context
1124e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1125e7058c64SPeter Brune 
1126e7058c64SPeter Brune    Notes:
1127e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1128e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1129e7058c64SPeter Brune 
1130e7058c64SPeter Brune    Level: advanced
1131e7058c64SPeter Brune 
11326188f407SPeter Brune .keywords: PetscLineSearch, append, options, prefix, database
1133e7058c64SPeter Brune 
1134e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1135e7058c64SPeter Brune @*/
11366188f407SPeter Brune PetscErrorCode  PetscLineSearchAppendOptionsPrefix(PetscLineSearch linesearch,const char prefix[])
1137e7058c64SPeter Brune {
1138e7058c64SPeter Brune   PetscErrorCode ierr;
1139e7058c64SPeter Brune 
1140e7058c64SPeter Brune   PetscFunctionBegin;
11416188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
1142e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1143e7058c64SPeter Brune   PetscFunctionReturn(0);
1144e7058c64SPeter Brune }
1145e7058c64SPeter Brune 
1146e7058c64SPeter Brune #undef __FUNCT__
11476188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetOptionsPrefix"
1148e7058c64SPeter Brune /*@C
11496188f407SPeter Brune    PetscLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
11506188f407SPeter Brune    PetscLineSearch options in the database.
1151e7058c64SPeter Brune 
1152e7058c64SPeter Brune    Not Collective
1153e7058c64SPeter Brune 
1154e7058c64SPeter Brune    Input Parameter:
1155e7058c64SPeter Brune .  snes - the SNES context
1156e7058c64SPeter Brune 
1157e7058c64SPeter Brune    Output Parameter:
1158e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1159e7058c64SPeter Brune 
1160e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
1161e7058c64SPeter Brune    sufficient length to hold the prefix.
1162e7058c64SPeter Brune 
1163e7058c64SPeter Brune    Level: advanced
1164e7058c64SPeter Brune 
11656188f407SPeter Brune .keywords: PetscLineSearch, get, options, prefix, database
1166e7058c64SPeter Brune 
1167e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1168e7058c64SPeter Brune @*/
11696188f407SPeter Brune PetscErrorCode  PetscLineSearchGetOptionsPrefix(PetscLineSearch linesearch,const char *prefix[])
1170e7058c64SPeter Brune {
1171e7058c64SPeter Brune   PetscErrorCode ierr;
1172e7058c64SPeter Brune 
1173e7058c64SPeter Brune   PetscFunctionBegin;
11746188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
1175e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1176e7058c64SPeter Brune   PetscFunctionReturn(0);
1177e7058c64SPeter Brune }
1178bf7f4e0aSPeter Brune 
1179bf7f4e0aSPeter Brune #undef __FUNCT__
11806188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetWork"
1181f40b411bSPeter Brune /*@
11826188f407SPeter Brune    PetscLineSearchGetWork - Gets work vectors for the line search.
1183f40b411bSPeter Brune 
1184f40b411bSPeter Brune    Input Parameter:
11856188f407SPeter Brune +  linesearch - the PetscLineSearch context
1186f40b411bSPeter Brune -  nwork - the number of work vectors
1187f40b411bSPeter Brune 
1188f40b411bSPeter Brune    Level: developer
1189f40b411bSPeter Brune 
11906188f407SPeter Brune .keywords: PetscLineSearch, work, vector
1191f40b411bSPeter Brune 
1192f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1193f40b411bSPeter Brune @*/
11946188f407SPeter Brune PetscErrorCode  PetscLineSearchGetWork(PetscLineSearch linesearch, PetscInt nwork)
1195bf7f4e0aSPeter Brune {
1196bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1197bf7f4e0aSPeter Brune   PetscFunctionBegin;
1198bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1199bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
1200bf7f4e0aSPeter Brune   } else {
1201bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1202bf7f4e0aSPeter Brune   }
1203bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1204bf7f4e0aSPeter Brune }
1205bf7f4e0aSPeter Brune 
12066a388c36SPeter Brune 
1207bf7f4e0aSPeter Brune #undef __FUNCT__
12086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSuccess"
1209f40b411bSPeter Brune /*@
12106188f407SPeter Brune    PetscLineSearchGetSuccess - Gets the success/failure status of the last line search application
1211f40b411bSPeter Brune 
1212f40b411bSPeter Brune    Input Parameters:
1213f40b411bSPeter Brune .  linesearch - linesearch context.
1214f40b411bSPeter Brune 
1215f40b411bSPeter Brune    Output Parameters:
1216f40b411bSPeter Brune .  success - The success or failure status.
1217f40b411bSPeter Brune 
1218f40b411bSPeter Brune    Level: intermediate
1219f40b411bSPeter Brune 
12206188f407SPeter Brune .seealso: PetscLineSearchSetSuccess()
1221f40b411bSPeter Brune @*/
12226188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSuccess(PetscLineSearch linesearch, PetscBool *success)
1223bf7f4e0aSPeter Brune {
1224bf7f4e0aSPeter Brune   PetscFunctionBegin;
12256188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
12266a388c36SPeter Brune   PetscValidPointer(success, 2);
1227bf7f4e0aSPeter Brune   if (success) {
1228bf7f4e0aSPeter Brune     *success = linesearch->success;
1229bf7f4e0aSPeter Brune   }
1230bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1231bf7f4e0aSPeter Brune }
1232bf7f4e0aSPeter Brune 
1233bf7f4e0aSPeter Brune #undef __FUNCT__
12346188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSuccess"
1235f40b411bSPeter Brune /*@
12366188f407SPeter Brune    PetscLineSearchSetSuccess - Sets the success/failure status of the last line search application
1237f40b411bSPeter Brune 
1238f40b411bSPeter Brune    Input Parameters:
1239f40b411bSPeter Brune +  linesearch - linesearch context.
1240f40b411bSPeter Brune -  success - The success or failure status.
1241f40b411bSPeter Brune 
1242f40b411bSPeter Brune    Level: intermediate
1243f40b411bSPeter Brune 
12446188f407SPeter Brune .seealso: PetscLineSearchGetSuccess()
1245f40b411bSPeter Brune @*/
12466188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSuccess(PetscLineSearch linesearch, PetscBool success)
12476a388c36SPeter Brune {
12486188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
12496a388c36SPeter Brune   PetscFunctionBegin;
12506a388c36SPeter Brune   linesearch->success = success;
12516a388c36SPeter Brune   PetscFunctionReturn(0);
12526a388c36SPeter Brune }
12536a388c36SPeter Brune 
12546a388c36SPeter Brune #undef __FUNCT__
1255*9bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchSetVIFunctions"
1256*9bd66eb0SPeter Brune /*@C
1257*9bd66eb0SPeter Brune    PetscLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
1258*9bd66eb0SPeter Brune 
1259*9bd66eb0SPeter Brune    Input Parameters:
1260*9bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
1261*9bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
1262*9bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
1263*9bd66eb0SPeter Brune 
1264*9bd66eb0SPeter Brune    Logically Collective on SNES
1265*9bd66eb0SPeter Brune 
1266*9bd66eb0SPeter Brune    Calling sequence of projectfunc:
1267*9bd66eb0SPeter Brune .vb
1268*9bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
1269*9bd66eb0SPeter Brune .ve
1270*9bd66eb0SPeter Brune 
1271*9bd66eb0SPeter Brune     Input parameters for projectfunc:
1272*9bd66eb0SPeter Brune +   snes - nonlinear context
1273*9bd66eb0SPeter Brune -   X - current solution
1274*9bd66eb0SPeter Brune 
1275*9bd66eb0SPeter Brune     Output parameters for func:
1276*9bd66eb0SPeter Brune .   X - Projected solution
1277*9bd66eb0SPeter Brune 
1278*9bd66eb0SPeter Brune    Calling sequence of normfunc:
1279*9bd66eb0SPeter Brune .vb
1280*9bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
1281*9bd66eb0SPeter Brune .ve
1282*9bd66eb0SPeter Brune 
1283*9bd66eb0SPeter Brune     Input parameters for projectfunc:
1284*9bd66eb0SPeter Brune +   snes - nonlinear context
1285*9bd66eb0SPeter Brune .   X - current solution
1286*9bd66eb0SPeter Brune -   F - current residual
1287*9bd66eb0SPeter Brune 
1288*9bd66eb0SPeter Brune     Output parameters for func:
1289*9bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
1290*9bd66eb0SPeter Brune 
1291*9bd66eb0SPeter Brune 
1292*9bd66eb0SPeter Brune     Level: developer
1293*9bd66eb0SPeter Brune 
1294*9bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
1295*9bd66eb0SPeter Brune 
1296*9bd66eb0SPeter Brune .seealso: PetscLineSearchGetVIFunctions(), PetscLineSearchSetPostCheck(), PetscLineSearchSetPreCheck()
1297*9bd66eb0SPeter Brune @*/
1298*9bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchSetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc projectfunc, PetscLineSearchVINormFunc normfunc)
1299*9bd66eb0SPeter Brune {
1300*9bd66eb0SPeter Brune   PetscFunctionBegin;
1301*9bd66eb0SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
1302*9bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
1303*9bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
1304*9bd66eb0SPeter Brune   PetscFunctionReturn(0);
1305*9bd66eb0SPeter Brune }
1306*9bd66eb0SPeter Brune 
1307*9bd66eb0SPeter Brune #undef __FUNCT__
1308*9bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchGetVIFunctions"
1309*9bd66eb0SPeter Brune /*@C
1310*9bd66eb0SPeter Brune    PetscLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
1311*9bd66eb0SPeter Brune 
1312*9bd66eb0SPeter Brune    Input Parameters:
1313*9bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
1314*9bd66eb0SPeter Brune 
1315*9bd66eb0SPeter Brune    Output Parameters:
1316*9bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
1317*9bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
1318*9bd66eb0SPeter Brune 
1319*9bd66eb0SPeter Brune    Logically Collective on SNES
1320*9bd66eb0SPeter Brune 
1321*9bd66eb0SPeter Brune     Level: developer
1322*9bd66eb0SPeter Brune 
1323*9bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
1324*9bd66eb0SPeter Brune 
1325*9bd66eb0SPeter Brune .seealso: PetscLineSearchSetVIFunctions(), PetscLineSearchGetPostCheck(), PetscLineSearchGetPreCheck()
1326*9bd66eb0SPeter Brune @*/
1327*9bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchGetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc *projectfunc, PetscLineSearchVINormFunc *normfunc)
1328*9bd66eb0SPeter Brune {
1329*9bd66eb0SPeter Brune   PetscFunctionBegin;
1330*9bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
1331*9bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
1332*9bd66eb0SPeter Brune   PetscFunctionReturn(0);
1333*9bd66eb0SPeter Brune }
1334*9bd66eb0SPeter Brune 
1335*9bd66eb0SPeter Brune #undef __FUNCT__
13366188f407SPeter Brune #define __FUNCT__ "PetscLineSearchRegister"
1337bf7f4e0aSPeter Brune /*@C
13386188f407SPeter Brune   PetscLineSearchRegister - See PetscLineSearchRegisterDynamic()
1339bf7f4e0aSPeter Brune 
1340bf7f4e0aSPeter Brune   Level: advanced
1341bf7f4e0aSPeter Brune @*/
13426188f407SPeter Brune PetscErrorCode  PetscLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscLineSearch))
1343bf7f4e0aSPeter Brune {
1344bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1345bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1346bf7f4e0aSPeter Brune 
1347bf7f4e0aSPeter Brune   PetscFunctionBegin;
1348bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
13496188f407SPeter Brune   ierr = PetscFListAdd(&PetscLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1350bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1351bf7f4e0aSPeter Brune }
1352