1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> /*I "petscsnes.h" I*/ 2bf7f4e0aSPeter Brune 3f1c6b773SPeter Brune PetscBool SNESLineSearchRegisterAllCalled = PETSC_FALSE; 40298fd71SBarry Smith PetscFunctionList SNESLineSearchList = NULL; 5bf7f4e0aSPeter Brune 6f1c6b773SPeter Brune PetscClassId SNESLINESEARCH_CLASSID; 7f1c6b773SPeter Brune PetscLogEvent SNESLineSearch_Apply; 8bf7f4e0aSPeter Brune 9bf7f4e0aSPeter Brune #undef __FUNCT__ 10f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchCreate" 11f40b411bSPeter Brune /*@ 12cd7522eaSPeter Brune SNESLineSearchCreate - Creates the line search context. 13f40b411bSPeter Brune 14cd7522eaSPeter Brune Logically Collective on Comm 15f40b411bSPeter Brune 16f40b411bSPeter Brune Input Parameters: 17cd7522eaSPeter Brune . comm - MPI communicator for the line search (typically from the associated SNES context). 18f40b411bSPeter Brune 19f40b411bSPeter Brune Output Parameters: 208e557f58SPeter Brune . outlinesearch - the new linesearch context 21f40b411bSPeter Brune 22162e0bf5SPeter Brune Level: developer 23162e0bf5SPeter Brune 24162e0bf5SPeter Brune Notes: 25162e0bf5SPeter Brune The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance 26162e0bf5SPeter Brune already associated with the SNES. This function is for developer use. 27f40b411bSPeter Brune 28cd7522eaSPeter Brune .keywords: LineSearch, create, context 29f40b411bSPeter Brune 30162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch() 31f40b411bSPeter Brune @*/ 32f40b411bSPeter Brune 33bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch) 34bf388a1fSBarry Smith { 35bf7f4e0aSPeter Brune PetscErrorCode ierr; 36f1c6b773SPeter Brune SNESLineSearch linesearch; 37bf388a1fSBarry Smith 38bf7f4e0aSPeter Brune PetscFunctionBegin; 39ea5d4fccSPeter Brune PetscValidPointer(outlinesearch,2); 40f34a81feSMatthew G. Knepley ierr = SNESInitializePackage();CHKERRQ(ierr); 410298fd71SBarry Smith *outlinesearch = NULL; 42f5af7f23SKarl Rupp 4367c2884eSBarry Smith ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr); 44bf7f4e0aSPeter Brune 450298fd71SBarry Smith linesearch->ops->precheck = NULL; 460298fd71SBarry Smith linesearch->ops->postcheck = NULL; 47bf7f4e0aSPeter Brune 480298fd71SBarry Smith linesearch->vec_sol_new = NULL; 490298fd71SBarry Smith linesearch->vec_func_new = NULL; 500298fd71SBarry Smith linesearch->vec_sol = NULL; 510298fd71SBarry Smith linesearch->vec_func = NULL; 520298fd71SBarry Smith linesearch->vec_update = NULL; 539bd66eb0SPeter Brune 54bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 55bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 56bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 57bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 58bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 59bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 60bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 61bf7f4e0aSPeter Brune linesearch->damping = 1.0; 62bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 63bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 64516fe3c3SPeter Brune linesearch->rtol = 1e-8; 65516fe3c3SPeter Brune linesearch->atol = 1e-15; 66516fe3c3SPeter Brune linesearch->ltol = 1e-8; 670298fd71SBarry Smith linesearch->precheckctx = NULL; 680298fd71SBarry Smith linesearch->postcheckctx = NULL; 6959405d5eSPeter Brune linesearch->max_its = 1; 70bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 71bf7f4e0aSPeter Brune *outlinesearch = linesearch; 72bf7f4e0aSPeter Brune PetscFunctionReturn(0); 73bf7f4e0aSPeter Brune } 74bf7f4e0aSPeter Brune 75bf7f4e0aSPeter Brune #undef __FUNCT__ 76f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp" 77f40b411bSPeter Brune /*@ 7878bcb3b5SPeter Brune SNESLineSearchSetUp - Prepares the line search for being applied by allocating 7978bcb3b5SPeter Brune any required vectors. 80f40b411bSPeter Brune 81cd7522eaSPeter Brune Collective on SNESLineSearch 82f40b411bSPeter Brune 83f40b411bSPeter Brune Input Parameters: 84f40b411bSPeter Brune . linesearch - The LineSearch instance. 85f40b411bSPeter Brune 86cd7522eaSPeter Brune Notes: 87f190f2fcSBarry Smith For most cases, this needn't be called by users or outside of SNESLineSearchApply(). 88cd7522eaSPeter Brune The only current case where this is called outside of this is for the VI 8978bcb3b5SPeter Brune solvers, which modify the solution and work vectors before the first call 90cd7522eaSPeter Brune of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be 91cd7522eaSPeter Brune allocated upfront. 92cd7522eaSPeter Brune 9378bcb3b5SPeter Brune Level: advanced 94f40b411bSPeter Brune 95f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp 96f40b411bSPeter Brune 97f1c6b773SPeter Brune .seealso: SNESLineSearchReset() 98f40b411bSPeter Brune @*/ 99f40b411bSPeter Brune 100bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) 101bf388a1fSBarry Smith { 102bf7f4e0aSPeter Brune PetscErrorCode ierr; 103bf388a1fSBarry Smith 104bf7f4e0aSPeter Brune PetscFunctionBegin; 105bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 1061a4f838cSPeter Brune ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr); 107bf7f4e0aSPeter Brune } 108bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 1099bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 110bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 1119bd66eb0SPeter Brune } 1129bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 1139bd66eb0SPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr); 1149bd66eb0SPeter Brune } 115bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 116bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 117bf7f4e0aSPeter Brune } 118ed07d7d7SPeter Brune if (!linesearch->ops->snesfunc) {ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunction);CHKERRQ(ierr);} 119bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 120bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 121bf7f4e0aSPeter Brune } 122bf7f4e0aSPeter Brune PetscFunctionReturn(0); 123bf7f4e0aSPeter Brune } 124bf7f4e0aSPeter Brune 125bf7f4e0aSPeter Brune #undef __FUNCT__ 126f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset" 127f40b411bSPeter Brune 128f40b411bSPeter Brune /*@ 129f190f2fcSBarry Smith SNESLineSearchReset - Undoes the SNESLineSearchSetUp() and deletes any Vecs or Mats allocated by the line search. 130f40b411bSPeter Brune 131f1c6b773SPeter Brune Collective on SNESLineSearch 132f40b411bSPeter Brune 133f40b411bSPeter Brune Input Parameters: 134f40b411bSPeter Brune . linesearch - The LineSearch instance. 135f40b411bSPeter Brune 136f190f2fcSBarry Smith Notes: Usually only called by SNESReset() 137f190f2fcSBarry Smith 138f190f2fcSBarry Smith Level: developer 139f40b411bSPeter Brune 140cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset 141f40b411bSPeter Brune 142f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp() 143f40b411bSPeter Brune @*/ 144f40b411bSPeter Brune 145bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) 146bf388a1fSBarry Smith { 147bf7f4e0aSPeter Brune PetscErrorCode ierr; 148bf388a1fSBarry Smith 149bf7f4e0aSPeter Brune PetscFunctionBegin; 150f5af7f23SKarl Rupp if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch); 151f5af7f23SKarl Rupp 152bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 153bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 154bf7f4e0aSPeter Brune 155bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 156f5af7f23SKarl Rupp 157bf7f4e0aSPeter Brune linesearch->nwork = 0; 158bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 159bf7f4e0aSPeter Brune PetscFunctionReturn(0); 160bf7f4e0aSPeter Brune } 161bf7f4e0aSPeter Brune 162ed07d7d7SPeter Brune #undef __FUNCT__ 163ed07d7d7SPeter Brune #define __FUNCT__ "SNESLineSearchSetFunction" 164ed07d7d7SPeter Brune /*@C 165f190f2fcSBarry Smith SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search 166ed07d7d7SPeter Brune 167ed07d7d7SPeter Brune Input Parameters: 168ed07d7d7SPeter Brune . linesearch - the SNESLineSearch context 169f190f2fcSBarry Smith + func - function evaluation routine 170ed07d7d7SPeter Brune 171ed07d7d7SPeter Brune Level: developer 172ed07d7d7SPeter Brune 173f190f2fcSBarry Smith Notes: This is used internally by PETSc and not called by users 174f190f2fcSBarry Smith 175ed07d7d7SPeter Brune .keywords: get, linesearch, pre-check 176ed07d7d7SPeter Brune 177f190f2fcSBarry Smith .seealso: SNESSetFunction() 178ed07d7d7SPeter Brune @*/ 179ed07d7d7SPeter Brune PetscErrorCode SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec)) 180ed07d7d7SPeter Brune { 181ed07d7d7SPeter Brune PetscFunctionBegin; 182ed07d7d7SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 183ed07d7d7SPeter Brune linesearch->ops->snesfunc = func; 184ed07d7d7SPeter Brune PetscFunctionReturn(0); 185ed07d7d7SPeter Brune } 186ed07d7d7SPeter Brune 187ed07d7d7SPeter Brune 1886b2b7091SBarry Smith /*MC 189f190f2fcSBarry Smith SNESLineSearchPreCheckFunction - form of function passed to check the search direction before line search is called 1906b2b7091SBarry Smith 1916b2b7091SBarry Smith Synopsis: 192aaa7dc30SBarry Smith #include <petscsnes.h> 1936b2b7091SBarry Smith SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed); 1946b2b7091SBarry Smith 1956b2b7091SBarry Smith Input Parameters: 1966b2b7091SBarry Smith + x - solution vector 1976b2b7091SBarry Smith . y - search direction vector 1986b2b7091SBarry Smith - changed - flag to indicate the precheck changed x or y. 1996b2b7091SBarry Smith 200f190f2fcSBarry Smith Note: This is NOTE a PETSc function, rather it documents the calling sequence of functions passed to SNESLineSearchSetPreCheck() 201f190f2fcSBarry Smith and SNESLineSearchGetPreCheck() 202f190f2fcSBarry Smith 203878cb397SSatish Balay Level: advanced 204878cb397SSatish Balay 205f190f2fcSBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck() 2066b2b7091SBarry Smith M*/ 2076b2b7091SBarry Smith 20886d74e61SPeter Brune #undef __FUNCT__ 209f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck" 21086d74e61SPeter Brune /*@C 211f190f2fcSBarry Smith SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but 212df3898eeSBarry Smith before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that 213f190f2fcSBarry Smith determined the search direction. 21486d74e61SPeter Brune 215f1c6b773SPeter Brune Logically Collective on SNESLineSearch 21686d74e61SPeter Brune 21786d74e61SPeter Brune Input Parameters: 218f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 219f190f2fcSBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPreCheckFunction for the calling sequence 220f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 22186d74e61SPeter Brune 22286d74e61SPeter Brune Level: intermediate 22386d74e61SPeter Brune 22486d74e61SPeter Brune .keywords: set, linesearch, pre-check 22586d74e61SPeter Brune 226f190f2fcSBarry Smith .seealso: SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 22786d74e61SPeter Brune @*/ 228f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx) 22986d74e61SPeter Brune { 2309bd66eb0SPeter Brune PetscFunctionBegin; 231f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 232f190f2fcSBarry Smith if (func) linesearch->ops->precheck = func; 23386d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 23486d74e61SPeter Brune PetscFunctionReturn(0); 23586d74e61SPeter Brune } 23686d74e61SPeter Brune 23786d74e61SPeter Brune #undef __FUNCT__ 238f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck" 23986d74e61SPeter Brune /*@C 240cd7522eaSPeter Brune SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine. 24186d74e61SPeter Brune 24286d74e61SPeter Brune Input Parameters: 243f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 24486d74e61SPeter Brune 24586d74e61SPeter Brune Output Parameters: 246f190f2fcSBarry Smith + func - [optional] function evaluation routine, see SNESLineSearchPreCheckFunction for calling sequence 247f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 24886d74e61SPeter Brune 24986d74e61SPeter Brune Level: intermediate 25086d74e61SPeter Brune 25186d74e61SPeter Brune .keywords: get, linesearch, pre-check 25286d74e61SPeter Brune 253f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck() 25486d74e61SPeter Brune @*/ 255f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx) 25686d74e61SPeter Brune { 2579bd66eb0SPeter Brune PetscFunctionBegin; 258f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 259f190f2fcSBarry Smith if (func) *func = linesearch->ops->precheck; 26086d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 26186d74e61SPeter Brune PetscFunctionReturn(0); 26286d74e61SPeter Brune } 26386d74e61SPeter Brune 2646b2b7091SBarry Smith /*MC 265f190f2fcSBarry Smith SNESLineSearchPostCheckFunction - form of function that is called after line search is complete 2666b2b7091SBarry Smith 2676b2b7091SBarry Smith Synopsis: 268aaa7dc30SBarry Smith #include <petscsnes.h> 2696b2b7091SBarry Smith SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y, Vec w, *changed_y, PetscBool *changed_w); 2706b2b7091SBarry Smith 2716b2b7091SBarry Smith Input Parameters: 2726b2b7091SBarry Smith + x - old solution vector 2736b2b7091SBarry Smith . y - search direction vector 2746b2b7091SBarry Smith . w - new solution vector 2756b2b7091SBarry Smith . changed_y - indicates that the line search changed y 2766b2b7091SBarry Smith - changed_w - indicates that the line search changed w 2776b2b7091SBarry Smith 278f190f2fcSBarry Smith Note: This is NOTE a PETSc function, rather it documents the calling sequence of functions passed to SNESLineSearchSetPostCheck() 279f190f2fcSBarry Smith and SNESLineSearchGetPostCheck() 280f190f2fcSBarry Smith 281878cb397SSatish Balay Level: advanced 2826b2b7091SBarry Smith 283f190f2fcSBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck() 2846b2b7091SBarry Smith M*/ 2856b2b7091SBarry Smith 28686d74e61SPeter Brune #undef __FUNCT__ 287f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck" 28886d74e61SPeter Brune /*@C 289f190f2fcSBarry Smith SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step 290f190f2fcSBarry Smith direction and length. Allows the user a chance to change or override the decision of the line search routine 29186d74e61SPeter Brune 292f1c6b773SPeter Brune Logically Collective on SNESLineSearch 29386d74e61SPeter Brune 29486d74e61SPeter Brune Input Parameters: 295f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 296f190f2fcSBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPostCheckFunction for the calling sequence 297f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 29886d74e61SPeter Brune 29986d74e61SPeter Brune Level: intermediate 30086d74e61SPeter Brune 30186d74e61SPeter Brune .keywords: set, linesearch, post-check 30286d74e61SPeter Brune 303f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck() 30486d74e61SPeter Brune @*/ 305f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx) 30686d74e61SPeter Brune { 30786d74e61SPeter Brune PetscFunctionBegin; 308f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 309f190f2fcSBarry Smith if (func) linesearch->ops->postcheck = func; 31086d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 31186d74e61SPeter Brune PetscFunctionReturn(0); 31286d74e61SPeter Brune } 31386d74e61SPeter Brune 31486d74e61SPeter Brune #undef __FUNCT__ 315f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck" 31686d74e61SPeter Brune /*@C 317f1c6b773SPeter Brune SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine. 31886d74e61SPeter Brune 31986d74e61SPeter Brune Input Parameters: 320f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 32186d74e61SPeter Brune 32286d74e61SPeter Brune Output Parameters: 323f190f2fcSBarry Smith + func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheckFunction 324f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 32586d74e61SPeter Brune 32686d74e61SPeter Brune Level: intermediate 32786d74e61SPeter Brune 32886d74e61SPeter Brune .keywords: get, linesearch, post-check 32986d74e61SPeter Brune 330f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck() 33186d74e61SPeter Brune @*/ 332f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx) 33386d74e61SPeter Brune { 3349bd66eb0SPeter Brune PetscFunctionBegin; 335f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 336f190f2fcSBarry Smith if (func) *func = linesearch->ops->postcheck; 33786d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 33886d74e61SPeter Brune PetscFunctionReturn(0); 33986d74e61SPeter Brune } 34086d74e61SPeter Brune 341bf7f4e0aSPeter Brune #undef __FUNCT__ 342f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck" 343f40b411bSPeter Brune /*@ 344f1c6b773SPeter Brune SNESLineSearchPreCheck - Prepares the line search for being applied. 345f40b411bSPeter Brune 346cd7522eaSPeter Brune Logically Collective on SNESLineSearch 347f40b411bSPeter Brune 348f40b411bSPeter Brune Input Parameters: 3497b1df9c1SPeter Brune + linesearch - The linesearch instance. 3507b1df9c1SPeter Brune . X - The current solution 3517b1df9c1SPeter Brune - Y - The step direction 352f40b411bSPeter Brune 353f40b411bSPeter Brune Output Parameters: 3548e557f58SPeter Brune . changed - Indicator that the precheck routine has changed anything 355f40b411bSPeter Brune 356f190f2fcSBarry Smith Level: developer 357f40b411bSPeter Brune 358f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 359f40b411bSPeter Brune 360f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck() 361f40b411bSPeter Brune @*/ 3627b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 363bf7f4e0aSPeter Brune { 364bf7f4e0aSPeter Brune PetscErrorCode ierr; 3655fd66863SKarl Rupp 366bf7f4e0aSPeter Brune PetscFunctionBegin; 367bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 3686b2b7091SBarry Smith if (linesearch->ops->precheck) { 3696b2b7091SBarry Smith ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr); 37038bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed,4); 371bf7f4e0aSPeter Brune } 372bf7f4e0aSPeter Brune PetscFunctionReturn(0); 373bf7f4e0aSPeter Brune } 374bf7f4e0aSPeter Brune 375bf7f4e0aSPeter Brune #undef __FUNCT__ 376f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck" 377f40b411bSPeter Brune /*@ 378f1c6b773SPeter Brune SNESLineSearchPostCheck - Prepares the line search for being applied. 379f40b411bSPeter Brune 380cd7522eaSPeter Brune Logically Collective on SNESLineSearch 381f40b411bSPeter Brune 382f40b411bSPeter Brune Input Parameters: 3837b1df9c1SPeter Brune + linesearch - The linesearch context 3847b1df9c1SPeter Brune . X - The last solution 3857b1df9c1SPeter Brune . Y - The step direction 3867b1df9c1SPeter Brune - W - The updated solution, W = X + lambda*Y for some lambda 387f40b411bSPeter Brune 388f40b411bSPeter Brune Output Parameters: 38978bcb3b5SPeter Brune + changed_Y - Indicator if the direction Y has been changed. 39078bcb3b5SPeter Brune - changed_W - Indicator if the new candidate solution W has been changed. 391f40b411bSPeter Brune 392f190f2fcSBarry Smith Level: developer 393f40b411bSPeter Brune 394f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 395f40b411bSPeter Brune 396f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck() 397f40b411bSPeter Brune @*/ 3987b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W) 399bf7f4e0aSPeter Brune { 400bf7f4e0aSPeter Brune PetscErrorCode ierr; 401bf388a1fSBarry Smith 402bf7f4e0aSPeter Brune PetscFunctionBegin; 403bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 404bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 4056b2b7091SBarry Smith if (linesearch->ops->postcheck) { 4066b2b7091SBarry Smith ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr); 40738bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5); 40838bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_W,6); 40986d74e61SPeter Brune } 41086d74e61SPeter Brune PetscFunctionReturn(0); 41186d74e61SPeter Brune } 41286d74e61SPeter Brune 41386d74e61SPeter Brune #undef __FUNCT__ 414f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard" 41586d74e61SPeter Brune /*@C 41686d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 41786d74e61SPeter Brune 418cd7522eaSPeter Brune Logically Collective on SNESLineSearch 41986d74e61SPeter Brune 42086d74e61SPeter Brune Input Arguments: 42186d74e61SPeter Brune + linesearch - linesearch context 42286d74e61SPeter Brune . X - base state for this step 42386d74e61SPeter Brune . Y - initial correction 42486d74e61SPeter Brune 42586d74e61SPeter Brune Output Arguments: 42686d74e61SPeter Brune + Y - correction, possibly modified 42786d74e61SPeter Brune - changed - flag indicating that Y was modified 42886d74e61SPeter Brune 42986d74e61SPeter Brune Options Database Key: 430cd7522eaSPeter Brune + -snes_linesearch_precheck_picard - activate this routine 431cd7522eaSPeter Brune - -snes_linesearch_precheck_picard_angle - angle 43286d74e61SPeter Brune 43386d74e61SPeter Brune Level: advanced 43486d74e61SPeter Brune 43586d74e61SPeter Brune Notes: 43686d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 43786d74e61SPeter Brune 43886d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 43986d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 44086d74e61SPeter Brune is generally not useful when using a Newton linearization. 44186d74e61SPeter Brune 44286d74e61SPeter Brune Reference: 44386d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 44486d74e61SPeter Brune 44586d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck() 44686d74e61SPeter Brune @*/ 447f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx) 44886d74e61SPeter Brune { 44986d74e61SPeter Brune PetscErrorCode ierr; 45086d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 45186d74e61SPeter Brune Vec Ylast; 45286d74e61SPeter Brune PetscScalar dot; 45386d74e61SPeter Brune PetscInt iter; 45486d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 45586d74e61SPeter Brune SNES snes; 45686d74e61SPeter Brune 45786d74e61SPeter Brune PetscFunctionBegin; 458f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 45986d74e61SPeter Brune ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr); 46086d74e61SPeter Brune if (!Ylast) { 46186d74e61SPeter Brune ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr); 46286d74e61SPeter Brune ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr); 46386d74e61SPeter Brune ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr); 46486d74e61SPeter Brune } 46586d74e61SPeter Brune ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr); 46686d74e61SPeter Brune if (iter < 2) { 46786d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 46886d74e61SPeter Brune *changed = PETSC_FALSE; 46986d74e61SPeter Brune PetscFunctionReturn(0); 47086d74e61SPeter Brune } 47186d74e61SPeter Brune 47286d74e61SPeter Brune ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr); 47386d74e61SPeter Brune ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr); 47486d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr); 47586d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 476255453a1SBarry Smith theta = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 47786d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 47886d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 47986d74e61SPeter Brune /* Modify the step Y */ 48086d74e61SPeter Brune PetscReal alpha,ydiffnorm; 48186d74e61SPeter Brune ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr); 48286d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr); 48386d74e61SPeter Brune alpha = ylastnorm / ydiffnorm; 48486d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 48586d74e61SPeter Brune ierr = VecScale(Y,alpha);CHKERRQ(ierr); 486c69d1a72SBarry Smith ierr = PetscInfo3(snes,"Angle %14.12e degrees less than threshold %14.12e, corrected step by alpha=%14.12e\n",(double)(theta*180./PETSC_PI),(double)angle,(double)alpha);CHKERRQ(ierr); 48786d74e61SPeter Brune } else { 488c69d1a72SBarry Smith ierr = PetscInfo2(snes,"Angle %14.12e degrees exceeds threshold %14.12e, no correction applied\n",(double)(theta*180./PETSC_PI),(double)angle);CHKERRQ(ierr); 48986d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 49086d74e61SPeter Brune *changed = PETSC_FALSE; 491bf7f4e0aSPeter Brune } 492bf7f4e0aSPeter Brune PetscFunctionReturn(0); 493bf7f4e0aSPeter Brune } 494bf7f4e0aSPeter Brune 495bf7f4e0aSPeter Brune #undef __FUNCT__ 496f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply" 497f40b411bSPeter Brune /*@ 498cd7522eaSPeter Brune SNESLineSearchApply - Computes the line-search update. 499f40b411bSPeter Brune 500f1c6b773SPeter Brune Collective on SNESLineSearch 501f40b411bSPeter Brune 502f40b411bSPeter Brune Input Parameters: 5038e557f58SPeter Brune + linesearch - The linesearch context 5048e557f58SPeter Brune . X - The current solution 5058e557f58SPeter Brune . F - The current function 5068e557f58SPeter Brune . fnorm - The current norm 5078e557f58SPeter Brune - Y - The search direction 508f40b411bSPeter Brune 509f40b411bSPeter Brune Output Parameters: 5108e557f58SPeter Brune + X - The new solution 5118e557f58SPeter Brune . F - The new function 5128e557f58SPeter Brune - fnorm - The new function norm 513f40b411bSPeter Brune 514cd7522eaSPeter Brune Options Database Keys: 5153c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell 516cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches 5173c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 518cd7522eaSPeter Brune . -snes_linesearch_norms - Turn on/off the linesearch norms 5193c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess 5203c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches 521cd7522eaSPeter Brune 522cd7522eaSPeter Brune Notes: 523cd7522eaSPeter Brune This is typically called from within a SNESSolve() implementation in order to 524cd7522eaSPeter Brune help with convergence of the nonlinear method. Various SNES types use line searches 525cd7522eaSPeter Brune in different ways, but the overarching theme is that a line search is used to determine 526cd7522eaSPeter Brune an optimal damping parameter of a step at each iteration of the method. Each 527cd7522eaSPeter Brune application of the line search may invoke SNESComputeFunction several times, and 528cd7522eaSPeter Brune therefore may be fairly expensive. 529cd7522eaSPeter Brune 530f40b411bSPeter Brune Level: Intermediate 531f40b411bSPeter Brune 532f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 533f40b411bSPeter Brune 534cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction() 535f40b411bSPeter Brune @*/ 536bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) 537bf388a1fSBarry Smith { 538bf7f4e0aSPeter Brune PetscErrorCode ierr; 539bf7f4e0aSPeter Brune 540bf388a1fSBarry Smith PetscFunctionBegin; 541f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 542bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 543bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 544bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 545bf7f4e0aSPeter Brune 546bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 547bf7f4e0aSPeter Brune 548bf7f4e0aSPeter Brune linesearch->vec_sol = X; 549bf7f4e0aSPeter Brune linesearch->vec_update = Y; 550bf7f4e0aSPeter Brune linesearch->vec_func = F; 551bf7f4e0aSPeter Brune 552f1c6b773SPeter Brune ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr); 553bf7f4e0aSPeter Brune 554f5af7f23SKarl Rupp if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 555bf7f4e0aSPeter Brune 556f5af7f23SKarl Rupp if (fnorm) linesearch->fnorm = *fnorm; 557f5af7f23SKarl Rupp else { 558bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 559bf7f4e0aSPeter Brune } 560bf7f4e0aSPeter Brune 561f1c6b773SPeter Brune ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 562bf7f4e0aSPeter Brune 563bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 564bf7f4e0aSPeter Brune 565f1c6b773SPeter Brune ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 566bf7f4e0aSPeter Brune 567f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 568bf7f4e0aSPeter Brune PetscFunctionReturn(0); 569bf7f4e0aSPeter Brune } 570bf7f4e0aSPeter Brune 571bf7f4e0aSPeter Brune #undef __FUNCT__ 572f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy" 573f40b411bSPeter Brune /*@ 574f1c6b773SPeter Brune SNESLineSearchDestroy - Destroys the line search instance. 575f40b411bSPeter Brune 576f1c6b773SPeter Brune Collective on SNESLineSearch 577f40b411bSPeter Brune 578f40b411bSPeter Brune Input Parameters: 5798e557f58SPeter Brune . linesearch - The linesearch context 580f40b411bSPeter Brune 581f40b411bSPeter Brune Level: Intermediate 582f40b411bSPeter Brune 58378bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy 584f40b411bSPeter Brune 585cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy() 586f40b411bSPeter Brune @*/ 587bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) 588bf388a1fSBarry Smith { 589bf7f4e0aSPeter Brune PetscErrorCode ierr; 590bf388a1fSBarry Smith 591bf7f4e0aSPeter Brune PetscFunctionBegin; 592bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 593f1c6b773SPeter Brune PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1); 594bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 595e04113cfSBarry Smith ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr); 59622d28d08SBarry Smith ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr); 597f5af7f23SKarl Rupp if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch); 598bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 599e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 600bf7f4e0aSPeter Brune PetscFunctionReturn(0); 601bf7f4e0aSPeter Brune } 602bf7f4e0aSPeter Brune 603bf7f4e0aSPeter Brune #undef __FUNCT__ 604f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor" 605f40b411bSPeter Brune /*@ 606cd7522eaSPeter Brune SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search. 607bf7f4e0aSPeter Brune 608bf7f4e0aSPeter Brune Input Parameters: 609bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 610bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 611bf7f4e0aSPeter Brune 612bf7f4e0aSPeter Brune Logically Collective on SNES 613bf7f4e0aSPeter Brune 614bf7f4e0aSPeter Brune Options Database: 6158e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 616bf7f4e0aSPeter Brune 617bf7f4e0aSPeter Brune Level: intermediate 618bf7f4e0aSPeter Brune 619cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer 620bf7f4e0aSPeter Brune @*/ 621f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg) 622bf7f4e0aSPeter Brune { 623bf7f4e0aSPeter Brune PetscErrorCode ierr; 624bf388a1fSBarry Smith 625bf7f4e0aSPeter Brune PetscFunctionBegin; 626bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 627ce94432eSBarry Smith ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)linesearch),"stdout",&linesearch->monitor);CHKERRQ(ierr); 628bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 629bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 630bf7f4e0aSPeter Brune } 631bf7f4e0aSPeter Brune PetscFunctionReturn(0); 632bf7f4e0aSPeter Brune } 633bf7f4e0aSPeter Brune 634bf7f4e0aSPeter Brune #undef __FUNCT__ 635f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor" 636f40b411bSPeter Brune /*@ 637cd7522eaSPeter Brune SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor. 6386a388c36SPeter Brune 639f190f2fcSBarry Smith Input Parameter: 6408e557f58SPeter Brune . linesearch - linesearch context 641f40b411bSPeter Brune 642f190f2fcSBarry Smith Output Parameter: 6438e557f58SPeter Brune . monitor - monitor context 644f40b411bSPeter Brune 645f40b411bSPeter Brune Logically Collective on SNES 646f40b411bSPeter Brune 647f40b411bSPeter Brune Options Database Keys: 6488e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 649f40b411bSPeter Brune 650f40b411bSPeter Brune Level: intermediate 651f40b411bSPeter Brune 652cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer 653f40b411bSPeter Brune @*/ 654f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor) 6556a388c36SPeter Brune { 6566a388c36SPeter Brune PetscFunctionBegin; 657f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 6586a388c36SPeter Brune if (monitor) { 6596a388c36SPeter Brune PetscValidPointer(monitor, 2); 6606a388c36SPeter Brune *monitor = linesearch->monitor; 6616a388c36SPeter Brune } 6626a388c36SPeter Brune PetscFunctionReturn(0); 6636a388c36SPeter Brune } 6646a388c36SPeter Brune 6656a388c36SPeter Brune #undef __FUNCT__ 666f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions" 667f40b411bSPeter Brune /*@ 668f1c6b773SPeter Brune SNESLineSearchSetFromOptions - Sets options for the line search 669f40b411bSPeter Brune 670f40b411bSPeter Brune Input Parameters: 6718e557f58SPeter Brune . linesearch - linesearch context 672f40b411bSPeter Brune 673f40b411bSPeter Brune Options Database Keys: 6743c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell 6753c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3. Most types only support certain orders (bt supports 2 or 3) 6765a9b6599SPeter Brune . -snes_linesearch_norms - Turn on/off the linesearch norms for the basic linesearch type 67771eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length 6781a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size 6791a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches 6801a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches 6811a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches 6821a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches 683cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches 6848e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 685cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess. 6861a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method 6871a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method 688f40b411bSPeter Brune 689f1c6b773SPeter Brune Logically Collective on SNESLineSearch 690f40b411bSPeter Brune 691f40b411bSPeter Brune Level: intermediate 692f40b411bSPeter Brune 6933c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard() 694f40b411bSPeter Brune @*/ 695bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch) 696bf388a1fSBarry Smith { 697bf7f4e0aSPeter Brune PetscErrorCode ierr; 6981a4f838cSPeter Brune const char *deft = SNESLINESEARCHBASIC; 699bf7f4e0aSPeter Brune char type[256]; 700bf7f4e0aSPeter Brune PetscBool flg, set; 701bf388a1fSBarry Smith 702bf7f4e0aSPeter Brune PetscFunctionBegin; 703607a6623SBarry Smith if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);} 704bf7f4e0aSPeter Brune 705bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 706f5af7f23SKarl Rupp if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name; 707a264d7a6SBarry Smith ierr = PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 708bf7f4e0aSPeter Brune if (flg) { 709f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr); 710bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 711f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 712bf7f4e0aSPeter Brune } 713bf7f4e0aSPeter Brune 714*8afaa268SBarry Smith ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor",linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 715f1c6b773SPeter Brune if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 716bf7f4e0aSPeter Brune 7171a9b3a06SPeter Brune /* tolerances */ 71894ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL);CHKERRQ(ierr); 71994ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL);CHKERRQ(ierr); 72094ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL);CHKERRQ(ierr); 72194ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL);CHKERRQ(ierr); 72294ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL);CHKERRQ(ierr); 72394ae4db5SBarry Smith ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL);CHKERRQ(ierr); 7247a35526eSPeter Brune 7251a9b3a06SPeter Brune /* damping parameters */ 72694ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL);CHKERRQ(ierr); 7271a9b3a06SPeter Brune 72894ae4db5SBarry Smith ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL);CHKERRQ(ierr); 7291a9b3a06SPeter Brune 7301a9b3a06SPeter Brune /* precheck */ 7317a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr); 7327a35526eSPeter Brune if (set) { 7337a35526eSPeter Brune if (flg) { 7347a35526eSPeter Brune linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */ 735f5af7f23SKarl Rupp 7367a35526eSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction", 7370298fd71SBarry Smith "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr); 7387a35526eSPeter Brune ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr); 7397a35526eSPeter Brune } else { 7400298fd71SBarry Smith ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr); 7417a35526eSPeter Brune } 7427a35526eSPeter Brune } 74394ae4db5SBarry Smith ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL);CHKERRQ(ierr); 74494ae4db5SBarry Smith ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL);CHKERRQ(ierr); 7457a35526eSPeter Brune 7465a9b6599SPeter Brune if (linesearch->ops->setfromoptions) { 7475a9b6599SPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 7485a9b6599SPeter Brune } 7495a9b6599SPeter Brune 750bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 751bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 752bf7f4e0aSPeter Brune PetscFunctionReturn(0); 753bf7f4e0aSPeter Brune } 754bf7f4e0aSPeter Brune 755bf7f4e0aSPeter Brune #undef __FUNCT__ 756f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView" 757f40b411bSPeter Brune /*@ 758f190f2fcSBarry Smith SNESLineSearchView - Prints useful information about the line search 759f40b411bSPeter Brune 760f40b411bSPeter Brune Input Parameters: 7618e557f58SPeter Brune . linesearch - linesearch context 762f40b411bSPeter Brune 763f1c6b773SPeter Brune Logically Collective on SNESLineSearch 764f40b411bSPeter Brune 765f40b411bSPeter Brune Level: intermediate 766f40b411bSPeter Brune 767f190f2fcSBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchMonitor() 768f40b411bSPeter Brune @*/ 769bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer) 770bf388a1fSBarry Smith { 7717f1410a3SPeter Brune PetscErrorCode ierr; 7727f1410a3SPeter Brune PetscBool iascii; 773bf388a1fSBarry Smith 774bf7f4e0aSPeter Brune PetscFunctionBegin; 7757f1410a3SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 7767f1410a3SPeter Brune if (!viewer) { 777ce94432eSBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr); 7787f1410a3SPeter Brune } 7797f1410a3SPeter Brune PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 7807f1410a3SPeter Brune PetscCheckSameComm(linesearch,1,viewer,2); 781f40b411bSPeter Brune 782251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 7837f1410a3SPeter Brune if (iascii) { 784dae58748SBarry Smith ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr); 7857f1410a3SPeter Brune if (linesearch->ops->view) { 7867f1410a3SPeter Brune ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 7877f1410a3SPeter Brune ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr); 7887f1410a3SPeter Brune ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 7897f1410a3SPeter Brune } 790c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr); 791c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr); 7927f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr); 7936b2b7091SBarry Smith if (linesearch->ops->precheck) { 7946b2b7091SBarry Smith if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) { 7957f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr); 7967f1410a3SPeter Brune } else { 7977f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr); 7987f1410a3SPeter Brune } 7997f1410a3SPeter Brune } 8006b2b7091SBarry Smith if (linesearch->ops->postcheck) { 8017f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr); 8027f1410a3SPeter Brune } 8037f1410a3SPeter Brune } 804bf7f4e0aSPeter Brune PetscFunctionReturn(0); 805bf7f4e0aSPeter Brune } 806bf7f4e0aSPeter Brune 807bf7f4e0aSPeter Brune #undef __FUNCT__ 808f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType" 809ea5d4fccSPeter Brune /*@C 810f1c6b773SPeter Brune SNESLineSearchSetType - Sets the linesearch type 811f40b411bSPeter Brune 812f190f2fcSBarry Smith Logically Collective on SNESLineSearch 813f190f2fcSBarry Smith 814f40b411bSPeter Brune Input Parameters: 8158e557f58SPeter Brune + linesearch - linesearch context 816f40b411bSPeter Brune - type - The type of line search to be used 817f40b411bSPeter Brune 818cd7522eaSPeter Brune Available Types: 819cd7522eaSPeter Brune + basic - Simple damping line search. 8208e557f58SPeter Brune . bt - Backtracking line search over the L2 norm of the function 8218e557f58SPeter Brune . l2 - Secant line search over the L2 norm of the function 8228e557f58SPeter Brune . cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x) 8238e557f58SPeter Brune - shell - User provided SNESLineSearch implementation 824cd7522eaSPeter Brune 825f40b411bSPeter Brune Level: intermediate 826f40b411bSPeter Brune 827f1c6b773SPeter Brune .seealso: SNESLineSearchCreate() 828f40b411bSPeter Brune @*/ 82919fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type) 830bf7f4e0aSPeter Brune { 831f1c6b773SPeter Brune PetscErrorCode ierr,(*r)(SNESLineSearch); 832bf7f4e0aSPeter Brune PetscBool match; 833bf7f4e0aSPeter Brune 834bf7f4e0aSPeter Brune PetscFunctionBegin; 835f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 836bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 837bf7f4e0aSPeter Brune 838251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 839bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 840bf7f4e0aSPeter Brune 8411c9cd337SJed Brown ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr); 842bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 843bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 844bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 845bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 846f5af7f23SKarl Rupp 8470298fd71SBarry Smith linesearch->ops->destroy = NULL; 848bf7f4e0aSPeter Brune } 849f1c6b773SPeter Brune /* Reinitialize function pointers in SNESLineSearchOps structure */ 850bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 851bf7f4e0aSPeter Brune linesearch->ops->view = 0; 852bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 853bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 854bf7f4e0aSPeter Brune 855bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 856bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 857bf7f4e0aSPeter Brune PetscFunctionReturn(0); 858bf7f4e0aSPeter Brune } 859bf7f4e0aSPeter Brune 860bf7f4e0aSPeter Brune #undef __FUNCT__ 861f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES" 862f40b411bSPeter Brune /*@ 86378bcb3b5SPeter Brune SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation. 864f40b411bSPeter Brune 865f40b411bSPeter Brune Input Parameters: 8668e557f58SPeter Brune + linesearch - linesearch context 867f40b411bSPeter Brune - snes - The snes instance 868f40b411bSPeter Brune 86978bcb3b5SPeter Brune Level: developer 87078bcb3b5SPeter Brune 87178bcb3b5SPeter Brune Notes: 872f190f2fcSBarry Smith This happens automatically when the line search is obtained/created with 8737601faf0SJed Brown SNESGetLineSearch(). This routine is therefore mainly called within SNES 87478bcb3b5SPeter Brune implementations. 875f40b411bSPeter Brune 8768141a3b9SPeter Brune Level: developer 877f40b411bSPeter Brune 878cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 879f40b411bSPeter Brune @*/ 880bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes) 881bf388a1fSBarry Smith { 882bf7f4e0aSPeter Brune PetscFunctionBegin; 883f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 884bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 885bf7f4e0aSPeter Brune linesearch->snes = snes; 886bf7f4e0aSPeter Brune PetscFunctionReturn(0); 887bf7f4e0aSPeter Brune } 888bf7f4e0aSPeter Brune 889bf7f4e0aSPeter Brune #undef __FUNCT__ 890f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES" 891f40b411bSPeter Brune /*@ 8928141a3b9SPeter Brune SNESLineSearchGetSNES - Gets the SNES instance associated with the line search. 8938141a3b9SPeter Brune Having an associated SNES is necessary because most line search implementations must be able to 8948141a3b9SPeter Brune evaluate the function using SNESComputeFunction() for the associated SNES. This routine 8958141a3b9SPeter Brune is used in the line search implementations when one must get this associated SNES instance. 896f40b411bSPeter Brune 897f40b411bSPeter Brune Input Parameters: 8988e557f58SPeter Brune . linesearch - linesearch context 899f40b411bSPeter Brune 900f40b411bSPeter Brune Output Parameters: 901f40b411bSPeter Brune . snes - The snes instance 902f40b411bSPeter Brune 9038141a3b9SPeter Brune Level: developer 904f40b411bSPeter Brune 905cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 906f40b411bSPeter Brune @*/ 907bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes) 908bf388a1fSBarry Smith { 909bf7f4e0aSPeter Brune PetscFunctionBegin; 910f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9116a388c36SPeter Brune PetscValidPointer(snes, 2); 912bf7f4e0aSPeter Brune *snes = linesearch->snes; 913bf7f4e0aSPeter Brune PetscFunctionReturn(0); 914bf7f4e0aSPeter Brune } 915bf7f4e0aSPeter Brune 9166a388c36SPeter Brune #undef __FUNCT__ 917f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda" 918f40b411bSPeter Brune /*@ 919f1c6b773SPeter Brune SNESLineSearchGetLambda - Gets the last linesearch steplength discovered. 920f40b411bSPeter Brune 921f40b411bSPeter Brune Input Parameters: 9228e557f58SPeter Brune . linesearch - linesearch context 923f40b411bSPeter Brune 924f40b411bSPeter Brune Output Parameters: 925cd7522eaSPeter Brune . lambda - The last steplength computed during SNESLineSearchApply() 926f40b411bSPeter Brune 92778bcb3b5SPeter Brune Level: advanced 92878bcb3b5SPeter Brune 9298e557f58SPeter Brune Notes: 9308e557f58SPeter Brune This is useful in methods where the solver is ill-scaled and 93178bcb3b5SPeter Brune requires some adaptive notion of the difference in scale between the 93278bcb3b5SPeter Brune solution and the function. For instance, SNESQN may be scaled by the 93378bcb3b5SPeter Brune line search lambda using the argument -snes_qn_scaling ls. 93478bcb3b5SPeter Brune 935cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply() 936f40b411bSPeter Brune @*/ 937f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda) 9386a388c36SPeter Brune { 9396a388c36SPeter Brune PetscFunctionBegin; 940f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9416a388c36SPeter Brune PetscValidPointer(lambda, 2); 9426a388c36SPeter Brune *lambda = linesearch->lambda; 9436a388c36SPeter Brune PetscFunctionReturn(0); 9446a388c36SPeter Brune } 9456a388c36SPeter Brune 9466a388c36SPeter Brune #undef __FUNCT__ 947f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda" 948f40b411bSPeter Brune /*@ 949f1c6b773SPeter Brune SNESLineSearchSetLambda - Sets the linesearch steplength. 950f40b411bSPeter Brune 951f40b411bSPeter Brune Input Parameters: 9528e557f58SPeter Brune + linesearch - linesearch context 953f40b411bSPeter Brune - lambda - The last steplength. 954f40b411bSPeter Brune 955cd7522eaSPeter Brune Notes: 956f190f2fcSBarry Smith This routine is typically used within implementations of SNESLineSearchApply() 957cd7522eaSPeter Brune to set the final steplength. This routine (and SNESLineSearchGetLambda()) were 958cd7522eaSPeter Brune added in order to facilitate Quasi-Newton methods that use the previous steplength 959cd7522eaSPeter Brune as an inner scaling parameter. 960cd7522eaSPeter Brune 96178bcb3b5SPeter Brune Level: advanced 962f40b411bSPeter Brune 963f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda() 964f40b411bSPeter Brune @*/ 965f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda) 9666a388c36SPeter Brune { 9676a388c36SPeter Brune PetscFunctionBegin; 968f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9696a388c36SPeter Brune linesearch->lambda = lambda; 9706a388c36SPeter Brune PetscFunctionReturn(0); 9716a388c36SPeter Brune } 9726a388c36SPeter Brune 9736a388c36SPeter Brune #undef __FUNCT__ 974f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances" 975f40b411bSPeter Brune /*@ 9763c7d6663SPeter Brune SNESLineSearchGetTolerances - Gets the tolerances for the linesearch. These include 97778bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 97878bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 97978bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 980f40b411bSPeter Brune 981f40b411bSPeter Brune Input Parameters: 9828e557f58SPeter Brune . linesearch - linesearch context 983f40b411bSPeter Brune 984f40b411bSPeter Brune Output Parameters: 985516fe3c3SPeter Brune + steptol - The minimum steplength 9866cc8e53bSPeter Brune . maxstep - The maximum steplength 987516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 988516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 989516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 990516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 991f40b411bSPeter Brune 99278bcb3b5SPeter Brune Level: intermediate 99378bcb3b5SPeter Brune 99478bcb3b5SPeter Brune Notes: 99578bcb3b5SPeter Brune Different line searches may implement these parameters slightly differently as 9963c7d6663SPeter Brune the type requires. 997516fe3c3SPeter Brune 998f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances() 999f40b411bSPeter Brune @*/ 1000f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 10016a388c36SPeter Brune { 10026a388c36SPeter Brune PetscFunctionBegin; 1003f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1004516fe3c3SPeter Brune if (steptol) { 10056a388c36SPeter Brune PetscValidPointer(steptol, 2); 10066a388c36SPeter Brune *steptol = linesearch->steptol; 1007516fe3c3SPeter Brune } 1008516fe3c3SPeter Brune if (maxstep) { 1009516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 1010516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 1011516fe3c3SPeter Brune } 1012516fe3c3SPeter Brune if (rtol) { 1013516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 1014516fe3c3SPeter Brune *rtol = linesearch->rtol; 1015516fe3c3SPeter Brune } 1016516fe3c3SPeter Brune if (atol) { 1017516fe3c3SPeter Brune PetscValidPointer(atol, 5); 1018516fe3c3SPeter Brune *atol = linesearch->atol; 1019516fe3c3SPeter Brune } 1020516fe3c3SPeter Brune if (ltol) { 1021516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 1022516fe3c3SPeter Brune *ltol = linesearch->ltol; 1023516fe3c3SPeter Brune } 1024516fe3c3SPeter Brune if (max_its) { 1025516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 1026516fe3c3SPeter Brune *max_its = linesearch->max_its; 1027516fe3c3SPeter Brune } 10286a388c36SPeter Brune PetscFunctionReturn(0); 10296a388c36SPeter Brune } 10306a388c36SPeter Brune 10316a388c36SPeter Brune #undef __FUNCT__ 1032f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances" 1033f40b411bSPeter Brune /*@ 10343c7d6663SPeter Brune SNESLineSearchSetTolerances - Gets the tolerances for the linesearch. These include 103578bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 103678bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 103778bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1038f40b411bSPeter Brune 1039f40b411bSPeter Brune Input Parameters: 10408e557f58SPeter Brune + linesearch - linesearch context 1041516fe3c3SPeter Brune . steptol - The minimum steplength 10426cc8e53bSPeter Brune . maxstep - The maximum steplength 1043516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1044516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1045516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1046516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1047f40b411bSPeter Brune 104878bcb3b5SPeter Brune Notes: 10493c7d6663SPeter Brune The user may choose to not set any of the tolerances using PETSC_DEFAULT in 105078bcb3b5SPeter Brune place of an argument. 1051f40b411bSPeter Brune 105278bcb3b5SPeter Brune Level: intermediate 1053516fe3c3SPeter Brune 1054f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances() 1055f40b411bSPeter Brune @*/ 1056f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 10576a388c36SPeter Brune { 10586a388c36SPeter Brune PetscFunctionBegin; 1059f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1060d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,steptol,2); 1061d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,maxstep,3); 1062d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,rtol,4); 1063d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,atol,5); 1064d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,ltol,6); 1065d3952184SSatish Balay PetscValidLogicalCollectiveInt(linesearch,max_its,7); 1066d3952184SSatish Balay 1067d3952184SSatish Balay if (steptol!= PETSC_DEFAULT) { 1068ce94432eSBarry Smith if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol); 10696a388c36SPeter Brune linesearch->steptol = steptol; 1070d3952184SSatish Balay } 1071d3952184SSatish Balay 1072d3952184SSatish Balay if (maxstep!= PETSC_DEFAULT) { 1073ce94432eSBarry Smith if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep); 1074516fe3c3SPeter Brune linesearch->maxstep = maxstep; 1075d3952184SSatish Balay } 1076d3952184SSatish Balay 1077d3952184SSatish Balay if (rtol != PETSC_DEFAULT) { 1078ce94432eSBarry Smith if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol); 1079516fe3c3SPeter Brune linesearch->rtol = rtol; 1080d3952184SSatish Balay } 1081d3952184SSatish Balay 1082d3952184SSatish Balay if (atol != PETSC_DEFAULT) { 1083ce94432eSBarry Smith if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol); 1084516fe3c3SPeter Brune linesearch->atol = atol; 1085d3952184SSatish Balay } 1086d3952184SSatish Balay 1087d3952184SSatish Balay if (ltol != PETSC_DEFAULT) { 1088ce94432eSBarry Smith if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol); 1089516fe3c3SPeter Brune linesearch->ltol = ltol; 1090d3952184SSatish Balay } 1091d3952184SSatish Balay 1092d3952184SSatish Balay if (max_its != PETSC_DEFAULT) { 1093ce94432eSBarry Smith if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its); 1094516fe3c3SPeter Brune linesearch->max_its = max_its; 1095d3952184SSatish Balay } 10966a388c36SPeter Brune PetscFunctionReturn(0); 10976a388c36SPeter Brune } 10986a388c36SPeter Brune 10996a388c36SPeter Brune #undef __FUNCT__ 1100f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping" 1101f40b411bSPeter Brune /*@ 1102f1c6b773SPeter Brune SNESLineSearchGetDamping - Gets the line search damping parameter. 1103f40b411bSPeter Brune 1104f40b411bSPeter Brune Input Parameters: 11058e557f58SPeter Brune . linesearch - linesearch context 1106f40b411bSPeter Brune 1107f40b411bSPeter Brune Output Parameters: 11088e557f58SPeter Brune . damping - The damping parameter 1109f40b411bSPeter Brune 111078bcb3b5SPeter Brune Level: advanced 1111f40b411bSPeter Brune 111278bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN 1113f40b411bSPeter Brune @*/ 1114f40b411bSPeter Brune 1115f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping) 11166a388c36SPeter Brune { 11176a388c36SPeter Brune PetscFunctionBegin; 1118f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 11196a388c36SPeter Brune PetscValidPointer(damping, 2); 11206a388c36SPeter Brune *damping = linesearch->damping; 11216a388c36SPeter Brune PetscFunctionReturn(0); 11226a388c36SPeter Brune } 11236a388c36SPeter Brune 11246a388c36SPeter Brune #undef __FUNCT__ 1125f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping" 1126f40b411bSPeter Brune /*@ 1127f1c6b773SPeter Brune SNESLineSearchSetDamping - Sets the line search damping paramter. 1128f40b411bSPeter Brune 1129f40b411bSPeter Brune Input Parameters: 113078bcb3b5SPeter Brune . linesearch - linesearch context 113178bcb3b5SPeter Brune . damping - The damping parameter 1132f40b411bSPeter Brune 1133f40b411bSPeter Brune Level: intermediate 1134f40b411bSPeter Brune 1135cd7522eaSPeter Brune Notes: 1136cd7522eaSPeter Brune The basic line search merely takes the update step scaled by the damping parameter. 1137cd7522eaSPeter Brune The use of the damping parameter in the l2 and cp line searches is much more subtle; 113878bcb3b5SPeter Brune it is used as a starting point in calculating the secant step. However, the eventual 1139cd7522eaSPeter Brune step may be of greater length than the damping parameter. In the bt line search it is 1140cd7522eaSPeter Brune used as the maximum possible step length, as the bt line search only backtracks. 1141cd7522eaSPeter Brune 1142f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping() 1143f40b411bSPeter Brune @*/ 1144f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping) 11456a388c36SPeter Brune { 11466a388c36SPeter Brune PetscFunctionBegin; 1147f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 11486a388c36SPeter Brune linesearch->damping = damping; 11496a388c36SPeter Brune PetscFunctionReturn(0); 11506a388c36SPeter Brune } 11516a388c36SPeter Brune 11526a388c36SPeter Brune #undef __FUNCT__ 115359405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder" 115459405d5eSPeter Brune /*@ 115559405d5eSPeter Brune SNESLineSearchGetOrder - Gets the line search approximation order. 115659405d5eSPeter Brune 115759405d5eSPeter Brune Input Parameters: 115878bcb3b5SPeter Brune . linesearch - linesearch context 115959405d5eSPeter Brune 116059405d5eSPeter Brune Output Parameters: 11618e557f58SPeter Brune . order - The order 116259405d5eSPeter Brune 116378bcb3b5SPeter Brune Possible Values for order: 11643c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11653c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11663c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 116778bcb3b5SPeter Brune 116859405d5eSPeter Brune Level: intermediate 116959405d5eSPeter Brune 117059405d5eSPeter Brune .seealso: SNESLineSearchSetOrder() 117159405d5eSPeter Brune @*/ 117259405d5eSPeter Brune 1173b000cd8dSPeter Brune PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order) 117459405d5eSPeter Brune { 117559405d5eSPeter Brune PetscFunctionBegin; 117659405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 117759405d5eSPeter Brune PetscValidPointer(order, 2); 117859405d5eSPeter Brune *order = linesearch->order; 117959405d5eSPeter Brune PetscFunctionReturn(0); 118059405d5eSPeter Brune } 118159405d5eSPeter Brune 118259405d5eSPeter Brune #undef __FUNCT__ 118359405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder" 118459405d5eSPeter Brune /*@ 118559405d5eSPeter Brune SNESLineSearchSetOrder - Sets the line search damping paramter. 118659405d5eSPeter Brune 118759405d5eSPeter Brune Input Parameters: 118878bcb3b5SPeter Brune . linesearch - linesearch context 118978bcb3b5SPeter Brune . order - The damping parameter 119059405d5eSPeter Brune 119159405d5eSPeter Brune Level: intermediate 119259405d5eSPeter Brune 119378bcb3b5SPeter Brune Possible Values for order: 11943c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11953c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11963c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 119778bcb3b5SPeter Brune 119859405d5eSPeter Brune Notes: 119959405d5eSPeter Brune Variable orders are supported by the following line searches: 120078bcb3b5SPeter Brune + bt - cubic and quadratic 120178bcb3b5SPeter Brune - cp - linear and quadratic 120259405d5eSPeter Brune 120359405d5eSPeter Brune .seealso: SNESLineSearchGetOrder() 120459405d5eSPeter Brune @*/ 1205b000cd8dSPeter Brune PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order) 120659405d5eSPeter Brune { 120759405d5eSPeter Brune PetscFunctionBegin; 120859405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 120959405d5eSPeter Brune linesearch->order = order; 121059405d5eSPeter Brune PetscFunctionReturn(0); 121159405d5eSPeter Brune } 121259405d5eSPeter Brune 121359405d5eSPeter Brune #undef __FUNCT__ 1214f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms" 1215f40b411bSPeter Brune /*@ 1216f1c6b773SPeter Brune SNESLineSearchGetNorms - Gets the norms for for X, Y, and F. 1217f40b411bSPeter Brune 1218f40b411bSPeter Brune Input Parameters: 121978bcb3b5SPeter Brune . linesearch - linesearch context 1220f40b411bSPeter Brune 1221f40b411bSPeter Brune Output Parameters: 1222f40b411bSPeter Brune + xnorm - The norm of the current solution 1223f40b411bSPeter Brune . fnorm - The norm of the current function 1224f40b411bSPeter Brune - ynorm - The norm of the current update 1225f40b411bSPeter Brune 1226cd7522eaSPeter Brune Notes: 1227cd7522eaSPeter Brune This function is mainly called from SNES implementations. 1228cd7522eaSPeter Brune 122978bcb3b5SPeter Brune Level: developer 1230f40b411bSPeter Brune 1231f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs() 1232f40b411bSPeter Brune @*/ 1233f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 1234bf7f4e0aSPeter Brune { 1235bf7f4e0aSPeter Brune PetscFunctionBegin; 1236f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1237f5af7f23SKarl Rupp if (xnorm) *xnorm = linesearch->xnorm; 1238f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 1239f5af7f23SKarl Rupp if (ynorm) *ynorm = linesearch->ynorm; 1240bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1241bf7f4e0aSPeter Brune } 1242bf7f4e0aSPeter Brune 1243e7058c64SPeter Brune #undef __FUNCT__ 1244f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms" 1245f40b411bSPeter Brune /*@ 1246f1c6b773SPeter Brune SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 1247f40b411bSPeter Brune 1248f40b411bSPeter Brune Input Parameters: 124978bcb3b5SPeter Brune + linesearch - linesearch context 1250f40b411bSPeter Brune . xnorm - The norm of the current solution 1251f40b411bSPeter Brune . fnorm - The norm of the current function 1252f40b411bSPeter Brune - ynorm - The norm of the current update 1253f40b411bSPeter Brune 125478bcb3b5SPeter Brune Level: advanced 1255f40b411bSPeter Brune 1256f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1257f40b411bSPeter Brune @*/ 1258f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 12596a388c36SPeter Brune { 12606a388c36SPeter Brune PetscFunctionBegin; 1261f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12626a388c36SPeter Brune linesearch->xnorm = xnorm; 12636a388c36SPeter Brune linesearch->fnorm = fnorm; 12646a388c36SPeter Brune linesearch->ynorm = ynorm; 12656a388c36SPeter Brune PetscFunctionReturn(0); 12666a388c36SPeter Brune } 12676a388c36SPeter Brune 12686a388c36SPeter Brune #undef __FUNCT__ 1269f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms" 1270f40b411bSPeter Brune /*@ 1271f1c6b773SPeter Brune SNESLineSearchComputeNorms - Computes the norms of X, F, and Y. 1272f40b411bSPeter Brune 1273f40b411bSPeter Brune Input Parameters: 127478bcb3b5SPeter Brune . linesearch - linesearch context 1275f40b411bSPeter Brune 1276f40b411bSPeter Brune Options Database Keys: 12778e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 1278f40b411bSPeter Brune 1279f40b411bSPeter Brune Level: intermediate 1280f40b411bSPeter Brune 128178bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms() 1282f40b411bSPeter Brune @*/ 1283f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch) 12846a388c36SPeter Brune { 12856a388c36SPeter Brune PetscErrorCode ierr; 12869bd66eb0SPeter Brune SNES snes; 1287bf388a1fSBarry Smith 12886a388c36SPeter Brune PetscFunctionBegin; 12896a388c36SPeter Brune if (linesearch->norms) { 12909bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1291f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 12929bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12939bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12949bd66eb0SPeter Brune ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr); 12959bd66eb0SPeter Brune } else { 12966a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 12976a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12986a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12996a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 13006a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 13016a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 13026a388c36SPeter Brune } 13039bd66eb0SPeter Brune } 13046a388c36SPeter Brune PetscFunctionReturn(0); 13056a388c36SPeter Brune } 13066a388c36SPeter Brune 13076f263ca3SPeter Brune #undef __FUNCT__ 13086f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms" 13096f263ca3SPeter Brune /*@ 13106f263ca3SPeter Brune SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search. 13116f263ca3SPeter Brune 13126f263ca3SPeter Brune Input Parameters: 131378bcb3b5SPeter Brune + linesearch - linesearch context 131478bcb3b5SPeter Brune - flg - indicates whether or not to compute norms 13156f263ca3SPeter Brune 13166f263ca3SPeter Brune Options Database Keys: 13178e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 13186f263ca3SPeter Brune 13196f263ca3SPeter Brune Notes: 13201a4f838cSPeter Brune This is most relevant to the SNESLINESEARCHBASIC line search type. 13216f263ca3SPeter Brune 13226f263ca3SPeter Brune Level: intermediate 13236f263ca3SPeter Brune 13241a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC 13256f263ca3SPeter Brune @*/ 13266f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg) 13276f263ca3SPeter Brune { 13286f263ca3SPeter Brune PetscFunctionBegin; 13296f263ca3SPeter Brune linesearch->norms = flg; 13306f263ca3SPeter Brune PetscFunctionReturn(0); 13316f263ca3SPeter Brune } 13326f263ca3SPeter Brune 13336a388c36SPeter Brune #undef __FUNCT__ 1334f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs" 1335f40b411bSPeter Brune /*@ 1336f1c6b773SPeter Brune SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context 1337f40b411bSPeter Brune 1338f40b411bSPeter Brune Input Parameters: 133978bcb3b5SPeter Brune . linesearch - linesearch context 1340f40b411bSPeter Brune 1341f40b411bSPeter Brune Output Parameters: 13426232e825SPeter Brune + X - Solution vector 13436232e825SPeter Brune . F - Function vector 13446232e825SPeter Brune . Y - Search direction vector 13456232e825SPeter Brune . W - Solution work vector 13466232e825SPeter Brune - G - Function work vector 13476232e825SPeter Brune 13487bba9028SPeter Brune Notes: 13497bba9028SPeter Brune At the beginning of a line search application, X should contain a 13506232e825SPeter Brune solution and the vector F the function computed at X. At the end of the 13516232e825SPeter Brune line search application, X should contain the new solution, and F the 13526232e825SPeter Brune function evaluated at the new solution. 1353f40b411bSPeter Brune 135478bcb3b5SPeter Brune Level: advanced 1355f40b411bSPeter Brune 1356f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1357f40b411bSPeter Brune @*/ 1358bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) 1359bf388a1fSBarry Smith { 13606a388c36SPeter Brune PetscFunctionBegin; 1361f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13626a388c36SPeter Brune if (X) { 13636a388c36SPeter Brune PetscValidPointer(X, 2); 13646a388c36SPeter Brune *X = linesearch->vec_sol; 13656a388c36SPeter Brune } 13666a388c36SPeter Brune if (F) { 13676a388c36SPeter Brune PetscValidPointer(F, 3); 13686a388c36SPeter Brune *F = linesearch->vec_func; 13696a388c36SPeter Brune } 13706a388c36SPeter Brune if (Y) { 13716a388c36SPeter Brune PetscValidPointer(Y, 4); 13726a388c36SPeter Brune *Y = linesearch->vec_update; 13736a388c36SPeter Brune } 13746a388c36SPeter Brune if (W) { 13756a388c36SPeter Brune PetscValidPointer(W, 5); 13766a388c36SPeter Brune *W = linesearch->vec_sol_new; 13776a388c36SPeter Brune } 13786a388c36SPeter Brune if (G) { 13796a388c36SPeter Brune PetscValidPointer(G, 6); 13806a388c36SPeter Brune *G = linesearch->vec_func_new; 13816a388c36SPeter Brune } 13826a388c36SPeter Brune PetscFunctionReturn(0); 13836a388c36SPeter Brune } 13846a388c36SPeter Brune 13856a388c36SPeter Brune #undef __FUNCT__ 1386f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs" 1387f40b411bSPeter Brune /*@ 1388f1c6b773SPeter Brune SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context 1389f40b411bSPeter Brune 1390f40b411bSPeter Brune Input Parameters: 139178bcb3b5SPeter Brune + linesearch - linesearch context 13926232e825SPeter Brune . X - Solution vector 13936232e825SPeter Brune . F - Function vector 13946232e825SPeter Brune . Y - Search direction vector 13956232e825SPeter Brune . W - Solution work vector 13966232e825SPeter Brune - G - Function work vector 1397f40b411bSPeter Brune 139878bcb3b5SPeter Brune Level: advanced 1399f40b411bSPeter Brune 1400f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs() 1401f40b411bSPeter Brune @*/ 1402bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) 1403bf388a1fSBarry Smith { 14046a388c36SPeter Brune PetscFunctionBegin; 1405f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 14066a388c36SPeter Brune if (X) { 14076a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 14086a388c36SPeter Brune linesearch->vec_sol = X; 14096a388c36SPeter Brune } 14106a388c36SPeter Brune if (F) { 14116a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 14126a388c36SPeter Brune linesearch->vec_func = F; 14136a388c36SPeter Brune } 14146a388c36SPeter Brune if (Y) { 14156a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 14166a388c36SPeter Brune linesearch->vec_update = Y; 14176a388c36SPeter Brune } 14186a388c36SPeter Brune if (W) { 14196a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 14206a388c36SPeter Brune linesearch->vec_sol_new = W; 14216a388c36SPeter Brune } 14226a388c36SPeter Brune if (G) { 14236a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 14246a388c36SPeter Brune linesearch->vec_func_new = G; 14256a388c36SPeter Brune } 14266a388c36SPeter Brune PetscFunctionReturn(0); 14276a388c36SPeter Brune } 14286a388c36SPeter Brune 14296a388c36SPeter Brune #undef __FUNCT__ 1430f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix" 1431e7058c64SPeter Brune /*@C 1432f1c6b773SPeter Brune SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1433e7058c64SPeter Brune SNES options in the database. 1434e7058c64SPeter Brune 1435cd7522eaSPeter Brune Logically Collective on SNESLineSearch 1436e7058c64SPeter Brune 1437e7058c64SPeter Brune Input Parameters: 1438e7058c64SPeter Brune + snes - the SNES context 1439e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1440e7058c64SPeter Brune 1441e7058c64SPeter Brune Notes: 1442e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1443e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1444e7058c64SPeter Brune 1445e7058c64SPeter Brune Level: advanced 1446e7058c64SPeter Brune 1447f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database 1448e7058c64SPeter Brune 1449e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1450e7058c64SPeter Brune @*/ 1451f1c6b773SPeter Brune PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[]) 1452e7058c64SPeter Brune { 1453e7058c64SPeter Brune PetscErrorCode ierr; 1454e7058c64SPeter Brune 1455e7058c64SPeter Brune PetscFunctionBegin; 1456f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1457e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1458e7058c64SPeter Brune PetscFunctionReturn(0); 1459e7058c64SPeter Brune } 1460e7058c64SPeter Brune 1461e7058c64SPeter Brune #undef __FUNCT__ 1462f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix" 1463e7058c64SPeter Brune /*@C 1464f1c6b773SPeter Brune SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 1465f1c6b773SPeter Brune SNESLineSearch options in the database. 1466e7058c64SPeter Brune 1467e7058c64SPeter Brune Not Collective 1468e7058c64SPeter Brune 1469e7058c64SPeter Brune Input Parameter: 1470cd7522eaSPeter Brune . linesearch - the SNESLineSearch context 1471e7058c64SPeter Brune 1472e7058c64SPeter Brune Output Parameter: 1473e7058c64SPeter Brune . prefix - pointer to the prefix string used 1474e7058c64SPeter Brune 14758e557f58SPeter Brune Notes: 14768e557f58SPeter Brune On the fortran side, the user should pass in a string 'prefix' of 1477e7058c64SPeter Brune sufficient length to hold the prefix. 1478e7058c64SPeter Brune 1479e7058c64SPeter Brune Level: advanced 1480e7058c64SPeter Brune 1481f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database 1482e7058c64SPeter Brune 1483e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1484e7058c64SPeter Brune @*/ 1485f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[]) 1486e7058c64SPeter Brune { 1487e7058c64SPeter Brune PetscErrorCode ierr; 1488e7058c64SPeter Brune 1489e7058c64SPeter Brune PetscFunctionBegin; 1490f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1491e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1492e7058c64SPeter Brune PetscFunctionReturn(0); 1493e7058c64SPeter Brune } 1494bf7f4e0aSPeter Brune 1495bf7f4e0aSPeter Brune #undef __FUNCT__ 1496fa0ddf94SBarry Smith #define __FUNCT__ "SNESLineSearchSetWorkVecs" 14978d359177SBarry Smith /*@C 1498fa0ddf94SBarry Smith SNESLineSearchSetWorkVecs - Gets work vectors for the line search. 1499f40b411bSPeter Brune 1500f40b411bSPeter Brune Input Parameter: 1501f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1502f40b411bSPeter Brune - nwork - the number of work vectors 1503f40b411bSPeter Brune 1504f40b411bSPeter Brune Level: developer 1505f40b411bSPeter Brune 1506fa0ddf94SBarry Smith Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations 1507cd7522eaSPeter Brune 1508f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector 1509f40b411bSPeter Brune 1510fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs() 1511f40b411bSPeter Brune @*/ 1512fa0ddf94SBarry Smith PetscErrorCode SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork) 1513bf7f4e0aSPeter Brune { 1514bf7f4e0aSPeter Brune PetscErrorCode ierr; 1515bf388a1fSBarry Smith 1516bf7f4e0aSPeter Brune PetscFunctionBegin; 1517bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1518bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 15198d359177SBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1520bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1521bf7f4e0aSPeter Brune } 1522bf7f4e0aSPeter Brune 1523bf7f4e0aSPeter Brune #undef __FUNCT__ 1524f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess" 1525f40b411bSPeter Brune /*@ 1526f1c6b773SPeter Brune SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application 1527f40b411bSPeter Brune 1528f40b411bSPeter Brune Input Parameters: 152978bcb3b5SPeter Brune . linesearch - linesearch context 1530f40b411bSPeter Brune 1531f40b411bSPeter Brune Output Parameters: 15328e557f58SPeter Brune . success - The success or failure status 1533f40b411bSPeter Brune 1534cd7522eaSPeter Brune Notes: 1535c98378a5SBarry Smith This is typically called after SNESLineSearchApply() in order to determine if the line-search failed 1536cd7522eaSPeter Brune (and set the SNES convergence accordingly). 1537cd7522eaSPeter Brune 1538f40b411bSPeter Brune Level: intermediate 1539f40b411bSPeter Brune 1540f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess() 1541f40b411bSPeter Brune @*/ 1542f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success) 1543bf7f4e0aSPeter Brune { 1544bf7f4e0aSPeter Brune PetscFunctionBegin; 1545f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15466a388c36SPeter Brune PetscValidPointer(success, 2); 1547f5af7f23SKarl Rupp if (success) *success = linesearch->success; 1548bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1549bf7f4e0aSPeter Brune } 1550bf7f4e0aSPeter Brune 1551bf7f4e0aSPeter Brune #undef __FUNCT__ 1552f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess" 1553f40b411bSPeter Brune /*@ 1554f1c6b773SPeter Brune SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application 1555f40b411bSPeter Brune 1556f40b411bSPeter Brune Input Parameters: 155778bcb3b5SPeter Brune + linesearch - linesearch context 15588e557f58SPeter Brune - success - The success or failure status 1559f40b411bSPeter Brune 1560cd7522eaSPeter Brune Notes: 1561cd7522eaSPeter Brune This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set 1562cd7522eaSPeter Brune the success or failure of the line search method. 1563cd7522eaSPeter Brune 156478bcb3b5SPeter Brune Level: developer 1565f40b411bSPeter Brune 1566f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess() 1567f40b411bSPeter Brune @*/ 1568f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success) 15696a388c36SPeter Brune { 15706a388c36SPeter Brune PetscFunctionBegin; 15715fd66863SKarl Rupp PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15726a388c36SPeter Brune linesearch->success = success; 15736a388c36SPeter Brune PetscFunctionReturn(0); 15746a388c36SPeter Brune } 15756a388c36SPeter Brune 15766a388c36SPeter Brune #undef __FUNCT__ 1577f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions" 15789bd66eb0SPeter Brune /*@C 1579f1c6b773SPeter Brune SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 15809bd66eb0SPeter Brune 15819bd66eb0SPeter Brune Input Parameters: 15829bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 15839bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 15849bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 15859bd66eb0SPeter Brune 15869bd66eb0SPeter Brune Logically Collective on SNES 15879bd66eb0SPeter Brune 15889bd66eb0SPeter Brune Calling sequence of projectfunc: 15899bd66eb0SPeter Brune .vb 15909bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 15919bd66eb0SPeter Brune .ve 15929bd66eb0SPeter Brune 15939bd66eb0SPeter Brune Input parameters for projectfunc: 15949bd66eb0SPeter Brune + snes - nonlinear context 15959bd66eb0SPeter Brune - X - current solution 15969bd66eb0SPeter Brune 1597cd7522eaSPeter Brune Output parameters for projectfunc: 15989bd66eb0SPeter Brune . X - Projected solution 15999bd66eb0SPeter Brune 16009bd66eb0SPeter Brune Calling sequence of normfunc: 16019bd66eb0SPeter Brune .vb 16029bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 16039bd66eb0SPeter Brune .ve 16049bd66eb0SPeter Brune 1605cd7522eaSPeter Brune Input parameters for normfunc: 16069bd66eb0SPeter Brune + snes - nonlinear context 16079bd66eb0SPeter Brune . X - current solution 16089bd66eb0SPeter Brune - F - current residual 16099bd66eb0SPeter Brune 1610cd7522eaSPeter Brune Output parameters for normfunc: 16119bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 16129bd66eb0SPeter Brune 1613cd7522eaSPeter Brune Notes: 1614cd7522eaSPeter Brune The VI solvers require projection of the solution to the feasible set. projectfunc should implement this. 1615cd7522eaSPeter Brune 1616cd7522eaSPeter Brune The VI solvers require special evaluation of the function norm such that the norm is only calculated 1617cd7522eaSPeter Brune on the inactive set. This should be implemented by normfunc. 16189bd66eb0SPeter Brune 16199bd66eb0SPeter Brune Level: developer 16209bd66eb0SPeter Brune 16219bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search 16229bd66eb0SPeter Brune 1623f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() 16249bd66eb0SPeter Brune @*/ 1625f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc) 16269bd66eb0SPeter Brune { 16279bd66eb0SPeter Brune PetscFunctionBegin; 1628f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 16299bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 16309bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 16319bd66eb0SPeter Brune PetscFunctionReturn(0); 16329bd66eb0SPeter Brune } 16339bd66eb0SPeter Brune 16349bd66eb0SPeter Brune #undef __FUNCT__ 1635f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions" 16369bd66eb0SPeter Brune /*@C 1637f1c6b773SPeter Brune SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 16389bd66eb0SPeter Brune 16399bd66eb0SPeter Brune Input Parameters: 16409bd66eb0SPeter Brune . snes - nonlinear context obtained from SNESCreate() 16419bd66eb0SPeter Brune 16429bd66eb0SPeter Brune Output Parameters: 16439bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 16449bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16459bd66eb0SPeter Brune 16469bd66eb0SPeter Brune Logically Collective on SNES 16479bd66eb0SPeter Brune 16489bd66eb0SPeter Brune Level: developer 16499bd66eb0SPeter Brune 16509bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search 16519bd66eb0SPeter Brune 1652f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 16539bd66eb0SPeter Brune @*/ 1654f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc) 16559bd66eb0SPeter Brune { 16569bd66eb0SPeter Brune PetscFunctionBegin; 16579bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 16589bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 16599bd66eb0SPeter Brune PetscFunctionReturn(0); 16609bd66eb0SPeter Brune } 16619bd66eb0SPeter Brune 16629bd66eb0SPeter Brune #undef __FUNCT__ 1663f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister" 1664bf7f4e0aSPeter Brune /*@C 16651c84c290SBarry Smith SNESLineSearchRegister - See SNESLineSearchRegister() 1666bf7f4e0aSPeter Brune 1667bf7f4e0aSPeter Brune Level: advanced 1668bf7f4e0aSPeter Brune @*/ 1669bdf89e91SBarry Smith PetscErrorCode SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch)) 1670bf7f4e0aSPeter Brune { 1671bf7f4e0aSPeter Brune PetscErrorCode ierr; 1672bf7f4e0aSPeter Brune 1673bf7f4e0aSPeter Brune PetscFunctionBegin; 1674a240a19fSJed Brown ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr); 1675bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1676bf7f4e0aSPeter Brune } 1677