xref: /petsc/src/snes/linesearch/impls/basic/linesearchbasic.c (revision af0996ce37bc06907c37d8d91773840993d61e62)
1*af0996ceSBarry Smith #include <petsc/private/linesearchimpl.h>
2*af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
3bf7f4e0aSPeter Brune 
4f40b411bSPeter Brune #undef __FUNCT__
5f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply_Basic"
6f1c6b773SPeter Brune static PetscErrorCode  SNESLineSearchApply_Basic(SNESLineSearch linesearch)
7bf7f4e0aSPeter Brune {
8bf7f4e0aSPeter Brune   PetscBool      changed_y, changed_w;
9bf7f4e0aSPeter Brune   PetscErrorCode ierr;
106a388c36SPeter Brune   Vec            X, F, Y, W;
116a388c36SPeter Brune   SNES           snes;
126a388c36SPeter Brune   PetscReal      gnorm, xnorm, ynorm, lambda;
136a388c36SPeter Brune   PetscBool      domainerror;
14bf7f4e0aSPeter Brune 
15bf7f4e0aSPeter Brune   PetscFunctionBegin;
160298fd71SBarry Smith   ierr = SNESLineSearchGetVecs(linesearch, &X, &F, &Y, &W, NULL);CHKERRQ(ierr);
17f1c6b773SPeter Brune   ierr = SNESLineSearchGetNorms(linesearch, &xnorm, &gnorm, &ynorm);CHKERRQ(ierr);
18f1c6b773SPeter Brune   ierr = SNESLineSearchGetLambda(linesearch, &lambda);CHKERRQ(ierr);
19f1c6b773SPeter Brune   ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
20f1c6b773SPeter Brune   ierr = SNESLineSearchSetSuccess(linesearch, PETSC_TRUE);CHKERRQ(ierr);
21bf7f4e0aSPeter Brune 
22bf7f4e0aSPeter Brune   /* precheck */
237b1df9c1SPeter Brune   ierr = SNESLineSearchPreCheck(linesearch,X,Y,&changed_y);CHKERRQ(ierr);
24bf7f4e0aSPeter Brune 
25bf7f4e0aSPeter Brune   /* update */
266a388c36SPeter Brune   ierr = VecWAXPY(W,-lambda,Y,X);CHKERRQ(ierr);
279bd66eb0SPeter Brune   if (linesearch->ops->viproject) {
289bd66eb0SPeter Brune     ierr = (*linesearch->ops->viproject)(snes, W);CHKERRQ(ierr);
299bd66eb0SPeter Brune   }
30bf7f4e0aSPeter Brune 
31bf7f4e0aSPeter Brune   /* postcheck */
327b1df9c1SPeter Brune   ierr = SNESLineSearchPostCheck(linesearch,X,Y,W,&changed_y,&changed_w);CHKERRQ(ierr);
33bf7f4e0aSPeter Brune   if (changed_y) {
346a388c36SPeter Brune     ierr = VecWAXPY(W,-lambda,Y,X);CHKERRQ(ierr);
359bd66eb0SPeter Brune     if (linesearch->ops->viproject) {
369bd66eb0SPeter Brune       ierr = (*linesearch->ops->viproject)(snes, W);CHKERRQ(ierr);
379bd66eb0SPeter Brune     }
38bf7f4e0aSPeter Brune   }
395fc09b23SPeter Brune   if (linesearch->norms || snes->iter < snes->max_its-1) {
40fb8e56e0SPeter Brune     ierr = (*linesearch->ops->snesfunc)(snes,W,F);CHKERRQ(ierr);
416a388c36SPeter Brune     ierr = SNESGetFunctionDomainError(snes, &domainerror);CHKERRQ(ierr);
426a388c36SPeter Brune     if (domainerror) {
4322d28d08SBarry Smith       ierr = SNESLineSearchSetSuccess(linesearch, PETSC_FALSE);CHKERRQ(ierr);
44bf7f4e0aSPeter Brune       PetscFunctionReturn(0);
45bf7f4e0aSPeter Brune     }
465fc09b23SPeter Brune   }
476a388c36SPeter Brune 
485fc09b23SPeter Brune   if (linesearch->norms) {
495fc09b23SPeter Brune     if (!linesearch->ops->vinorm) VecNormBegin(F, NORM_2, &linesearch->fnorm);
505fc09b23SPeter Brune     ierr = VecNormBegin(Y, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
515fc09b23SPeter Brune     ierr = VecNormBegin(W, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
525fc09b23SPeter Brune     if (!linesearch->ops->vinorm) VecNormEnd(F, NORM_2, &linesearch->fnorm);
535fc09b23SPeter Brune     ierr = VecNormEnd(Y, NORM_2, &linesearch->ynorm);CHKERRQ(ierr);
545fc09b23SPeter Brune     ierr = VecNormEnd(W, NORM_2, &linesearch->xnorm);CHKERRQ(ierr);
555fc09b23SPeter Brune 
569bd66eb0SPeter Brune     if (linesearch->ops->vinorm) {
579bd66eb0SPeter Brune       linesearch->fnorm = gnorm;
58f5af7f23SKarl Rupp 
599bd66eb0SPeter Brune       ierr = (*linesearch->ops->vinorm)(snes, F, W, &linesearch->fnorm);CHKERRQ(ierr);
609bd66eb0SPeter Brune     } else {
619bd66eb0SPeter Brune       ierr = VecNorm(F,NORM_2,&linesearch->fnorm);CHKERRQ(ierr);
629bd66eb0SPeter Brune     }
635fc09b23SPeter Brune   }
646a388c36SPeter Brune 
65bf7f4e0aSPeter Brune   /* copy the solution over */
66bf7f4e0aSPeter Brune   ierr = VecCopy(W, X);CHKERRQ(ierr);
67bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
68bf7f4e0aSPeter Brune }
69bf7f4e0aSPeter Brune 
70bf7f4e0aSPeter Brune #undef __FUNCT__
71f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate_Basic"
72954494b2SJed Brown /*MC
731a4f838cSPeter Brune    SNESLINESEARCHBASIC - This line search implementation is not a line
74cd7522eaSPeter Brune    search at all; it simply uses the full step.  Thus, this routine is intended
7504d7464bSBarry Smith    for methods with well-scaled updates; i.e. Newton's method (SNESNEWTONLS), on
76cd7522eaSPeter Brune    well-behaved problems.
77cd7522eaSPeter Brune 
78cd7522eaSPeter Brune    Options Database Keys:
79eb23ba39SBarry Smith +   -snes_linesearch_damping <damping> search vector is scaled by this amount, default is 1.0
80eb23ba39SBarry Smith -   -snes_linesearch_norms <flag> whether to compute norms or not, default is true
81cd7522eaSPeter Brune 
82cd7522eaSPeter Brune    Notes:
83cd7522eaSPeter Brune    For methods with ill-scaled updates (SNESNRICHARDSON, SNESNCG), a small
84cd7522eaSPeter Brune    damping parameter may yield satisfactory but slow convergence despite
85cd7522eaSPeter Brune    the simplicity of the line search.
86954494b2SJed Brown 
87954494b2SJed Brown    Level: advanced
88954494b2SJed Brown 
89f1c6b773SPeter Brune .keywords: SNES, SNESLineSearch, damping
90954494b2SJed Brown 
91f1c6b773SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetType()
92954494b2SJed Brown M*/
938cc058d9SJed Brown PETSC_EXTERN PetscErrorCode SNESLineSearchCreate_Basic(SNESLineSearch linesearch)
94bf7f4e0aSPeter Brune {
95bf7f4e0aSPeter Brune   PetscFunctionBegin;
96f1c6b773SPeter Brune   linesearch->ops->apply          = SNESLineSearchApply_Basic;
970298fd71SBarry Smith   linesearch->ops->destroy        = NULL;
980298fd71SBarry Smith   linesearch->ops->setfromoptions = NULL;
990298fd71SBarry Smith   linesearch->ops->reset          = NULL;
1000298fd71SBarry Smith   linesearch->ops->view           = NULL;
1010298fd71SBarry Smith   linesearch->ops->setup          = NULL;
102bf7f4e0aSPeter Brune   PetscFunctionReturn(0);
103bf7f4e0aSPeter Brune }
104