xref: /petsc/src/snes/linesearch/impls/basic/linesearchbasic.c (revision 0ebbf5cd9a3c2c6e80db03c16b7e9d3cb0ce5fc5)
1 #include <private/linesearchimpl.h>
2 #include <private/snesimpl.h>
3 
4 /*MC
5    LineSearchBasic - This routine is not a line search at all;
6    it simply uses the full step.  Thus, this routine is intended
7    to serve as a template and is not recommended for general use.
8 
9    Level: advanced
10 
11 .keywords: SNES, LineSearch, damping
12 
13 .seealso: LineSearchCreate(), LineSearchSetType()
14 M*/
15 
16 #undef __FUNCT__
17 #define __FUNCT__ "LineSearchApply_Basic"
18 
19 PetscErrorCode  LineSearchApply_Basic(LineSearch linesearch)
20 {
21   PetscBool      changed_y, changed_w;
22   PetscErrorCode ierr;
23   Vec            X, F, Y, W;
24   SNES           snes;
25   PetscReal      gnorm, xnorm, ynorm, lambda;
26   PetscBool      domainerror;
27 
28   PetscFunctionBegin;
29 
30   ierr = LineSearchGetVecs(linesearch, &X, &F, &Y, &W, PETSC_NULL);CHKERRQ(ierr);
31   ierr = LineSearchGetNorms(linesearch, &xnorm, &gnorm, &ynorm);CHKERRQ(ierr);
32   ierr = LineSearchGetLambda(linesearch, &lambda);CHKERRQ(ierr);
33   ierr = LineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr);
34   ierr = LineSearchSetSuccess(linesearch, PETSC_TRUE);CHKERRQ(ierr);
35 
36   /* precheck */
37   ierr = LineSearchPreCheck(linesearch, &changed_y);CHKERRQ(ierr);
38 
39   /* update */
40   ierr = VecWAXPY(W,-lambda,Y,X);CHKERRQ(ierr);
41 
42   /* postcheck */
43   ierr = LineSearchPostCheck(linesearch, &changed_y, &changed_w);CHKERRQ(ierr);
44   if (changed_y) {
45     ierr = VecWAXPY(W,-lambda,Y,X);CHKERRQ(ierr);
46   }
47   ierr = SNESComputeFunction(snes,W,F);CHKERRQ(ierr);
48   ierr = SNESGetFunctionDomainError(snes, &domainerror);CHKERRQ(ierr);
49   if (domainerror) {
50     ierr = LineSearchSetSuccess(linesearch, PETSC_FALSE);
51     PetscFunctionReturn(0);
52   }
53 
54   ierr = LineSearchComputeNorms(linesearch);CHKERRQ(ierr);
55 
56   /* copy the solution over */
57   ierr = VecCopy(W, X);CHKERRQ(ierr);
58   PetscFunctionReturn(0);
59 }
60 
61 EXTERN_C_BEGIN
62 #undef __FUNCT__
63 #define __FUNCT__ "LineSearchCreate_Basic"
64 PetscErrorCode LineSearchCreate_Basic(LineSearch linesearch)
65 {
66   PetscFunctionBegin;
67   linesearch->ops->apply          = LineSearchApply_Basic;
68   linesearch->ops->destroy        = PETSC_NULL;
69   linesearch->ops->setfromoptions = PETSC_NULL;
70   linesearch->ops->reset          = PETSC_NULL;
71   linesearch->ops->view           = PETSC_NULL;
72   linesearch->ops->setup          = PETSC_NULL;
73   PetscFunctionReturn(0);
74 }
75 EXTERN_C_END
76