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 2278bcb3b5SPeter Brune Level: beginner 23f40b411bSPeter Brune 24cd7522eaSPeter Brune .keywords: LineSearch, create, context 25f40b411bSPeter Brune 26f40b411bSPeter Brune .seealso: LineSearchDestroy() 27f40b411bSPeter Brune @*/ 28f40b411bSPeter Brune 29bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch) 30bf388a1fSBarry Smith { 31bf7f4e0aSPeter Brune PetscErrorCode ierr; 32f1c6b773SPeter Brune SNESLineSearch linesearch; 33bf388a1fSBarry Smith 34bf7f4e0aSPeter Brune PetscFunctionBegin; 35ea5d4fccSPeter Brune PetscValidPointer(outlinesearch,2); 360298fd71SBarry Smith *outlinesearch = NULL; 37f5af7f23SKarl Rupp 3867c2884eSBarry Smith ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr); 39bf7f4e0aSPeter Brune 400298fd71SBarry Smith linesearch->ops->precheck = NULL; 410298fd71SBarry Smith linesearch->ops->postcheck = NULL; 42bf7f4e0aSPeter Brune 430298fd71SBarry Smith linesearch->vec_sol_new = NULL; 440298fd71SBarry Smith linesearch->vec_func_new = NULL; 450298fd71SBarry Smith linesearch->vec_sol = NULL; 460298fd71SBarry Smith linesearch->vec_func = NULL; 470298fd71SBarry Smith linesearch->vec_update = NULL; 489bd66eb0SPeter Brune 49bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 50bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 51bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 52bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 53bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 54bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 55bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 56bf7f4e0aSPeter Brune linesearch->damping = 1.0; 57bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 58bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 59516fe3c3SPeter Brune linesearch->rtol = 1e-8; 60516fe3c3SPeter Brune linesearch->atol = 1e-15; 61516fe3c3SPeter Brune linesearch->ltol = 1e-8; 620298fd71SBarry Smith linesearch->precheckctx = NULL; 630298fd71SBarry Smith linesearch->postcheckctx = NULL; 6459405d5eSPeter Brune linesearch->max_its = 1; 65bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 66bf7f4e0aSPeter Brune *outlinesearch = linesearch; 67bf7f4e0aSPeter Brune PetscFunctionReturn(0); 68bf7f4e0aSPeter Brune } 69bf7f4e0aSPeter Brune 70bf7f4e0aSPeter Brune #undef __FUNCT__ 71f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp" 72f40b411bSPeter Brune /*@ 7378bcb3b5SPeter Brune SNESLineSearchSetUp - Prepares the line search for being applied by allocating 7478bcb3b5SPeter Brune any required vectors. 75f40b411bSPeter Brune 76cd7522eaSPeter Brune Collective on SNESLineSearch 77f40b411bSPeter Brune 78f40b411bSPeter Brune Input Parameters: 79f40b411bSPeter Brune . linesearch - The LineSearch instance. 80f40b411bSPeter Brune 81cd7522eaSPeter Brune Notes: 82cd7522eaSPeter Brune For most cases, this needn't be called outside of SNESLineSearchApply(). 83cd7522eaSPeter Brune The only current case where this is called outside of this is for the VI 8478bcb3b5SPeter Brune solvers, which modify the solution and work vectors before the first call 85cd7522eaSPeter Brune of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be 86cd7522eaSPeter Brune allocated upfront. 87cd7522eaSPeter Brune 8878bcb3b5SPeter Brune Level: advanced 89f40b411bSPeter Brune 90f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp 91f40b411bSPeter Brune 92f1c6b773SPeter Brune .seealso: SNESLineSearchReset() 93f40b411bSPeter Brune @*/ 94f40b411bSPeter Brune 95bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) 96bf388a1fSBarry Smith { 97bf7f4e0aSPeter Brune PetscErrorCode ierr; 98bf388a1fSBarry Smith 99bf7f4e0aSPeter Brune PetscFunctionBegin; 100bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 1011a4f838cSPeter Brune ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr); 102bf7f4e0aSPeter Brune } 103bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 1049bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 105bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 1069bd66eb0SPeter Brune } 1079bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 1089bd66eb0SPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr); 1099bd66eb0SPeter Brune } 110bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 111bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 112bf7f4e0aSPeter Brune } 113bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 114bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 115bf7f4e0aSPeter Brune } 116bf7f4e0aSPeter Brune PetscFunctionReturn(0); 117bf7f4e0aSPeter Brune } 118bf7f4e0aSPeter Brune 119bf7f4e0aSPeter Brune #undef __FUNCT__ 120f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset" 121f40b411bSPeter Brune 122f40b411bSPeter Brune /*@ 12378bcb3b5SPeter Brune SNESLineSearchReset - Undoes the SetUp and deletes any Vecs or Mats allocated by the line search. 124f40b411bSPeter Brune 125f1c6b773SPeter Brune Collective on SNESLineSearch 126f40b411bSPeter Brune 127f40b411bSPeter Brune Input Parameters: 128f40b411bSPeter Brune . linesearch - The LineSearch instance. 129f40b411bSPeter Brune 13078bcb3b5SPeter Brune Level: intermediate 131f40b411bSPeter Brune 132cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset 133f40b411bSPeter Brune 134f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp() 135f40b411bSPeter Brune @*/ 136f40b411bSPeter Brune 137bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) 138bf388a1fSBarry Smith { 139bf7f4e0aSPeter Brune PetscErrorCode ierr; 140bf388a1fSBarry Smith 141bf7f4e0aSPeter Brune PetscFunctionBegin; 142f5af7f23SKarl Rupp if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch); 143f5af7f23SKarl Rupp 144bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 145bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 146bf7f4e0aSPeter Brune 147bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 148f5af7f23SKarl Rupp 149bf7f4e0aSPeter Brune linesearch->nwork = 0; 150bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 151bf7f4e0aSPeter Brune PetscFunctionReturn(0); 152bf7f4e0aSPeter Brune } 153bf7f4e0aSPeter Brune 1546b2b7091SBarry Smith /*MC 1556b2b7091SBarry Smith SNESLineSearchPreCheckFunction - functional form passed to check before line search is called 1566b2b7091SBarry Smith 1576b2b7091SBarry Smith Synopsis: 1586b2b7091SBarry Smith #include "petscsnes.h" 1596b2b7091SBarry Smith SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed); 1606b2b7091SBarry Smith 1616b2b7091SBarry Smith Input Parameters: 1626b2b7091SBarry Smith + x - solution vector 1636b2b7091SBarry Smith . y - search direction vector 1646b2b7091SBarry Smith - changed - flag to indicate the precheck changed x or y. 1656b2b7091SBarry Smith 166878cb397SSatish Balay Level: advanced 167878cb397SSatish Balay 1686b2b7091SBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 1696b2b7091SBarry Smith M*/ 1706b2b7091SBarry Smith 17186d74e61SPeter Brune #undef __FUNCT__ 172f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck" 17386d74e61SPeter Brune /*@C 174f1c6b773SPeter Brune SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine. 17586d74e61SPeter Brune 176f1c6b773SPeter Brune Logically Collective on SNESLineSearch 17786d74e61SPeter Brune 17886d74e61SPeter Brune Input Parameters: 179f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1806b2b7091SBarry Smith . SNESLineSearchPreCheckFunction - [optional] function evaluation routine 18186d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 1820298fd71SBarry Smith function evaluation routine (may be NULL) 18386d74e61SPeter Brune 18486d74e61SPeter Brune 18586d74e61SPeter Brune Level: intermediate 18686d74e61SPeter Brune 18786d74e61SPeter Brune .keywords: set, linesearch, pre-check 18886d74e61SPeter Brune 189f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck() 19086d74e61SPeter Brune @*/ 1916b2b7091SBarry Smith PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx) 19286d74e61SPeter Brune { 1939bd66eb0SPeter Brune PetscFunctionBegin; 194f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1956b2b7091SBarry Smith if (SNESLineSearchPreCheckFunction) linesearch->ops->precheck = SNESLineSearchPreCheckFunction; 19686d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 19786d74e61SPeter Brune PetscFunctionReturn(0); 19886d74e61SPeter Brune } 19986d74e61SPeter Brune 20086d74e61SPeter Brune #undef __FUNCT__ 201f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck" 20286d74e61SPeter Brune /*@C 203cd7522eaSPeter Brune SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine. 20486d74e61SPeter Brune 20586d74e61SPeter Brune Input Parameters: 206f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 20786d74e61SPeter Brune 20886d74e61SPeter Brune Output Parameters: 20986d74e61SPeter Brune + func - [optional] function evaluation routine 21086d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 2110298fd71SBarry Smith function evaluation routine (may be NULL) 21286d74e61SPeter Brune 21386d74e61SPeter Brune Level: intermediate 21486d74e61SPeter Brune 21586d74e61SPeter Brune .keywords: get, linesearch, pre-check 21686d74e61SPeter Brune 217f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck() 21886d74e61SPeter Brune @*/ 2196b2b7091SBarry Smith PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx) 22086d74e61SPeter Brune { 2219bd66eb0SPeter Brune PetscFunctionBegin; 222f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2236b2b7091SBarry Smith if (SNESLineSearchPreCheckFunction) *SNESLineSearchPreCheckFunction = linesearch->ops->precheck; 22486d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 22586d74e61SPeter Brune PetscFunctionReturn(0); 22686d74e61SPeter Brune } 22786d74e61SPeter Brune 2286b2b7091SBarry Smith /*MC 2296b2b7091SBarry Smith SNESLineSearchPostheckFunction - functional form that is called after line search is complete 2306b2b7091SBarry Smith 2316b2b7091SBarry Smith Synopsis: 2326b2b7091SBarry Smith #include "petscsnes.h" 2336b2b7091SBarry Smith SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y, Vec w, *changed_y, PetscBool *changed_w); 2346b2b7091SBarry Smith 2356b2b7091SBarry Smith Input Parameters: 2366b2b7091SBarry Smith + x - old solution vector 2376b2b7091SBarry Smith . y - search direction vector 2386b2b7091SBarry Smith . w - new solution vector 2396b2b7091SBarry Smith . changed_y - indicates that the line search changed y 2406b2b7091SBarry Smith - changed_w - indicates that the line search changed w 2416b2b7091SBarry Smith 242878cb397SSatish Balay Level: advanced 2436b2b7091SBarry Smith 2446b2b7091SBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 2456b2b7091SBarry Smith M*/ 2466b2b7091SBarry Smith 24786d74e61SPeter Brune #undef __FUNCT__ 248f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck" 24986d74e61SPeter Brune /*@C 250f1c6b773SPeter Brune SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine. 25186d74e61SPeter Brune 252f1c6b773SPeter Brune Logically Collective on SNESLineSearch 25386d74e61SPeter Brune 25486d74e61SPeter Brune Input Parameters: 255f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 2566b2b7091SBarry Smith . SNESLineSearchPostCheckFunction - [optional] function evaluation routine 25786d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 2580298fd71SBarry Smith function evaluation routine (may be NULL) 25986d74e61SPeter Brune 26086d74e61SPeter Brune Level: intermediate 26186d74e61SPeter Brune 26286d74e61SPeter Brune .keywords: set, linesearch, post-check 26386d74e61SPeter Brune 264f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck() 26586d74e61SPeter Brune @*/ 2666b2b7091SBarry Smith PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx) 26786d74e61SPeter Brune { 26886d74e61SPeter Brune PetscFunctionBegin; 269f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2706b2b7091SBarry Smith if (SNESLineSearchPostCheckFunction) linesearch->ops->postcheck = SNESLineSearchPostCheckFunction; 27186d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 27286d74e61SPeter Brune PetscFunctionReturn(0); 27386d74e61SPeter Brune } 27486d74e61SPeter Brune 27586d74e61SPeter Brune #undef __FUNCT__ 276f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck" 27786d74e61SPeter Brune /*@C 278f1c6b773SPeter Brune SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine. 27986d74e61SPeter Brune 28086d74e61SPeter Brune Input Parameters: 281f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 28286d74e61SPeter Brune 28386d74e61SPeter Brune Output Parameters: 2846b2b7091SBarry Smith + SNESLineSearchPostCheckFunction - [optional] function evaluation routine 28586d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 2860298fd71SBarry Smith function evaluation routine (may be NULL) 28786d74e61SPeter Brune 28886d74e61SPeter Brune Level: intermediate 28986d74e61SPeter Brune 29086d74e61SPeter Brune .keywords: get, linesearch, post-check 29186d74e61SPeter Brune 292f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck() 29386d74e61SPeter Brune @*/ 2946b2b7091SBarry Smith PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx) 29586d74e61SPeter Brune { 2969bd66eb0SPeter Brune PetscFunctionBegin; 297f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2986b2b7091SBarry Smith if (SNESLineSearchPostCheckFunction) *SNESLineSearchPostCheckFunction = linesearch->ops->postcheck; 29986d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 30086d74e61SPeter Brune PetscFunctionReturn(0); 30186d74e61SPeter Brune } 30286d74e61SPeter Brune 303bf7f4e0aSPeter Brune #undef __FUNCT__ 304f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck" 305f40b411bSPeter Brune /*@ 306f1c6b773SPeter Brune SNESLineSearchPreCheck - Prepares the line search for being applied. 307f40b411bSPeter Brune 308cd7522eaSPeter Brune Logically Collective on SNESLineSearch 309f40b411bSPeter Brune 310f40b411bSPeter Brune Input Parameters: 3117b1df9c1SPeter Brune + linesearch - The linesearch instance. 3127b1df9c1SPeter Brune . X - The current solution 3137b1df9c1SPeter Brune - Y - The step direction 314f40b411bSPeter Brune 315f40b411bSPeter Brune Output Parameters: 3168e557f58SPeter Brune . changed - Indicator that the precheck routine has changed anything 317f40b411bSPeter Brune 318f40b411bSPeter Brune Level: Beginner 319f40b411bSPeter Brune 320f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 321f40b411bSPeter Brune 322f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck() 323f40b411bSPeter Brune @*/ 3247b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 325bf7f4e0aSPeter Brune { 326bf7f4e0aSPeter Brune PetscErrorCode ierr; 3275fd66863SKarl Rupp 328bf7f4e0aSPeter Brune PetscFunctionBegin; 329bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 3306b2b7091SBarry Smith if (linesearch->ops->precheck) { 3316b2b7091SBarry Smith ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr); 33238bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed,4); 333bf7f4e0aSPeter Brune } 334bf7f4e0aSPeter Brune PetscFunctionReturn(0); 335bf7f4e0aSPeter Brune } 336bf7f4e0aSPeter Brune 337bf7f4e0aSPeter Brune #undef __FUNCT__ 338f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck" 339f40b411bSPeter Brune /*@ 340f1c6b773SPeter Brune SNESLineSearchPostCheck - Prepares the line search for being applied. 341f40b411bSPeter Brune 342cd7522eaSPeter Brune Logically Collective on SNESLineSearch 343f40b411bSPeter Brune 344f40b411bSPeter Brune Input Parameters: 3457b1df9c1SPeter Brune + linesearch - The linesearch context 3467b1df9c1SPeter Brune . X - The last solution 3477b1df9c1SPeter Brune . Y - The step direction 3487b1df9c1SPeter Brune - W - The updated solution, W = X + lambda*Y for some lambda 349f40b411bSPeter Brune 350f40b411bSPeter Brune Output Parameters: 35178bcb3b5SPeter Brune + changed_Y - Indicator if the direction Y has been changed. 35278bcb3b5SPeter Brune - changed_W - Indicator if the new candidate solution W has been changed. 353f40b411bSPeter Brune 354f40b411bSPeter Brune Level: Intermediate 355f40b411bSPeter Brune 356f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 357f40b411bSPeter Brune 358f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck() 359f40b411bSPeter Brune @*/ 3607b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W) 361bf7f4e0aSPeter Brune { 362bf7f4e0aSPeter Brune PetscErrorCode ierr; 363bf388a1fSBarry Smith 364bf7f4e0aSPeter Brune PetscFunctionBegin; 365bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 366bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 3676b2b7091SBarry Smith if (linesearch->ops->postcheck) { 3686b2b7091SBarry Smith ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr); 36938bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5); 37038bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_W,6); 37186d74e61SPeter Brune } 37286d74e61SPeter Brune PetscFunctionReturn(0); 37386d74e61SPeter Brune } 37486d74e61SPeter Brune 37586d74e61SPeter Brune #undef __FUNCT__ 376f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard" 37786d74e61SPeter Brune /*@C 37886d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 37986d74e61SPeter Brune 380cd7522eaSPeter Brune Logically Collective on SNESLineSearch 38186d74e61SPeter Brune 38286d74e61SPeter Brune Input Arguments: 38386d74e61SPeter Brune + linesearch - linesearch context 38486d74e61SPeter Brune . X - base state for this step 38586d74e61SPeter Brune . Y - initial correction 38686d74e61SPeter Brune 38786d74e61SPeter Brune Output Arguments: 38886d74e61SPeter Brune + Y - correction, possibly modified 38986d74e61SPeter Brune - changed - flag indicating that Y was modified 39086d74e61SPeter Brune 39186d74e61SPeter Brune Options Database Key: 392cd7522eaSPeter Brune + -snes_linesearch_precheck_picard - activate this routine 393cd7522eaSPeter Brune - -snes_linesearch_precheck_picard_angle - angle 39486d74e61SPeter Brune 39586d74e61SPeter Brune Level: advanced 39686d74e61SPeter Brune 39786d74e61SPeter Brune Notes: 39886d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 39986d74e61SPeter Brune 40086d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 40186d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 40286d74e61SPeter Brune is generally not useful when using a Newton linearization. 40386d74e61SPeter Brune 40486d74e61SPeter Brune Reference: 40586d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 40686d74e61SPeter Brune 40786d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck() 40886d74e61SPeter Brune @*/ 409f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx) 41086d74e61SPeter Brune { 41186d74e61SPeter Brune PetscErrorCode ierr; 41286d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 41386d74e61SPeter Brune Vec Ylast; 41486d74e61SPeter Brune PetscScalar dot; 41586d74e61SPeter Brune PetscInt iter; 41686d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 41786d74e61SPeter Brune SNES snes; 41886d74e61SPeter Brune 41986d74e61SPeter Brune PetscFunctionBegin; 420f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 42186d74e61SPeter Brune ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr); 42286d74e61SPeter Brune if (!Ylast) { 42386d74e61SPeter Brune ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr); 42486d74e61SPeter Brune ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr); 42586d74e61SPeter Brune ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr); 42686d74e61SPeter Brune } 42786d74e61SPeter Brune ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr); 42886d74e61SPeter Brune if (iter < 2) { 42986d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 43086d74e61SPeter Brune *changed = PETSC_FALSE; 43186d74e61SPeter Brune PetscFunctionReturn(0); 43286d74e61SPeter Brune } 43386d74e61SPeter Brune 43486d74e61SPeter Brune ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr); 43586d74e61SPeter Brune ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr); 43686d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr); 43786d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 43886d74e61SPeter Brune theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 43986d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 44086d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 44186d74e61SPeter Brune /* Modify the step Y */ 44286d74e61SPeter Brune PetscReal alpha,ydiffnorm; 44386d74e61SPeter Brune ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr); 44486d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr); 44586d74e61SPeter Brune alpha = ylastnorm / ydiffnorm; 44686d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 44786d74e61SPeter Brune ierr = VecScale(Y,alpha);CHKERRQ(ierr); 448c69d1a72SBarry 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); 44986d74e61SPeter Brune } else { 450c69d1a72SBarry 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); 45186d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 45286d74e61SPeter Brune *changed = PETSC_FALSE; 453bf7f4e0aSPeter Brune } 454bf7f4e0aSPeter Brune PetscFunctionReturn(0); 455bf7f4e0aSPeter Brune } 456bf7f4e0aSPeter Brune 457bf7f4e0aSPeter Brune #undef __FUNCT__ 458f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply" 459f40b411bSPeter Brune /*@ 460cd7522eaSPeter Brune SNESLineSearchApply - Computes the line-search update. 461f40b411bSPeter Brune 462f1c6b773SPeter Brune Collective on SNESLineSearch 463f40b411bSPeter Brune 464f40b411bSPeter Brune Input Parameters: 4658e557f58SPeter Brune + linesearch - The linesearch context 4668e557f58SPeter Brune . X - The current solution 4678e557f58SPeter Brune . F - The current function 4688e557f58SPeter Brune . fnorm - The current norm 4698e557f58SPeter Brune - Y - The search direction 470f40b411bSPeter Brune 471f40b411bSPeter Brune Output Parameters: 4728e557f58SPeter Brune + X - The new solution 4738e557f58SPeter Brune . F - The new function 4748e557f58SPeter Brune - fnorm - The new function norm 475f40b411bSPeter Brune 476cd7522eaSPeter Brune Options Database Keys: 4773c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell 478cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches 4793c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 480cd7522eaSPeter Brune . -snes_linesearch_norms - Turn on/off the linesearch norms 4813c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess 4823c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches 483cd7522eaSPeter Brune 484cd7522eaSPeter Brune Notes: 485cd7522eaSPeter Brune This is typically called from within a SNESSolve() implementation in order to 486cd7522eaSPeter Brune help with convergence of the nonlinear method. Various SNES types use line searches 487cd7522eaSPeter Brune in different ways, but the overarching theme is that a line search is used to determine 488cd7522eaSPeter Brune an optimal damping parameter of a step at each iteration of the method. Each 489cd7522eaSPeter Brune application of the line search may invoke SNESComputeFunction several times, and 490cd7522eaSPeter Brune therefore may be fairly expensive. 491cd7522eaSPeter Brune 492f40b411bSPeter Brune Level: Intermediate 493f40b411bSPeter Brune 494f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 495f40b411bSPeter Brune 496cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction() 497f40b411bSPeter Brune @*/ 498bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) 499bf388a1fSBarry Smith { 500bf7f4e0aSPeter Brune PetscErrorCode ierr; 501bf7f4e0aSPeter Brune 502bf388a1fSBarry Smith PetscFunctionBegin; 503f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 504bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 505bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 506bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 507bf7f4e0aSPeter Brune 508bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 509bf7f4e0aSPeter Brune 510bf7f4e0aSPeter Brune linesearch->vec_sol = X; 511bf7f4e0aSPeter Brune linesearch->vec_update = Y; 512bf7f4e0aSPeter Brune linesearch->vec_func = F; 513bf7f4e0aSPeter Brune 514f1c6b773SPeter Brune ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr); 515bf7f4e0aSPeter Brune 516f5af7f23SKarl Rupp if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 517bf7f4e0aSPeter Brune 518f5af7f23SKarl Rupp if (fnorm) linesearch->fnorm = *fnorm; 519f5af7f23SKarl Rupp else { 520bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 521bf7f4e0aSPeter Brune } 522bf7f4e0aSPeter Brune 523f1c6b773SPeter Brune ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 524bf7f4e0aSPeter Brune 525bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 526bf7f4e0aSPeter Brune 527f1c6b773SPeter Brune ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 528bf7f4e0aSPeter Brune 529f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 530bf7f4e0aSPeter Brune PetscFunctionReturn(0); 531bf7f4e0aSPeter Brune } 532bf7f4e0aSPeter Brune 533bf7f4e0aSPeter Brune #undef __FUNCT__ 534f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy" 535f40b411bSPeter Brune /*@ 536f1c6b773SPeter Brune SNESLineSearchDestroy - Destroys the line search instance. 537f40b411bSPeter Brune 538f1c6b773SPeter Brune Collective on SNESLineSearch 539f40b411bSPeter Brune 540f40b411bSPeter Brune Input Parameters: 5418e557f58SPeter Brune . linesearch - The linesearch context 542f40b411bSPeter Brune 543f40b411bSPeter Brune Level: Intermediate 544f40b411bSPeter Brune 54578bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy 546f40b411bSPeter Brune 547cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy() 548f40b411bSPeter Brune @*/ 549bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) 550bf388a1fSBarry Smith { 551bf7f4e0aSPeter Brune PetscErrorCode ierr; 552bf388a1fSBarry Smith 553bf7f4e0aSPeter Brune PetscFunctionBegin; 554bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 555f1c6b773SPeter Brune PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1); 556bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 557f05ece33SBarry Smith ierr = PetscObjectAMSViewOff((PetscObject)*linesearch);CHKERRQ(ierr); 55822d28d08SBarry Smith ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr); 559f5af7f23SKarl Rupp if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch); 560bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 561e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 562bf7f4e0aSPeter Brune PetscFunctionReturn(0); 563bf7f4e0aSPeter Brune } 564bf7f4e0aSPeter Brune 565bf7f4e0aSPeter Brune #undef __FUNCT__ 566f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetMonitor" 567f40b411bSPeter Brune /*@ 568cd7522eaSPeter Brune SNESLineSearchSetMonitor - Turns on/off printing useful information and debugging output about the line search. 569bf7f4e0aSPeter Brune 570bf7f4e0aSPeter Brune Input Parameters: 571bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 572bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 573bf7f4e0aSPeter Brune 574bf7f4e0aSPeter Brune Logically Collective on SNES 575bf7f4e0aSPeter Brune 576bf7f4e0aSPeter Brune Options Database: 5778e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 578bf7f4e0aSPeter Brune 579bf7f4e0aSPeter Brune Level: intermediate 580bf7f4e0aSPeter Brune 581bf7f4e0aSPeter Brune 582cd7522eaSPeter Brune .seealso: SNESLineSearchGetMonitor(), PetscViewer 583bf7f4e0aSPeter Brune @*/ 584f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetMonitor(SNESLineSearch linesearch, PetscBool flg) 585bf7f4e0aSPeter Brune { 586bf7f4e0aSPeter Brune PetscErrorCode ierr; 587bf388a1fSBarry Smith 588bf7f4e0aSPeter Brune PetscFunctionBegin; 589bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 590ce94432eSBarry Smith ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)linesearch),"stdout",&linesearch->monitor);CHKERRQ(ierr); 591bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 592bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 593bf7f4e0aSPeter Brune } 594bf7f4e0aSPeter Brune PetscFunctionReturn(0); 595bf7f4e0aSPeter Brune } 596bf7f4e0aSPeter Brune 597bf7f4e0aSPeter Brune #undef __FUNCT__ 598f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetMonitor" 599f40b411bSPeter Brune /*@ 600cd7522eaSPeter Brune SNESLineSearchGetMonitor - Gets the PetscViewer instance for the line search monitor. 6016a388c36SPeter Brune 602f40b411bSPeter Brune Input Parameters: 6038e557f58SPeter Brune . linesearch - linesearch context 604f40b411bSPeter Brune 605f40b411bSPeter Brune Input Parameters: 6068e557f58SPeter Brune . monitor - monitor context 607f40b411bSPeter Brune 608f40b411bSPeter Brune Logically Collective on SNES 609f40b411bSPeter Brune 610f40b411bSPeter Brune 611f40b411bSPeter Brune Options Database Keys: 6128e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 613f40b411bSPeter Brune 614f40b411bSPeter Brune Level: intermediate 615f40b411bSPeter Brune 616f40b411bSPeter Brune 617cd7522eaSPeter Brune .seealso: SNESLineSearchSetMonitor(), PetscViewer 618f40b411bSPeter Brune @*/ 619f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetMonitor(SNESLineSearch linesearch, PetscViewer *monitor) 6206a388c36SPeter Brune { 6216a388c36SPeter Brune PetscFunctionBegin; 622f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 6236a388c36SPeter Brune if (monitor) { 6246a388c36SPeter Brune PetscValidPointer(monitor, 2); 6256a388c36SPeter Brune *monitor = linesearch->monitor; 6266a388c36SPeter Brune } 6276a388c36SPeter Brune PetscFunctionReturn(0); 6286a388c36SPeter Brune } 6296a388c36SPeter Brune 6306a388c36SPeter Brune #undef __FUNCT__ 631f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetFromOptions" 632f40b411bSPeter Brune /*@ 633f1c6b773SPeter Brune SNESLineSearchSetFromOptions - Sets options for the line search 634f40b411bSPeter Brune 635f40b411bSPeter Brune Input Parameters: 6368e557f58SPeter Brune . linesearch - linesearch context 637f40b411bSPeter Brune 638f40b411bSPeter Brune Options Database Keys: 6393c7d6663SPeter Brune + -snes_linesearch_type <type> - basic, bt, l2, cp, shell 6403c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3. Most types only support certain orders (bt supports 2 or 3) 6415a9b6599SPeter Brune . -snes_linesearch_norms - Turn on/off the linesearch norms for the basic linesearch type 64271eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length 6431a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size 6441a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches 6451a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches 6461a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches 6471a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches 648cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches 6498e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 650cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess. 6511a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method 6521a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method 653f40b411bSPeter Brune 654f1c6b773SPeter Brune Logically Collective on SNESLineSearch 655f40b411bSPeter Brune 656f40b411bSPeter Brune Level: intermediate 657f40b411bSPeter Brune 6583c7d6663SPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard() 659f40b411bSPeter Brune @*/ 660bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch) 661bf388a1fSBarry Smith { 662bf7f4e0aSPeter Brune PetscErrorCode ierr; 6631a4f838cSPeter Brune const char *deft = SNESLINESEARCHBASIC; 664bf7f4e0aSPeter Brune char type[256]; 665bf7f4e0aSPeter Brune PetscBool flg, set; 666bf388a1fSBarry Smith 667bf7f4e0aSPeter Brune PetscFunctionBegin; 668607a6623SBarry Smith if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr);} 669bf7f4e0aSPeter Brune 670bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 671f5af7f23SKarl Rupp if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name; 6723c7d6663SPeter Brune ierr = PetscOptionsList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 673bf7f4e0aSPeter Brune if (flg) { 674f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr); 675bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 676f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 677bf7f4e0aSPeter Brune } 678bf7f4e0aSPeter Brune 6797a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor", 680bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 681f1c6b773SPeter Brune if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 682bf7f4e0aSPeter Brune 6831a9b3a06SPeter Brune /* tolerances */ 68471eef1aeSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr); 6851a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr); 6861a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr); 6871a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr); 6881a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr); 6898e557f58SPeter Brune ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 6907a35526eSPeter Brune 6911a9b3a06SPeter Brune /* damping parameters */ 6921a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 6931a9b3a06SPeter Brune 6941a9b3a06SPeter Brune ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 6951a9b3a06SPeter Brune 6961a9b3a06SPeter Brune /* precheck */ 6977a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr); 6987a35526eSPeter Brune if (set) { 6997a35526eSPeter Brune if (flg) { 7007a35526eSPeter Brune linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */ 701f5af7f23SKarl Rupp 7027a35526eSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction", 7030298fd71SBarry Smith "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr); 7047a35526eSPeter Brune ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr); 7057a35526eSPeter Brune } else { 7060298fd71SBarry Smith ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr); 7077a35526eSPeter Brune } 7087a35526eSPeter Brune } 709b000cd8dSPeter Brune ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr); 7101a9b3a06SPeter Brune ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 7117a35526eSPeter Brune 7125a9b6599SPeter Brune if (linesearch->ops->setfromoptions) { 7135a9b6599SPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 7145a9b6599SPeter Brune } 7155a9b6599SPeter Brune 716bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 717bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 718bf7f4e0aSPeter Brune PetscFunctionReturn(0); 719bf7f4e0aSPeter Brune } 720bf7f4e0aSPeter Brune 721bf7f4e0aSPeter Brune #undef __FUNCT__ 722f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView" 723f40b411bSPeter Brune /*@ 724cd7522eaSPeter Brune SNESLineSearchView - Prints useful information about the line search not 725cd7522eaSPeter Brune related to an individual call. 726f40b411bSPeter Brune 727f40b411bSPeter Brune Input Parameters: 7288e557f58SPeter Brune . linesearch - linesearch context 729f40b411bSPeter Brune 730f1c6b773SPeter Brune Logically Collective on SNESLineSearch 731f40b411bSPeter Brune 732f40b411bSPeter Brune Level: intermediate 733f40b411bSPeter Brune 734f1c6b773SPeter Brune .seealso: SNESLineSearchCreate() 735f40b411bSPeter Brune @*/ 736bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer) 737bf388a1fSBarry Smith { 7387f1410a3SPeter Brune PetscErrorCode ierr; 7397f1410a3SPeter Brune PetscBool iascii; 740bf388a1fSBarry Smith 741bf7f4e0aSPeter Brune PetscFunctionBegin; 7427f1410a3SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 7437f1410a3SPeter Brune if (!viewer) { 744ce94432eSBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr); 7457f1410a3SPeter Brune } 7467f1410a3SPeter Brune PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 7477f1410a3SPeter Brune PetscCheckSameComm(linesearch,1,viewer,2); 748f40b411bSPeter Brune 749251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 7507f1410a3SPeter Brune if (iascii) { 7517f1410a3SPeter Brune ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer,"SNESLineSearch Object");CHKERRQ(ierr); 7527f1410a3SPeter Brune if (linesearch->ops->view) { 7537f1410a3SPeter Brune ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 7547f1410a3SPeter Brune ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr); 7557f1410a3SPeter Brune ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 7567f1410a3SPeter Brune } 757c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr); 758c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr); 7597f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr); 7606b2b7091SBarry Smith if (linesearch->ops->precheck) { 7616b2b7091SBarry Smith if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) { 7627f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr); 7637f1410a3SPeter Brune } else { 7647f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr); 7657f1410a3SPeter Brune } 7667f1410a3SPeter Brune } 7676b2b7091SBarry Smith if (linesearch->ops->postcheck) { 7687f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr); 7697f1410a3SPeter Brune } 7707f1410a3SPeter Brune } 771bf7f4e0aSPeter Brune PetscFunctionReturn(0); 772bf7f4e0aSPeter Brune } 773bf7f4e0aSPeter Brune 774bf7f4e0aSPeter Brune #undef __FUNCT__ 775f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType" 776ea5d4fccSPeter Brune /*@C 777f1c6b773SPeter Brune SNESLineSearchSetType - Sets the linesearch type 778f40b411bSPeter Brune 779f40b411bSPeter Brune Input Parameters: 7808e557f58SPeter Brune + linesearch - linesearch context 781f40b411bSPeter Brune - type - The type of line search to be used 782f40b411bSPeter Brune 783cd7522eaSPeter Brune Available Types: 784cd7522eaSPeter Brune + basic - Simple damping line search. 7858e557f58SPeter Brune . bt - Backtracking line search over the L2 norm of the function 7868e557f58SPeter Brune . l2 - Secant line search over the L2 norm of the function 7878e557f58SPeter Brune . cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x) 7888e557f58SPeter Brune - shell - User provided SNESLineSearch implementation 789cd7522eaSPeter Brune 790f1c6b773SPeter Brune Logically Collective on SNESLineSearch 791f40b411bSPeter Brune 792f40b411bSPeter Brune Level: intermediate 793f40b411bSPeter Brune 794f40b411bSPeter Brune 795f1c6b773SPeter Brune .seealso: SNESLineSearchCreate() 796f40b411bSPeter Brune @*/ 79719fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type) 798bf7f4e0aSPeter Brune { 799f1c6b773SPeter Brune PetscErrorCode ierr,(*r)(SNESLineSearch); 800bf7f4e0aSPeter Brune PetscBool match; 801bf7f4e0aSPeter Brune 802bf7f4e0aSPeter Brune PetscFunctionBegin; 803f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 804bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 805bf7f4e0aSPeter Brune 806251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 807bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 808bf7f4e0aSPeter Brune 8091c9cd337SJed Brown ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr); 810bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 811bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 812bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 813bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 814f5af7f23SKarl Rupp 8150298fd71SBarry Smith linesearch->ops->destroy = NULL; 816bf7f4e0aSPeter Brune } 817f1c6b773SPeter Brune /* Reinitialize function pointers in SNESLineSearchOps structure */ 818bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 819bf7f4e0aSPeter Brune linesearch->ops->view = 0; 820bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 821bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 822bf7f4e0aSPeter Brune 823bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 824bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 825bf7f4e0aSPeter Brune PetscFunctionReturn(0); 826bf7f4e0aSPeter Brune } 827bf7f4e0aSPeter Brune 828bf7f4e0aSPeter Brune #undef __FUNCT__ 829f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES" 830f40b411bSPeter Brune /*@ 83178bcb3b5SPeter Brune SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation. 832f40b411bSPeter Brune 833f40b411bSPeter Brune Input Parameters: 8348e557f58SPeter Brune + linesearch - linesearch context 835f40b411bSPeter Brune - snes - The snes instance 836f40b411bSPeter Brune 83778bcb3b5SPeter Brune Level: developer 83878bcb3b5SPeter Brune 83978bcb3b5SPeter Brune Notes: 84078bcb3b5SPeter Brune This happens automatically when the line search is gotten/created with 8417601faf0SJed Brown SNESGetLineSearch(). This routine is therefore mainly called within SNES 84278bcb3b5SPeter Brune implementations. 843f40b411bSPeter Brune 8448141a3b9SPeter Brune Level: developer 845f40b411bSPeter Brune 846cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 847f40b411bSPeter Brune @*/ 848bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes) 849bf388a1fSBarry Smith { 850bf7f4e0aSPeter Brune PetscFunctionBegin; 851f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 852bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 853bf7f4e0aSPeter Brune linesearch->snes = snes; 854bf7f4e0aSPeter Brune PetscFunctionReturn(0); 855bf7f4e0aSPeter Brune } 856bf7f4e0aSPeter Brune 857bf7f4e0aSPeter Brune #undef __FUNCT__ 858f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES" 859f40b411bSPeter Brune /*@ 8608141a3b9SPeter Brune SNESLineSearchGetSNES - Gets the SNES instance associated with the line search. 8618141a3b9SPeter Brune Having an associated SNES is necessary because most line search implementations must be able to 8628141a3b9SPeter Brune evaluate the function using SNESComputeFunction() for the associated SNES. This routine 8638141a3b9SPeter Brune is used in the line search implementations when one must get this associated SNES instance. 864f40b411bSPeter Brune 865f40b411bSPeter Brune Input Parameters: 8668e557f58SPeter Brune . linesearch - linesearch context 867f40b411bSPeter Brune 868f40b411bSPeter Brune Output Parameters: 869f40b411bSPeter Brune . snes - The snes instance 870f40b411bSPeter Brune 8718141a3b9SPeter Brune Level: developer 872f40b411bSPeter Brune 873cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 874f40b411bSPeter Brune @*/ 875bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes) 876bf388a1fSBarry Smith { 877bf7f4e0aSPeter Brune PetscFunctionBegin; 878f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 8796a388c36SPeter Brune PetscValidPointer(snes, 2); 880bf7f4e0aSPeter Brune *snes = linesearch->snes; 881bf7f4e0aSPeter Brune PetscFunctionReturn(0); 882bf7f4e0aSPeter Brune } 883bf7f4e0aSPeter Brune 8846a388c36SPeter Brune #undef __FUNCT__ 885f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda" 886f40b411bSPeter Brune /*@ 887f1c6b773SPeter Brune SNESLineSearchGetLambda - Gets the last linesearch steplength discovered. 888f40b411bSPeter Brune 889f40b411bSPeter Brune Input Parameters: 8908e557f58SPeter Brune . linesearch - linesearch context 891f40b411bSPeter Brune 892f40b411bSPeter Brune Output Parameters: 893cd7522eaSPeter Brune . lambda - The last steplength computed during SNESLineSearchApply() 894f40b411bSPeter Brune 89578bcb3b5SPeter Brune Level: advanced 89678bcb3b5SPeter Brune 8978e557f58SPeter Brune Notes: 8988e557f58SPeter Brune This is useful in methods where the solver is ill-scaled and 89978bcb3b5SPeter Brune requires some adaptive notion of the difference in scale between the 90078bcb3b5SPeter Brune solution and the function. For instance, SNESQN may be scaled by the 90178bcb3b5SPeter Brune line search lambda using the argument -snes_qn_scaling ls. 90278bcb3b5SPeter Brune 903f40b411bSPeter Brune 904cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply() 905f40b411bSPeter Brune @*/ 906f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda) 9076a388c36SPeter Brune { 9086a388c36SPeter Brune PetscFunctionBegin; 909f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9106a388c36SPeter Brune PetscValidPointer(lambda, 2); 9116a388c36SPeter Brune *lambda = linesearch->lambda; 9126a388c36SPeter Brune PetscFunctionReturn(0); 9136a388c36SPeter Brune } 9146a388c36SPeter Brune 9156a388c36SPeter Brune #undef __FUNCT__ 916f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda" 917f40b411bSPeter Brune /*@ 918f1c6b773SPeter Brune SNESLineSearchSetLambda - Sets the linesearch steplength. 919f40b411bSPeter Brune 920f40b411bSPeter Brune Input Parameters: 9218e557f58SPeter Brune + linesearch - linesearch context 922f40b411bSPeter Brune - lambda - The last steplength. 923f40b411bSPeter Brune 924cd7522eaSPeter Brune Notes: 925cd7522eaSPeter Brune This routine is typically used within implementations of SNESLineSearchApply 926cd7522eaSPeter Brune to set the final steplength. This routine (and SNESLineSearchGetLambda()) were 927cd7522eaSPeter Brune added in order to facilitate Quasi-Newton methods that use the previous steplength 928cd7522eaSPeter Brune as an inner scaling parameter. 929cd7522eaSPeter Brune 93078bcb3b5SPeter Brune Level: advanced 931f40b411bSPeter Brune 932f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda() 933f40b411bSPeter Brune @*/ 934f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda) 9356a388c36SPeter Brune { 9366a388c36SPeter Brune PetscFunctionBegin; 937f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9386a388c36SPeter Brune linesearch->lambda = lambda; 9396a388c36SPeter Brune PetscFunctionReturn(0); 9406a388c36SPeter Brune } 9416a388c36SPeter Brune 9426a388c36SPeter Brune #undef __FUNCT__ 943f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances" 944f40b411bSPeter Brune /*@ 9453c7d6663SPeter Brune SNESLineSearchGetTolerances - Gets the tolerances for the linesearch. These include 94678bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 94778bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 94878bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 949f40b411bSPeter Brune 950f40b411bSPeter Brune Input Parameters: 9518e557f58SPeter Brune . linesearch - linesearch context 952f40b411bSPeter Brune 953f40b411bSPeter Brune Output Parameters: 954516fe3c3SPeter Brune + steptol - The minimum steplength 9556cc8e53bSPeter Brune . maxstep - The maximum steplength 956516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 957516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 958516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 959516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 960f40b411bSPeter Brune 96178bcb3b5SPeter Brune Level: intermediate 96278bcb3b5SPeter Brune 96378bcb3b5SPeter Brune Notes: 96478bcb3b5SPeter Brune Different line searches may implement these parameters slightly differently as 9653c7d6663SPeter Brune the type requires. 966516fe3c3SPeter Brune 967f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances() 968f40b411bSPeter Brune @*/ 969f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 9706a388c36SPeter Brune { 9716a388c36SPeter Brune PetscFunctionBegin; 972f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 973516fe3c3SPeter Brune if (steptol) { 9746a388c36SPeter Brune PetscValidPointer(steptol, 2); 9756a388c36SPeter Brune *steptol = linesearch->steptol; 976516fe3c3SPeter Brune } 977516fe3c3SPeter Brune if (maxstep) { 978516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 979516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 980516fe3c3SPeter Brune } 981516fe3c3SPeter Brune if (rtol) { 982516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 983516fe3c3SPeter Brune *rtol = linesearch->rtol; 984516fe3c3SPeter Brune } 985516fe3c3SPeter Brune if (atol) { 986516fe3c3SPeter Brune PetscValidPointer(atol, 5); 987516fe3c3SPeter Brune *atol = linesearch->atol; 988516fe3c3SPeter Brune } 989516fe3c3SPeter Brune if (ltol) { 990516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 991516fe3c3SPeter Brune *ltol = linesearch->ltol; 992516fe3c3SPeter Brune } 993516fe3c3SPeter Brune if (max_its) { 994516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 995516fe3c3SPeter Brune *max_its = linesearch->max_its; 996516fe3c3SPeter Brune } 9976a388c36SPeter Brune PetscFunctionReturn(0); 9986a388c36SPeter Brune } 9996a388c36SPeter Brune 10006a388c36SPeter Brune #undef __FUNCT__ 1001f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances" 1002f40b411bSPeter Brune /*@ 10033c7d6663SPeter Brune SNESLineSearchSetTolerances - Gets the tolerances for the linesearch. These include 100478bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 100578bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 100678bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1007f40b411bSPeter Brune 1008f40b411bSPeter Brune Input Parameters: 10098e557f58SPeter Brune + linesearch - linesearch context 1010516fe3c3SPeter Brune . steptol - The minimum steplength 10116cc8e53bSPeter Brune . maxstep - The maximum steplength 1012516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1013516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1014516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1015516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1016f40b411bSPeter Brune 101778bcb3b5SPeter Brune Notes: 10183c7d6663SPeter Brune The user may choose to not set any of the tolerances using PETSC_DEFAULT in 101978bcb3b5SPeter Brune place of an argument. 1020f40b411bSPeter Brune 102178bcb3b5SPeter Brune Level: intermediate 1022516fe3c3SPeter Brune 1023f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances() 1024f40b411bSPeter Brune @*/ 1025f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 10266a388c36SPeter Brune { 10276a388c36SPeter Brune PetscFunctionBegin; 1028f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1029d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,steptol,2); 1030d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,maxstep,3); 1031d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,rtol,4); 1032d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,atol,5); 1033d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,ltol,6); 1034d3952184SSatish Balay PetscValidLogicalCollectiveInt(linesearch,max_its,7); 1035d3952184SSatish Balay 1036d3952184SSatish Balay if (steptol!= PETSC_DEFAULT) { 1037ce94432eSBarry Smith if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol); 10386a388c36SPeter Brune linesearch->steptol = steptol; 1039d3952184SSatish Balay } 1040d3952184SSatish Balay 1041d3952184SSatish Balay if (maxstep!= PETSC_DEFAULT) { 1042ce94432eSBarry Smith if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep); 1043516fe3c3SPeter Brune linesearch->maxstep = maxstep; 1044d3952184SSatish Balay } 1045d3952184SSatish Balay 1046d3952184SSatish Balay if (rtol != PETSC_DEFAULT) { 1047ce94432eSBarry 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); 1048516fe3c3SPeter Brune linesearch->rtol = rtol; 1049d3952184SSatish Balay } 1050d3952184SSatish Balay 1051d3952184SSatish Balay if (atol != PETSC_DEFAULT) { 1052ce94432eSBarry Smith if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol); 1053516fe3c3SPeter Brune linesearch->atol = atol; 1054d3952184SSatish Balay } 1055d3952184SSatish Balay 1056d3952184SSatish Balay if (ltol != PETSC_DEFAULT) { 1057ce94432eSBarry Smith if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol); 1058516fe3c3SPeter Brune linesearch->ltol = ltol; 1059d3952184SSatish Balay } 1060d3952184SSatish Balay 1061d3952184SSatish Balay if (max_its != PETSC_DEFAULT) { 1062ce94432eSBarry Smith if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its); 1063516fe3c3SPeter Brune linesearch->max_its = max_its; 1064d3952184SSatish Balay } 10656a388c36SPeter Brune PetscFunctionReturn(0); 10666a388c36SPeter Brune } 10676a388c36SPeter Brune 10686a388c36SPeter Brune #undef __FUNCT__ 1069f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping" 1070f40b411bSPeter Brune /*@ 1071f1c6b773SPeter Brune SNESLineSearchGetDamping - Gets the line search damping parameter. 1072f40b411bSPeter Brune 1073f40b411bSPeter Brune Input Parameters: 10748e557f58SPeter Brune . linesearch - linesearch context 1075f40b411bSPeter Brune 1076f40b411bSPeter Brune Output Parameters: 10778e557f58SPeter Brune . damping - The damping parameter 1078f40b411bSPeter Brune 107978bcb3b5SPeter Brune Level: advanced 1080f40b411bSPeter Brune 108178bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN 1082f40b411bSPeter Brune @*/ 1083f40b411bSPeter Brune 1084f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping) 10856a388c36SPeter Brune { 10866a388c36SPeter Brune PetscFunctionBegin; 1087f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10886a388c36SPeter Brune PetscValidPointer(damping, 2); 10896a388c36SPeter Brune *damping = linesearch->damping; 10906a388c36SPeter Brune PetscFunctionReturn(0); 10916a388c36SPeter Brune } 10926a388c36SPeter Brune 10936a388c36SPeter Brune #undef __FUNCT__ 1094f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping" 1095f40b411bSPeter Brune /*@ 1096f1c6b773SPeter Brune SNESLineSearchSetDamping - Sets the line search damping paramter. 1097f40b411bSPeter Brune 1098f40b411bSPeter Brune Input Parameters: 109978bcb3b5SPeter Brune . linesearch - linesearch context 110078bcb3b5SPeter Brune . damping - The damping parameter 1101f40b411bSPeter Brune 1102f40b411bSPeter Brune Level: intermediate 1103f40b411bSPeter Brune 1104cd7522eaSPeter Brune Notes: 1105cd7522eaSPeter Brune The basic line search merely takes the update step scaled by the damping parameter. 1106cd7522eaSPeter Brune The use of the damping parameter in the l2 and cp line searches is much more subtle; 110778bcb3b5SPeter Brune it is used as a starting point in calculating the secant step. However, the eventual 1108cd7522eaSPeter Brune step may be of greater length than the damping parameter. In the bt line search it is 1109cd7522eaSPeter Brune used as the maximum possible step length, as the bt line search only backtracks. 1110cd7522eaSPeter Brune 1111f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping() 1112f40b411bSPeter Brune @*/ 1113f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping) 11146a388c36SPeter Brune { 11156a388c36SPeter Brune PetscFunctionBegin; 1116f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 11176a388c36SPeter Brune linesearch->damping = damping; 11186a388c36SPeter Brune PetscFunctionReturn(0); 11196a388c36SPeter Brune } 11206a388c36SPeter Brune 11216a388c36SPeter Brune #undef __FUNCT__ 112259405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder" 112359405d5eSPeter Brune /*@ 112459405d5eSPeter Brune SNESLineSearchGetOrder - Gets the line search approximation order. 112559405d5eSPeter Brune 112659405d5eSPeter Brune Input Parameters: 112778bcb3b5SPeter Brune . linesearch - linesearch context 112859405d5eSPeter Brune 112959405d5eSPeter Brune Output Parameters: 11308e557f58SPeter Brune . order - The order 113159405d5eSPeter Brune 113278bcb3b5SPeter Brune Possible Values for order: 11333c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11343c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11353c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 113678bcb3b5SPeter Brune 113759405d5eSPeter Brune Level: intermediate 113859405d5eSPeter Brune 113959405d5eSPeter Brune .seealso: SNESLineSearchSetOrder() 114059405d5eSPeter Brune @*/ 114159405d5eSPeter Brune 1142b000cd8dSPeter Brune PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order) 114359405d5eSPeter Brune { 114459405d5eSPeter Brune PetscFunctionBegin; 114559405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 114659405d5eSPeter Brune PetscValidPointer(order, 2); 114759405d5eSPeter Brune *order = linesearch->order; 114859405d5eSPeter Brune PetscFunctionReturn(0); 114959405d5eSPeter Brune } 115059405d5eSPeter Brune 115159405d5eSPeter Brune #undef __FUNCT__ 115259405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder" 115359405d5eSPeter Brune /*@ 115459405d5eSPeter Brune SNESLineSearchSetOrder - Sets the line search damping paramter. 115559405d5eSPeter Brune 115659405d5eSPeter Brune Input Parameters: 115778bcb3b5SPeter Brune . linesearch - linesearch context 115878bcb3b5SPeter Brune . order - The damping parameter 115959405d5eSPeter Brune 116059405d5eSPeter Brune Level: intermediate 116159405d5eSPeter Brune 116278bcb3b5SPeter Brune Possible Values for order: 11633c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11643c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11653c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 116678bcb3b5SPeter Brune 116759405d5eSPeter Brune Notes: 116859405d5eSPeter Brune Variable orders are supported by the following line searches: 116978bcb3b5SPeter Brune + bt - cubic and quadratic 117078bcb3b5SPeter Brune - cp - linear and quadratic 117159405d5eSPeter Brune 117259405d5eSPeter Brune .seealso: SNESLineSearchGetOrder() 117359405d5eSPeter Brune @*/ 1174b000cd8dSPeter Brune PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order) 117559405d5eSPeter Brune { 117659405d5eSPeter Brune PetscFunctionBegin; 117759405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 117859405d5eSPeter Brune linesearch->order = order; 117959405d5eSPeter Brune PetscFunctionReturn(0); 118059405d5eSPeter Brune } 118159405d5eSPeter Brune 118259405d5eSPeter Brune #undef __FUNCT__ 1183f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms" 1184f40b411bSPeter Brune /*@ 1185f1c6b773SPeter Brune SNESLineSearchGetNorms - Gets the norms for for X, Y, and F. 1186f40b411bSPeter Brune 1187f40b411bSPeter Brune Input Parameters: 118878bcb3b5SPeter Brune . linesearch - linesearch context 1189f40b411bSPeter Brune 1190f40b411bSPeter Brune Output Parameters: 1191f40b411bSPeter Brune + xnorm - The norm of the current solution 1192f40b411bSPeter Brune . fnorm - The norm of the current function 1193f40b411bSPeter Brune - ynorm - The norm of the current update 1194f40b411bSPeter Brune 1195cd7522eaSPeter Brune Notes: 1196cd7522eaSPeter Brune This function is mainly called from SNES implementations. 1197cd7522eaSPeter Brune 119878bcb3b5SPeter Brune Level: developer 1199f40b411bSPeter Brune 1200f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs() 1201f40b411bSPeter Brune @*/ 1202f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 1203bf7f4e0aSPeter Brune { 1204bf7f4e0aSPeter Brune PetscFunctionBegin; 1205f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1206f5af7f23SKarl Rupp if (xnorm) *xnorm = linesearch->xnorm; 1207f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 1208f5af7f23SKarl Rupp if (ynorm) *ynorm = linesearch->ynorm; 1209bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1210bf7f4e0aSPeter Brune } 1211bf7f4e0aSPeter Brune 1212e7058c64SPeter Brune #undef __FUNCT__ 1213f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms" 1214f40b411bSPeter Brune /*@ 1215f1c6b773SPeter Brune SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 1216f40b411bSPeter Brune 1217f40b411bSPeter Brune Input Parameters: 121878bcb3b5SPeter Brune + linesearch - linesearch context 1219f40b411bSPeter Brune . xnorm - The norm of the current solution 1220f40b411bSPeter Brune . fnorm - The norm of the current function 1221f40b411bSPeter Brune - ynorm - The norm of the current update 1222f40b411bSPeter Brune 122378bcb3b5SPeter Brune Level: advanced 1224f40b411bSPeter Brune 1225f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1226f40b411bSPeter Brune @*/ 1227f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 12286a388c36SPeter Brune { 12296a388c36SPeter Brune PetscFunctionBegin; 1230f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12316a388c36SPeter Brune linesearch->xnorm = xnorm; 12326a388c36SPeter Brune linesearch->fnorm = fnorm; 12336a388c36SPeter Brune linesearch->ynorm = ynorm; 12346a388c36SPeter Brune PetscFunctionReturn(0); 12356a388c36SPeter Brune } 12366a388c36SPeter Brune 12376a388c36SPeter Brune #undef __FUNCT__ 1238f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms" 1239f40b411bSPeter Brune /*@ 1240f1c6b773SPeter Brune SNESLineSearchComputeNorms - Computes the norms of X, F, and Y. 1241f40b411bSPeter Brune 1242f40b411bSPeter Brune Input Parameters: 124378bcb3b5SPeter Brune . linesearch - linesearch context 1244f40b411bSPeter Brune 1245f40b411bSPeter Brune Options Database Keys: 12468e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 1247f40b411bSPeter Brune 1248f40b411bSPeter Brune Level: intermediate 1249f40b411bSPeter Brune 125078bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms() 1251f40b411bSPeter Brune @*/ 1252f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch) 12536a388c36SPeter Brune { 12546a388c36SPeter Brune PetscErrorCode ierr; 12559bd66eb0SPeter Brune SNES snes; 1256bf388a1fSBarry Smith 12576a388c36SPeter Brune PetscFunctionBegin; 12586a388c36SPeter Brune if (linesearch->norms) { 12599bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1260f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 12619bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12629bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12639bd66eb0SPeter Brune ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr); 12649bd66eb0SPeter Brune } else { 12656a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 12666a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12676a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12686a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 12696a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12706a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12716a388c36SPeter Brune } 12729bd66eb0SPeter Brune } 12736a388c36SPeter Brune PetscFunctionReturn(0); 12746a388c36SPeter Brune } 12756a388c36SPeter Brune 12766f263ca3SPeter Brune #undef __FUNCT__ 12776f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms" 12786f263ca3SPeter Brune /*@ 12796f263ca3SPeter Brune SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search. 12806f263ca3SPeter Brune 12816f263ca3SPeter Brune Input Parameters: 128278bcb3b5SPeter Brune + linesearch - linesearch context 128378bcb3b5SPeter Brune - flg - indicates whether or not to compute norms 12846f263ca3SPeter Brune 12856f263ca3SPeter Brune Options Database Keys: 12868e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 12876f263ca3SPeter Brune 12886f263ca3SPeter Brune Notes: 12891a4f838cSPeter Brune This is most relevant to the SNESLINESEARCHBASIC line search type. 12906f263ca3SPeter Brune 12916f263ca3SPeter Brune Level: intermediate 12926f263ca3SPeter Brune 12931a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC 12946f263ca3SPeter Brune @*/ 12956f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg) 12966f263ca3SPeter Brune { 12976f263ca3SPeter Brune PetscFunctionBegin; 12986f263ca3SPeter Brune linesearch->norms = flg; 12996f263ca3SPeter Brune PetscFunctionReturn(0); 13006f263ca3SPeter Brune } 13016f263ca3SPeter Brune 13026a388c36SPeter Brune #undef __FUNCT__ 1303f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs" 1304f40b411bSPeter Brune /*@ 1305f1c6b773SPeter Brune SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context 1306f40b411bSPeter Brune 1307f40b411bSPeter Brune Input Parameters: 130878bcb3b5SPeter Brune . linesearch - linesearch context 1309f40b411bSPeter Brune 1310f40b411bSPeter Brune Output Parameters: 13116232e825SPeter Brune + X - Solution vector 13126232e825SPeter Brune . F - Function vector 13136232e825SPeter Brune . Y - Search direction vector 13146232e825SPeter Brune . W - Solution work vector 13156232e825SPeter Brune - G - Function work vector 13166232e825SPeter Brune 1317*7bba9028SPeter Brune Notes: 1318*7bba9028SPeter Brune At the beginning of a line search application, X should contain a 13196232e825SPeter Brune solution and the vector F the function computed at X. At the end of the 13206232e825SPeter Brune line search application, X should contain the new solution, and F the 13216232e825SPeter Brune function evaluated at the new solution. 1322f40b411bSPeter Brune 132378bcb3b5SPeter Brune Level: advanced 1324f40b411bSPeter Brune 1325f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1326f40b411bSPeter Brune @*/ 1327bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) 1328bf388a1fSBarry Smith { 13296a388c36SPeter Brune PetscFunctionBegin; 1330f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13316a388c36SPeter Brune if (X) { 13326a388c36SPeter Brune PetscValidPointer(X, 2); 13336a388c36SPeter Brune *X = linesearch->vec_sol; 13346a388c36SPeter Brune } 13356a388c36SPeter Brune if (F) { 13366a388c36SPeter Brune PetscValidPointer(F, 3); 13376a388c36SPeter Brune *F = linesearch->vec_func; 13386a388c36SPeter Brune } 13396a388c36SPeter Brune if (Y) { 13406a388c36SPeter Brune PetscValidPointer(Y, 4); 13416a388c36SPeter Brune *Y = linesearch->vec_update; 13426a388c36SPeter Brune } 13436a388c36SPeter Brune if (W) { 13446a388c36SPeter Brune PetscValidPointer(W, 5); 13456a388c36SPeter Brune *W = linesearch->vec_sol_new; 13466a388c36SPeter Brune } 13476a388c36SPeter Brune if (G) { 13486a388c36SPeter Brune PetscValidPointer(G, 6); 13496a388c36SPeter Brune *G = linesearch->vec_func_new; 13506a388c36SPeter Brune } 13516a388c36SPeter Brune PetscFunctionReturn(0); 13526a388c36SPeter Brune } 13536a388c36SPeter Brune 13546a388c36SPeter Brune #undef __FUNCT__ 1355f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs" 1356f40b411bSPeter Brune /*@ 1357f1c6b773SPeter Brune SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context 1358f40b411bSPeter Brune 1359f40b411bSPeter Brune Input Parameters: 136078bcb3b5SPeter Brune + linesearch - linesearch context 13616232e825SPeter Brune . X - Solution vector 13626232e825SPeter Brune . F - Function vector 13636232e825SPeter Brune . Y - Search direction vector 13646232e825SPeter Brune . W - Solution work vector 13656232e825SPeter Brune - G - Function work vector 1366f40b411bSPeter Brune 136778bcb3b5SPeter Brune Level: advanced 1368f40b411bSPeter Brune 1369f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs() 1370f40b411bSPeter Brune @*/ 1371bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) 1372bf388a1fSBarry Smith { 13736a388c36SPeter Brune PetscFunctionBegin; 1374f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13756a388c36SPeter Brune if (X) { 13766a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 13776a388c36SPeter Brune linesearch->vec_sol = X; 13786a388c36SPeter Brune } 13796a388c36SPeter Brune if (F) { 13806a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 13816a388c36SPeter Brune linesearch->vec_func = F; 13826a388c36SPeter Brune } 13836a388c36SPeter Brune if (Y) { 13846a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 13856a388c36SPeter Brune linesearch->vec_update = Y; 13866a388c36SPeter Brune } 13876a388c36SPeter Brune if (W) { 13886a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 13896a388c36SPeter Brune linesearch->vec_sol_new = W; 13906a388c36SPeter Brune } 13916a388c36SPeter Brune if (G) { 13926a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 13936a388c36SPeter Brune linesearch->vec_func_new = G; 13946a388c36SPeter Brune } 13956a388c36SPeter Brune PetscFunctionReturn(0); 13966a388c36SPeter Brune } 13976a388c36SPeter Brune 13986a388c36SPeter Brune #undef __FUNCT__ 1399f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix" 1400e7058c64SPeter Brune /*@C 1401f1c6b773SPeter Brune SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1402e7058c64SPeter Brune SNES options in the database. 1403e7058c64SPeter Brune 1404cd7522eaSPeter Brune Logically Collective on SNESLineSearch 1405e7058c64SPeter Brune 1406e7058c64SPeter Brune Input Parameters: 1407e7058c64SPeter Brune + snes - the SNES context 1408e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1409e7058c64SPeter Brune 1410e7058c64SPeter Brune Notes: 1411e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1412e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1413e7058c64SPeter Brune 1414e7058c64SPeter Brune Level: advanced 1415e7058c64SPeter Brune 1416f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database 1417e7058c64SPeter Brune 1418e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1419e7058c64SPeter Brune @*/ 1420f1c6b773SPeter Brune PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[]) 1421e7058c64SPeter Brune { 1422e7058c64SPeter Brune PetscErrorCode ierr; 1423e7058c64SPeter Brune 1424e7058c64SPeter Brune PetscFunctionBegin; 1425f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1426e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1427e7058c64SPeter Brune PetscFunctionReturn(0); 1428e7058c64SPeter Brune } 1429e7058c64SPeter Brune 1430e7058c64SPeter Brune #undef __FUNCT__ 1431f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix" 1432e7058c64SPeter Brune /*@C 1433f1c6b773SPeter Brune SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 1434f1c6b773SPeter Brune SNESLineSearch options in the database. 1435e7058c64SPeter Brune 1436e7058c64SPeter Brune Not Collective 1437e7058c64SPeter Brune 1438e7058c64SPeter Brune Input Parameter: 1439cd7522eaSPeter Brune . linesearch - the SNESLineSearch context 1440e7058c64SPeter Brune 1441e7058c64SPeter Brune Output Parameter: 1442e7058c64SPeter Brune . prefix - pointer to the prefix string used 1443e7058c64SPeter Brune 14448e557f58SPeter Brune Notes: 14458e557f58SPeter Brune On the fortran side, the user should pass in a string 'prefix' of 1446e7058c64SPeter Brune sufficient length to hold the prefix. 1447e7058c64SPeter Brune 1448e7058c64SPeter Brune Level: advanced 1449e7058c64SPeter Brune 1450f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database 1451e7058c64SPeter Brune 1452e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1453e7058c64SPeter Brune @*/ 1454f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[]) 1455e7058c64SPeter Brune { 1456e7058c64SPeter Brune PetscErrorCode ierr; 1457e7058c64SPeter Brune 1458e7058c64SPeter Brune PetscFunctionBegin; 1459f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1460e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1461e7058c64SPeter Brune PetscFunctionReturn(0); 1462e7058c64SPeter Brune } 1463bf7f4e0aSPeter Brune 1464bf7f4e0aSPeter Brune #undef __FUNCT__ 1465fa0ddf94SBarry Smith #define __FUNCT__ "SNESLineSearchSetWorkVecs" 14668d359177SBarry Smith /*@C 1467fa0ddf94SBarry Smith SNESLineSearchSetWorkVecs - Gets work vectors for the line search. 1468f40b411bSPeter Brune 1469f40b411bSPeter Brune Input Parameter: 1470f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1471f40b411bSPeter Brune - nwork - the number of work vectors 1472f40b411bSPeter Brune 1473f40b411bSPeter Brune Level: developer 1474f40b411bSPeter Brune 1475fa0ddf94SBarry Smith Developers Note: This is PETSC_EXTERN because it may be used by user written plugin SNES implementations 1476cd7522eaSPeter Brune 1477f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector 1478f40b411bSPeter Brune 1479fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs() 1480f40b411bSPeter Brune @*/ 1481fa0ddf94SBarry Smith PetscErrorCode SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork) 1482bf7f4e0aSPeter Brune { 1483bf7f4e0aSPeter Brune PetscErrorCode ierr; 1484bf388a1fSBarry Smith 1485bf7f4e0aSPeter Brune PetscFunctionBegin; 1486bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1487bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 14888d359177SBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1489bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1490bf7f4e0aSPeter Brune } 1491bf7f4e0aSPeter Brune 1492bf7f4e0aSPeter Brune #undef __FUNCT__ 1493f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess" 1494f40b411bSPeter Brune /*@ 1495f1c6b773SPeter Brune SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application 1496f40b411bSPeter Brune 1497f40b411bSPeter Brune Input Parameters: 149878bcb3b5SPeter Brune . linesearch - linesearch context 1499f40b411bSPeter Brune 1500f40b411bSPeter Brune Output Parameters: 15018e557f58SPeter Brune . success - The success or failure status 1502f40b411bSPeter Brune 1503cd7522eaSPeter Brune Notes: 1504c98378a5SBarry Smith This is typically called after SNESLineSearchApply() in order to determine if the line-search failed 1505cd7522eaSPeter Brune (and set the SNES convergence accordingly). 1506cd7522eaSPeter Brune 1507f40b411bSPeter Brune Level: intermediate 1508f40b411bSPeter Brune 1509f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess() 1510f40b411bSPeter Brune @*/ 1511f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success) 1512bf7f4e0aSPeter Brune { 1513bf7f4e0aSPeter Brune PetscFunctionBegin; 1514f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15156a388c36SPeter Brune PetscValidPointer(success, 2); 1516f5af7f23SKarl Rupp if (success) *success = linesearch->success; 1517bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1518bf7f4e0aSPeter Brune } 1519bf7f4e0aSPeter Brune 1520bf7f4e0aSPeter Brune #undef __FUNCT__ 1521f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess" 1522f40b411bSPeter Brune /*@ 1523f1c6b773SPeter Brune SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application 1524f40b411bSPeter Brune 1525f40b411bSPeter Brune Input Parameters: 152678bcb3b5SPeter Brune + linesearch - linesearch context 15278e557f58SPeter Brune - success - The success or failure status 1528f40b411bSPeter Brune 1529cd7522eaSPeter Brune Notes: 1530cd7522eaSPeter Brune This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set 1531cd7522eaSPeter Brune the success or failure of the line search method. 1532cd7522eaSPeter Brune 153378bcb3b5SPeter Brune Level: developer 1534f40b411bSPeter Brune 1535f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess() 1536f40b411bSPeter Brune @*/ 1537f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success) 15386a388c36SPeter Brune { 15396a388c36SPeter Brune PetscFunctionBegin; 15405fd66863SKarl Rupp PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15416a388c36SPeter Brune linesearch->success = success; 15426a388c36SPeter Brune PetscFunctionReturn(0); 15436a388c36SPeter Brune } 15446a388c36SPeter Brune 15456a388c36SPeter Brune #undef __FUNCT__ 1546f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions" 15479bd66eb0SPeter Brune /*@C 1548f1c6b773SPeter Brune SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 15499bd66eb0SPeter Brune 15509bd66eb0SPeter Brune Input Parameters: 15519bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 15529bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 15539bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 15549bd66eb0SPeter Brune 15559bd66eb0SPeter Brune Logically Collective on SNES 15569bd66eb0SPeter Brune 15579bd66eb0SPeter Brune Calling sequence of projectfunc: 15589bd66eb0SPeter Brune .vb 15599bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 15609bd66eb0SPeter Brune .ve 15619bd66eb0SPeter Brune 15629bd66eb0SPeter Brune Input parameters for projectfunc: 15639bd66eb0SPeter Brune + snes - nonlinear context 15649bd66eb0SPeter Brune - X - current solution 15659bd66eb0SPeter Brune 1566cd7522eaSPeter Brune Output parameters for projectfunc: 15679bd66eb0SPeter Brune . X - Projected solution 15689bd66eb0SPeter Brune 15699bd66eb0SPeter Brune Calling sequence of normfunc: 15709bd66eb0SPeter Brune .vb 15719bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 15729bd66eb0SPeter Brune .ve 15739bd66eb0SPeter Brune 1574cd7522eaSPeter Brune Input parameters for normfunc: 15759bd66eb0SPeter Brune + snes - nonlinear context 15769bd66eb0SPeter Brune . X - current solution 15779bd66eb0SPeter Brune - F - current residual 15789bd66eb0SPeter Brune 1579cd7522eaSPeter Brune Output parameters for normfunc: 15809bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 15819bd66eb0SPeter Brune 1582cd7522eaSPeter Brune Notes: 1583cd7522eaSPeter Brune The VI solvers require projection of the solution to the feasible set. projectfunc should implement this. 1584cd7522eaSPeter Brune 1585cd7522eaSPeter Brune The VI solvers require special evaluation of the function norm such that the norm is only calculated 1586cd7522eaSPeter Brune on the inactive set. This should be implemented by normfunc. 15879bd66eb0SPeter Brune 15889bd66eb0SPeter Brune Level: developer 15899bd66eb0SPeter Brune 15909bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search 15919bd66eb0SPeter Brune 1592f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() 15939bd66eb0SPeter Brune @*/ 1594f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc) 15959bd66eb0SPeter Brune { 15969bd66eb0SPeter Brune PetscFunctionBegin; 1597f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15989bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 15999bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 16009bd66eb0SPeter Brune PetscFunctionReturn(0); 16019bd66eb0SPeter Brune } 16029bd66eb0SPeter Brune 16039bd66eb0SPeter Brune #undef __FUNCT__ 1604f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions" 16059bd66eb0SPeter Brune /*@C 1606f1c6b773SPeter Brune SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 16079bd66eb0SPeter Brune 16089bd66eb0SPeter Brune Input Parameters: 16099bd66eb0SPeter Brune . snes - nonlinear context obtained from SNESCreate() 16109bd66eb0SPeter Brune 16119bd66eb0SPeter Brune Output Parameters: 16129bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 16139bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16149bd66eb0SPeter Brune 16159bd66eb0SPeter Brune Logically Collective on SNES 16169bd66eb0SPeter Brune 16179bd66eb0SPeter Brune Level: developer 16189bd66eb0SPeter Brune 16199bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search 16209bd66eb0SPeter Brune 1621f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 16229bd66eb0SPeter Brune @*/ 1623f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc) 16249bd66eb0SPeter Brune { 16259bd66eb0SPeter Brune PetscFunctionBegin; 16269bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 16279bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 16289bd66eb0SPeter Brune PetscFunctionReturn(0); 16299bd66eb0SPeter Brune } 16309bd66eb0SPeter Brune 16319bd66eb0SPeter Brune #undef __FUNCT__ 1632f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister" 1633bf7f4e0aSPeter Brune /*@C 16341c84c290SBarry Smith SNESLineSearchRegister - See SNESLineSearchRegister() 1635bf7f4e0aSPeter Brune 1636bf7f4e0aSPeter Brune Level: advanced 1637bf7f4e0aSPeter Brune @*/ 1638bdf89e91SBarry Smith PetscErrorCode SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch)) 1639bf7f4e0aSPeter Brune { 1640bf7f4e0aSPeter Brune PetscErrorCode ierr; 1641bf7f4e0aSPeter Brune 1642bf7f4e0aSPeter Brune PetscFunctionBegin; 1643a240a19fSJed Brown ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr); 1644bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1645bf7f4e0aSPeter Brune } 1646