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