xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision ea5d4fccf296dd2bbd0f9c3a3343651cb1066da7)
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;
33*ea5d4fccSPeter Brune   PetscValidPointer(outlinesearch,2);
34*ea5d4fccSPeter Brune   *outlinesearch = PETSC_NULL;
356188f407SPeter Brune   ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,PETSCLINESEARCH_CLASSID, 0,
36*ea5d4fccSPeter Brune                            "PetscLineSearch","Line-search method","PetscLineSearch",comm,PetscLineSearchDestroy,PetscLineSearchView);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__
696188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetUp"
70f40b411bSPeter Brune /*@
716188f407SPeter Brune    PetscLineSearchSetUp - 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 
806188f407SPeter Brune    .keywords: PetscLineSearch, SetUp
81f40b411bSPeter Brune 
826188f407SPeter Brune    .seealso: PetscLineSearchReset()
83f40b411bSPeter Brune @*/
84f40b411bSPeter Brune 
856188f407SPeter Brune PetscErrorCode PetscLineSearchSetUp(PetscLineSearch linesearch) {
86bf7f4e0aSPeter Brune   PetscErrorCode ierr;
87bf7f4e0aSPeter Brune   PetscFunctionBegin;
88bf7f4e0aSPeter Brune   if (!((PetscObject)linesearch)->type_name) {
896188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,PETSCLINESEARCHBASIC);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__
1086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchReset"
109f40b411bSPeter Brune 
110f40b411bSPeter Brune /*@
1116188f407SPeter Brune    PetscLineSearchReset - Tears down the structures required for application
112f40b411bSPeter Brune 
1136188f407SPeter Brune    Collective on PetscLineSearch
114f40b411bSPeter Brune 
115f40b411bSPeter Brune    Input Parameters:
116f40b411bSPeter Brune .  linesearch - The LineSearch instance.
117f40b411bSPeter Brune 
118f40b411bSPeter Brune    Level: Intermediate
119f40b411bSPeter Brune 
1206188f407SPeter Brune    .keywords: PetscLineSearch, Create
121f40b411bSPeter Brune 
1226188f407SPeter Brune    .seealso: PetscLineSearchSetUp()
123f40b411bSPeter Brune @*/
124f40b411bSPeter Brune 
1256188f407SPeter Brune PetscErrorCode PetscLineSearchReset(PetscLineSearch 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__
14286d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPreCheck"
14386d74e61SPeter Brune /*@C
14486d74e61SPeter Brune    PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
14586d74e61SPeter Brune 
14686d74e61SPeter Brune    Logically Collective on PetscLineSearch
14786d74e61SPeter Brune 
14886d74e61SPeter Brune    Input Parameters:
14986d74e61SPeter Brune +  linesearch - the PetscLineSearch 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:
15586d74e61SPeter Brune $    func (PetscLineSearch 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 
16586d74e61SPeter Brune .seealso: PetscLineSearchSetPostCheck()
16686d74e61SPeter Brune @*/
16786d74e61SPeter Brune PetscErrorCode  PetscLineSearchSetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc func,void *ctx)
16886d74e61SPeter Brune {
1699bd66eb0SPeter Brune   PetscFunctionBegin;
17086d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
17886d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPreCheck"
17986d74e61SPeter Brune /*@C
18086d74e61SPeter Brune    PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine.
18186d74e61SPeter Brune 
18286d74e61SPeter Brune    Input Parameters:
18386d74e61SPeter Brune .  linesearch - the PetscLineSearch 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 
19486d74e61SPeter Brune .seealso: PetscLineSearchGetPostCheck(), PetscLineSearchSetPreCheck()
19586d74e61SPeter Brune @*/
19686d74e61SPeter Brune PetscErrorCode  PetscLineSearchGetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc *func,void **ctx)
19786d74e61SPeter Brune {
1989bd66eb0SPeter Brune   PetscFunctionBegin;
19986d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
20786d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPostCheck"
20886d74e61SPeter Brune /*@C
20986d74e61SPeter Brune    PetscLineSearchSetPostCheck - Sets a post-check function for the line search routine.
21086d74e61SPeter Brune 
21186d74e61SPeter Brune    Logically Collective on PetscLineSearch
21286d74e61SPeter Brune 
21386d74e61SPeter Brune    Input Parameters:
21486d74e61SPeter Brune +  linesearch - the PetscLineSearch 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:
22086d74e61SPeter Brune $    func (PetscLineSearch 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 
23286d74e61SPeter Brune .seealso: PetscLineSearchSetPreCheck()
23386d74e61SPeter Brune @*/
23486d74e61SPeter Brune PetscErrorCode  PetscLineSearchSetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc func,void *ctx)
23586d74e61SPeter Brune {
23686d74e61SPeter Brune   PetscFunctionBegin;
23786d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
24586d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPostCheck"
24686d74e61SPeter Brune /*@C
24786d74e61SPeter Brune    PetscLineSearchGetPostCheck - Gets the post-check function for the line search routine.
24886d74e61SPeter Brune 
24986d74e61SPeter Brune    Input Parameters:
25086d74e61SPeter Brune .  linesearch - the PetscLineSearch 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 
26186d74e61SPeter Brune .seealso: PetscLineSearchGetPreCheck(), PetscLineSearchSetPostCheck()
26286d74e61SPeter Brune @*/
26386d74e61SPeter Brune PetscErrorCode  PetscLineSearchGetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc *func,void **ctx)
26486d74e61SPeter Brune {
2659bd66eb0SPeter Brune   PetscFunctionBegin;
26686d74e61SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__
2746188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheck"
275f40b411bSPeter Brune /*@
2766188f407SPeter Brune    PetscLineSearchPreCheck - Prepares the line search for being applied.
277f40b411bSPeter Brune 
2786188f407SPeter Brune    Collective on PetscLineSearch
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 
2886188f407SPeter Brune    .keywords: PetscLineSearch, Create
289f40b411bSPeter Brune 
2906188f407SPeter Brune    .seealso: PetscLineSearchPostCheck()
291f40b411bSPeter Brune @*/
2926188f407SPeter Brune PetscErrorCode PetscLineSearchPreCheck(PetscLineSearch linesearch, PetscBool * changed)
293bf7f4e0aSPeter Brune {
294bf7f4e0aSPeter Brune   PetscErrorCode ierr;
295bf7f4e0aSPeter Brune   PetscFunctionBegin;
296bf7f4e0aSPeter Brune   *changed = PETSC_FALSE;
297bf7f4e0aSPeter Brune   if (linesearch->ops->precheckstep) {
298bf7f4e0aSPeter Brune     ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr);
299bf7f4e0aSPeter Brune   }
300bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
301bf7f4e0aSPeter Brune }
302bf7f4e0aSPeter Brune 
303bf7f4e0aSPeter Brune #undef __FUNCT__
3046188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPostCheck"
305f40b411bSPeter Brune /*@
3066188f407SPeter Brune    PetscLineSearchPostCheck - Prepares the line search for being applied.
307f40b411bSPeter Brune 
3086188f407SPeter Brune    Collective on PetscLineSearch
309f40b411bSPeter Brune 
310f40b411bSPeter Brune    Input Parameters:
311f40b411bSPeter Brune .  linesearch - The linesearch instance.
312f40b411bSPeter Brune 
313f40b411bSPeter Brune    Output Parameters:
31486d74e61SPeter Brune +  changed_Y - Indicator if the solution has been changed.
31586d74e61SPeter Brune -  changed_W - Indicator if the direction has been changed.
316f40b411bSPeter Brune 
317f40b411bSPeter Brune    Level: Intermediate
318f40b411bSPeter Brune 
3196188f407SPeter Brune    .keywords: PetscLineSearch, Create
320f40b411bSPeter Brune 
3216188f407SPeter Brune    .seealso: PetscLineSearchPreCheck()
322f40b411bSPeter Brune @*/
32386d74e61SPeter Brune PetscErrorCode PetscLineSearchPostCheck(PetscLineSearch 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) {
33086d74e61SPeter Brune     ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, linesearch->vec_sol_new, changed_Y, changed_W);CHKERRQ(ierr);
33186d74e61SPeter Brune   }
33286d74e61SPeter Brune   PetscFunctionReturn(0);
33386d74e61SPeter Brune }
33486d74e61SPeter Brune 
33586d74e61SPeter Brune 
33686d74e61SPeter Brune #undef __FUNCT__
33786d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheckPicard"
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 @*/
37086d74e61SPeter Brune PetscErrorCode PetscLineSearchPreCheckPicard(PetscLineSearch linesearch,Vec X,Vec Y,PetscBool *changed)
37186d74e61SPeter Brune {
37286d74e61SPeter Brune   PetscErrorCode ierr;
37386d74e61SPeter Brune   PetscReal      angle = *(PetscReal*)linesearch->precheckctx;
37486d74e61SPeter Brune   Vec            Ylast;
37586d74e61SPeter Brune   PetscScalar    dot;
37686d74e61SPeter Brune   PetscInt       iter;
37786d74e61SPeter Brune   PetscReal      ynorm,ylastnorm,theta,angle_radians;
37886d74e61SPeter Brune   SNES           snes;
37986d74e61SPeter Brune 
38086d74e61SPeter Brune   PetscFunctionBegin;
38186d74e61SPeter Brune   ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
38286d74e61SPeter Brune   ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr);
38386d74e61SPeter Brune   if (!Ylast) {
38486d74e61SPeter Brune     ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr);
38586d74e61SPeter Brune     ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr);
38686d74e61SPeter Brune     ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr);
38786d74e61SPeter Brune   }
38886d74e61SPeter Brune   ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr);
38986d74e61SPeter Brune   if (iter < 2) {
39086d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
39186d74e61SPeter Brune     *changed = PETSC_FALSE;
39286d74e61SPeter Brune     PetscFunctionReturn(0);
39386d74e61SPeter Brune   }
39486d74e61SPeter Brune 
39586d74e61SPeter Brune   ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr);
39686d74e61SPeter Brune   ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr);
39786d74e61SPeter Brune   ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr);
39886d74e61SPeter Brune   /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */
39986d74e61SPeter Brune   theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0));
40086d74e61SPeter Brune   angle_radians = angle * PETSC_PI / 180.;
40186d74e61SPeter Brune   if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) {
40286d74e61SPeter Brune     /* Modify the step Y */
40386d74e61SPeter Brune     PetscReal alpha,ydiffnorm;
40486d74e61SPeter Brune     ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr);
40586d74e61SPeter Brune     ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr);
40686d74e61SPeter Brune     alpha = ylastnorm / ydiffnorm;
40786d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
40886d74e61SPeter Brune     ierr = VecScale(Y,alpha);CHKERRQ(ierr);
40986d74e61SPeter 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);
41086d74e61SPeter Brune   } else {
41186d74e61SPeter Brune     ierr = PetscInfo2(snes,"Angle %G degrees exceeds threshold %G, no correction applied\n",theta*180./PETSC_PI,angle);CHKERRQ(ierr);
41286d74e61SPeter Brune     ierr = VecCopy(Y,Ylast);CHKERRQ(ierr);
41386d74e61SPeter Brune     *changed = PETSC_FALSE;
414bf7f4e0aSPeter Brune   }
415bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
416bf7f4e0aSPeter Brune }
417bf7f4e0aSPeter Brune 
418bf7f4e0aSPeter Brune #undef __FUNCT__
4196188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply"
420f40b411bSPeter Brune /*@
4216188f407SPeter Brune    PetscLineSearchApply - Computes the line-search update
422f40b411bSPeter Brune 
4236188f407SPeter Brune    Collective on PetscLineSearch
424f40b411bSPeter Brune 
425f40b411bSPeter Brune    Input Parameters:
426f40b411bSPeter Brune +  linesearch - The linesearch instance.
427f40b411bSPeter Brune .  X - The current solution.
428f40b411bSPeter Brune .  F - The current function.
429f40b411bSPeter Brune .  fnorm - The current norm.
430f40b411bSPeter Brune .  Y - The search direction.
431f40b411bSPeter Brune 
432f40b411bSPeter Brune    Output Parameters:
433f40b411bSPeter Brune +  X - The new solution.
434f40b411bSPeter Brune .  F - The new function.
435f40b411bSPeter Brune -  fnorm - The new function norm.
436f40b411bSPeter Brune 
437f40b411bSPeter Brune    Level: Intermediate
438f40b411bSPeter Brune 
4396188f407SPeter Brune    .keywords: PetscLineSearch, Create
440f40b411bSPeter Brune 
4416188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchPreCheck(), PetscLineSearchPostCheck()
442f40b411bSPeter Brune @*/
4436188f407SPeter Brune PetscErrorCode PetscLineSearchApply(PetscLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) {
444bf7f4e0aSPeter Brune   PetscErrorCode ierr;
445bf7f4e0aSPeter Brune   PetscFunctionBegin;
446bf7f4e0aSPeter Brune 
447bf7f4e0aSPeter Brune   /* check the pointers */
4486188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
449bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
450bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
451bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
452bf7f4e0aSPeter Brune 
453bf7f4e0aSPeter Brune   linesearch->success = PETSC_TRUE;
454bf7f4e0aSPeter Brune 
455bf7f4e0aSPeter Brune   linesearch->vec_sol = X;
456bf7f4e0aSPeter Brune   linesearch->vec_update = Y;
457bf7f4e0aSPeter Brune   linesearch->vec_func = F;
458bf7f4e0aSPeter Brune 
4596188f407SPeter Brune   ierr = PetscLineSearchSetUp(linesearch);CHKERRQ(ierr);
460bf7f4e0aSPeter Brune 
461bf7f4e0aSPeter Brune   if (!linesearch->keeplambda)
462bf7f4e0aSPeter Brune     linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */
463bf7f4e0aSPeter Brune 
464bf7f4e0aSPeter Brune   if (fnorm) {
465bf7f4e0aSPeter Brune     linesearch->fnorm = *fnorm;
466bf7f4e0aSPeter Brune   } else {
467bf7f4e0aSPeter Brune     ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
468bf7f4e0aSPeter Brune   }
469bf7f4e0aSPeter Brune 
4706188f407SPeter Brune   ierr = PetscLogEventBegin(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
471bf7f4e0aSPeter Brune 
472bf7f4e0aSPeter Brune   ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr);
473bf7f4e0aSPeter Brune 
4746188f407SPeter Brune   ierr = PetscLogEventEnd(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr);
475bf7f4e0aSPeter Brune 
476bf7f4e0aSPeter Brune   if (fnorm)
477bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
478bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
479bf7f4e0aSPeter Brune }
480bf7f4e0aSPeter Brune 
481bf7f4e0aSPeter Brune #undef __FUNCT__
4826188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy"
483f40b411bSPeter Brune /*@
4846188f407SPeter Brune    PetscLineSearchDestroy - Destroys the line search instance.
485f40b411bSPeter Brune 
4866188f407SPeter Brune    Collective on PetscLineSearch
487f40b411bSPeter Brune 
488f40b411bSPeter Brune    Input Parameters:
489f40b411bSPeter Brune .  linesearch - The linesearch instance.
490f40b411bSPeter Brune 
491f40b411bSPeter Brune    Level: Intermediate
492f40b411bSPeter Brune 
4936188f407SPeter Brune    .keywords: PetscLineSearch, Create
494f40b411bSPeter Brune 
4956188f407SPeter Brune    .seealso: PetscLineSearchCreate(), PetscLineSearchReset()
496f40b411bSPeter Brune @*/
4976188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy(PetscLineSearch * linesearch) {
498bf7f4e0aSPeter Brune   PetscErrorCode ierr;
499bf7f4e0aSPeter Brune   PetscFunctionBegin;
500bf7f4e0aSPeter Brune   if (!*linesearch) PetscFunctionReturn(0);
5016188f407SPeter Brune   PetscValidHeaderSpecific((*linesearch),PETSCLINESEARCH_CLASSID,1);
502bf7f4e0aSPeter Brune   if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);}
503bf7f4e0aSPeter Brune   ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr);
5046188f407SPeter Brune   ierr = PetscLineSearchReset(*linesearch);
505bf7f4e0aSPeter Brune   if ((*linesearch)->ops->destroy) {
506bf7f4e0aSPeter Brune     (*linesearch)->ops->destroy(*linesearch);
507bf7f4e0aSPeter Brune   }
508bf7f4e0aSPeter Brune   ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr);
509e7058c64SPeter Brune   ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr);
510bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
511bf7f4e0aSPeter Brune }
512bf7f4e0aSPeter Brune 
513bf7f4e0aSPeter Brune #undef __FUNCT__
5146188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetMonitor"
515f40b411bSPeter Brune /*@
5166188f407SPeter Brune    PetscLineSearchSetMonitor - Turns on/off printing useful things about the line search.
517bf7f4e0aSPeter Brune 
518bf7f4e0aSPeter Brune    Input Parameters:
519bf7f4e0aSPeter Brune +  snes - nonlinear context obtained from SNESCreate()
520bf7f4e0aSPeter Brune -  flg - PETSC_TRUE to monitor the line search
521bf7f4e0aSPeter Brune 
522bf7f4e0aSPeter Brune    Logically Collective on SNES
523bf7f4e0aSPeter Brune 
524bf7f4e0aSPeter Brune    Options Database:
525f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
526bf7f4e0aSPeter Brune 
527bf7f4e0aSPeter Brune    Level: intermediate
528bf7f4e0aSPeter Brune 
529bf7f4e0aSPeter Brune 
5306188f407SPeter Brune .seealso: PetscLineSearchGetMonitor()
531bf7f4e0aSPeter Brune @*/
5326188f407SPeter Brune PetscErrorCode  PetscLineSearchSetMonitor(PetscLineSearch linesearch, PetscBool flg)
533bf7f4e0aSPeter Brune {
534bf7f4e0aSPeter Brune 
535bf7f4e0aSPeter Brune   PetscErrorCode ierr;
536bf7f4e0aSPeter Brune   PetscFunctionBegin;
537bf7f4e0aSPeter Brune   if (flg && !linesearch->monitor) {
538bf7f4e0aSPeter Brune     ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr);
539bf7f4e0aSPeter Brune   } else if (!flg && linesearch->monitor) {
540bf7f4e0aSPeter Brune     ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr);
541bf7f4e0aSPeter Brune   }
542bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
543bf7f4e0aSPeter Brune }
544bf7f4e0aSPeter Brune 
545bf7f4e0aSPeter Brune #undef __FUNCT__
5466188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetMonitor"
547f40b411bSPeter Brune /*@
5486188f407SPeter Brune    PetscLineSearchGetMonitor - Gets the monitor instance for the line search
5496a388c36SPeter Brune 
550f40b411bSPeter Brune    Input Parameters:
551f40b411bSPeter Brune .  linesearch - linesearch context.
552f40b411bSPeter Brune 
553f40b411bSPeter Brune    Input Parameters:
554f40b411bSPeter Brune .  monitor - monitor context.
555f40b411bSPeter Brune 
556f40b411bSPeter Brune    Logically Collective on SNES
557f40b411bSPeter Brune 
558f40b411bSPeter Brune 
559f40b411bSPeter Brune    Options Database Keys:
560f40b411bSPeter Brune .   -linesearch_monitor - enables the monitor.
561f40b411bSPeter Brune 
562f40b411bSPeter Brune    Level: intermediate
563f40b411bSPeter Brune 
564f40b411bSPeter Brune 
5656188f407SPeter Brune .seealso: PetscLineSearchSetMonitor()
566f40b411bSPeter Brune @*/
5676188f407SPeter Brune PetscErrorCode  PetscLineSearchGetMonitor(PetscLineSearch linesearch, PetscViewer *monitor)
5686a388c36SPeter Brune {
5696a388c36SPeter Brune 
5706a388c36SPeter Brune   PetscFunctionBegin;
5716188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
5726a388c36SPeter Brune   if (monitor) {
5736a388c36SPeter Brune     PetscValidPointer(monitor, 2);
5746a388c36SPeter Brune     *monitor = linesearch->monitor;
5756a388c36SPeter Brune   }
5766a388c36SPeter Brune   PetscFunctionReturn(0);
5776a388c36SPeter Brune }
5786a388c36SPeter Brune 
5796a388c36SPeter Brune #undef __FUNCT__
5806188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetFromOptions"
581f40b411bSPeter Brune /*@
5826188f407SPeter Brune    PetscLineSearchSetFromOptions - Sets options for the line search
583f40b411bSPeter Brune 
584f40b411bSPeter Brune    Input Parameters:
585f40b411bSPeter Brune .  linesearch - linesearch context.
586f40b411bSPeter Brune 
587f40b411bSPeter Brune    Options Database Keys:
588f40b411bSPeter Brune + -linesearch_type - The Line search method
589f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches
590f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter.
591f40b411bSPeter Brune . -linesearch_norms   - Turn on/off the linesearch norms
592f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess.
593f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches.
594f40b411bSPeter Brune 
5956188f407SPeter Brune    Logically Collective on PetscLineSearch
596f40b411bSPeter Brune 
597f40b411bSPeter Brune    Level: intermediate
598f40b411bSPeter Brune 
599f40b411bSPeter Brune 
6006188f407SPeter Brune .seealso: PetscLineSearchCreate()
601f40b411bSPeter Brune @*/
6026188f407SPeter Brune PetscErrorCode PetscLineSearchSetFromOptions(PetscLineSearch linesearch) {
603bf7f4e0aSPeter Brune   PetscErrorCode ierr;
6046188f407SPeter Brune   const char     *deft = PETSCLINESEARCHBASIC;
605bf7f4e0aSPeter Brune   char           type[256];
606bf7f4e0aSPeter Brune   PetscBool      flg, set;
607bf7f4e0aSPeter Brune   PetscFunctionBegin;
6086188f407SPeter Brune   if (!PetscLineSearchRegisterAllCalled) {ierr = PetscLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
609bf7f4e0aSPeter Brune 
610bf7f4e0aSPeter Brune   ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr);
611bf7f4e0aSPeter Brune   if (((PetscObject)linesearch)->type_name) {
612bf7f4e0aSPeter Brune     deft = ((PetscObject)linesearch)->type_name;
613bf7f4e0aSPeter Brune   }
6146188f407SPeter Brune   ierr = PetscOptionsList("-linesearch_type","Line-search method","PetscLineSearchSetType",PetscLineSearchList,deft,type,256,&flg);CHKERRQ(ierr);
615bf7f4e0aSPeter Brune   if (flg) {
6166188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,type);CHKERRQ(ierr);
617bf7f4e0aSPeter Brune   } else if (!((PetscObject)linesearch)->type_name) {
6186188f407SPeter Brune     ierr = PetscLineSearchSetType(linesearch,deft);CHKERRQ(ierr);
619bf7f4e0aSPeter Brune   }
620bf7f4e0aSPeter Brune   if (linesearch->ops->setfromoptions) {
621bf7f4e0aSPeter Brune     (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr);
622bf7f4e0aSPeter Brune   }
623bf7f4e0aSPeter Brune 
6246188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESPetscLineSearchSetMonitor",
625bf7f4e0aSPeter Brune                           linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
6266188f407SPeter Brune   if (set) {ierr = PetscLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);}
627bf7f4e0aSPeter Brune 
6286188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","PetscLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr);
6296188f407SPeter Brune   ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","PetscLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr);
6306188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","PetscLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr);
6316188f407SPeter Brune   ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","PetscLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr);
632bf7f4e0aSPeter Brune   ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr);
633bf7f4e0aSPeter Brune   ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr);
634bf7f4e0aSPeter Brune   ierr = PetscOptionsEnd();CHKERRQ(ierr);
635bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
636bf7f4e0aSPeter Brune }
637bf7f4e0aSPeter Brune 
638bf7f4e0aSPeter Brune #undef __FUNCT__
6396188f407SPeter Brune #define __FUNCT__ "PetscLineSearchView"
640f40b411bSPeter Brune /*@
6416188f407SPeter Brune    PetscLineSearchView - Views useful information for the line search.
642f40b411bSPeter Brune 
643f40b411bSPeter Brune    Input Parameters:
644f40b411bSPeter Brune .  linesearch - linesearch context.
645f40b411bSPeter Brune 
6466188f407SPeter Brune    Logically Collective on PetscLineSearch
647f40b411bSPeter Brune 
648f40b411bSPeter Brune    Level: intermediate
649f40b411bSPeter Brune 
650f40b411bSPeter Brune 
6516188f407SPeter Brune .seealso: PetscLineSearchCreate()
652f40b411bSPeter Brune @*/
6536188f407SPeter Brune PetscErrorCode PetscLineSearchView(PetscLineSearch linesearch) {
654bf7f4e0aSPeter Brune   PetscFunctionBegin;
655f40b411bSPeter Brune 
656bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
657bf7f4e0aSPeter Brune }
658bf7f4e0aSPeter Brune 
659bf7f4e0aSPeter Brune #undef __FUNCT__
6606188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetType"
661*ea5d4fccSPeter Brune /*@C
6626188f407SPeter Brune    PetscLineSearchSetType - Sets the linesearch type
663f40b411bSPeter Brune 
664f40b411bSPeter Brune    Input Parameters:
665f40b411bSPeter Brune +  linesearch - linesearch context.
666f40b411bSPeter Brune -  type - The type of line search to be used
667f40b411bSPeter Brune 
6686188f407SPeter Brune    Logically Collective on PetscLineSearch
669f40b411bSPeter Brune 
670f40b411bSPeter Brune    Level: intermediate
671f40b411bSPeter Brune 
672f40b411bSPeter Brune 
6736188f407SPeter Brune .seealso: PetscLineSearchCreate()
674f40b411bSPeter Brune @*/
6756188f407SPeter Brune PetscErrorCode PetscLineSearchSetType(PetscLineSearch linesearch, const PetscLineSearchType type)
676bf7f4e0aSPeter Brune {
677bf7f4e0aSPeter Brune 
6786188f407SPeter Brune   PetscErrorCode ierr,(*r)(PetscLineSearch);
679bf7f4e0aSPeter Brune   PetscBool      match;
680bf7f4e0aSPeter Brune 
681bf7f4e0aSPeter Brune   PetscFunctionBegin;
6826188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
683bf7f4e0aSPeter Brune   PetscValidCharPointer(type,2);
684bf7f4e0aSPeter Brune 
685bf7f4e0aSPeter Brune   ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr);
686bf7f4e0aSPeter Brune   if (match) PetscFunctionReturn(0);
687bf7f4e0aSPeter Brune 
6886188f407SPeter Brune   ierr =  PetscFListFind(PetscLineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
689bf7f4e0aSPeter Brune   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type);
690bf7f4e0aSPeter Brune   /* Destroy the previous private linesearch context */
691bf7f4e0aSPeter Brune   if (linesearch->ops->destroy) {
692bf7f4e0aSPeter Brune     ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr);
693bf7f4e0aSPeter Brune     linesearch->ops->destroy = PETSC_NULL;
694bf7f4e0aSPeter Brune   }
6956188f407SPeter Brune   /* Reinitialize function pointers in PetscLineSearchOps structure */
696bf7f4e0aSPeter Brune   linesearch->ops->apply          = 0;
697bf7f4e0aSPeter Brune   linesearch->ops->view           = 0;
698bf7f4e0aSPeter Brune   linesearch->ops->setfromoptions = 0;
699bf7f4e0aSPeter Brune   linesearch->ops->destroy        = 0;
700bf7f4e0aSPeter Brune 
701bf7f4e0aSPeter Brune   ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr);
702bf7f4e0aSPeter Brune   ierr = (*r)(linesearch);CHKERRQ(ierr);
703bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS)
704bf7f4e0aSPeter Brune   if (PetscAMSPublishAll) {
705bf7f4e0aSPeter Brune     ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr);
706bf7f4e0aSPeter Brune   }
707bf7f4e0aSPeter Brune #endif
708bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
709bf7f4e0aSPeter Brune }
710bf7f4e0aSPeter Brune 
711bf7f4e0aSPeter Brune #undef __FUNCT__
7126188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSNES"
713f40b411bSPeter Brune /*@
7146188f407SPeter Brune    PetscLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation
715f40b411bSPeter Brune 
716f40b411bSPeter Brune    Input Parameters:
717f40b411bSPeter Brune +  linesearch - linesearch context.
718f40b411bSPeter Brune -  snes - The snes instance
719f40b411bSPeter Brune 
720f40b411bSPeter Brune    Level: intermediate
721f40b411bSPeter Brune 
722f40b411bSPeter Brune 
7236188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
724f40b411bSPeter Brune @*/
7256188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSNES(PetscLineSearch linesearch, SNES snes){
726bf7f4e0aSPeter Brune   PetscFunctionBegin;
7276188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
728bf7f4e0aSPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,2);
729bf7f4e0aSPeter Brune   linesearch->snes = snes;
730bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
731bf7f4e0aSPeter Brune }
732bf7f4e0aSPeter Brune 
733bf7f4e0aSPeter Brune #undef __FUNCT__
7346188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSNES"
735f40b411bSPeter Brune /*@
7366188f407SPeter Brune    PetscLineSearchGetSNES - Gets the SNES for the linesearch for function evaluation
737f40b411bSPeter Brune 
738f40b411bSPeter Brune    Input Parameters:
739f40b411bSPeter Brune .  linesearch - linesearch context.
740f40b411bSPeter Brune 
741f40b411bSPeter Brune    Output Parameters:
742f40b411bSPeter Brune .  snes - The snes instance
743f40b411bSPeter Brune 
744f40b411bSPeter Brune    Level: intermediate
745f40b411bSPeter Brune 
7466188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
747f40b411bSPeter Brune @*/
7486188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSNES(PetscLineSearch linesearch, SNES *snes){
749bf7f4e0aSPeter Brune   PetscFunctionBegin;
7506188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7516a388c36SPeter Brune   PetscValidPointer(snes, 2);
752bf7f4e0aSPeter Brune   *snes = linesearch->snes;
753bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
754bf7f4e0aSPeter Brune }
755bf7f4e0aSPeter Brune 
7566a388c36SPeter Brune #undef __FUNCT__
7576188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetLambda"
758f40b411bSPeter Brune /*@
7596188f407SPeter Brune    PetscLineSearchGetLambda - Gets the last linesearch steplength discovered.
760f40b411bSPeter Brune 
761f40b411bSPeter Brune    Input Parameters:
762f40b411bSPeter Brune .  linesearch - linesearch context.
763f40b411bSPeter Brune 
764f40b411bSPeter Brune    Output Parameters:
765f40b411bSPeter Brune .  lambda - The last steplength.
766f40b411bSPeter Brune 
767f40b411bSPeter Brune    Level: intermediate
768f40b411bSPeter Brune 
7696188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs()
770f40b411bSPeter Brune @*/
7716188f407SPeter Brune PetscErrorCode  PetscLineSearchGetLambda(PetscLineSearch linesearch,PetscReal *lambda)
7726a388c36SPeter Brune {
7736a388c36SPeter Brune   PetscFunctionBegin;
7746188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7756a388c36SPeter Brune   PetscValidPointer(lambda, 2);
7766a388c36SPeter Brune   *lambda = linesearch->lambda;
7776a388c36SPeter Brune   PetscFunctionReturn(0);
7786a388c36SPeter Brune }
7796a388c36SPeter Brune 
7806a388c36SPeter Brune #undef __FUNCT__
7816188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetLambda"
782f40b411bSPeter Brune /*@
7836188f407SPeter Brune    PetscLineSearchSetLambda - Sets the linesearch steplength.
784f40b411bSPeter Brune 
785f40b411bSPeter Brune    Input Parameters:
786f40b411bSPeter Brune +  linesearch - linesearch context.
787f40b411bSPeter Brune -  lambda - The last steplength.
788f40b411bSPeter Brune 
789f40b411bSPeter Brune    Level: intermediate
790f40b411bSPeter Brune 
7916188f407SPeter Brune .seealso: PetscLineSearchGetLambda()
792f40b411bSPeter Brune @*/
7936188f407SPeter Brune PetscErrorCode  PetscLineSearchSetLambda(PetscLineSearch linesearch, PetscReal lambda)
7946a388c36SPeter Brune {
7956a388c36SPeter Brune   PetscFunctionBegin;
7966188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
7976a388c36SPeter Brune   linesearch->lambda = lambda;
7986a388c36SPeter Brune   PetscFunctionReturn(0);
7996a388c36SPeter Brune }
8006a388c36SPeter Brune 
8016a388c36SPeter Brune #undef  __FUNCT__
8026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetTolerances"
803f40b411bSPeter Brune /*@
8046188f407SPeter Brune    PetscLineSearchGetTolerances - Gets the tolerances for the method
805f40b411bSPeter Brune 
806f40b411bSPeter Brune    Input Parameters:
807f40b411bSPeter Brune .  linesearch - linesearch context.
808f40b411bSPeter Brune 
809f40b411bSPeter Brune    Output Parameters:
810516fe3c3SPeter Brune +  steptol - The minimum steplength
811516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
812516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
813516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
814516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
815f40b411bSPeter Brune 
816f40b411bSPeter Brune 
817516fe3c3SPeter Brune    Level: advanced
818516fe3c3SPeter Brune 
8196188f407SPeter Brune .seealso: PetscLineSearchSetTolerances()
820f40b411bSPeter Brune @*/
8216188f407SPeter Brune PetscErrorCode  PetscLineSearchGetTolerances(PetscLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its)
8226a388c36SPeter Brune {
8236a388c36SPeter Brune   PetscFunctionBegin;
8246188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
825516fe3c3SPeter Brune   if (steptol) {
8266a388c36SPeter Brune     PetscValidPointer(steptol, 2);
8276a388c36SPeter Brune     *steptol = linesearch->steptol;
828516fe3c3SPeter Brune   }
829516fe3c3SPeter Brune   if (maxstep) {
830516fe3c3SPeter Brune     PetscValidPointer(maxstep, 3);
831516fe3c3SPeter Brune     *maxstep = linesearch->maxstep;
832516fe3c3SPeter Brune   }
833516fe3c3SPeter Brune   if (rtol) {
834516fe3c3SPeter Brune     PetscValidPointer(rtol, 4);
835516fe3c3SPeter Brune     *rtol = linesearch->rtol;
836516fe3c3SPeter Brune   }
837516fe3c3SPeter Brune   if (atol) {
838516fe3c3SPeter Brune     PetscValidPointer(atol, 5);
839516fe3c3SPeter Brune     *atol = linesearch->atol;
840516fe3c3SPeter Brune   }
841516fe3c3SPeter Brune   if (ltol) {
842516fe3c3SPeter Brune     PetscValidPointer(ltol, 6);
843516fe3c3SPeter Brune     *ltol = linesearch->ltol;
844516fe3c3SPeter Brune   }
845516fe3c3SPeter Brune   if (max_its) {
846516fe3c3SPeter Brune     PetscValidPointer(max_its, 7);
847516fe3c3SPeter Brune     *max_its = linesearch->max_its;
848516fe3c3SPeter Brune   }
8496a388c36SPeter Brune   PetscFunctionReturn(0);
8506a388c36SPeter Brune }
8516a388c36SPeter Brune 
8526a388c36SPeter Brune #undef  __FUNCT__
8536188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetTolerances"
854f40b411bSPeter Brune /*@
8556188f407SPeter Brune    PetscLineSearchSetTolerances - Sets the tolerances for the method
856f40b411bSPeter Brune 
857f40b411bSPeter Brune    Input Parameters:
858516fe3c3SPeter Brune +  linesearch - linesearch context.
859516fe3c3SPeter Brune .  steptol - The minimum steplength
860516fe3c3SPeter Brune .  rtol    - The relative tolerance for iterative line searches
861516fe3c3SPeter Brune .  atol    - The absolute tolerance for iterative line searches
862516fe3c3SPeter Brune .  ltol    - The change in lambda tolerance for iterative line searches
863516fe3c3SPeter Brune -  max_it  - The maximum number of iterations of the line search
864f40b411bSPeter Brune 
865f40b411bSPeter Brune 
866516fe3c3SPeter Brune    Level: advanced
867516fe3c3SPeter Brune 
8686188f407SPeter Brune .seealso: PetscLineSearchGetTolerances()
869f40b411bSPeter Brune @*/
8706188f407SPeter Brune PetscErrorCode  PetscLineSearchSetTolerances(PetscLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its)
8716a388c36SPeter Brune {
8726a388c36SPeter Brune   PetscFunctionBegin;
8736188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
8746a388c36SPeter Brune   linesearch->steptol = steptol;
875516fe3c3SPeter Brune   linesearch->maxstep = maxstep;
876516fe3c3SPeter Brune   linesearch->rtol = rtol;
877516fe3c3SPeter Brune   linesearch->atol = atol;
878516fe3c3SPeter Brune   linesearch->ltol = ltol;
879516fe3c3SPeter Brune   linesearch->max_its = max_its;
8806a388c36SPeter Brune   PetscFunctionReturn(0);
8816a388c36SPeter Brune }
8826a388c36SPeter Brune 
883516fe3c3SPeter Brune 
8846a388c36SPeter Brune #undef __FUNCT__
8856188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetDamping"
886f40b411bSPeter Brune /*@
8876188f407SPeter Brune    PetscLineSearchGetDamping - Gets the line search damping parameter.
888f40b411bSPeter Brune 
889f40b411bSPeter Brune    Input Parameters:
890f40b411bSPeter Brune .  linesearch - linesearch context.
891f40b411bSPeter Brune 
892f40b411bSPeter Brune    Output Parameters:
893f40b411bSPeter Brune .  damping - The damping parameter.
894f40b411bSPeter Brune 
895f40b411bSPeter Brune    Level: intermediate
896f40b411bSPeter Brune 
8976188f407SPeter Brune .seealso: PetscLineSearchGetStepTolerance()
898f40b411bSPeter Brune @*/
899f40b411bSPeter Brune 
9006188f407SPeter Brune PetscErrorCode  PetscLineSearchGetDamping(PetscLineSearch linesearch,PetscReal *damping)
9016a388c36SPeter Brune {
9026a388c36SPeter Brune   PetscFunctionBegin;
9036188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9046a388c36SPeter Brune   PetscValidPointer(damping, 2);
9056a388c36SPeter Brune   *damping = linesearch->damping;
9066a388c36SPeter Brune   PetscFunctionReturn(0);
9076a388c36SPeter Brune }
9086a388c36SPeter Brune 
9096a388c36SPeter Brune #undef __FUNCT__
9106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetDamping"
911f40b411bSPeter Brune /*@
9126188f407SPeter Brune    PetscLineSearchSetDamping - Sets the line search damping paramter.
913f40b411bSPeter Brune 
914f40b411bSPeter Brune    Input Parameters:
915f40b411bSPeter Brune .  linesearch - linesearch context.
916f40b411bSPeter Brune .  damping - The damping parameter.
917f40b411bSPeter Brune 
918f40b411bSPeter Brune    Level: intermediate
919f40b411bSPeter Brune 
9206188f407SPeter Brune .seealso: PetscLineSearchGetDamping()
921f40b411bSPeter Brune @*/
9226188f407SPeter Brune PetscErrorCode  PetscLineSearchSetDamping(PetscLineSearch linesearch,PetscReal damping)
9236a388c36SPeter Brune {
9246a388c36SPeter Brune   PetscFunctionBegin;
9256188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9266a388c36SPeter Brune   linesearch->damping = damping;
9276a388c36SPeter Brune   PetscFunctionReturn(0);
9286a388c36SPeter Brune }
9296a388c36SPeter Brune 
9306a388c36SPeter Brune #undef __FUNCT__
9316188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetNorms"
932f40b411bSPeter Brune /*@
9336188f407SPeter Brune    PetscLineSearchGetNorms - Gets the norms for for X, Y, and F.
934f40b411bSPeter Brune 
935f40b411bSPeter Brune    Input Parameters:
936f40b411bSPeter Brune .  linesearch - linesearch context.
937f40b411bSPeter Brune 
938f40b411bSPeter Brune    Output Parameters:
939f40b411bSPeter Brune +  xnorm - The norm of the current solution
940f40b411bSPeter Brune .  fnorm - The norm of the current function
941f40b411bSPeter Brune -  ynorm - The norm of the current update
942f40b411bSPeter Brune 
943f40b411bSPeter Brune    Level: intermediate
944f40b411bSPeter Brune 
9456188f407SPeter Brune .seealso: PetscLineSearchSetNorms() PetscLineSearchGetVecs()
946f40b411bSPeter Brune @*/
9476188f407SPeter Brune PetscErrorCode  PetscLineSearchGetNorms(PetscLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm)
948bf7f4e0aSPeter Brune {
949bf7f4e0aSPeter Brune   PetscFunctionBegin;
9506188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
951bf7f4e0aSPeter Brune   if (xnorm) {
952bf7f4e0aSPeter Brune     *xnorm = linesearch->xnorm;
953bf7f4e0aSPeter Brune   }
954bf7f4e0aSPeter Brune   if (fnorm) {
955bf7f4e0aSPeter Brune     *fnorm = linesearch->fnorm;
956bf7f4e0aSPeter Brune   }
957bf7f4e0aSPeter Brune   if (ynorm) {
958bf7f4e0aSPeter Brune     *ynorm = linesearch->ynorm;
959bf7f4e0aSPeter Brune   }
960bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
961bf7f4e0aSPeter Brune }
962bf7f4e0aSPeter Brune 
963e7058c64SPeter Brune #undef __FUNCT__
9646188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetNorms"
965f40b411bSPeter Brune /*@
9666188f407SPeter Brune    PetscLineSearchSetNorms - Gets the computed norms for for X, Y, and F.
967f40b411bSPeter Brune 
968f40b411bSPeter Brune    Input Parameters:
969f40b411bSPeter Brune +  linesearch - linesearch context.
970f40b411bSPeter Brune .  xnorm - The norm of the current solution
971f40b411bSPeter Brune .  fnorm - The norm of the current function
972f40b411bSPeter Brune -  ynorm - The norm of the current update
973f40b411bSPeter Brune 
974f40b411bSPeter Brune    Level: intermediate
975f40b411bSPeter Brune 
9766188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
977f40b411bSPeter Brune @*/
9786188f407SPeter Brune PetscErrorCode  PetscLineSearchSetNorms(PetscLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm)
9796a388c36SPeter Brune {
9806a388c36SPeter Brune   PetscFunctionBegin;
9816188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
9826a388c36SPeter Brune   linesearch->xnorm = xnorm;
9836a388c36SPeter Brune   linesearch->fnorm = fnorm;
9846a388c36SPeter Brune   linesearch->ynorm = ynorm;
9856a388c36SPeter Brune   PetscFunctionReturn(0);
9866a388c36SPeter Brune }
9876a388c36SPeter Brune 
9886a388c36SPeter Brune #undef __FUNCT__
9896188f407SPeter Brune #define __FUNCT__ "PetscLineSearchComputeNorms"
990f40b411bSPeter Brune /*@
9916188f407SPeter Brune    PetscLineSearchComputeNorms - Computes the norms of X, F, and Y.
992f40b411bSPeter Brune 
993f40b411bSPeter Brune    Input Parameters:
994f40b411bSPeter Brune .  linesearch - linesearch context.
995f40b411bSPeter Brune 
996f40b411bSPeter Brune    Options Database Keys:
997f40b411bSPeter Brune .   -linesearch_norms - turn norm computation on or off.
998f40b411bSPeter Brune 
999f40b411bSPeter Brune    Level: intermediate
1000f40b411bSPeter Brune 
10016188f407SPeter Brune .seealso: PetscLineSearchGetNorms, PetscLineSearchSetNorms()
1002f40b411bSPeter Brune @*/
10036188f407SPeter Brune PetscErrorCode PetscLineSearchComputeNorms(PetscLineSearch linesearch)
10046a388c36SPeter Brune {
10056a388c36SPeter Brune   PetscErrorCode ierr;
10069bd66eb0SPeter Brune   SNES snes;
10076a388c36SPeter Brune   PetscFunctionBegin;
10086a388c36SPeter Brune   if (linesearch->norms) {
10099bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
10109bd66eb0SPeter Brune       ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
10119bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10129bd66eb0SPeter Brune       ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10139bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr);
10149bd66eb0SPeter Brune     } else {
10156a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_func,   NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10166a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_sol,    NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10176a388c36SPeter Brune       ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10186a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_func,     NORM_2, &linesearch->fnorm);CHKERRQ(ierr);
10196a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_sol,      NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
10206a388c36SPeter Brune       ierr = VecNormEnd(linesearch->vec_update,   NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
10216a388c36SPeter Brune     }
10229bd66eb0SPeter Brune   }
10236a388c36SPeter Brune   PetscFunctionReturn(0);
10246a388c36SPeter Brune }
10256a388c36SPeter Brune 
10266a388c36SPeter Brune #undef __FUNCT__
10276188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetVecs"
1028f40b411bSPeter Brune /*@
10296188f407SPeter Brune    PetscLineSearchGetVecs - Gets the vectors from the PetscLineSearch context
1030f40b411bSPeter Brune 
1031f40b411bSPeter Brune    Input Parameters:
1032f40b411bSPeter Brune .  linesearch - linesearch context.
1033f40b411bSPeter Brune 
1034f40b411bSPeter Brune    Output Parameters:
1035f40b411bSPeter Brune +  X - The old solution
1036f40b411bSPeter Brune .  F - The old function
1037f40b411bSPeter Brune .  Y - The search direction
1038f40b411bSPeter Brune .  W - The new solution
1039f40b411bSPeter Brune -  G - The new function
1040f40b411bSPeter Brune 
1041f40b411bSPeter Brune    Level: intermediate
1042f40b411bSPeter Brune 
10436188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs()
1044f40b411bSPeter Brune @*/
10456188f407SPeter Brune PetscErrorCode PetscLineSearchGetVecs(PetscLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) {
10466a388c36SPeter Brune   PetscFunctionBegin;
10476188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
10486a388c36SPeter Brune   if (X) {
10496a388c36SPeter Brune     PetscValidPointer(X, 2);
10506a388c36SPeter Brune     *X = linesearch->vec_sol;
10516a388c36SPeter Brune   }
10526a388c36SPeter Brune   if (F) {
10536a388c36SPeter Brune     PetscValidPointer(F, 3);
10546a388c36SPeter Brune     *F = linesearch->vec_func;
10556a388c36SPeter Brune   }
10566a388c36SPeter Brune   if (Y) {
10576a388c36SPeter Brune     PetscValidPointer(Y, 4);
10586a388c36SPeter Brune     *Y = linesearch->vec_update;
10596a388c36SPeter Brune   }
10606a388c36SPeter Brune   if (W) {
10616a388c36SPeter Brune     PetscValidPointer(W, 5);
10626a388c36SPeter Brune     *W = linesearch->vec_sol_new;
10636a388c36SPeter Brune   }
10646a388c36SPeter Brune   if (G) {
10656a388c36SPeter Brune     PetscValidPointer(G, 6);
10666a388c36SPeter Brune     *G = linesearch->vec_func_new;
10676a388c36SPeter Brune   }
10686a388c36SPeter Brune 
10696a388c36SPeter Brune   PetscFunctionReturn(0);
10706a388c36SPeter Brune }
10716a388c36SPeter Brune 
10726a388c36SPeter Brune #undef __FUNCT__
10736188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetVecs"
1074f40b411bSPeter Brune /*@
10756188f407SPeter Brune    PetscLineSearchSetVecs - Sets the vectors on the PetscLineSearch context
1076f40b411bSPeter Brune 
1077f40b411bSPeter Brune    Input Parameters:
1078f40b411bSPeter Brune +  linesearch - linesearch context.
1079f40b411bSPeter Brune .  X - The old solution
1080f40b411bSPeter Brune .  F - The old function
1081f40b411bSPeter Brune .  Y - The search direction
1082f40b411bSPeter Brune .  W - The new solution
1083f40b411bSPeter Brune -  G - The new function
1084f40b411bSPeter Brune 
1085f40b411bSPeter Brune    Level: intermediate
1086f40b411bSPeter Brune 
10876188f407SPeter Brune .seealso: PetscLineSearchSetNorms(), PetscLineSearchGetVecs()
1088f40b411bSPeter Brune @*/
10896188f407SPeter Brune PetscErrorCode PetscLineSearchSetVecs(PetscLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) {
10906a388c36SPeter Brune   PetscFunctionBegin;
10916188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
10926a388c36SPeter Brune   if (X) {
10936a388c36SPeter Brune     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
10946a388c36SPeter Brune     linesearch->vec_sol = X;
10956a388c36SPeter Brune   }
10966a388c36SPeter Brune   if (F) {
10976a388c36SPeter Brune     PetscValidHeaderSpecific(F,VEC_CLASSID,3);
10986a388c36SPeter Brune     linesearch->vec_func = F;
10996a388c36SPeter Brune   }
11006a388c36SPeter Brune   if (Y) {
11016a388c36SPeter Brune     PetscValidHeaderSpecific(Y,VEC_CLASSID,4);
11026a388c36SPeter Brune     linesearch->vec_update = Y;
11036a388c36SPeter Brune   }
11046a388c36SPeter Brune   if (W) {
11056a388c36SPeter Brune     PetscValidHeaderSpecific(W,VEC_CLASSID,5);
11066a388c36SPeter Brune     linesearch->vec_sol_new = W;
11076a388c36SPeter Brune   }
11086a388c36SPeter Brune   if (G) {
11096a388c36SPeter Brune     PetscValidHeaderSpecific(G,VEC_CLASSID,6);
11106a388c36SPeter Brune     linesearch->vec_func_new = G;
11116a388c36SPeter Brune   }
11126a388c36SPeter Brune 
11136a388c36SPeter Brune   PetscFunctionReturn(0);
11146a388c36SPeter Brune }
11156a388c36SPeter Brune 
11166a388c36SPeter Brune #undef __FUNCT__
11176188f407SPeter Brune #define __FUNCT__ "PetscLineSearchAppendOptionsPrefix"
1118e7058c64SPeter Brune /*@C
11196188f407SPeter Brune    PetscLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all
1120e7058c64SPeter Brune    SNES options in the database.
1121e7058c64SPeter Brune 
1122e7058c64SPeter Brune    Logically Collective on SNES
1123e7058c64SPeter Brune 
1124e7058c64SPeter Brune    Input Parameters:
1125e7058c64SPeter Brune +  snes - the SNES context
1126e7058c64SPeter Brune -  prefix - the prefix to prepend to all option names
1127e7058c64SPeter Brune 
1128e7058c64SPeter Brune    Notes:
1129e7058c64SPeter Brune    A hyphen (-) must NOT be given at the beginning of the prefix name.
1130e7058c64SPeter Brune    The first character of all runtime options is AUTOMATICALLY the hyphen.
1131e7058c64SPeter Brune 
1132e7058c64SPeter Brune    Level: advanced
1133e7058c64SPeter Brune 
11346188f407SPeter Brune .keywords: PetscLineSearch, append, options, prefix, database
1135e7058c64SPeter Brune 
1136e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix()
1137e7058c64SPeter Brune @*/
11386188f407SPeter Brune PetscErrorCode  PetscLineSearchAppendOptionsPrefix(PetscLineSearch linesearch,const char prefix[])
1139e7058c64SPeter Brune {
1140e7058c64SPeter Brune   PetscErrorCode ierr;
1141e7058c64SPeter Brune 
1142e7058c64SPeter Brune   PetscFunctionBegin;
11436188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
1144e7058c64SPeter Brune   ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1145e7058c64SPeter Brune   PetscFunctionReturn(0);
1146e7058c64SPeter Brune }
1147e7058c64SPeter Brune 
1148e7058c64SPeter Brune #undef __FUNCT__
11496188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetOptionsPrefix"
1150e7058c64SPeter Brune /*@C
11516188f407SPeter Brune    PetscLineSearchGetOptionsPrefix - Sets the prefix used for searching for all
11526188f407SPeter Brune    PetscLineSearch options in the database.
1153e7058c64SPeter Brune 
1154e7058c64SPeter Brune    Not Collective
1155e7058c64SPeter Brune 
1156e7058c64SPeter Brune    Input Parameter:
1157e7058c64SPeter Brune .  snes - the SNES context
1158e7058c64SPeter Brune 
1159e7058c64SPeter Brune    Output Parameter:
1160e7058c64SPeter Brune .  prefix - pointer to the prefix string used
1161e7058c64SPeter Brune 
1162e7058c64SPeter Brune    Notes: On the fortran side, the user should pass in a string 'prefix' of
1163e7058c64SPeter Brune    sufficient length to hold the prefix.
1164e7058c64SPeter Brune 
1165e7058c64SPeter Brune    Level: advanced
1166e7058c64SPeter Brune 
11676188f407SPeter Brune .keywords: PetscLineSearch, get, options, prefix, database
1168e7058c64SPeter Brune 
1169e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix()
1170e7058c64SPeter Brune @*/
11716188f407SPeter Brune PetscErrorCode  PetscLineSearchGetOptionsPrefix(PetscLineSearch linesearch,const char *prefix[])
1172e7058c64SPeter Brune {
1173e7058c64SPeter Brune   PetscErrorCode ierr;
1174e7058c64SPeter Brune 
1175e7058c64SPeter Brune   PetscFunctionBegin;
11766188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
1177e7058c64SPeter Brune   ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr);
1178e7058c64SPeter Brune   PetscFunctionReturn(0);
1179e7058c64SPeter Brune }
1180bf7f4e0aSPeter Brune 
1181bf7f4e0aSPeter Brune #undef __FUNCT__
11826188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetWork"
1183f40b411bSPeter Brune /*@
11846188f407SPeter Brune    PetscLineSearchGetWork - Gets work vectors for the line search.
1185f40b411bSPeter Brune 
1186f40b411bSPeter Brune    Input Parameter:
11876188f407SPeter Brune +  linesearch - the PetscLineSearch context
1188f40b411bSPeter Brune -  nwork - the number of work vectors
1189f40b411bSPeter Brune 
1190f40b411bSPeter Brune    Level: developer
1191f40b411bSPeter Brune 
11926188f407SPeter Brune .keywords: PetscLineSearch, work, vector
1193f40b411bSPeter Brune 
1194f40b411bSPeter Brune .seealso: SNESDefaultGetWork()
1195f40b411bSPeter Brune @*/
11966188f407SPeter Brune PetscErrorCode  PetscLineSearchGetWork(PetscLineSearch linesearch, PetscInt nwork)
1197bf7f4e0aSPeter Brune {
1198bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1199bf7f4e0aSPeter Brune   PetscFunctionBegin;
1200bf7f4e0aSPeter Brune   if (linesearch->vec_sol) {
1201bf7f4e0aSPeter Brune     ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr);
1202bf7f4e0aSPeter Brune   } else {
1203bf7f4e0aSPeter Brune     SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!");
1204bf7f4e0aSPeter Brune   }
1205bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1206bf7f4e0aSPeter Brune }
1207bf7f4e0aSPeter Brune 
12086a388c36SPeter Brune 
1209bf7f4e0aSPeter Brune #undef __FUNCT__
12106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSuccess"
1211f40b411bSPeter Brune /*@
12126188f407SPeter Brune    PetscLineSearchGetSuccess - Gets the success/failure status of the last line search application
1213f40b411bSPeter Brune 
1214f40b411bSPeter Brune    Input Parameters:
1215f40b411bSPeter Brune .  linesearch - linesearch context.
1216f40b411bSPeter Brune 
1217f40b411bSPeter Brune    Output Parameters:
1218f40b411bSPeter Brune .  success - The success or failure status.
1219f40b411bSPeter Brune 
1220f40b411bSPeter Brune    Level: intermediate
1221f40b411bSPeter Brune 
12226188f407SPeter Brune .seealso: PetscLineSearchSetSuccess()
1223f40b411bSPeter Brune @*/
12246188f407SPeter Brune PetscErrorCode  PetscLineSearchGetSuccess(PetscLineSearch linesearch, PetscBool *success)
1225bf7f4e0aSPeter Brune {
1226bf7f4e0aSPeter Brune   PetscFunctionBegin;
12276188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
12286a388c36SPeter Brune   PetscValidPointer(success, 2);
1229bf7f4e0aSPeter Brune   if (success) {
1230bf7f4e0aSPeter Brune     *success = linesearch->success;
1231bf7f4e0aSPeter Brune   }
1232bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1233bf7f4e0aSPeter Brune }
1234bf7f4e0aSPeter Brune 
1235bf7f4e0aSPeter Brune #undef __FUNCT__
12366188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSuccess"
1237f40b411bSPeter Brune /*@
12386188f407SPeter Brune    PetscLineSearchSetSuccess - Sets the success/failure status of the last line search application
1239f40b411bSPeter Brune 
1240f40b411bSPeter Brune    Input Parameters:
1241f40b411bSPeter Brune +  linesearch - linesearch context.
1242f40b411bSPeter Brune -  success - The success or failure status.
1243f40b411bSPeter Brune 
1244f40b411bSPeter Brune    Level: intermediate
1245f40b411bSPeter Brune 
12466188f407SPeter Brune .seealso: PetscLineSearchGetSuccess()
1247f40b411bSPeter Brune @*/
12486188f407SPeter Brune PetscErrorCode  PetscLineSearchSetSuccess(PetscLineSearch linesearch, PetscBool success)
12496a388c36SPeter Brune {
12506188f407SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
12516a388c36SPeter Brune   PetscFunctionBegin;
12526a388c36SPeter Brune   linesearch->success = success;
12536a388c36SPeter Brune   PetscFunctionReturn(0);
12546a388c36SPeter Brune }
12556a388c36SPeter Brune 
12566a388c36SPeter Brune #undef __FUNCT__
12579bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchSetVIFunctions"
12589bd66eb0SPeter Brune /*@C
12599bd66eb0SPeter Brune    PetscLineSearchSetVIFunctions - Sets VI-specific functions for line search computation.
12609bd66eb0SPeter Brune 
12619bd66eb0SPeter Brune    Input Parameters:
12629bd66eb0SPeter Brune +  snes - nonlinear context obtained from SNESCreate()
12639bd66eb0SPeter Brune .  projectfunc - function for projecting the function to the bounds
12649bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
12659bd66eb0SPeter Brune 
12669bd66eb0SPeter Brune    Logically Collective on SNES
12679bd66eb0SPeter Brune 
12689bd66eb0SPeter Brune    Calling sequence of projectfunc:
12699bd66eb0SPeter Brune .vb
12709bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X)
12719bd66eb0SPeter Brune .ve
12729bd66eb0SPeter Brune 
12739bd66eb0SPeter Brune     Input parameters for projectfunc:
12749bd66eb0SPeter Brune +   snes - nonlinear context
12759bd66eb0SPeter Brune -   X - current solution
12769bd66eb0SPeter Brune 
12779bd66eb0SPeter Brune     Output parameters for func:
12789bd66eb0SPeter Brune .   X - Projected solution
12799bd66eb0SPeter Brune 
12809bd66eb0SPeter Brune    Calling sequence of normfunc:
12819bd66eb0SPeter Brune .vb
12829bd66eb0SPeter Brune    projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm)
12839bd66eb0SPeter Brune .ve
12849bd66eb0SPeter Brune 
12859bd66eb0SPeter Brune     Input parameters for projectfunc:
12869bd66eb0SPeter Brune +   snes - nonlinear context
12879bd66eb0SPeter Brune .   X - current solution
12889bd66eb0SPeter Brune -   F - current residual
12899bd66eb0SPeter Brune 
12909bd66eb0SPeter Brune     Output parameters for func:
12919bd66eb0SPeter Brune .   fnorm - VI-specific norm of the function
12929bd66eb0SPeter Brune 
12939bd66eb0SPeter Brune 
12949bd66eb0SPeter Brune     Level: developer
12959bd66eb0SPeter Brune 
12969bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search
12979bd66eb0SPeter Brune 
12989bd66eb0SPeter Brune .seealso: PetscLineSearchGetVIFunctions(), PetscLineSearchSetPostCheck(), PetscLineSearchSetPreCheck()
12999bd66eb0SPeter Brune @*/
13009bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchSetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc projectfunc, PetscLineSearchVINormFunc normfunc)
13019bd66eb0SPeter Brune {
13029bd66eb0SPeter Brune   PetscFunctionBegin;
13039bd66eb0SPeter Brune   PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1);
13049bd66eb0SPeter Brune   if (projectfunc) linesearch->ops->viproject = projectfunc;
13059bd66eb0SPeter Brune   if (normfunc) linesearch->ops->vinorm = normfunc;
13069bd66eb0SPeter Brune   PetscFunctionReturn(0);
13079bd66eb0SPeter Brune }
13089bd66eb0SPeter Brune 
13099bd66eb0SPeter Brune #undef __FUNCT__
13109bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchGetVIFunctions"
13119bd66eb0SPeter Brune /*@C
13129bd66eb0SPeter Brune    PetscLineSearchGetVIFunctions - Sets VI-specific functions for line search computation.
13139bd66eb0SPeter Brune 
13149bd66eb0SPeter Brune    Input Parameters:
13159bd66eb0SPeter Brune .  snes - nonlinear context obtained from SNESCreate()
13169bd66eb0SPeter Brune 
13179bd66eb0SPeter Brune    Output Parameters:
13189bd66eb0SPeter Brune +  projectfunc - function for projecting the function to the bounds
13199bd66eb0SPeter Brune -  normfunc - function for computing the norm of an active set
13209bd66eb0SPeter Brune 
13219bd66eb0SPeter Brune    Logically Collective on SNES
13229bd66eb0SPeter Brune 
13239bd66eb0SPeter Brune     Level: developer
13249bd66eb0SPeter Brune 
13259bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search
13269bd66eb0SPeter Brune 
13279bd66eb0SPeter Brune .seealso: PetscLineSearchSetVIFunctions(), PetscLineSearchGetPostCheck(), PetscLineSearchGetPreCheck()
13289bd66eb0SPeter Brune @*/
13299bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchGetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc *projectfunc, PetscLineSearchVINormFunc *normfunc)
13309bd66eb0SPeter Brune {
13319bd66eb0SPeter Brune   PetscFunctionBegin;
13329bd66eb0SPeter Brune   if (projectfunc) *projectfunc = linesearch->ops->viproject;
13339bd66eb0SPeter Brune   if (normfunc) *normfunc = linesearch->ops->vinorm;
13349bd66eb0SPeter Brune   PetscFunctionReturn(0);
13359bd66eb0SPeter Brune }
13369bd66eb0SPeter Brune 
13379bd66eb0SPeter Brune #undef __FUNCT__
13386188f407SPeter Brune #define __FUNCT__ "PetscLineSearchRegister"
1339bf7f4e0aSPeter Brune /*@C
13406188f407SPeter Brune   PetscLineSearchRegister - See PetscLineSearchRegisterDynamic()
1341bf7f4e0aSPeter Brune 
1342bf7f4e0aSPeter Brune   Level: advanced
1343bf7f4e0aSPeter Brune @*/
13446188f407SPeter Brune PetscErrorCode  PetscLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscLineSearch))
1345bf7f4e0aSPeter Brune {
1346bf7f4e0aSPeter Brune   char           fullname[PETSC_MAX_PATH_LEN];
1347bf7f4e0aSPeter Brune   PetscErrorCode ierr;
1348bf7f4e0aSPeter Brune 
1349bf7f4e0aSPeter Brune   PetscFunctionBegin;
1350bf7f4e0aSPeter Brune   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
13516188f407SPeter Brune   ierr = PetscFListAdd(&PetscLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1352bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
1353bf7f4e0aSPeter Brune }
1354