xref: /petsc/src/snes/linesearch/impls/basic/linesearchbasic.c (revision bf7f4e0aa335b99ab1a0e3a31a22f19305ab3c54)
1 #include <private/linesearchimpl.h>
2 #include <private/snesimpl.h>
3 
4 #undef __FUNCT__
5 #define __FUNCT__ "LineSearchApply_Basic"
6 
7 /*@C
8    SNESLineSearchBasic - This routine is not a line search at all;
9    it simply uses the full step.  Thus, this routine is intended
10    to serve as a template and is not recommended for general use.
11 
12    Logically Collective on SNES and Vec
13 
14    Input Parameters:
15 +  snes - nonlinear context
16 .  lsctx - optional context for line search (not used here)
17 .  x - current iterate
18 .  f - residual evaluated at x
19 .  y - search direction
20 .  fnorm - 2-norm of f
21 -  xnorm - norm of x if known, otherwise 0
22 
23    Output Parameters:
24 +  g - residual evaluated at new iterate y
25 .  w - new iterate
26 .  gnorm - 2-norm of g
27 .  ynorm - 2-norm of search length
28 -  flag - PETSC_TRUE on success, PETSC_FALSE on failure
29 
30    Options Database Key:
31 .  -snes_ls basic - Activates SNESLineSearchNo()
32 
33    Level: advanced
34 
35 .keywords: SNES, nonlinear, line search, cubic
36 
37 .seealso: SNESLineSearchCubic(), SNESLineSearchQuadratic(),
38           SNESLineSearchSet(), SNESLineSearchNoNorms()
39 @*/
40 PetscErrorCode  LineSearchApply_Basic(LineSearch linesearch)
41 {
42   PetscBool      changed_y, changed_w;
43   PetscErrorCode ierr;
44   Vec            X = linesearch->vec_sol;
45   Vec            F = linesearch->vec_func;
46   Vec            Y = linesearch->vec_update;
47   Vec            W = linesearch->vec_sol_new;
48   SNES           snes = linesearch->snes;
49   PetscReal      *gnorm = &linesearch->fnorm;
50   PetscReal      *ynorm = &linesearch->ynorm;
51   PetscReal      *xnorm = &linesearch->xnorm;
52 
53   PetscFunctionBegin;
54   ierr = PetscLogEventBegin(SNES_LineSearch,linesearch,X,F,snes);CHKERRQ(ierr);
55 
56   /* precheck */
57   ierr = LineSearchPreCheck(linesearch, &changed_y);CHKERRQ(ierr);
58 
59   /* update */
60   ierr = VecWAXPY(W,-linesearch->damping,Y,X);CHKERRQ(ierr);
61 
62   /* postcheck */
63   ierr = LineSearchPostCheck(linesearch, &changed_y, &changed_w);CHKERRQ(ierr);
64   if (changed_y) {
65     ierr = VecWAXPY(W,-snes->damping,Y,X);CHKERRQ(ierr);
66   }
67   ierr = SNESComputeFunction(snes,W,F);CHKERRQ(ierr);
68   if (snes->domainerror) {
69     linesearch->success = PETSC_FALSE;
70     PetscFunctionReturn(0);
71   }
72   if (linesearch->norms) {
73     ierr = VecNormBegin(F,NORM_2,gnorm);CHKERRQ(ierr);
74     ierr = VecNormBegin(X,NORM_2,xnorm);CHKERRQ(ierr);
75     ierr = VecNormBegin(Y,NORM_2,ynorm);CHKERRQ(ierr);
76     ierr = VecNormEnd(F,NORM_2,gnorm);CHKERRQ(ierr);
77     ierr = VecNormEnd(X,NORM_2,xnorm);CHKERRQ(ierr);
78     ierr = VecNormEnd(Y,NORM_2,ynorm);CHKERRQ(ierr);
79     if (PetscIsInfOrNanReal(*gnorm)) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FP,"User provided compute function generated a Not-a-Number");
80   }
81   /* copy the solution over */
82   ierr = VecCopy(W, X);CHKERRQ(ierr);
83 
84   ierr = PetscLogEventEnd(SNES_LineSearch,linesearch,X,F,snes);CHKERRQ(ierr);
85   PetscFunctionReturn(0);
86 }
87 
88 EXTERN_C_BEGIN
89 #undef __FUNCT__
90 #define __FUNCT__ "LineSearchCreate_Basic"
91 PetscErrorCode LineSearchCreate_Basic(LineSearch linesearch)
92 {
93   PetscFunctionBegin;
94   linesearch->ops->apply          = LineSearchApply_Basic;
95   linesearch->ops->destroy        = PETSC_NULL;
96   linesearch->ops->setfromoptions = PETSC_NULL;
97   linesearch->ops->reset          = PETSC_NULL;
98   linesearch->ops->view           = PETSC_NULL;
99   linesearch->ops->setup          = PETSC_NULL;
100   PetscFunctionReturn(0);
101 }
102 EXTERN_C_END
103