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