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