19e764e56SPeter Brune #include <private/linesearchimpl.h> /*I "petscsnes.h" I*/ 2bf7f4e0aSPeter Brune 36188f407SPeter Brune PetscBool PetscLineSearchRegisterAllCalled = PETSC_FALSE; 46188f407SPeter Brune PetscFList PetscLineSearchList = PETSC_NULL; 5bf7f4e0aSPeter Brune 66188f407SPeter Brune PetscClassId PETSCLINESEARCH_CLASSID; 76188f407SPeter Brune PetscLogEvent PetscLineSearch_Apply; 8bf7f4e0aSPeter Brune 9bf7f4e0aSPeter Brune #undef __FUNCT__ 106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate" 11f40b411bSPeter Brune /*@ 126188f407SPeter Brune PetscLineSearchCreate - Creates the line search. 13f40b411bSPeter Brune 14f40b411bSPeter Brune Collective on LineSearch 15f40b411bSPeter Brune 16f40b411bSPeter Brune Input Parameters: 17f40b411bSPeter Brune . comm - MPI communicator for the line search 18f40b411bSPeter Brune 19f40b411bSPeter Brune Output Parameters: 20f40b411bSPeter Brune . outlinesearch - the line search instance. 21f40b411bSPeter Brune 22f40b411bSPeter Brune Level: Beginner 23f40b411bSPeter Brune 24f40b411bSPeter Brune .keywords: LineSearch, Create 25f40b411bSPeter Brune 26f40b411bSPeter Brune .seealso: LineSearchDestroy() 27f40b411bSPeter Brune @*/ 28f40b411bSPeter Brune 296188f407SPeter Brune PetscErrorCode PetscLineSearchCreate(MPI_Comm comm, PetscLineSearch * outlinesearch) { 30bf7f4e0aSPeter Brune PetscErrorCode ierr; 316188f407SPeter Brune PetscLineSearch linesearch; 32bf7f4e0aSPeter Brune PetscFunctionBegin; 336188f407SPeter Brune ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,PETSCLINESEARCH_CLASSID, 0, 346188f407SPeter Brune "LineSearch","Line-search method","LineSearch",comm,PetscLineSearchDestroy,PetscLineSearchView);CHKERRQ(ierr); 35bf7f4e0aSPeter Brune 36bf7f4e0aSPeter Brune linesearch->ops->precheckstep = PETSC_NULL; 37bf7f4e0aSPeter Brune linesearch->ops->postcheckstep = PETSC_NULL; 38bf7f4e0aSPeter Brune 39*9bd66eb0SPeter Brune linesearch->vec_sol_new = PETSC_NULL; 40*9bd66eb0SPeter Brune linesearch->vec_func_new = PETSC_NULL; 41*9bd66eb0SPeter Brune linesearch->vec_sol = PETSC_NULL; 42*9bd66eb0SPeter Brune linesearch->vec_func = PETSC_NULL; 43*9bd66eb0SPeter Brune linesearch->vec_update = PETSC_NULL; 44*9bd66eb0SPeter Brune 45bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 46bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 47bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 48bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 49bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 50bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 51bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 52bf7f4e0aSPeter Brune linesearch->damping = 1.0; 53bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 54bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 55516fe3c3SPeter Brune linesearch->rtol = 1e-8; 56516fe3c3SPeter Brune linesearch->atol = 1e-15; 57516fe3c3SPeter Brune linesearch->ltol = 1e-8; 58bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 59bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 60516fe3c3SPeter Brune linesearch->max_its = 3; 61bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 62bf7f4e0aSPeter Brune *outlinesearch = linesearch; 63bf7f4e0aSPeter Brune PetscFunctionReturn(0); 64bf7f4e0aSPeter Brune } 65bf7f4e0aSPeter Brune 66bf7f4e0aSPeter Brune #undef __FUNCT__ 676188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetUp" 68f40b411bSPeter Brune /*@ 696188f407SPeter Brune PetscLineSearchSetUp - Prepares the line search for being applied. 70f40b411bSPeter Brune 71f40b411bSPeter Brune Collective on LineSearch 72f40b411bSPeter Brune 73f40b411bSPeter Brune Input Parameters: 74f40b411bSPeter Brune . linesearch - The LineSearch instance. 75f40b411bSPeter Brune 76f40b411bSPeter Brune Level: Intermediate 77f40b411bSPeter Brune 786188f407SPeter Brune .keywords: PetscLineSearch, SetUp 79f40b411bSPeter Brune 806188f407SPeter Brune .seealso: PetscLineSearchReset() 81f40b411bSPeter Brune @*/ 82f40b411bSPeter Brune 836188f407SPeter Brune PetscErrorCode PetscLineSearchSetUp(PetscLineSearch linesearch) { 84bf7f4e0aSPeter Brune PetscErrorCode ierr; 85bf7f4e0aSPeter Brune PetscFunctionBegin; 86bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 876188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,PETSCLINESEARCHBASIC);CHKERRQ(ierr); 88bf7f4e0aSPeter Brune } 89bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 90*9bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 91bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 92*9bd66eb0SPeter Brune } 93*9bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 94*9bd66eb0SPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr); 95*9bd66eb0SPeter Brune } 96bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 97bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 98bf7f4e0aSPeter Brune } 99bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 100bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 101bf7f4e0aSPeter Brune } 102bf7f4e0aSPeter Brune PetscFunctionReturn(0); 103bf7f4e0aSPeter Brune } 104bf7f4e0aSPeter Brune 105bf7f4e0aSPeter Brune #undef __FUNCT__ 1066188f407SPeter Brune #define __FUNCT__ "PetscLineSearchReset" 107f40b411bSPeter Brune 108f40b411bSPeter Brune /*@ 1096188f407SPeter Brune PetscLineSearchReset - Tears down the structures required for application 110f40b411bSPeter Brune 1116188f407SPeter Brune Collective on PetscLineSearch 112f40b411bSPeter Brune 113f40b411bSPeter Brune Input Parameters: 114f40b411bSPeter Brune . linesearch - The LineSearch instance. 115f40b411bSPeter Brune 116f40b411bSPeter Brune Level: Intermediate 117f40b411bSPeter Brune 1186188f407SPeter Brune .keywords: PetscLineSearch, Create 119f40b411bSPeter Brune 1206188f407SPeter Brune .seealso: PetscLineSearchSetUp() 121f40b411bSPeter Brune @*/ 122f40b411bSPeter Brune 1236188f407SPeter Brune PetscErrorCode PetscLineSearchReset(PetscLineSearch linesearch) { 124bf7f4e0aSPeter Brune PetscErrorCode ierr; 125bf7f4e0aSPeter Brune PetscFunctionBegin; 126bf7f4e0aSPeter Brune if (linesearch->ops->reset) { 127bf7f4e0aSPeter Brune (*linesearch->ops->reset)(linesearch); 128bf7f4e0aSPeter Brune } 129bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 130bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 131bf7f4e0aSPeter Brune 132bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 133bf7f4e0aSPeter Brune linesearch->nwork = 0; 134bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 135bf7f4e0aSPeter Brune PetscFunctionReturn(0); 136bf7f4e0aSPeter Brune } 137bf7f4e0aSPeter Brune 13886d74e61SPeter Brune 13986d74e61SPeter Brune #undef __FUNCT__ 14086d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPreCheck" 14186d74e61SPeter Brune /*@C 14286d74e61SPeter Brune PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine. 14386d74e61SPeter Brune 14486d74e61SPeter Brune Logically Collective on PetscLineSearch 14586d74e61SPeter Brune 14686d74e61SPeter Brune Input Parameters: 14786d74e61SPeter Brune + linesearch - the PetscLineSearch context 14886d74e61SPeter Brune . func - [optional] function evaluation routine 14986d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 15086d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 15186d74e61SPeter Brune 15286d74e61SPeter Brune Calling sequence of func: 15386d74e61SPeter Brune $ func (PetscLineSearch snes,Vec x,Vec y, PetscBool *changed); 15486d74e61SPeter Brune 15586d74e61SPeter Brune + x - solution vector 15686d74e61SPeter Brune . y - search direction vector 15786d74e61SPeter Brune - changed - flag to indicate the precheck changed something. 15886d74e61SPeter Brune 15986d74e61SPeter Brune Level: intermediate 16086d74e61SPeter Brune 16186d74e61SPeter Brune .keywords: set, linesearch, pre-check 16286d74e61SPeter Brune 16386d74e61SPeter Brune .seealso: PetscLineSearchSetPostCheck() 16486d74e61SPeter Brune @*/ 16586d74e61SPeter Brune PetscErrorCode PetscLineSearchSetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc func,void *ctx) 16686d74e61SPeter Brune { 167*9bd66eb0SPeter Brune PetscFunctionBegin; 16886d74e61SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 16986d74e61SPeter Brune if (func) linesearch->ops->precheckstep = func; 17086d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 17186d74e61SPeter Brune PetscFunctionReturn(0); 17286d74e61SPeter Brune } 17386d74e61SPeter Brune 17486d74e61SPeter Brune 17586d74e61SPeter Brune #undef __FUNCT__ 17686d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPreCheck" 17786d74e61SPeter Brune /*@C 17886d74e61SPeter Brune PetscLineSearchSetPreCheck - Sets a pre-check function for the line search routine. 17986d74e61SPeter Brune 18086d74e61SPeter Brune Input Parameters: 18186d74e61SPeter Brune . linesearch - the PetscLineSearch context 18286d74e61SPeter Brune 18386d74e61SPeter Brune Output Parameters: 18486d74e61SPeter Brune + func - [optional] function evaluation routine 18586d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 18686d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 18786d74e61SPeter Brune 18886d74e61SPeter Brune Level: intermediate 18986d74e61SPeter Brune 19086d74e61SPeter Brune .keywords: get, linesearch, pre-check 19186d74e61SPeter Brune 19286d74e61SPeter Brune .seealso: PetscLineSearchGetPostCheck(), PetscLineSearchSetPreCheck() 19386d74e61SPeter Brune @*/ 19486d74e61SPeter Brune PetscErrorCode PetscLineSearchGetPreCheck(PetscLineSearch linesearch, PetscLineSearchPreCheckFunc *func,void **ctx) 19586d74e61SPeter Brune { 196*9bd66eb0SPeter Brune PetscFunctionBegin; 19786d74e61SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 19886d74e61SPeter Brune if (func) *func = linesearch->ops->precheckstep; 19986d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 20086d74e61SPeter Brune PetscFunctionReturn(0); 20186d74e61SPeter Brune } 20286d74e61SPeter Brune 20386d74e61SPeter Brune 20486d74e61SPeter Brune #undef __FUNCT__ 20586d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchSetPostCheck" 20686d74e61SPeter Brune /*@C 20786d74e61SPeter Brune PetscLineSearchSetPostCheck - Sets a post-check function for the line search routine. 20886d74e61SPeter Brune 20986d74e61SPeter Brune Logically Collective on PetscLineSearch 21086d74e61SPeter Brune 21186d74e61SPeter Brune Input Parameters: 21286d74e61SPeter Brune + linesearch - the PetscLineSearch context 21386d74e61SPeter Brune . func - [optional] function evaluation routine 21486d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 21586d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 21686d74e61SPeter Brune 21786d74e61SPeter Brune Calling sequence of func: 21886d74e61SPeter Brune $ func (PetscLineSearch linesearch,Vec x, Vec w, Vec y, PetscBool *changed_w, *changed_y); 21986d74e61SPeter Brune 22086d74e61SPeter Brune + x - old solution vector 22186d74e61SPeter Brune . y - search direction vector 22286d74e61SPeter Brune . w - new solution vector 22386d74e61SPeter Brune . changed_y - indicates that the line search changed y. 22486d74e61SPeter Brune . changed_w - indicates that the line search changed w. 22586d74e61SPeter Brune 22686d74e61SPeter Brune Level: intermediate 22786d74e61SPeter Brune 22886d74e61SPeter Brune .keywords: set, linesearch, post-check 22986d74e61SPeter Brune 23086d74e61SPeter Brune .seealso: PetscLineSearchSetPreCheck() 23186d74e61SPeter Brune @*/ 23286d74e61SPeter Brune PetscErrorCode PetscLineSearchSetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc func,void *ctx) 23386d74e61SPeter Brune { 23486d74e61SPeter Brune PetscFunctionBegin; 23586d74e61SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 23686d74e61SPeter Brune if (func) linesearch->ops->postcheckstep = func; 23786d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 23886d74e61SPeter Brune PetscFunctionReturn(0); 23986d74e61SPeter Brune } 24086d74e61SPeter Brune 24186d74e61SPeter Brune 24286d74e61SPeter Brune #undef __FUNCT__ 24386d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchGetPostCheck" 24486d74e61SPeter Brune /*@C 24586d74e61SPeter Brune PetscLineSearchGetPostCheck - Gets the post-check function for the line search routine. 24686d74e61SPeter Brune 24786d74e61SPeter Brune Input Parameters: 24886d74e61SPeter Brune . linesearch - the PetscLineSearch context 24986d74e61SPeter Brune 25086d74e61SPeter Brune Output Parameters: 25186d74e61SPeter Brune + func - [optional] function evaluation routine 25286d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 25386d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 25486d74e61SPeter Brune 25586d74e61SPeter Brune Level: intermediate 25686d74e61SPeter Brune 25786d74e61SPeter Brune .keywords: get, linesearch, post-check 25886d74e61SPeter Brune 25986d74e61SPeter Brune .seealso: PetscLineSearchGetPreCheck(), PetscLineSearchSetPostCheck() 26086d74e61SPeter Brune @*/ 26186d74e61SPeter Brune PetscErrorCode PetscLineSearchGetPostCheck(PetscLineSearch linesearch, PetscLineSearchPostCheckFunc *func,void **ctx) 26286d74e61SPeter Brune { 263*9bd66eb0SPeter Brune PetscFunctionBegin; 26486d74e61SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 26586d74e61SPeter Brune if (func) *func = linesearch->ops->postcheckstep; 26686d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 26786d74e61SPeter Brune PetscFunctionReturn(0); 26886d74e61SPeter Brune } 26986d74e61SPeter Brune 27086d74e61SPeter Brune 271bf7f4e0aSPeter Brune #undef __FUNCT__ 2726188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheck" 273f40b411bSPeter Brune /*@ 2746188f407SPeter Brune PetscLineSearchPreCheck - Prepares the line search for being applied. 275f40b411bSPeter Brune 2766188f407SPeter Brune Collective on PetscLineSearch 277f40b411bSPeter Brune 278f40b411bSPeter Brune Input Parameters: 279f40b411bSPeter Brune . linesearch - The linesearch instance. 280f40b411bSPeter Brune 281f40b411bSPeter Brune Output Parameters: 282f40b411bSPeter Brune . changed - Indicator if the pre-check has changed anything. 283f40b411bSPeter Brune 284f40b411bSPeter Brune Level: Beginner 285f40b411bSPeter Brune 2866188f407SPeter Brune .keywords: PetscLineSearch, Create 287f40b411bSPeter Brune 2886188f407SPeter Brune .seealso: PetscLineSearchPostCheck() 289f40b411bSPeter Brune @*/ 2906188f407SPeter Brune PetscErrorCode PetscLineSearchPreCheck(PetscLineSearch linesearch, PetscBool * changed) 291bf7f4e0aSPeter Brune { 292bf7f4e0aSPeter Brune PetscErrorCode ierr; 293bf7f4e0aSPeter Brune PetscFunctionBegin; 294bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 295bf7f4e0aSPeter Brune if (linesearch->ops->precheckstep) { 296bf7f4e0aSPeter Brune ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr); 297bf7f4e0aSPeter Brune } 298bf7f4e0aSPeter Brune PetscFunctionReturn(0); 299bf7f4e0aSPeter Brune } 300bf7f4e0aSPeter Brune 301bf7f4e0aSPeter Brune #undef __FUNCT__ 3026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPostCheck" 303f40b411bSPeter Brune /*@ 3046188f407SPeter Brune PetscLineSearchPostCheck - Prepares the line search for being applied. 305f40b411bSPeter Brune 3066188f407SPeter Brune Collective on PetscLineSearch 307f40b411bSPeter Brune 308f40b411bSPeter Brune Input Parameters: 309f40b411bSPeter Brune . linesearch - The linesearch instance. 310f40b411bSPeter Brune 311f40b411bSPeter Brune Output Parameters: 31286d74e61SPeter Brune + changed_Y - Indicator if the solution has been changed. 31386d74e61SPeter Brune - changed_W - Indicator if the direction has been changed. 314f40b411bSPeter Brune 315f40b411bSPeter Brune Level: Intermediate 316f40b411bSPeter Brune 3176188f407SPeter Brune .keywords: PetscLineSearch, Create 318f40b411bSPeter Brune 3196188f407SPeter Brune .seealso: PetscLineSearchPreCheck() 320f40b411bSPeter Brune @*/ 32186d74e61SPeter Brune PetscErrorCode PetscLineSearchPostCheck(PetscLineSearch linesearch, PetscBool * changed_Y, PetscBool * changed_W) 322bf7f4e0aSPeter Brune { 323bf7f4e0aSPeter Brune PetscErrorCode ierr; 324bf7f4e0aSPeter Brune PetscFunctionBegin; 325bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 326bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 327bf7f4e0aSPeter Brune if (linesearch->ops->postcheckstep) { 32886d74e61SPeter Brune ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, linesearch->vec_sol_new, changed_Y, changed_W);CHKERRQ(ierr); 32986d74e61SPeter Brune } 33086d74e61SPeter Brune PetscFunctionReturn(0); 33186d74e61SPeter Brune } 33286d74e61SPeter Brune 33386d74e61SPeter Brune 33486d74e61SPeter Brune #undef __FUNCT__ 33586d74e61SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheckPicard" 33686d74e61SPeter Brune /*@C 33786d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 33886d74e61SPeter Brune 33986d74e61SPeter Brune Logically Collective 34086d74e61SPeter Brune 34186d74e61SPeter Brune Input Arguments: 34286d74e61SPeter Brune + linesearch - linesearch context 34386d74e61SPeter Brune . X - base state for this step 34486d74e61SPeter Brune . Y - initial correction 34586d74e61SPeter Brune 34686d74e61SPeter Brune Output Arguments: 34786d74e61SPeter Brune + Y - correction, possibly modified 34886d74e61SPeter Brune - changed - flag indicating that Y was modified 34986d74e61SPeter Brune 35086d74e61SPeter Brune Options Database Key: 35186d74e61SPeter Brune + -snes_ls_precheck_picard - activate this routine 35286d74e61SPeter Brune - -snes_ls_precheck_picard_angle - angle 35386d74e61SPeter Brune 35486d74e61SPeter Brune Level: advanced 35586d74e61SPeter Brune 35686d74e61SPeter Brune Notes: 35786d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 35886d74e61SPeter Brune 35986d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 36086d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 36186d74e61SPeter Brune is generally not useful when using a Newton linearization. 36286d74e61SPeter Brune 36386d74e61SPeter Brune Reference: 36486d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 36586d74e61SPeter Brune 36686d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck() 36786d74e61SPeter Brune @*/ 36886d74e61SPeter Brune PetscErrorCode PetscLineSearchPreCheckPicard(PetscLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 36986d74e61SPeter Brune { 37086d74e61SPeter Brune PetscErrorCode ierr; 37186d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 37286d74e61SPeter Brune Vec Ylast; 37386d74e61SPeter Brune PetscScalar dot; 37486d74e61SPeter Brune PetscInt iter; 37586d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 37686d74e61SPeter Brune SNES snes; 37786d74e61SPeter Brune 37886d74e61SPeter Brune PetscFunctionBegin; 37986d74e61SPeter Brune ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 38086d74e61SPeter Brune ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr); 38186d74e61SPeter Brune if (!Ylast) { 38286d74e61SPeter Brune ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr); 38386d74e61SPeter Brune ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr); 38486d74e61SPeter Brune ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr); 38586d74e61SPeter Brune } 38686d74e61SPeter Brune ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr); 38786d74e61SPeter Brune if (iter < 2) { 38886d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 38986d74e61SPeter Brune *changed = PETSC_FALSE; 39086d74e61SPeter Brune PetscFunctionReturn(0); 39186d74e61SPeter Brune } 39286d74e61SPeter Brune 39386d74e61SPeter Brune ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr); 39486d74e61SPeter Brune ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr); 39586d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr); 39686d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 39786d74e61SPeter Brune theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 39886d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 39986d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 40086d74e61SPeter Brune /* Modify the step Y */ 40186d74e61SPeter Brune PetscReal alpha,ydiffnorm; 40286d74e61SPeter Brune ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr); 40386d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr); 40486d74e61SPeter Brune alpha = ylastnorm / ydiffnorm; 40586d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 40686d74e61SPeter Brune ierr = VecScale(Y,alpha);CHKERRQ(ierr); 40786d74e61SPeter Brune ierr = PetscInfo3(snes,"Angle %G degrees less than threshold %G, corrected step by alpha=%G\n",theta*180./PETSC_PI,angle,alpha);CHKERRQ(ierr); 40886d74e61SPeter Brune } else { 40986d74e61SPeter Brune ierr = PetscInfo2(snes,"Angle %G degrees exceeds threshold %G, no correction applied\n",theta*180./PETSC_PI,angle);CHKERRQ(ierr); 41086d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 41186d74e61SPeter Brune *changed = PETSC_FALSE; 412bf7f4e0aSPeter Brune } 413bf7f4e0aSPeter Brune PetscFunctionReturn(0); 414bf7f4e0aSPeter Brune } 415bf7f4e0aSPeter Brune 416bf7f4e0aSPeter Brune #undef __FUNCT__ 4176188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply" 418f40b411bSPeter Brune /*@ 4196188f407SPeter Brune PetscLineSearchApply - Computes the line-search update 420f40b411bSPeter Brune 4216188f407SPeter Brune Collective on PetscLineSearch 422f40b411bSPeter Brune 423f40b411bSPeter Brune Input Parameters: 424f40b411bSPeter Brune + linesearch - The linesearch instance. 425f40b411bSPeter Brune . X - The current solution. 426f40b411bSPeter Brune . F - The current function. 427f40b411bSPeter Brune . fnorm - The current norm. 428f40b411bSPeter Brune . Y - The search direction. 429f40b411bSPeter Brune 430f40b411bSPeter Brune Output Parameters: 431f40b411bSPeter Brune + X - The new solution. 432f40b411bSPeter Brune . F - The new function. 433f40b411bSPeter Brune - fnorm - The new function norm. 434f40b411bSPeter Brune 435f40b411bSPeter Brune Level: Intermediate 436f40b411bSPeter Brune 4376188f407SPeter Brune .keywords: PetscLineSearch, Create 438f40b411bSPeter Brune 4396188f407SPeter Brune .seealso: PetscLineSearchCreate(), PetscLineSearchPreCheck(), PetscLineSearchPostCheck() 440f40b411bSPeter Brune @*/ 4416188f407SPeter Brune PetscErrorCode PetscLineSearchApply(PetscLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) { 442bf7f4e0aSPeter Brune PetscErrorCode ierr; 443bf7f4e0aSPeter Brune PetscFunctionBegin; 444bf7f4e0aSPeter Brune 445bf7f4e0aSPeter Brune /* check the pointers */ 4466188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 447bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 448bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 449bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 450bf7f4e0aSPeter Brune 451bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 452bf7f4e0aSPeter Brune 453bf7f4e0aSPeter Brune linesearch->vec_sol = X; 454bf7f4e0aSPeter Brune linesearch->vec_update = Y; 455bf7f4e0aSPeter Brune linesearch->vec_func = F; 456bf7f4e0aSPeter Brune 4576188f407SPeter Brune ierr = PetscLineSearchSetUp(linesearch);CHKERRQ(ierr); 458bf7f4e0aSPeter Brune 459bf7f4e0aSPeter Brune if (!linesearch->keeplambda) 460bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 461bf7f4e0aSPeter Brune 462bf7f4e0aSPeter Brune if (fnorm) { 463bf7f4e0aSPeter Brune linesearch->fnorm = *fnorm; 464bf7f4e0aSPeter Brune } else { 465bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 466bf7f4e0aSPeter Brune } 467bf7f4e0aSPeter Brune 4686188f407SPeter Brune ierr = PetscLogEventBegin(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 469bf7f4e0aSPeter Brune 470bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 471bf7f4e0aSPeter Brune 4726188f407SPeter Brune ierr = PetscLogEventEnd(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 473bf7f4e0aSPeter Brune 474bf7f4e0aSPeter Brune if (fnorm) 475bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 476bf7f4e0aSPeter Brune PetscFunctionReturn(0); 477bf7f4e0aSPeter Brune } 478bf7f4e0aSPeter Brune 479bf7f4e0aSPeter Brune #undef __FUNCT__ 4806188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy" 481f40b411bSPeter Brune /*@ 4826188f407SPeter Brune PetscLineSearchDestroy - Destroys the line search instance. 483f40b411bSPeter Brune 4846188f407SPeter Brune Collective on PetscLineSearch 485f40b411bSPeter Brune 486f40b411bSPeter Brune Input Parameters: 487f40b411bSPeter Brune . linesearch - The linesearch instance. 488f40b411bSPeter Brune 489f40b411bSPeter Brune Level: Intermediate 490f40b411bSPeter Brune 4916188f407SPeter Brune .keywords: PetscLineSearch, Create 492f40b411bSPeter Brune 4936188f407SPeter Brune .seealso: PetscLineSearchCreate(), PetscLineSearchReset() 494f40b411bSPeter Brune @*/ 4956188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy(PetscLineSearch * linesearch) { 496bf7f4e0aSPeter Brune PetscErrorCode ierr; 497bf7f4e0aSPeter Brune PetscFunctionBegin; 498bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 4996188f407SPeter Brune PetscValidHeaderSpecific((*linesearch),PETSCLINESEARCH_CLASSID,1); 500bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 501bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 5026188f407SPeter Brune ierr = PetscLineSearchReset(*linesearch); 503bf7f4e0aSPeter Brune if ((*linesearch)->ops->destroy) { 504bf7f4e0aSPeter Brune (*linesearch)->ops->destroy(*linesearch); 505bf7f4e0aSPeter Brune } 506bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 507e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 508bf7f4e0aSPeter Brune PetscFunctionReturn(0); 509bf7f4e0aSPeter Brune } 510bf7f4e0aSPeter Brune 511bf7f4e0aSPeter Brune #undef __FUNCT__ 5126188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetMonitor" 513f40b411bSPeter Brune /*@ 5146188f407SPeter Brune PetscLineSearchSetMonitor - Turns on/off printing useful things about the line search. 515bf7f4e0aSPeter Brune 516bf7f4e0aSPeter Brune Input Parameters: 517bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 518bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 519bf7f4e0aSPeter Brune 520bf7f4e0aSPeter Brune Logically Collective on SNES 521bf7f4e0aSPeter Brune 522bf7f4e0aSPeter Brune Options Database: 523f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 524bf7f4e0aSPeter Brune 525bf7f4e0aSPeter Brune Level: intermediate 526bf7f4e0aSPeter Brune 527bf7f4e0aSPeter Brune 5286188f407SPeter Brune .seealso: PetscLineSearchGetMonitor() 529bf7f4e0aSPeter Brune @*/ 5306188f407SPeter Brune PetscErrorCode PetscLineSearchSetMonitor(PetscLineSearch linesearch, PetscBool flg) 531bf7f4e0aSPeter Brune { 532bf7f4e0aSPeter Brune 533bf7f4e0aSPeter Brune PetscErrorCode ierr; 534bf7f4e0aSPeter Brune PetscFunctionBegin; 535bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 536bf7f4e0aSPeter Brune ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr); 537bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 538bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 539bf7f4e0aSPeter Brune } 540bf7f4e0aSPeter Brune PetscFunctionReturn(0); 541bf7f4e0aSPeter Brune } 542bf7f4e0aSPeter Brune 543bf7f4e0aSPeter Brune #undef __FUNCT__ 5446188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetMonitor" 545f40b411bSPeter Brune /*@ 5466188f407SPeter Brune PetscLineSearchGetMonitor - Gets the monitor instance for the line search 5476a388c36SPeter Brune 548f40b411bSPeter Brune Input Parameters: 549f40b411bSPeter Brune . linesearch - linesearch context. 550f40b411bSPeter Brune 551f40b411bSPeter Brune Input Parameters: 552f40b411bSPeter Brune . monitor - monitor context. 553f40b411bSPeter Brune 554f40b411bSPeter Brune Logically Collective on SNES 555f40b411bSPeter Brune 556f40b411bSPeter Brune 557f40b411bSPeter Brune Options Database Keys: 558f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 559f40b411bSPeter Brune 560f40b411bSPeter Brune Level: intermediate 561f40b411bSPeter Brune 562f40b411bSPeter Brune 5636188f407SPeter Brune .seealso: PetscLineSearchSetMonitor() 564f40b411bSPeter Brune @*/ 5656188f407SPeter Brune PetscErrorCode PetscLineSearchGetMonitor(PetscLineSearch linesearch, PetscViewer *monitor) 5666a388c36SPeter Brune { 5676a388c36SPeter Brune 5686a388c36SPeter Brune PetscFunctionBegin; 5696188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 5706a388c36SPeter Brune if (monitor) { 5716a388c36SPeter Brune PetscValidPointer(monitor, 2); 5726a388c36SPeter Brune *monitor = linesearch->monitor; 5736a388c36SPeter Brune } 5746a388c36SPeter Brune PetscFunctionReturn(0); 5756a388c36SPeter Brune } 5766a388c36SPeter Brune 5776a388c36SPeter Brune #undef __FUNCT__ 5786188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetFromOptions" 579f40b411bSPeter Brune /*@ 5806188f407SPeter Brune PetscLineSearchSetFromOptions - Sets options for the line search 581f40b411bSPeter Brune 582f40b411bSPeter Brune Input Parameters: 583f40b411bSPeter Brune . linesearch - linesearch context. 584f40b411bSPeter Brune 585f40b411bSPeter Brune Options Database Keys: 586f40b411bSPeter Brune + -linesearch_type - The Line search method 587f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches 588f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter. 589f40b411bSPeter Brune . -linesearch_norms - Turn on/off the linesearch norms 590f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess. 591f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches. 592f40b411bSPeter Brune 5936188f407SPeter Brune Logically Collective on PetscLineSearch 594f40b411bSPeter Brune 595f40b411bSPeter Brune Level: intermediate 596f40b411bSPeter Brune 597f40b411bSPeter Brune 5986188f407SPeter Brune .seealso: PetscLineSearchCreate() 599f40b411bSPeter Brune @*/ 6006188f407SPeter Brune PetscErrorCode PetscLineSearchSetFromOptions(PetscLineSearch linesearch) { 601bf7f4e0aSPeter Brune PetscErrorCode ierr; 6026188f407SPeter Brune const char *deft = PETSCLINESEARCHBASIC; 603bf7f4e0aSPeter Brune char type[256]; 604bf7f4e0aSPeter Brune PetscBool flg, set; 605bf7f4e0aSPeter Brune PetscFunctionBegin; 6066188f407SPeter Brune if (!PetscLineSearchRegisterAllCalled) {ierr = PetscLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 607bf7f4e0aSPeter Brune 608bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 609bf7f4e0aSPeter Brune if (((PetscObject)linesearch)->type_name) { 610bf7f4e0aSPeter Brune deft = ((PetscObject)linesearch)->type_name; 611bf7f4e0aSPeter Brune } 6126188f407SPeter Brune ierr = PetscOptionsList("-linesearch_type","Line-search method","PetscLineSearchSetType",PetscLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 613bf7f4e0aSPeter Brune if (flg) { 6146188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,type);CHKERRQ(ierr); 615bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 6166188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 617bf7f4e0aSPeter Brune } 618bf7f4e0aSPeter Brune if (linesearch->ops->setfromoptions) { 619bf7f4e0aSPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 620bf7f4e0aSPeter Brune } 621bf7f4e0aSPeter Brune 6226188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESPetscLineSearchSetMonitor", 623bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 6246188f407SPeter Brune if (set) {ierr = PetscLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 625bf7f4e0aSPeter Brune 6266188f407SPeter Brune ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","PetscLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 6276188f407SPeter Brune ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","PetscLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr); 6286188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","PetscLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 6296188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","PetscLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 630bf7f4e0aSPeter Brune ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 631bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 632bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 633bf7f4e0aSPeter Brune PetscFunctionReturn(0); 634bf7f4e0aSPeter Brune } 635bf7f4e0aSPeter Brune 636bf7f4e0aSPeter Brune #undef __FUNCT__ 6376188f407SPeter Brune #define __FUNCT__ "PetscLineSearchView" 638f40b411bSPeter Brune /*@ 6396188f407SPeter Brune PetscLineSearchView - Views useful information for the line search. 640f40b411bSPeter Brune 641f40b411bSPeter Brune Input Parameters: 642f40b411bSPeter Brune . linesearch - linesearch context. 643f40b411bSPeter Brune 6446188f407SPeter Brune Logically Collective on PetscLineSearch 645f40b411bSPeter Brune 646f40b411bSPeter Brune Level: intermediate 647f40b411bSPeter Brune 648f40b411bSPeter Brune 6496188f407SPeter Brune .seealso: PetscLineSearchCreate() 650f40b411bSPeter Brune @*/ 6516188f407SPeter Brune PetscErrorCode PetscLineSearchView(PetscLineSearch linesearch) { 652bf7f4e0aSPeter Brune PetscFunctionBegin; 653f40b411bSPeter Brune 654bf7f4e0aSPeter Brune PetscFunctionReturn(0); 655bf7f4e0aSPeter Brune } 656bf7f4e0aSPeter Brune 657bf7f4e0aSPeter Brune #undef __FUNCT__ 6586188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetType" 659f40b411bSPeter Brune /*@ 6606188f407SPeter Brune PetscLineSearchSetType - Sets the linesearch type 661f40b411bSPeter Brune 662f40b411bSPeter Brune Input Parameters: 663f40b411bSPeter Brune + linesearch - linesearch context. 664f40b411bSPeter Brune - type - The type of line search to be used 665f40b411bSPeter Brune 6666188f407SPeter Brune Logically Collective on PetscLineSearch 667f40b411bSPeter Brune 668f40b411bSPeter Brune Level: intermediate 669f40b411bSPeter Brune 670f40b411bSPeter Brune 6716188f407SPeter Brune .seealso: PetscLineSearchCreate() 672f40b411bSPeter Brune @*/ 6736188f407SPeter Brune PetscErrorCode PetscLineSearchSetType(PetscLineSearch linesearch, const PetscLineSearchType type) 674bf7f4e0aSPeter Brune { 675bf7f4e0aSPeter Brune 6766188f407SPeter Brune PetscErrorCode ierr,(*r)(PetscLineSearch); 677bf7f4e0aSPeter Brune PetscBool match; 678bf7f4e0aSPeter Brune 679bf7f4e0aSPeter Brune PetscFunctionBegin; 6806188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 681bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 682bf7f4e0aSPeter Brune 683bf7f4e0aSPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 684bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 685bf7f4e0aSPeter Brune 6866188f407SPeter Brune ierr = PetscFListFind(PetscLineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 687bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 688bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 689bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 690bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 691bf7f4e0aSPeter Brune linesearch->ops->destroy = PETSC_NULL; 692bf7f4e0aSPeter Brune } 6936188f407SPeter Brune /* Reinitialize function pointers in PetscLineSearchOps structure */ 694bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 695bf7f4e0aSPeter Brune linesearch->ops->view = 0; 696bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 697bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 698bf7f4e0aSPeter Brune 699bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 700bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 701bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS) 702bf7f4e0aSPeter Brune if (PetscAMSPublishAll) { 703bf7f4e0aSPeter Brune ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr); 704bf7f4e0aSPeter Brune } 705bf7f4e0aSPeter Brune #endif 706bf7f4e0aSPeter Brune PetscFunctionReturn(0); 707bf7f4e0aSPeter Brune } 708bf7f4e0aSPeter Brune 709bf7f4e0aSPeter Brune #undef __FUNCT__ 7106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSNES" 711f40b411bSPeter Brune /*@ 7126188f407SPeter Brune PetscLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation 713f40b411bSPeter Brune 714f40b411bSPeter Brune Input Parameters: 715f40b411bSPeter Brune + linesearch - linesearch context. 716f40b411bSPeter Brune - snes - The snes instance 717f40b411bSPeter Brune 718f40b411bSPeter Brune Level: intermediate 719f40b411bSPeter Brune 720f40b411bSPeter Brune 7216188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 722f40b411bSPeter Brune @*/ 7236188f407SPeter Brune PetscErrorCode PetscLineSearchSetSNES(PetscLineSearch linesearch, SNES snes){ 724bf7f4e0aSPeter Brune PetscFunctionBegin; 7256188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 726bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 727bf7f4e0aSPeter Brune linesearch->snes = snes; 728bf7f4e0aSPeter Brune PetscFunctionReturn(0); 729bf7f4e0aSPeter Brune } 730bf7f4e0aSPeter Brune 731bf7f4e0aSPeter Brune #undef __FUNCT__ 7326188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSNES" 733f40b411bSPeter Brune /*@ 7346188f407SPeter Brune PetscLineSearchGetSNES - Gets the SNES for the linesearch for function evaluation 735f40b411bSPeter Brune 736f40b411bSPeter Brune Input Parameters: 737f40b411bSPeter Brune . linesearch - linesearch context. 738f40b411bSPeter Brune 739f40b411bSPeter Brune Output Parameters: 740f40b411bSPeter Brune . snes - The snes instance 741f40b411bSPeter Brune 742f40b411bSPeter Brune Level: intermediate 743f40b411bSPeter Brune 7446188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 745f40b411bSPeter Brune @*/ 7466188f407SPeter Brune PetscErrorCode PetscLineSearchGetSNES(PetscLineSearch linesearch, SNES *snes){ 747bf7f4e0aSPeter Brune PetscFunctionBegin; 7486188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 7496a388c36SPeter Brune PetscValidPointer(snes, 2); 750bf7f4e0aSPeter Brune *snes = linesearch->snes; 751bf7f4e0aSPeter Brune PetscFunctionReturn(0); 752bf7f4e0aSPeter Brune } 753bf7f4e0aSPeter Brune 7546a388c36SPeter Brune #undef __FUNCT__ 7556188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetLambda" 756f40b411bSPeter Brune /*@ 7576188f407SPeter Brune PetscLineSearchGetLambda - Gets the last linesearch steplength discovered. 758f40b411bSPeter Brune 759f40b411bSPeter Brune Input Parameters: 760f40b411bSPeter Brune . linesearch - linesearch context. 761f40b411bSPeter Brune 762f40b411bSPeter Brune Output Parameters: 763f40b411bSPeter Brune . lambda - The last steplength. 764f40b411bSPeter Brune 765f40b411bSPeter Brune Level: intermediate 766f40b411bSPeter Brune 7676188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 768f40b411bSPeter Brune @*/ 7696188f407SPeter Brune PetscErrorCode PetscLineSearchGetLambda(PetscLineSearch linesearch,PetscReal *lambda) 7706a388c36SPeter Brune { 7716a388c36SPeter Brune PetscFunctionBegin; 7726188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 7736a388c36SPeter Brune PetscValidPointer(lambda, 2); 7746a388c36SPeter Brune *lambda = linesearch->lambda; 7756a388c36SPeter Brune PetscFunctionReturn(0); 7766a388c36SPeter Brune } 7776a388c36SPeter Brune 7786a388c36SPeter Brune #undef __FUNCT__ 7796188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetLambda" 780f40b411bSPeter Brune /*@ 7816188f407SPeter Brune PetscLineSearchSetLambda - Sets the linesearch steplength. 782f40b411bSPeter Brune 783f40b411bSPeter Brune Input Parameters: 784f40b411bSPeter Brune + linesearch - linesearch context. 785f40b411bSPeter Brune - lambda - The last steplength. 786f40b411bSPeter Brune 787f40b411bSPeter Brune Level: intermediate 788f40b411bSPeter Brune 7896188f407SPeter Brune .seealso: PetscLineSearchGetLambda() 790f40b411bSPeter Brune @*/ 7916188f407SPeter Brune PetscErrorCode PetscLineSearchSetLambda(PetscLineSearch linesearch, PetscReal lambda) 7926a388c36SPeter Brune { 7936a388c36SPeter Brune PetscFunctionBegin; 7946188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 7956a388c36SPeter Brune linesearch->lambda = lambda; 7966a388c36SPeter Brune PetscFunctionReturn(0); 7976a388c36SPeter Brune } 7986a388c36SPeter Brune 7996a388c36SPeter Brune #undef __FUNCT__ 8006188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetTolerances" 801f40b411bSPeter Brune /*@ 8026188f407SPeter Brune PetscLineSearchGetTolerances - Gets the tolerances for the method 803f40b411bSPeter Brune 804f40b411bSPeter Brune Input Parameters: 805f40b411bSPeter Brune . linesearch - linesearch context. 806f40b411bSPeter Brune 807f40b411bSPeter Brune Output Parameters: 808516fe3c3SPeter Brune + steptol - The minimum steplength 809516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 810516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 811516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 812516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 813f40b411bSPeter Brune 814f40b411bSPeter Brune 815516fe3c3SPeter Brune Level: advanced 816516fe3c3SPeter Brune 8176188f407SPeter Brune .seealso: PetscLineSearchSetTolerances() 818f40b411bSPeter Brune @*/ 8196188f407SPeter Brune PetscErrorCode PetscLineSearchGetTolerances(PetscLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 8206a388c36SPeter Brune { 8216a388c36SPeter Brune PetscFunctionBegin; 8226188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 823516fe3c3SPeter Brune if (steptol) { 8246a388c36SPeter Brune PetscValidPointer(steptol, 2); 8256a388c36SPeter Brune *steptol = linesearch->steptol; 826516fe3c3SPeter Brune } 827516fe3c3SPeter Brune if (maxstep) { 828516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 829516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 830516fe3c3SPeter Brune } 831516fe3c3SPeter Brune if (rtol) { 832516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 833516fe3c3SPeter Brune *rtol = linesearch->rtol; 834516fe3c3SPeter Brune } 835516fe3c3SPeter Brune if (atol) { 836516fe3c3SPeter Brune PetscValidPointer(atol, 5); 837516fe3c3SPeter Brune *atol = linesearch->atol; 838516fe3c3SPeter Brune } 839516fe3c3SPeter Brune if (ltol) { 840516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 841516fe3c3SPeter Brune *ltol = linesearch->ltol; 842516fe3c3SPeter Brune } 843516fe3c3SPeter Brune if (max_its) { 844516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 845516fe3c3SPeter Brune *max_its = linesearch->max_its; 846516fe3c3SPeter Brune } 8476a388c36SPeter Brune PetscFunctionReturn(0); 8486a388c36SPeter Brune } 8496a388c36SPeter Brune 8506a388c36SPeter Brune #undef __FUNCT__ 8516188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetTolerances" 852f40b411bSPeter Brune /*@ 8536188f407SPeter Brune PetscLineSearchSetTolerances - Sets the tolerances for the method 854f40b411bSPeter Brune 855f40b411bSPeter Brune Input Parameters: 856516fe3c3SPeter Brune + linesearch - linesearch context. 857516fe3c3SPeter Brune . steptol - The minimum steplength 858516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 859516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 860516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 861516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 862f40b411bSPeter Brune 863f40b411bSPeter Brune 864516fe3c3SPeter Brune Level: advanced 865516fe3c3SPeter Brune 8666188f407SPeter Brune .seealso: PetscLineSearchGetTolerances() 867f40b411bSPeter Brune @*/ 8686188f407SPeter Brune PetscErrorCode PetscLineSearchSetTolerances(PetscLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 8696a388c36SPeter Brune { 8706a388c36SPeter Brune PetscFunctionBegin; 8716188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 8726a388c36SPeter Brune linesearch->steptol = steptol; 873516fe3c3SPeter Brune linesearch->maxstep = maxstep; 874516fe3c3SPeter Brune linesearch->rtol = rtol; 875516fe3c3SPeter Brune linesearch->atol = atol; 876516fe3c3SPeter Brune linesearch->ltol = ltol; 877516fe3c3SPeter Brune linesearch->max_its = max_its; 8786a388c36SPeter Brune PetscFunctionReturn(0); 8796a388c36SPeter Brune } 8806a388c36SPeter Brune 881516fe3c3SPeter Brune 8826a388c36SPeter Brune #undef __FUNCT__ 8836188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetDamping" 884f40b411bSPeter Brune /*@ 8856188f407SPeter Brune PetscLineSearchGetDamping - Gets the line search damping parameter. 886f40b411bSPeter Brune 887f40b411bSPeter Brune Input Parameters: 888f40b411bSPeter Brune . linesearch - linesearch context. 889f40b411bSPeter Brune 890f40b411bSPeter Brune Output Parameters: 891f40b411bSPeter Brune . damping - The damping parameter. 892f40b411bSPeter Brune 893f40b411bSPeter Brune Level: intermediate 894f40b411bSPeter Brune 8956188f407SPeter Brune .seealso: PetscLineSearchGetStepTolerance() 896f40b411bSPeter Brune @*/ 897f40b411bSPeter Brune 8986188f407SPeter Brune PetscErrorCode PetscLineSearchGetDamping(PetscLineSearch linesearch,PetscReal *damping) 8996a388c36SPeter Brune { 9006a388c36SPeter Brune PetscFunctionBegin; 9016188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 9026a388c36SPeter Brune PetscValidPointer(damping, 2); 9036a388c36SPeter Brune *damping = linesearch->damping; 9046a388c36SPeter Brune PetscFunctionReturn(0); 9056a388c36SPeter Brune } 9066a388c36SPeter Brune 9076a388c36SPeter Brune #undef __FUNCT__ 9086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetDamping" 909f40b411bSPeter Brune /*@ 9106188f407SPeter Brune PetscLineSearchSetDamping - Sets the line search damping paramter. 911f40b411bSPeter Brune 912f40b411bSPeter Brune Input Parameters: 913f40b411bSPeter Brune . linesearch - linesearch context. 914f40b411bSPeter Brune . damping - The damping parameter. 915f40b411bSPeter Brune 916f40b411bSPeter Brune Level: intermediate 917f40b411bSPeter Brune 9186188f407SPeter Brune .seealso: PetscLineSearchGetDamping() 919f40b411bSPeter Brune @*/ 9206188f407SPeter Brune PetscErrorCode PetscLineSearchSetDamping(PetscLineSearch linesearch,PetscReal damping) 9216a388c36SPeter Brune { 9226a388c36SPeter Brune PetscFunctionBegin; 9236188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 9246a388c36SPeter Brune linesearch->damping = damping; 9256a388c36SPeter Brune PetscFunctionReturn(0); 9266a388c36SPeter Brune } 9276a388c36SPeter Brune 9286a388c36SPeter Brune #undef __FUNCT__ 9296188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetNorms" 930f40b411bSPeter Brune /*@ 9316188f407SPeter Brune PetscLineSearchGetNorms - Gets the norms for for X, Y, and F. 932f40b411bSPeter Brune 933f40b411bSPeter Brune Input Parameters: 934f40b411bSPeter Brune . linesearch - linesearch context. 935f40b411bSPeter Brune 936f40b411bSPeter Brune Output Parameters: 937f40b411bSPeter Brune + xnorm - The norm of the current solution 938f40b411bSPeter Brune . fnorm - The norm of the current function 939f40b411bSPeter Brune - ynorm - The norm of the current update 940f40b411bSPeter Brune 941f40b411bSPeter Brune Level: intermediate 942f40b411bSPeter Brune 9436188f407SPeter Brune .seealso: PetscLineSearchSetNorms() PetscLineSearchGetVecs() 944f40b411bSPeter Brune @*/ 9456188f407SPeter Brune PetscErrorCode PetscLineSearchGetNorms(PetscLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 946bf7f4e0aSPeter Brune { 947bf7f4e0aSPeter Brune PetscFunctionBegin; 9486188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 949bf7f4e0aSPeter Brune if (xnorm) { 950bf7f4e0aSPeter Brune *xnorm = linesearch->xnorm; 951bf7f4e0aSPeter Brune } 952bf7f4e0aSPeter Brune if (fnorm) { 953bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 954bf7f4e0aSPeter Brune } 955bf7f4e0aSPeter Brune if (ynorm) { 956bf7f4e0aSPeter Brune *ynorm = linesearch->ynorm; 957bf7f4e0aSPeter Brune } 958bf7f4e0aSPeter Brune PetscFunctionReturn(0); 959bf7f4e0aSPeter Brune } 960bf7f4e0aSPeter Brune 961e7058c64SPeter Brune #undef __FUNCT__ 9626188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetNorms" 963f40b411bSPeter Brune /*@ 9646188f407SPeter Brune PetscLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 965f40b411bSPeter Brune 966f40b411bSPeter Brune Input Parameters: 967f40b411bSPeter Brune + linesearch - linesearch context. 968f40b411bSPeter Brune . xnorm - The norm of the current solution 969f40b411bSPeter Brune . fnorm - The norm of the current function 970f40b411bSPeter Brune - ynorm - The norm of the current update 971f40b411bSPeter Brune 972f40b411bSPeter Brune Level: intermediate 973f40b411bSPeter Brune 9746188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs() 975f40b411bSPeter Brune @*/ 9766188f407SPeter Brune PetscErrorCode PetscLineSearchSetNorms(PetscLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 9776a388c36SPeter Brune { 9786a388c36SPeter Brune PetscFunctionBegin; 9796188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 9806a388c36SPeter Brune linesearch->xnorm = xnorm; 9816a388c36SPeter Brune linesearch->fnorm = fnorm; 9826a388c36SPeter Brune linesearch->ynorm = ynorm; 9836a388c36SPeter Brune PetscFunctionReturn(0); 9846a388c36SPeter Brune } 9856a388c36SPeter Brune 9866a388c36SPeter Brune #undef __FUNCT__ 9876188f407SPeter Brune #define __FUNCT__ "PetscLineSearchComputeNorms" 988f40b411bSPeter Brune /*@ 9896188f407SPeter Brune PetscLineSearchComputeNorms - Computes the norms of X, F, and Y. 990f40b411bSPeter Brune 991f40b411bSPeter Brune Input Parameters: 992f40b411bSPeter Brune . linesearch - linesearch context. 993f40b411bSPeter Brune 994f40b411bSPeter Brune Options Database Keys: 995f40b411bSPeter Brune . -linesearch_norms - turn norm computation on or off. 996f40b411bSPeter Brune 997f40b411bSPeter Brune Level: intermediate 998f40b411bSPeter Brune 9996188f407SPeter Brune .seealso: PetscLineSearchGetNorms, PetscLineSearchSetNorms() 1000f40b411bSPeter Brune @*/ 10016188f407SPeter Brune PetscErrorCode PetscLineSearchComputeNorms(PetscLineSearch linesearch) 10026a388c36SPeter Brune { 10036a388c36SPeter Brune PetscErrorCode ierr; 1004*9bd66eb0SPeter Brune SNES snes; 10056a388c36SPeter Brune PetscFunctionBegin; 10066a388c36SPeter Brune if (linesearch->norms) { 1007*9bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1008*9bd66eb0SPeter Brune ierr = PetscLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 1009*9bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 1010*9bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 1011*9bd66eb0SPeter Brune ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr); 1012*9bd66eb0SPeter Brune } else { 10136a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 10146a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 10156a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 10166a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 10176a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 10186a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 10196a388c36SPeter Brune } 1020*9bd66eb0SPeter Brune } 10216a388c36SPeter Brune PetscFunctionReturn(0); 10226a388c36SPeter Brune } 10236a388c36SPeter Brune 10246a388c36SPeter Brune #undef __FUNCT__ 10256188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetVecs" 1026f40b411bSPeter Brune /*@ 10276188f407SPeter Brune PetscLineSearchGetVecs - Gets the vectors from the PetscLineSearch context 1028f40b411bSPeter Brune 1029f40b411bSPeter Brune Input Parameters: 1030f40b411bSPeter Brune . linesearch - linesearch context. 1031f40b411bSPeter Brune 1032f40b411bSPeter Brune Output Parameters: 1033f40b411bSPeter Brune + X - The old solution 1034f40b411bSPeter Brune . F - The old function 1035f40b411bSPeter Brune . Y - The search direction 1036f40b411bSPeter Brune . W - The new solution 1037f40b411bSPeter Brune - G - The new function 1038f40b411bSPeter Brune 1039f40b411bSPeter Brune Level: intermediate 1040f40b411bSPeter Brune 10416188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs() 1042f40b411bSPeter Brune @*/ 10436188f407SPeter Brune PetscErrorCode PetscLineSearchGetVecs(PetscLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) { 10446a388c36SPeter Brune PetscFunctionBegin; 10456188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 10466a388c36SPeter Brune if (X) { 10476a388c36SPeter Brune PetscValidPointer(X, 2); 10486a388c36SPeter Brune *X = linesearch->vec_sol; 10496a388c36SPeter Brune } 10506a388c36SPeter Brune if (F) { 10516a388c36SPeter Brune PetscValidPointer(F, 3); 10526a388c36SPeter Brune *F = linesearch->vec_func; 10536a388c36SPeter Brune } 10546a388c36SPeter Brune if (Y) { 10556a388c36SPeter Brune PetscValidPointer(Y, 4); 10566a388c36SPeter Brune *Y = linesearch->vec_update; 10576a388c36SPeter Brune } 10586a388c36SPeter Brune if (W) { 10596a388c36SPeter Brune PetscValidPointer(W, 5); 10606a388c36SPeter Brune *W = linesearch->vec_sol_new; 10616a388c36SPeter Brune } 10626a388c36SPeter Brune if (G) { 10636a388c36SPeter Brune PetscValidPointer(G, 6); 10646a388c36SPeter Brune *G = linesearch->vec_func_new; 10656a388c36SPeter Brune } 10666a388c36SPeter Brune 10676a388c36SPeter Brune PetscFunctionReturn(0); 10686a388c36SPeter Brune } 10696a388c36SPeter Brune 10706a388c36SPeter Brune #undef __FUNCT__ 10716188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetVecs" 1072f40b411bSPeter Brune /*@ 10736188f407SPeter Brune PetscLineSearchSetVecs - Sets the vectors on the PetscLineSearch context 1074f40b411bSPeter Brune 1075f40b411bSPeter Brune Input Parameters: 1076f40b411bSPeter Brune + linesearch - linesearch context. 1077f40b411bSPeter Brune . X - The old solution 1078f40b411bSPeter Brune . F - The old function 1079f40b411bSPeter Brune . Y - The search direction 1080f40b411bSPeter Brune . W - The new solution 1081f40b411bSPeter Brune - G - The new function 1082f40b411bSPeter Brune 1083f40b411bSPeter Brune Level: intermediate 1084f40b411bSPeter Brune 10856188f407SPeter Brune .seealso: PetscLineSearchSetNorms(), PetscLineSearchGetVecs() 1086f40b411bSPeter Brune @*/ 10876188f407SPeter Brune PetscErrorCode PetscLineSearchSetVecs(PetscLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) { 10886a388c36SPeter Brune PetscFunctionBegin; 10896188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 10906a388c36SPeter Brune if (X) { 10916a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 10926a388c36SPeter Brune linesearch->vec_sol = X; 10936a388c36SPeter Brune } 10946a388c36SPeter Brune if (F) { 10956a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 10966a388c36SPeter Brune linesearch->vec_func = F; 10976a388c36SPeter Brune } 10986a388c36SPeter Brune if (Y) { 10996a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 11006a388c36SPeter Brune linesearch->vec_update = Y; 11016a388c36SPeter Brune } 11026a388c36SPeter Brune if (W) { 11036a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 11046a388c36SPeter Brune linesearch->vec_sol_new = W; 11056a388c36SPeter Brune } 11066a388c36SPeter Brune if (G) { 11076a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 11086a388c36SPeter Brune linesearch->vec_func_new = G; 11096a388c36SPeter Brune } 11106a388c36SPeter Brune 11116a388c36SPeter Brune PetscFunctionReturn(0); 11126a388c36SPeter Brune } 11136a388c36SPeter Brune 11146a388c36SPeter Brune #undef __FUNCT__ 11156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchAppendOptionsPrefix" 1116e7058c64SPeter Brune /*@C 11176188f407SPeter Brune PetscLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1118e7058c64SPeter Brune SNES options in the database. 1119e7058c64SPeter Brune 1120e7058c64SPeter Brune Logically Collective on SNES 1121e7058c64SPeter Brune 1122e7058c64SPeter Brune Input Parameters: 1123e7058c64SPeter Brune + snes - the SNES context 1124e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1125e7058c64SPeter Brune 1126e7058c64SPeter Brune Notes: 1127e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1128e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1129e7058c64SPeter Brune 1130e7058c64SPeter Brune Level: advanced 1131e7058c64SPeter Brune 11326188f407SPeter Brune .keywords: PetscLineSearch, append, options, prefix, database 1133e7058c64SPeter Brune 1134e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1135e7058c64SPeter Brune @*/ 11366188f407SPeter Brune PetscErrorCode PetscLineSearchAppendOptionsPrefix(PetscLineSearch linesearch,const char prefix[]) 1137e7058c64SPeter Brune { 1138e7058c64SPeter Brune PetscErrorCode ierr; 1139e7058c64SPeter Brune 1140e7058c64SPeter Brune PetscFunctionBegin; 11416188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 1142e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1143e7058c64SPeter Brune PetscFunctionReturn(0); 1144e7058c64SPeter Brune } 1145e7058c64SPeter Brune 1146e7058c64SPeter Brune #undef __FUNCT__ 11476188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetOptionsPrefix" 1148e7058c64SPeter Brune /*@C 11496188f407SPeter Brune PetscLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 11506188f407SPeter Brune PetscLineSearch options in the database. 1151e7058c64SPeter Brune 1152e7058c64SPeter Brune Not Collective 1153e7058c64SPeter Brune 1154e7058c64SPeter Brune Input Parameter: 1155e7058c64SPeter Brune . snes - the SNES context 1156e7058c64SPeter Brune 1157e7058c64SPeter Brune Output Parameter: 1158e7058c64SPeter Brune . prefix - pointer to the prefix string used 1159e7058c64SPeter Brune 1160e7058c64SPeter Brune Notes: On the fortran side, the user should pass in a string 'prefix' of 1161e7058c64SPeter Brune sufficient length to hold the prefix. 1162e7058c64SPeter Brune 1163e7058c64SPeter Brune Level: advanced 1164e7058c64SPeter Brune 11656188f407SPeter Brune .keywords: PetscLineSearch, get, options, prefix, database 1166e7058c64SPeter Brune 1167e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1168e7058c64SPeter Brune @*/ 11696188f407SPeter Brune PetscErrorCode PetscLineSearchGetOptionsPrefix(PetscLineSearch linesearch,const char *prefix[]) 1170e7058c64SPeter Brune { 1171e7058c64SPeter Brune PetscErrorCode ierr; 1172e7058c64SPeter Brune 1173e7058c64SPeter Brune PetscFunctionBegin; 11746188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 1175e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1176e7058c64SPeter Brune PetscFunctionReturn(0); 1177e7058c64SPeter Brune } 1178bf7f4e0aSPeter Brune 1179bf7f4e0aSPeter Brune #undef __FUNCT__ 11806188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetWork" 1181f40b411bSPeter Brune /*@ 11826188f407SPeter Brune PetscLineSearchGetWork - Gets work vectors for the line search. 1183f40b411bSPeter Brune 1184f40b411bSPeter Brune Input Parameter: 11856188f407SPeter Brune + linesearch - the PetscLineSearch context 1186f40b411bSPeter Brune - nwork - the number of work vectors 1187f40b411bSPeter Brune 1188f40b411bSPeter Brune Level: developer 1189f40b411bSPeter Brune 11906188f407SPeter Brune .keywords: PetscLineSearch, work, vector 1191f40b411bSPeter Brune 1192f40b411bSPeter Brune .seealso: SNESDefaultGetWork() 1193f40b411bSPeter Brune @*/ 11946188f407SPeter Brune PetscErrorCode PetscLineSearchGetWork(PetscLineSearch linesearch, PetscInt nwork) 1195bf7f4e0aSPeter Brune { 1196bf7f4e0aSPeter Brune PetscErrorCode ierr; 1197bf7f4e0aSPeter Brune PetscFunctionBegin; 1198bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1199bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 1200bf7f4e0aSPeter Brune } else { 1201bf7f4e0aSPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1202bf7f4e0aSPeter Brune } 1203bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1204bf7f4e0aSPeter Brune } 1205bf7f4e0aSPeter Brune 12066a388c36SPeter Brune 1207bf7f4e0aSPeter Brune #undef __FUNCT__ 12086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSuccess" 1209f40b411bSPeter Brune /*@ 12106188f407SPeter Brune PetscLineSearchGetSuccess - Gets the success/failure status of the last line search application 1211f40b411bSPeter Brune 1212f40b411bSPeter Brune Input Parameters: 1213f40b411bSPeter Brune . linesearch - linesearch context. 1214f40b411bSPeter Brune 1215f40b411bSPeter Brune Output Parameters: 1216f40b411bSPeter Brune . success - The success or failure status. 1217f40b411bSPeter Brune 1218f40b411bSPeter Brune Level: intermediate 1219f40b411bSPeter Brune 12206188f407SPeter Brune .seealso: PetscLineSearchSetSuccess() 1221f40b411bSPeter Brune @*/ 12226188f407SPeter Brune PetscErrorCode PetscLineSearchGetSuccess(PetscLineSearch linesearch, PetscBool *success) 1223bf7f4e0aSPeter Brune { 1224bf7f4e0aSPeter Brune PetscFunctionBegin; 12256188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 12266a388c36SPeter Brune PetscValidPointer(success, 2); 1227bf7f4e0aSPeter Brune if (success) { 1228bf7f4e0aSPeter Brune *success = linesearch->success; 1229bf7f4e0aSPeter Brune } 1230bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1231bf7f4e0aSPeter Brune } 1232bf7f4e0aSPeter Brune 1233bf7f4e0aSPeter Brune #undef __FUNCT__ 12346188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSuccess" 1235f40b411bSPeter Brune /*@ 12366188f407SPeter Brune PetscLineSearchSetSuccess - Sets the success/failure status of the last line search application 1237f40b411bSPeter Brune 1238f40b411bSPeter Brune Input Parameters: 1239f40b411bSPeter Brune + linesearch - linesearch context. 1240f40b411bSPeter Brune - success - The success or failure status. 1241f40b411bSPeter Brune 1242f40b411bSPeter Brune Level: intermediate 1243f40b411bSPeter Brune 12446188f407SPeter Brune .seealso: PetscLineSearchGetSuccess() 1245f40b411bSPeter Brune @*/ 12466188f407SPeter Brune PetscErrorCode PetscLineSearchSetSuccess(PetscLineSearch linesearch, PetscBool success) 12476a388c36SPeter Brune { 12486188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 12496a388c36SPeter Brune PetscFunctionBegin; 12506a388c36SPeter Brune linesearch->success = success; 12516a388c36SPeter Brune PetscFunctionReturn(0); 12526a388c36SPeter Brune } 12536a388c36SPeter Brune 12546a388c36SPeter Brune #undef __FUNCT__ 1255*9bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchSetVIFunctions" 1256*9bd66eb0SPeter Brune /*@C 1257*9bd66eb0SPeter Brune PetscLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 1258*9bd66eb0SPeter Brune 1259*9bd66eb0SPeter Brune Input Parameters: 1260*9bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 1261*9bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 1262*9bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 1263*9bd66eb0SPeter Brune 1264*9bd66eb0SPeter Brune Logically Collective on SNES 1265*9bd66eb0SPeter Brune 1266*9bd66eb0SPeter Brune Calling sequence of projectfunc: 1267*9bd66eb0SPeter Brune .vb 1268*9bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 1269*9bd66eb0SPeter Brune .ve 1270*9bd66eb0SPeter Brune 1271*9bd66eb0SPeter Brune Input parameters for projectfunc: 1272*9bd66eb0SPeter Brune + snes - nonlinear context 1273*9bd66eb0SPeter Brune - X - current solution 1274*9bd66eb0SPeter Brune 1275*9bd66eb0SPeter Brune Output parameters for func: 1276*9bd66eb0SPeter Brune . X - Projected solution 1277*9bd66eb0SPeter Brune 1278*9bd66eb0SPeter Brune Calling sequence of normfunc: 1279*9bd66eb0SPeter Brune .vb 1280*9bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 1281*9bd66eb0SPeter Brune .ve 1282*9bd66eb0SPeter Brune 1283*9bd66eb0SPeter Brune Input parameters for projectfunc: 1284*9bd66eb0SPeter Brune + snes - nonlinear context 1285*9bd66eb0SPeter Brune . X - current solution 1286*9bd66eb0SPeter Brune - F - current residual 1287*9bd66eb0SPeter Brune 1288*9bd66eb0SPeter Brune Output parameters for func: 1289*9bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 1290*9bd66eb0SPeter Brune 1291*9bd66eb0SPeter Brune 1292*9bd66eb0SPeter Brune Level: developer 1293*9bd66eb0SPeter Brune 1294*9bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search 1295*9bd66eb0SPeter Brune 1296*9bd66eb0SPeter Brune .seealso: PetscLineSearchGetVIFunctions(), PetscLineSearchSetPostCheck(), PetscLineSearchSetPreCheck() 1297*9bd66eb0SPeter Brune @*/ 1298*9bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchSetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc projectfunc, PetscLineSearchVINormFunc normfunc) 1299*9bd66eb0SPeter Brune { 1300*9bd66eb0SPeter Brune PetscFunctionBegin; 1301*9bd66eb0SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 1302*9bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 1303*9bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 1304*9bd66eb0SPeter Brune PetscFunctionReturn(0); 1305*9bd66eb0SPeter Brune } 1306*9bd66eb0SPeter Brune 1307*9bd66eb0SPeter Brune #undef __FUNCT__ 1308*9bd66eb0SPeter Brune #define __FUNCT__ "PetscLineSearchGetVIFunctions" 1309*9bd66eb0SPeter Brune /*@C 1310*9bd66eb0SPeter Brune PetscLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 1311*9bd66eb0SPeter Brune 1312*9bd66eb0SPeter Brune Input Parameters: 1313*9bd66eb0SPeter Brune . snes - nonlinear context obtained from SNESCreate() 1314*9bd66eb0SPeter Brune 1315*9bd66eb0SPeter Brune Output Parameters: 1316*9bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 1317*9bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 1318*9bd66eb0SPeter Brune 1319*9bd66eb0SPeter Brune Logically Collective on SNES 1320*9bd66eb0SPeter Brune 1321*9bd66eb0SPeter Brune Level: developer 1322*9bd66eb0SPeter Brune 1323*9bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search 1324*9bd66eb0SPeter Brune 1325*9bd66eb0SPeter Brune .seealso: PetscLineSearchSetVIFunctions(), PetscLineSearchGetPostCheck(), PetscLineSearchGetPreCheck() 1326*9bd66eb0SPeter Brune @*/ 1327*9bd66eb0SPeter Brune extern PetscErrorCode PetscLineSearchGetVIFunctions(PetscLineSearch linesearch, PetscLineSearchVIProjectFunc *projectfunc, PetscLineSearchVINormFunc *normfunc) 1328*9bd66eb0SPeter Brune { 1329*9bd66eb0SPeter Brune PetscFunctionBegin; 1330*9bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 1331*9bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 1332*9bd66eb0SPeter Brune PetscFunctionReturn(0); 1333*9bd66eb0SPeter Brune } 1334*9bd66eb0SPeter Brune 1335*9bd66eb0SPeter Brune #undef __FUNCT__ 13366188f407SPeter Brune #define __FUNCT__ "PetscLineSearchRegister" 1337bf7f4e0aSPeter Brune /*@C 13386188f407SPeter Brune PetscLineSearchRegister - See PetscLineSearchRegisterDynamic() 1339bf7f4e0aSPeter Brune 1340bf7f4e0aSPeter Brune Level: advanced 1341bf7f4e0aSPeter Brune @*/ 13426188f407SPeter Brune PetscErrorCode PetscLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscLineSearch)) 1343bf7f4e0aSPeter Brune { 1344bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 1345bf7f4e0aSPeter Brune PetscErrorCode ierr; 1346bf7f4e0aSPeter Brune 1347bf7f4e0aSPeter Brune PetscFunctionBegin; 1348bf7f4e0aSPeter Brune ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 13496188f407SPeter Brune ierr = PetscFListAdd(&PetscLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1350bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1351bf7f4e0aSPeter Brune } 1352