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