1bf7f4e0aSPeter Brune #include <private/linesearchimpl.h> 2bf7f4e0aSPeter Brune #include <private/snesimpl.h> 3bf7f4e0aSPeter Brune 4f40b411bSPeter Brune /*MC 5*6188f407SPeter Brune PetscLineSearchBasic - 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*6188f407SPeter Brune .keywords: SNES, PetscLineSearch, damping 12bf7f4e0aSPeter Brune 13*6188f407SPeter Brune .seealso: PetscLineSearchCreate(), PetscLineSearchSetType() 14f40b411bSPeter Brune M*/ 15f40b411bSPeter Brune 16f40b411bSPeter Brune #undef __FUNCT__ 17*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply_Basic" 18f40b411bSPeter Brune 19*6188f407SPeter Brune PetscErrorCode PetscLineSearchApply_Basic(PetscLineSearch 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 30*6188f407SPeter Brune ierr = PetscLineSearchGetVecs(linesearch, &X, &F, &Y, &W, PETSC_NULL);CHKERRQ(ierr); 31*6188f407SPeter Brune ierr = PetscLineSearchGetNorms(linesearch, &xnorm, &gnorm, &ynorm);CHKERRQ(ierr); 32*6188f407SPeter Brune ierr = PetscLineSearchGetLambda(linesearch, &lambda);CHKERRQ(ierr); 33*6188f407SPeter Brune ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 34*6188f407SPeter Brune ierr = PetscLineSearchSetSuccess(linesearch, PETSC_TRUE);CHKERRQ(ierr); 35bf7f4e0aSPeter Brune 36bf7f4e0aSPeter Brune /* precheck */ 37*6188f407SPeter Brune ierr = PetscLineSearchPreCheck(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 */ 43*6188f407SPeter Brune ierr = PetscLineSearchPostCheck(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) { 50*6188f407SPeter Brune ierr = PetscLineSearchSetSuccess(linesearch, PETSC_FALSE); 51bf7f4e0aSPeter Brune PetscFunctionReturn(0); 52bf7f4e0aSPeter Brune } 536a388c36SPeter Brune 54*6188f407SPeter Brune ierr = PetscLineSearchComputeNorms(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__ 63*6188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate_Basic" 64*6188f407SPeter Brune PetscErrorCode PetscLineSearchCreate_Basic(PetscLineSearch linesearch) 65bf7f4e0aSPeter Brune { 66bf7f4e0aSPeter Brune PetscFunctionBegin; 67*6188f407SPeter Brune linesearch->ops->apply = PetscLineSearchApply_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