1b45d2f2cSJed Brown #include <petsc-private/linesearchimpl.h> /*I "petscsnes.h" I*/ 2bf7f4e0aSPeter Brune 3f1c6b773SPeter Brune PetscBool SNESLineSearchRegisterAllCalled = PETSC_FALSE; 4140e18c1SBarry Smith PetscFunctionList SNESLineSearchList = PETSC_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); 36ea5d4fccSPeter Brune *outlinesearch = PETSC_NULL; 37bf388a1fSBarry Smith ierr = PetscHeaderCreate(linesearch,_p_LineSearch,struct _LineSearchOps,SNESLINESEARCH_CLASSID, 0,"SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr); 38bf7f4e0aSPeter Brune 396b2b7091SBarry Smith linesearch->ops->precheck = PETSC_NULL; 406b2b7091SBarry Smith linesearch->ops->postcheck = PETSC_NULL; 41bf7f4e0aSPeter Brune 429bd66eb0SPeter Brune linesearch->vec_sol_new = PETSC_NULL; 439bd66eb0SPeter Brune linesearch->vec_func_new = PETSC_NULL; 449bd66eb0SPeter Brune linesearch->vec_sol = PETSC_NULL; 459bd66eb0SPeter Brune linesearch->vec_func = PETSC_NULL; 469bd66eb0SPeter Brune linesearch->vec_update = PETSC_NULL; 479bd66eb0SPeter Brune 48bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 49bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 50bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 51bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 52bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 53bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 54bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 55bf7f4e0aSPeter Brune linesearch->damping = 1.0; 56bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 57bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 58516fe3c3SPeter Brune linesearch->rtol = 1e-8; 59516fe3c3SPeter Brune linesearch->atol = 1e-15; 60516fe3c3SPeter Brune linesearch->ltol = 1e-8; 61bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 62bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 6359405d5eSPeter Brune linesearch->max_its = 1; 64bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 65bf7f4e0aSPeter Brune *outlinesearch = linesearch; 66bf7f4e0aSPeter Brune PetscFunctionReturn(0); 67bf7f4e0aSPeter Brune } 68bf7f4e0aSPeter Brune 69bf7f4e0aSPeter Brune #undef __FUNCT__ 70f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetUp" 71f40b411bSPeter Brune /*@ 7278bcb3b5SPeter Brune SNESLineSearchSetUp - Prepares the line search for being applied by allocating 7378bcb3b5SPeter Brune any required vectors. 74f40b411bSPeter Brune 75cd7522eaSPeter Brune Collective on SNESLineSearch 76f40b411bSPeter Brune 77f40b411bSPeter Brune Input Parameters: 78f40b411bSPeter Brune . linesearch - The LineSearch instance. 79f40b411bSPeter Brune 80cd7522eaSPeter Brune Notes: 81cd7522eaSPeter Brune For most cases, this needn't be called outside of SNESLineSearchApply(). 82cd7522eaSPeter Brune The only current case where this is called outside of this is for the VI 8378bcb3b5SPeter Brune solvers, which modify the solution and work vectors before the first call 84cd7522eaSPeter Brune of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be 85cd7522eaSPeter Brune allocated upfront. 86cd7522eaSPeter Brune 8778bcb3b5SPeter Brune Level: advanced 88f40b411bSPeter Brune 89f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp 90f40b411bSPeter Brune 91f1c6b773SPeter Brune .seealso: SNESLineSearchReset() 92f40b411bSPeter Brune @*/ 93f40b411bSPeter Brune 94bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) 95bf388a1fSBarry Smith { 96bf7f4e0aSPeter Brune PetscErrorCode ierr; 97bf388a1fSBarry Smith 98bf7f4e0aSPeter Brune PetscFunctionBegin; 99bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 1001a4f838cSPeter Brune ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr); 101bf7f4e0aSPeter Brune } 102bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 1039bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 104bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 1059bd66eb0SPeter Brune } 1069bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 1079bd66eb0SPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr); 1089bd66eb0SPeter Brune } 109bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 110bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 111bf7f4e0aSPeter Brune } 112bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 113bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 114bf7f4e0aSPeter Brune } 115bf7f4e0aSPeter Brune PetscFunctionReturn(0); 116bf7f4e0aSPeter Brune } 117bf7f4e0aSPeter Brune 118bf7f4e0aSPeter Brune #undef __FUNCT__ 119f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchReset" 120f40b411bSPeter Brune 121f40b411bSPeter Brune /*@ 12278bcb3b5SPeter Brune SNESLineSearchReset - Undoes the SetUp and deletes any Vecs or Mats allocated by the line search. 123f40b411bSPeter Brune 124f1c6b773SPeter Brune Collective on SNESLineSearch 125f40b411bSPeter Brune 126f40b411bSPeter Brune Input Parameters: 127f40b411bSPeter Brune . linesearch - The LineSearch instance. 128f40b411bSPeter Brune 12978bcb3b5SPeter Brune Level: intermediate 130f40b411bSPeter Brune 131cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset 132f40b411bSPeter Brune 133f1c6b773SPeter Brune .seealso: SNESLineSearchSetUp() 134f40b411bSPeter Brune @*/ 135f40b411bSPeter Brune 136bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) 137bf388a1fSBarry Smith { 138bf7f4e0aSPeter Brune PetscErrorCode ierr; 139bf388a1fSBarry Smith 140bf7f4e0aSPeter Brune PetscFunctionBegin; 141bf7f4e0aSPeter Brune if (linesearch->ops->reset) { 142bf7f4e0aSPeter Brune (*linesearch->ops->reset)(linesearch); 143bf7f4e0aSPeter Brune } 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); 148bf7f4e0aSPeter Brune linesearch->nwork = 0; 149bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 150bf7f4e0aSPeter Brune PetscFunctionReturn(0); 151bf7f4e0aSPeter Brune } 152bf7f4e0aSPeter Brune 1536b2b7091SBarry Smith /*MC 1546b2b7091SBarry Smith SNESLineSearchPreCheckFunction - functional form passed to check before line search is called 1556b2b7091SBarry Smith 1566b2b7091SBarry Smith Synopsis: 1576b2b7091SBarry Smith #include "petscsnes.h" 1586b2b7091SBarry Smith SNESLineSearchPreCheckFunction(SNESLineSearch snes,Vec x,Vec y, PetscBool *changed); 1596b2b7091SBarry Smith 1606b2b7091SBarry Smith Input Parameters: 1616b2b7091SBarry Smith + x - solution vector 1626b2b7091SBarry Smith . y - search direction vector 1636b2b7091SBarry Smith - changed - flag to indicate the precheck changed x or y. 1646b2b7091SBarry Smith 1656b2b7091SBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 1666b2b7091SBarry Smith M*/ 1676b2b7091SBarry Smith 16886d74e61SPeter Brune #undef __FUNCT__ 169f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPreCheck" 17086d74e61SPeter Brune /*@C 171f1c6b773SPeter Brune SNESLineSearchSetPreCheck - Sets a pre-check function for the line search routine. 17286d74e61SPeter Brune 173f1c6b773SPeter Brune Logically Collective on SNESLineSearch 17486d74e61SPeter Brune 17586d74e61SPeter Brune Input Parameters: 176f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1776b2b7091SBarry Smith . SNESLineSearchPreCheckFunction - [optional] function evaluation routine 17886d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 17986d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 18086d74e61SPeter Brune 18186d74e61SPeter Brune 18286d74e61SPeter Brune Level: intermediate 18386d74e61SPeter Brune 18486d74e61SPeter Brune .keywords: set, linesearch, pre-check 18586d74e61SPeter Brune 186f1c6b773SPeter Brune .seealso: SNESLineSearchSetPostCheck() 18786d74e61SPeter Brune @*/ 1886b2b7091SBarry Smith PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx) 18986d74e61SPeter Brune { 1909bd66eb0SPeter Brune PetscFunctionBegin; 191f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1926b2b7091SBarry Smith if (SNESLineSearchPreCheckFunction) linesearch->ops->precheck = SNESLineSearchPreCheckFunction; 19386d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 19486d74e61SPeter Brune PetscFunctionReturn(0); 19586d74e61SPeter Brune } 19686d74e61SPeter Brune 19786d74e61SPeter Brune #undef __FUNCT__ 198f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPreCheck" 19986d74e61SPeter Brune /*@C 200cd7522eaSPeter Brune SNESLineSearchSetPreCheck - Gets the pre-check function for the line search routine. 20186d74e61SPeter Brune 20286d74e61SPeter Brune Input Parameters: 203f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 20486d74e61SPeter Brune 20586d74e61SPeter Brune Output Parameters: 20686d74e61SPeter Brune + func - [optional] function evaluation routine 20786d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 20886d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 20986d74e61SPeter Brune 21086d74e61SPeter Brune Level: intermediate 21186d74e61SPeter Brune 21286d74e61SPeter Brune .keywords: get, linesearch, pre-check 21386d74e61SPeter Brune 214f1c6b773SPeter Brune .seealso: SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck() 21586d74e61SPeter Brune @*/ 2166b2b7091SBarry Smith PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPreCheckFunction)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx) 21786d74e61SPeter Brune { 2189bd66eb0SPeter Brune PetscFunctionBegin; 219f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2206b2b7091SBarry Smith if (SNESLineSearchPreCheckFunction) *SNESLineSearchPreCheckFunction = linesearch->ops->precheck; 22186d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 22286d74e61SPeter Brune PetscFunctionReturn(0); 22386d74e61SPeter Brune } 22486d74e61SPeter Brune 2256b2b7091SBarry Smith /*MC 2266b2b7091SBarry Smith SNESLineSearchPostheckFunction - functional form that is called after line search is complete 2276b2b7091SBarry Smith 2286b2b7091SBarry Smith Synopsis: 2296b2b7091SBarry Smith #include "petscsnes.h" 2306b2b7091SBarry Smith SNESLineSearchPostheckFunction(SNESLineSearch linesearch,Vec x,Vec y, Vec w, *changed_y, PetscBool *changed_w); 2316b2b7091SBarry Smith 2326b2b7091SBarry Smith Input Parameters: 2336b2b7091SBarry Smith + x - old solution vector 2346b2b7091SBarry Smith . y - search direction vector 2356b2b7091SBarry Smith . w - new solution vector 2366b2b7091SBarry Smith . changed_y - indicates that the line search changed y 2376b2b7091SBarry Smith - changed_w - indicates that the line search changed w 2386b2b7091SBarry Smith 2396b2b7091SBarry Smith 2406b2b7091SBarry Smith .seealso: SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 2416b2b7091SBarry Smith M*/ 2426b2b7091SBarry Smith 24386d74e61SPeter Brune #undef __FUNCT__ 244f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetPostCheck" 24586d74e61SPeter Brune /*@C 246f1c6b773SPeter Brune SNESLineSearchSetPostCheck - Sets a post-check function for the line search routine. 24786d74e61SPeter Brune 248f1c6b773SPeter Brune Logically Collective on SNESLineSearch 24986d74e61SPeter Brune 25086d74e61SPeter Brune Input Parameters: 251f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 2526b2b7091SBarry Smith . SNESLineSearchPostCheckFunction - [optional] function evaluation routine 25386d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 25486d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 25586d74e61SPeter Brune 25686d74e61SPeter Brune Level: intermediate 25786d74e61SPeter Brune 25886d74e61SPeter Brune .keywords: set, linesearch, post-check 25986d74e61SPeter Brune 260f1c6b773SPeter Brune .seealso: SNESLineSearchSetPreCheck() 26186d74e61SPeter Brune @*/ 2626b2b7091SBarry Smith PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*),void *ctx) 26386d74e61SPeter Brune { 26486d74e61SPeter Brune PetscFunctionBegin; 265f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2666b2b7091SBarry Smith if (SNESLineSearchPostCheckFunction) linesearch->ops->postcheck = SNESLineSearchPostCheckFunction; 26786d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 26886d74e61SPeter Brune PetscFunctionReturn(0); 26986d74e61SPeter Brune } 27086d74e61SPeter Brune 27186d74e61SPeter Brune #undef __FUNCT__ 272f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetPostCheck" 27386d74e61SPeter Brune /*@C 274f1c6b773SPeter Brune SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine. 27586d74e61SPeter Brune 27686d74e61SPeter Brune Input Parameters: 277f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 27886d74e61SPeter Brune 27986d74e61SPeter Brune Output Parameters: 2806b2b7091SBarry Smith + SNESLineSearchPostCheckFunction - [optional] function evaluation routine 28186d74e61SPeter Brune - ctx - [optional] user-defined context for private data for the 28286d74e61SPeter Brune function evaluation routine (may be PETSC_NULL) 28386d74e61SPeter Brune 28486d74e61SPeter Brune Level: intermediate 28586d74e61SPeter Brune 28686d74e61SPeter Brune .keywords: get, linesearch, post-check 28786d74e61SPeter Brune 288f1c6b773SPeter Brune .seealso: SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck() 28986d74e61SPeter Brune @*/ 2906b2b7091SBarry Smith PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**SNESLineSearchPostCheckFunction)(SNESLineSearch,Vec,Vec,Vec,PetscBool *,PetscBool *,void*),void **ctx) 29186d74e61SPeter Brune { 2929bd66eb0SPeter Brune PetscFunctionBegin; 293f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 2946b2b7091SBarry Smith if (SNESLineSearchPostCheckFunction) *SNESLineSearchPostCheckFunction = linesearch->ops->postcheck; 29586d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 29686d74e61SPeter Brune PetscFunctionReturn(0); 29786d74e61SPeter Brune } 29886d74e61SPeter Brune 299bf7f4e0aSPeter Brune #undef __FUNCT__ 300f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheck" 301f40b411bSPeter Brune /*@ 302f1c6b773SPeter Brune SNESLineSearchPreCheck - Prepares the line search for being applied. 303f40b411bSPeter Brune 304cd7522eaSPeter Brune Logically Collective on SNESLineSearch 305f40b411bSPeter Brune 306f40b411bSPeter Brune Input Parameters: 3077b1df9c1SPeter Brune + linesearch - The linesearch instance. 3087b1df9c1SPeter Brune . X - The current solution 3097b1df9c1SPeter Brune - Y - The step direction 310f40b411bSPeter Brune 311f40b411bSPeter Brune Output Parameters: 3128e557f58SPeter Brune . changed - Indicator that the precheck routine has changed anything 313f40b411bSPeter Brune 314f40b411bSPeter Brune Level: Beginner 315f40b411bSPeter Brune 316f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 317f40b411bSPeter Brune 318f1c6b773SPeter Brune .seealso: SNESLineSearchPostCheck() 319f40b411bSPeter Brune @*/ 3207b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 321bf7f4e0aSPeter Brune { 322bf7f4e0aSPeter Brune PetscErrorCode ierr; 323bf7f4e0aSPeter Brune PetscFunctionBegin; 324bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 3256b2b7091SBarry Smith if (linesearch->ops->precheck) { 3266b2b7091SBarry Smith ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr); 32738bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed,4); 328bf7f4e0aSPeter Brune } 329bf7f4e0aSPeter Brune PetscFunctionReturn(0); 330bf7f4e0aSPeter Brune } 331bf7f4e0aSPeter Brune 332bf7f4e0aSPeter Brune #undef __FUNCT__ 333f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPostCheck" 334f40b411bSPeter Brune /*@ 335f1c6b773SPeter Brune SNESLineSearchPostCheck - Prepares the line search for being applied. 336f40b411bSPeter Brune 337cd7522eaSPeter Brune Logically Collective on SNESLineSearch 338f40b411bSPeter Brune 339f40b411bSPeter Brune Input Parameters: 3407b1df9c1SPeter Brune + linesearch - The linesearch context 3417b1df9c1SPeter Brune . X - The last solution 3427b1df9c1SPeter Brune . Y - The step direction 3437b1df9c1SPeter Brune - W - The updated solution, W = X + lambda*Y for some lambda 344f40b411bSPeter Brune 345f40b411bSPeter Brune Output Parameters: 34678bcb3b5SPeter Brune + changed_Y - Indicator if the direction Y has been changed. 34778bcb3b5SPeter Brune - changed_W - Indicator if the new candidate solution W has been changed. 348f40b411bSPeter Brune 349f40b411bSPeter Brune Level: Intermediate 350f40b411bSPeter Brune 351f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 352f40b411bSPeter Brune 353f1c6b773SPeter Brune .seealso: SNESLineSearchPreCheck() 354f40b411bSPeter Brune @*/ 3557b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W) 356bf7f4e0aSPeter Brune { 357bf7f4e0aSPeter Brune PetscErrorCode ierr; 358bf388a1fSBarry Smith 359bf7f4e0aSPeter Brune PetscFunctionBegin; 360bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 361bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 3626b2b7091SBarry Smith if (linesearch->ops->postcheck) { 3636b2b7091SBarry Smith ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr); 36438bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5); 36538bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_W,6); 36686d74e61SPeter Brune } 36786d74e61SPeter Brune PetscFunctionReturn(0); 36886d74e61SPeter Brune } 36986d74e61SPeter Brune 37086d74e61SPeter Brune #undef __FUNCT__ 371f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchPreCheckPicard" 37286d74e61SPeter Brune /*@C 37386d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 37486d74e61SPeter Brune 375cd7522eaSPeter Brune Logically Collective on SNESLineSearch 37686d74e61SPeter Brune 37786d74e61SPeter Brune Input Arguments: 37886d74e61SPeter Brune + linesearch - linesearch context 37986d74e61SPeter Brune . X - base state for this step 38086d74e61SPeter Brune . Y - initial correction 38186d74e61SPeter Brune 38286d74e61SPeter Brune Output Arguments: 38386d74e61SPeter Brune + Y - correction, possibly modified 38486d74e61SPeter Brune - changed - flag indicating that Y was modified 38586d74e61SPeter Brune 38686d74e61SPeter Brune Options Database Key: 387cd7522eaSPeter Brune + -snes_linesearch_precheck_picard - activate this routine 388cd7522eaSPeter Brune - -snes_linesearch_precheck_picard_angle - angle 38986d74e61SPeter Brune 39086d74e61SPeter Brune Level: advanced 39186d74e61SPeter Brune 39286d74e61SPeter Brune Notes: 39386d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 39486d74e61SPeter Brune 39586d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 39686d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 39786d74e61SPeter Brune is generally not useful when using a Newton linearization. 39886d74e61SPeter Brune 39986d74e61SPeter Brune Reference: 40086d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 40186d74e61SPeter Brune 40286d74e61SPeter Brune .seealso: SNESLineSearchSetPreCheck() 40386d74e61SPeter Brune @*/ 404f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx) 40586d74e61SPeter Brune { 40686d74e61SPeter Brune PetscErrorCode ierr; 40786d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 40886d74e61SPeter Brune Vec Ylast; 40986d74e61SPeter Brune PetscScalar dot; 41086d74e61SPeter Brune PetscInt iter; 41186d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 41286d74e61SPeter Brune SNES snes; 41386d74e61SPeter Brune 41486d74e61SPeter Brune PetscFunctionBegin; 415f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 41686d74e61SPeter Brune ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr); 41786d74e61SPeter Brune if (!Ylast) { 41886d74e61SPeter Brune ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr); 41986d74e61SPeter Brune ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr); 42086d74e61SPeter Brune ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr); 42186d74e61SPeter Brune } 42286d74e61SPeter Brune ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr); 42386d74e61SPeter Brune if (iter < 2) { 42486d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 42586d74e61SPeter Brune *changed = PETSC_FALSE; 42686d74e61SPeter Brune PetscFunctionReturn(0); 42786d74e61SPeter Brune } 42886d74e61SPeter Brune 42986d74e61SPeter Brune ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr); 43086d74e61SPeter Brune ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr); 43186d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr); 43286d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 43386d74e61SPeter Brune theta = acos((double)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 43486d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 43586d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 43686d74e61SPeter Brune /* Modify the step Y */ 43786d74e61SPeter Brune PetscReal alpha,ydiffnorm; 43886d74e61SPeter Brune ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr); 43986d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr); 44086d74e61SPeter Brune alpha = ylastnorm / ydiffnorm; 44186d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 44286d74e61SPeter Brune ierr = VecScale(Y,alpha);CHKERRQ(ierr); 443c69d1a72SBarry 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); 44486d74e61SPeter Brune } else { 445c69d1a72SBarry 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); 44686d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 44786d74e61SPeter Brune *changed = PETSC_FALSE; 448bf7f4e0aSPeter Brune } 449bf7f4e0aSPeter Brune PetscFunctionReturn(0); 450bf7f4e0aSPeter Brune } 451bf7f4e0aSPeter Brune 452bf7f4e0aSPeter Brune #undef __FUNCT__ 453f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchApply" 454f40b411bSPeter Brune /*@ 455cd7522eaSPeter Brune SNESLineSearchApply - Computes the line-search update. 456f40b411bSPeter Brune 457f1c6b773SPeter Brune Collective on SNESLineSearch 458f40b411bSPeter Brune 459f40b411bSPeter Brune Input Parameters: 4608e557f58SPeter Brune + linesearch - The linesearch context 4618e557f58SPeter Brune . X - The current solution 4628e557f58SPeter Brune . F - The current function 4638e557f58SPeter Brune . fnorm - The current norm 4648e557f58SPeter Brune - Y - The search direction 465f40b411bSPeter Brune 466f40b411bSPeter Brune Output Parameters: 4678e557f58SPeter Brune + X - The new solution 4688e557f58SPeter Brune . F - The new function 4698e557f58SPeter Brune - fnorm - The new function norm 470f40b411bSPeter Brune 471cd7522eaSPeter Brune Options Database Keys: 4723c7d6663SPeter Brune + -snes_linesearch_type - basic, bt, l2, cp, shell 473cd7522eaSPeter Brune . -snes_linesearch_monitor - Print progress of line searches 4743c7d6663SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 475cd7522eaSPeter Brune . -snes_linesearch_norms - Turn on/off the linesearch norms 4763c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess 4773c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches 478cd7522eaSPeter Brune 479cd7522eaSPeter Brune Notes: 480cd7522eaSPeter Brune This is typically called from within a SNESSolve() implementation in order to 481cd7522eaSPeter Brune help with convergence of the nonlinear method. Various SNES types use line searches 482cd7522eaSPeter Brune in different ways, but the overarching theme is that a line search is used to determine 483cd7522eaSPeter Brune an optimal damping parameter of a step at each iteration of the method. Each 484cd7522eaSPeter Brune application of the line search may invoke SNESComputeFunction several times, and 485cd7522eaSPeter Brune therefore may be fairly expensive. 486cd7522eaSPeter Brune 487f40b411bSPeter Brune Level: Intermediate 488f40b411bSPeter Brune 489f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 490f40b411bSPeter Brune 491cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction() 492f40b411bSPeter Brune @*/ 493bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) 494bf388a1fSBarry Smith { 495bf7f4e0aSPeter Brune PetscErrorCode ierr; 496bf7f4e0aSPeter Brune 497bf388a1fSBarry Smith PetscFunctionBegin; 498f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 499bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 500bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 501bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 502bf7f4e0aSPeter Brune 503bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 504bf7f4e0aSPeter Brune 505bf7f4e0aSPeter Brune linesearch->vec_sol = X; 506bf7f4e0aSPeter Brune linesearch->vec_update = Y; 507bf7f4e0aSPeter Brune linesearch->vec_func = F; 508bf7f4e0aSPeter Brune 509f1c6b773SPeter Brune ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr); 510bf7f4e0aSPeter Brune 511bf7f4e0aSPeter Brune if (!linesearch->keeplambda) 512bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 513bf7f4e0aSPeter Brune 514bf7f4e0aSPeter Brune if (fnorm) { 515bf7f4e0aSPeter Brune linesearch->fnorm = *fnorm; 516bf7f4e0aSPeter Brune } else { 517bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 518bf7f4e0aSPeter Brune } 519bf7f4e0aSPeter Brune 520f1c6b773SPeter Brune ierr = PetscLogEventBegin(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 521bf7f4e0aSPeter Brune 522bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 523bf7f4e0aSPeter Brune 524f1c6b773SPeter Brune ierr = PetscLogEventEnd(SNESLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 525bf7f4e0aSPeter Brune 526bf7f4e0aSPeter Brune if (fnorm) 527bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 528bf7f4e0aSPeter Brune PetscFunctionReturn(0); 529bf7f4e0aSPeter Brune } 530bf7f4e0aSPeter Brune 531bf7f4e0aSPeter Brune #undef __FUNCT__ 532f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchDestroy" 533f40b411bSPeter Brune /*@ 534f1c6b773SPeter Brune SNESLineSearchDestroy - Destroys the line search instance. 535f40b411bSPeter Brune 536f1c6b773SPeter Brune Collective on SNESLineSearch 537f40b411bSPeter Brune 538f40b411bSPeter Brune Input Parameters: 5398e557f58SPeter Brune . linesearch - The linesearch context 540f40b411bSPeter Brune 541f40b411bSPeter Brune Level: Intermediate 542f40b411bSPeter Brune 54378bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy 544f40b411bSPeter Brune 545cd7522eaSPeter Brune .seealso: SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy() 546f40b411bSPeter Brune @*/ 547bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) 548bf388a1fSBarry Smith { 549bf7f4e0aSPeter Brune PetscErrorCode ierr; 550bf388a1fSBarry Smith 551bf7f4e0aSPeter Brune PetscFunctionBegin; 552bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 553f1c6b773SPeter Brune PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1); 554bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 555bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 55622d28d08SBarry Smith ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr); 557bf7f4e0aSPeter Brune if ((*linesearch)->ops->destroy) { 558bf7f4e0aSPeter Brune (*linesearch)->ops->destroy(*linesearch); 559bf7f4e0aSPeter Brune } 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) { 590bf7f4e0aSPeter Brune ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"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; 668f1c6b773SPeter Brune if (!SNESLineSearchRegisterAllCalled) {ierr = SNESLineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 669bf7f4e0aSPeter Brune 670bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 671bf7f4e0aSPeter Brune if (((PetscObject)linesearch)->type_name) { 672bf7f4e0aSPeter Brune deft = ((PetscObject)linesearch)->type_name; 673bf7f4e0aSPeter Brune } 6743c7d6663SPeter Brune ierr = PetscOptionsList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 675bf7f4e0aSPeter Brune if (flg) { 676f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr); 677bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 678f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 679bf7f4e0aSPeter Brune } 680bf7f4e0aSPeter Brune 6817a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_monitor","Print progress of line searches","SNESSNESLineSearchSetMonitor", 682bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 683f1c6b773SPeter Brune if (set) {ierr = SNESLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 684bf7f4e0aSPeter Brune 6851a9b3a06SPeter Brune /* tolerances */ 68671eef1aeSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,0);CHKERRQ(ierr); 6871a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,0);CHKERRQ(ierr); 6881a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr); 6891a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,0);CHKERRQ(ierr); 6901a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,0);CHKERRQ(ierr); 6918e557f58SPeter Brune ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 6927a35526eSPeter Brune 6931a9b3a06SPeter Brune /* damping parameters */ 6941a9b3a06SPeter Brune ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 6951a9b3a06SPeter Brune 6961a9b3a06SPeter Brune ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 6971a9b3a06SPeter Brune 6981a9b3a06SPeter Brune /* precheck */ 6997a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr); 7007a35526eSPeter Brune if (set) { 7017a35526eSPeter Brune if (flg) { 7027a35526eSPeter Brune linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */ 7037a35526eSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction", 7047a35526eSPeter Brune "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,PETSC_NULL);CHKERRQ(ierr); 7057a35526eSPeter Brune ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr); 7067a35526eSPeter Brune } else { 7077a35526eSPeter Brune ierr = SNESLineSearchSetPreCheck(linesearch,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 7087a35526eSPeter Brune } 7097a35526eSPeter Brune } 710b000cd8dSPeter Brune ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,0);CHKERRQ(ierr); 7111a9b3a06SPeter Brune ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 7127a35526eSPeter Brune 7135a9b6599SPeter Brune if (linesearch->ops->setfromoptions) { 7145a9b6599SPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 7155a9b6599SPeter Brune } 7165a9b6599SPeter Brune 717bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 718bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 719bf7f4e0aSPeter Brune PetscFunctionReturn(0); 720bf7f4e0aSPeter Brune } 721bf7f4e0aSPeter Brune 722bf7f4e0aSPeter Brune #undef __FUNCT__ 723f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchView" 724f40b411bSPeter Brune /*@ 725cd7522eaSPeter Brune SNESLineSearchView - Prints useful information about the line search not 726cd7522eaSPeter Brune related to an individual call. 727f40b411bSPeter Brune 728f40b411bSPeter Brune Input Parameters: 7298e557f58SPeter Brune . linesearch - linesearch context 730f40b411bSPeter Brune 731f1c6b773SPeter Brune Logically Collective on SNESLineSearch 732f40b411bSPeter Brune 733f40b411bSPeter Brune Level: intermediate 734f40b411bSPeter Brune 735f1c6b773SPeter Brune .seealso: SNESLineSearchCreate() 736f40b411bSPeter Brune @*/ 737bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer) 738bf388a1fSBarry Smith { 7397f1410a3SPeter Brune PetscErrorCode ierr; 7407f1410a3SPeter Brune PetscBool iascii; 741bf388a1fSBarry Smith 742bf7f4e0aSPeter Brune PetscFunctionBegin; 7437f1410a3SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 7447f1410a3SPeter Brune if (!viewer) { 7457f1410a3SPeter Brune ierr = PetscViewerASCIIGetStdout(((PetscObject)linesearch)->comm,&viewer);CHKERRQ(ierr); 7467f1410a3SPeter Brune } 7477f1410a3SPeter Brune PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 7487f1410a3SPeter Brune PetscCheckSameComm(linesearch,1,viewer,2); 749f40b411bSPeter Brune 750251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 7517f1410a3SPeter Brune if (iascii) { 7527f1410a3SPeter Brune ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer,"SNESLineSearch Object");CHKERRQ(ierr); 7537f1410a3SPeter Brune if (linesearch->ops->view) { 7547f1410a3SPeter Brune ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 7557f1410a3SPeter Brune ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr); 7567f1410a3SPeter Brune ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 7577f1410a3SPeter Brune } 758c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr); 759c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr); 7607f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr); 7616b2b7091SBarry Smith if (linesearch->ops->precheck) { 7626b2b7091SBarry Smith if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) { 7637f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr); 7647f1410a3SPeter Brune } else { 7657f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr); 7667f1410a3SPeter Brune } 7677f1410a3SPeter Brune } 7686b2b7091SBarry Smith if (linesearch->ops->postcheck) { 7697f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr); 7707f1410a3SPeter Brune } 7717f1410a3SPeter Brune } 772bf7f4e0aSPeter Brune PetscFunctionReturn(0); 773bf7f4e0aSPeter Brune } 774bf7f4e0aSPeter Brune 775bf7f4e0aSPeter Brune #undef __FUNCT__ 776f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetType" 777ea5d4fccSPeter Brune /*@C 778f1c6b773SPeter Brune SNESLineSearchSetType - Sets the linesearch type 779f40b411bSPeter Brune 780f40b411bSPeter Brune Input Parameters: 7818e557f58SPeter Brune + linesearch - linesearch context 782f40b411bSPeter Brune - type - The type of line search to be used 783f40b411bSPeter Brune 784cd7522eaSPeter Brune Available Types: 785cd7522eaSPeter Brune + basic - Simple damping line search. 7868e557f58SPeter Brune . bt - Backtracking line search over the L2 norm of the function 7878e557f58SPeter Brune . l2 - Secant line search over the L2 norm of the function 7888e557f58SPeter Brune . cp - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x) 7898e557f58SPeter Brune - shell - User provided SNESLineSearch implementation 790cd7522eaSPeter Brune 791f1c6b773SPeter Brune Logically Collective on SNESLineSearch 792f40b411bSPeter Brune 793f40b411bSPeter Brune Level: intermediate 794f40b411bSPeter Brune 795f40b411bSPeter Brune 796f1c6b773SPeter Brune .seealso: SNESLineSearchCreate() 797f40b411bSPeter Brune @*/ 79819fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type) 799bf7f4e0aSPeter Brune { 800f1c6b773SPeter Brune PetscErrorCode ierr,(*r)(SNESLineSearch); 801bf7f4e0aSPeter Brune PetscBool match; 802bf7f4e0aSPeter Brune 803bf7f4e0aSPeter Brune PetscFunctionBegin; 804f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 805bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 806bf7f4e0aSPeter Brune 807251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 808bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 809bf7f4e0aSPeter Brune 810140e18c1SBarry Smith ierr = PetscFunctionListFind(((PetscObject)linesearch)->comm,SNESLineSearchList,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 811bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 812bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 813bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 814bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 815bf7f4e0aSPeter Brune linesearch->ops->destroy = PETSC_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 #if defined(PETSC_HAVE_AMS) 826bf7f4e0aSPeter Brune if (PetscAMSPublishAll) { 827bf7f4e0aSPeter Brune ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr); 828bf7f4e0aSPeter Brune } 829bf7f4e0aSPeter Brune #endif 830bf7f4e0aSPeter Brune PetscFunctionReturn(0); 831bf7f4e0aSPeter Brune } 832bf7f4e0aSPeter Brune 833bf7f4e0aSPeter Brune #undef __FUNCT__ 834f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSNES" 835f40b411bSPeter Brune /*@ 83678bcb3b5SPeter Brune SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation. 837f40b411bSPeter Brune 838f40b411bSPeter Brune Input Parameters: 8398e557f58SPeter Brune + linesearch - linesearch context 840f40b411bSPeter Brune - snes - The snes instance 841f40b411bSPeter Brune 84278bcb3b5SPeter Brune Level: developer 84378bcb3b5SPeter Brune 84478bcb3b5SPeter Brune Notes: 84578bcb3b5SPeter Brune This happens automatically when the line search is gotten/created with 84678bcb3b5SPeter Brune SNESGetSNESLineSearch(). This routine is therefore mainly called within SNES 84778bcb3b5SPeter Brune implementations. 848f40b411bSPeter Brune 8498141a3b9SPeter Brune Level: developer 850f40b411bSPeter Brune 851cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 852f40b411bSPeter Brune @*/ 853bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes) 854bf388a1fSBarry Smith { 855bf7f4e0aSPeter Brune PetscFunctionBegin; 856f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 857bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 858bf7f4e0aSPeter Brune linesearch->snes = snes; 859bf7f4e0aSPeter Brune PetscFunctionReturn(0); 860bf7f4e0aSPeter Brune } 861bf7f4e0aSPeter Brune 862bf7f4e0aSPeter Brune #undef __FUNCT__ 863f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSNES" 864f40b411bSPeter Brune /*@ 8658141a3b9SPeter Brune SNESLineSearchGetSNES - Gets the SNES instance associated with the line search. 8668141a3b9SPeter Brune Having an associated SNES is necessary because most line search implementations must be able to 8678141a3b9SPeter Brune evaluate the function using SNESComputeFunction() for the associated SNES. This routine 8688141a3b9SPeter Brune is used in the line search implementations when one must get this associated SNES instance. 869f40b411bSPeter Brune 870f40b411bSPeter Brune Input Parameters: 8718e557f58SPeter Brune . linesearch - linesearch context 872f40b411bSPeter Brune 873f40b411bSPeter Brune Output Parameters: 874f40b411bSPeter Brune . snes - The snes instance 875f40b411bSPeter Brune 8768141a3b9SPeter Brune Level: developer 877f40b411bSPeter Brune 878cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 879f40b411bSPeter Brune @*/ 880bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes) 881bf388a1fSBarry Smith { 882bf7f4e0aSPeter Brune PetscFunctionBegin; 883f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 8846a388c36SPeter Brune PetscValidPointer(snes, 2); 885bf7f4e0aSPeter Brune *snes = linesearch->snes; 886bf7f4e0aSPeter Brune PetscFunctionReturn(0); 887bf7f4e0aSPeter Brune } 888bf7f4e0aSPeter Brune 8896a388c36SPeter Brune #undef __FUNCT__ 890f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetLambda" 891f40b411bSPeter Brune /*@ 892f1c6b773SPeter Brune SNESLineSearchGetLambda - Gets the last linesearch steplength discovered. 893f40b411bSPeter Brune 894f40b411bSPeter Brune Input Parameters: 8958e557f58SPeter Brune . linesearch - linesearch context 896f40b411bSPeter Brune 897f40b411bSPeter Brune Output Parameters: 898cd7522eaSPeter Brune . lambda - The last steplength computed during SNESLineSearchApply() 899f40b411bSPeter Brune 90078bcb3b5SPeter Brune Level: advanced 90178bcb3b5SPeter Brune 9028e557f58SPeter Brune Notes: 9038e557f58SPeter Brune This is useful in methods where the solver is ill-scaled and 90478bcb3b5SPeter Brune requires some adaptive notion of the difference in scale between the 90578bcb3b5SPeter Brune solution and the function. For instance, SNESQN may be scaled by the 90678bcb3b5SPeter Brune line search lambda using the argument -snes_qn_scaling ls. 90778bcb3b5SPeter Brune 908f40b411bSPeter Brune 909cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply() 910f40b411bSPeter Brune @*/ 911f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda) 9126a388c36SPeter Brune { 9136a388c36SPeter Brune PetscFunctionBegin; 914f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9156a388c36SPeter Brune PetscValidPointer(lambda, 2); 9166a388c36SPeter Brune *lambda = linesearch->lambda; 9176a388c36SPeter Brune PetscFunctionReturn(0); 9186a388c36SPeter Brune } 9196a388c36SPeter Brune 9206a388c36SPeter Brune #undef __FUNCT__ 921f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetLambda" 922f40b411bSPeter Brune /*@ 923f1c6b773SPeter Brune SNESLineSearchSetLambda - Sets the linesearch steplength. 924f40b411bSPeter Brune 925f40b411bSPeter Brune Input Parameters: 9268e557f58SPeter Brune + linesearch - linesearch context 927f40b411bSPeter Brune - lambda - The last steplength. 928f40b411bSPeter Brune 929cd7522eaSPeter Brune Notes: 930cd7522eaSPeter Brune This routine is typically used within implementations of SNESLineSearchApply 931cd7522eaSPeter Brune to set the final steplength. This routine (and SNESLineSearchGetLambda()) were 932cd7522eaSPeter Brune added in order to facilitate Quasi-Newton methods that use the previous steplength 933cd7522eaSPeter Brune as an inner scaling parameter. 934cd7522eaSPeter Brune 93578bcb3b5SPeter Brune Level: advanced 936f40b411bSPeter Brune 937f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda() 938f40b411bSPeter Brune @*/ 939f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda) 9406a388c36SPeter Brune { 9416a388c36SPeter Brune PetscFunctionBegin; 942f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9436a388c36SPeter Brune linesearch->lambda = lambda; 9446a388c36SPeter Brune PetscFunctionReturn(0); 9456a388c36SPeter Brune } 9466a388c36SPeter Brune 9476a388c36SPeter Brune #undef __FUNCT__ 948f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetTolerances" 949f40b411bSPeter Brune /*@ 9503c7d6663SPeter Brune SNESLineSearchGetTolerances - Gets the tolerances for the linesearch. These include 95178bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 95278bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 95378bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 954f40b411bSPeter Brune 955f40b411bSPeter Brune Input Parameters: 9568e557f58SPeter Brune . linesearch - linesearch context 957f40b411bSPeter Brune 958f40b411bSPeter Brune Output Parameters: 959516fe3c3SPeter Brune + steptol - The minimum steplength 9606cc8e53bSPeter Brune . maxstep - The maximum steplength 961516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 962516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 963516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 964516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 965f40b411bSPeter Brune 96678bcb3b5SPeter Brune Level: intermediate 96778bcb3b5SPeter Brune 96878bcb3b5SPeter Brune Notes: 96978bcb3b5SPeter Brune Different line searches may implement these parameters slightly differently as 9703c7d6663SPeter Brune the type requires. 971516fe3c3SPeter Brune 972f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances() 973f40b411bSPeter Brune @*/ 974f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 9756a388c36SPeter Brune { 9766a388c36SPeter Brune PetscFunctionBegin; 977f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 978516fe3c3SPeter Brune if (steptol) { 9796a388c36SPeter Brune PetscValidPointer(steptol, 2); 9806a388c36SPeter Brune *steptol = linesearch->steptol; 981516fe3c3SPeter Brune } 982516fe3c3SPeter Brune if (maxstep) { 983516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 984516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 985516fe3c3SPeter Brune } 986516fe3c3SPeter Brune if (rtol) { 987516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 988516fe3c3SPeter Brune *rtol = linesearch->rtol; 989516fe3c3SPeter Brune } 990516fe3c3SPeter Brune if (atol) { 991516fe3c3SPeter Brune PetscValidPointer(atol, 5); 992516fe3c3SPeter Brune *atol = linesearch->atol; 993516fe3c3SPeter Brune } 994516fe3c3SPeter Brune if (ltol) { 995516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 996516fe3c3SPeter Brune *ltol = linesearch->ltol; 997516fe3c3SPeter Brune } 998516fe3c3SPeter Brune if (max_its) { 999516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 1000516fe3c3SPeter Brune *max_its = linesearch->max_its; 1001516fe3c3SPeter Brune } 10026a388c36SPeter Brune PetscFunctionReturn(0); 10036a388c36SPeter Brune } 10046a388c36SPeter Brune 10056a388c36SPeter Brune #undef __FUNCT__ 1006f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetTolerances" 1007f40b411bSPeter Brune /*@ 10083c7d6663SPeter Brune SNESLineSearchSetTolerances - Gets the tolerances for the linesearch. These include 100978bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 101078bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 101178bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1012f40b411bSPeter Brune 1013f40b411bSPeter Brune Input Parameters: 10148e557f58SPeter Brune + linesearch - linesearch context 1015516fe3c3SPeter Brune . steptol - The minimum steplength 10166cc8e53bSPeter Brune . maxstep - The maximum steplength 1017516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1018516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1019516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1020516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1021f40b411bSPeter Brune 102278bcb3b5SPeter Brune Notes: 10233c7d6663SPeter Brune The user may choose to not set any of the tolerances using PETSC_DEFAULT in 102478bcb3b5SPeter Brune place of an argument. 1025f40b411bSPeter Brune 102678bcb3b5SPeter Brune Level: intermediate 1027516fe3c3SPeter Brune 1028f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances() 1029f40b411bSPeter Brune @*/ 1030f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 10316a388c36SPeter Brune { 10326a388c36SPeter Brune PetscFunctionBegin; 1033f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1034d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,steptol,2); 1035d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,maxstep,3); 1036d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,rtol,4); 1037d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,atol,5); 1038d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,ltol,6); 1039d3952184SSatish Balay PetscValidLogicalCollectiveInt(linesearch,max_its,7); 1040d3952184SSatish Balay 1041d3952184SSatish Balay if (steptol!= PETSC_DEFAULT) { 1042c69d1a72SBarry Smith if (steptol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol); 10436a388c36SPeter Brune linesearch->steptol = steptol; 1044d3952184SSatish Balay } 1045d3952184SSatish Balay 1046d3952184SSatish Balay if (maxstep!= PETSC_DEFAULT) { 1047c69d1a72SBarry Smith if (maxstep < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep); 1048516fe3c3SPeter Brune linesearch->maxstep = maxstep; 1049d3952184SSatish Balay } 1050d3952184SSatish Balay 1051d3952184SSatish Balay if (rtol != PETSC_DEFAULT) { 1052c69d1a72SBarry Smith if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol); 1053516fe3c3SPeter Brune linesearch->rtol = rtol; 1054d3952184SSatish Balay } 1055d3952184SSatish Balay 1056d3952184SSatish Balay if (atol != PETSC_DEFAULT) { 1057c69d1a72SBarry Smith if (atol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol); 1058516fe3c3SPeter Brune linesearch->atol = atol; 1059d3952184SSatish Balay } 1060d3952184SSatish Balay 1061d3952184SSatish Balay if (ltol != PETSC_DEFAULT) { 1062c69d1a72SBarry Smith if (ltol < 0.0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol); 1063516fe3c3SPeter Brune linesearch->ltol = ltol; 1064d3952184SSatish Balay } 1065d3952184SSatish Balay 1066d3952184SSatish Balay if (max_its != PETSC_DEFAULT) { 1067d3952184SSatish Balay if (max_its < 0) SETERRQ1(((PetscObject)linesearch)->comm,PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its); 1068516fe3c3SPeter Brune linesearch->max_its = max_its; 1069d3952184SSatish Balay } 1070d3952184SSatish Balay 10716a388c36SPeter Brune PetscFunctionReturn(0); 10726a388c36SPeter Brune } 10736a388c36SPeter Brune 10746a388c36SPeter Brune #undef __FUNCT__ 1075f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetDamping" 1076f40b411bSPeter Brune /*@ 1077f1c6b773SPeter Brune SNESLineSearchGetDamping - Gets the line search damping parameter. 1078f40b411bSPeter Brune 1079f40b411bSPeter Brune Input Parameters: 10808e557f58SPeter Brune . linesearch - linesearch context 1081f40b411bSPeter Brune 1082f40b411bSPeter Brune Output Parameters: 10838e557f58SPeter Brune . damping - The damping parameter 1084f40b411bSPeter Brune 108578bcb3b5SPeter Brune Level: advanced 1086f40b411bSPeter Brune 108778bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN 1088f40b411bSPeter Brune @*/ 1089f40b411bSPeter Brune 1090f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping) 10916a388c36SPeter Brune { 10926a388c36SPeter Brune PetscFunctionBegin; 1093f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10946a388c36SPeter Brune PetscValidPointer(damping, 2); 10956a388c36SPeter Brune *damping = linesearch->damping; 10966a388c36SPeter Brune PetscFunctionReturn(0); 10976a388c36SPeter Brune } 10986a388c36SPeter Brune 10996a388c36SPeter Brune #undef __FUNCT__ 1100f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetDamping" 1101f40b411bSPeter Brune /*@ 1102f1c6b773SPeter Brune SNESLineSearchSetDamping - Sets the line search damping paramter. 1103f40b411bSPeter Brune 1104f40b411bSPeter Brune Input Parameters: 110578bcb3b5SPeter Brune . linesearch - linesearch context 110678bcb3b5SPeter Brune . damping - The damping parameter 1107f40b411bSPeter Brune 1108f40b411bSPeter Brune Level: intermediate 1109f40b411bSPeter Brune 1110cd7522eaSPeter Brune Notes: 1111cd7522eaSPeter Brune The basic line search merely takes the update step scaled by the damping parameter. 1112cd7522eaSPeter Brune The use of the damping parameter in the l2 and cp line searches is much more subtle; 111378bcb3b5SPeter Brune it is used as a starting point in calculating the secant step. However, the eventual 1114cd7522eaSPeter Brune step may be of greater length than the damping parameter. In the bt line search it is 1115cd7522eaSPeter Brune used as the maximum possible step length, as the bt line search only backtracks. 1116cd7522eaSPeter Brune 1117f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping() 1118f40b411bSPeter Brune @*/ 1119f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping) 11206a388c36SPeter Brune { 11216a388c36SPeter Brune PetscFunctionBegin; 1122f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 11236a388c36SPeter Brune linesearch->damping = damping; 11246a388c36SPeter Brune PetscFunctionReturn(0); 11256a388c36SPeter Brune } 11266a388c36SPeter Brune 11276a388c36SPeter Brune #undef __FUNCT__ 112859405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchGetOrder" 112959405d5eSPeter Brune /*@ 113059405d5eSPeter Brune SNESLineSearchGetOrder - Gets the line search approximation order. 113159405d5eSPeter Brune 113259405d5eSPeter Brune Input Parameters: 113378bcb3b5SPeter Brune . linesearch - linesearch context 113459405d5eSPeter Brune 113559405d5eSPeter Brune Output Parameters: 11368e557f58SPeter Brune . order - The order 113759405d5eSPeter Brune 113878bcb3b5SPeter Brune Possible Values for order: 11393c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11403c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11413c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 114278bcb3b5SPeter Brune 114359405d5eSPeter Brune Level: intermediate 114459405d5eSPeter Brune 114559405d5eSPeter Brune .seealso: SNESLineSearchSetOrder() 114659405d5eSPeter Brune @*/ 114759405d5eSPeter Brune 1148b000cd8dSPeter Brune PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order) 114959405d5eSPeter Brune { 115059405d5eSPeter Brune PetscFunctionBegin; 115159405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 115259405d5eSPeter Brune PetscValidPointer(order, 2); 115359405d5eSPeter Brune *order = linesearch->order; 115459405d5eSPeter Brune PetscFunctionReturn(0); 115559405d5eSPeter Brune } 115659405d5eSPeter Brune 115759405d5eSPeter Brune #undef __FUNCT__ 115859405d5eSPeter Brune #define __FUNCT__ "SNESLineSearchSetOrder" 115959405d5eSPeter Brune /*@ 116059405d5eSPeter Brune SNESLineSearchSetOrder - Sets the line search damping paramter. 116159405d5eSPeter Brune 116259405d5eSPeter Brune Input Parameters: 116378bcb3b5SPeter Brune . linesearch - linesearch context 116478bcb3b5SPeter Brune . order - The damping parameter 116559405d5eSPeter Brune 116659405d5eSPeter Brune Level: intermediate 116759405d5eSPeter Brune 116878bcb3b5SPeter Brune Possible Values for order: 11693c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 11703c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 11713c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 117278bcb3b5SPeter Brune 117359405d5eSPeter Brune Notes: 117459405d5eSPeter Brune Variable orders are supported by the following line searches: 117578bcb3b5SPeter Brune + bt - cubic and quadratic 117678bcb3b5SPeter Brune - cp - linear and quadratic 117759405d5eSPeter Brune 117859405d5eSPeter Brune .seealso: SNESLineSearchGetOrder() 117959405d5eSPeter Brune @*/ 1180b000cd8dSPeter Brune PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order) 118159405d5eSPeter Brune { 118259405d5eSPeter Brune PetscFunctionBegin; 118359405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 118459405d5eSPeter Brune linesearch->order = order; 118559405d5eSPeter Brune PetscFunctionReturn(0); 118659405d5eSPeter Brune } 118759405d5eSPeter Brune 118859405d5eSPeter Brune #undef __FUNCT__ 1189f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetNorms" 1190f40b411bSPeter Brune /*@ 1191f1c6b773SPeter Brune SNESLineSearchGetNorms - Gets the norms for for X, Y, and F. 1192f40b411bSPeter Brune 1193f40b411bSPeter Brune Input Parameters: 119478bcb3b5SPeter Brune . linesearch - linesearch context 1195f40b411bSPeter Brune 1196f40b411bSPeter Brune Output Parameters: 1197f40b411bSPeter Brune + xnorm - The norm of the current solution 1198f40b411bSPeter Brune . fnorm - The norm of the current function 1199f40b411bSPeter Brune - ynorm - The norm of the current update 1200f40b411bSPeter Brune 1201cd7522eaSPeter Brune Notes: 1202cd7522eaSPeter Brune This function is mainly called from SNES implementations. 1203cd7522eaSPeter Brune 120478bcb3b5SPeter Brune Level: developer 1205f40b411bSPeter Brune 1206f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs() 1207f40b411bSPeter Brune @*/ 1208f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 1209bf7f4e0aSPeter Brune { 1210bf7f4e0aSPeter Brune PetscFunctionBegin; 1211f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1212bf7f4e0aSPeter Brune if (xnorm) { 1213bf7f4e0aSPeter Brune *xnorm = linesearch->xnorm; 1214bf7f4e0aSPeter Brune } 1215bf7f4e0aSPeter Brune if (fnorm) { 1216bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 1217bf7f4e0aSPeter Brune } 1218bf7f4e0aSPeter Brune if (ynorm) { 1219bf7f4e0aSPeter Brune *ynorm = linesearch->ynorm; 1220bf7f4e0aSPeter Brune } 1221bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1222bf7f4e0aSPeter Brune } 1223bf7f4e0aSPeter Brune 1224e7058c64SPeter Brune #undef __FUNCT__ 1225f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetNorms" 1226f40b411bSPeter Brune /*@ 1227f1c6b773SPeter Brune SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 1228f40b411bSPeter Brune 1229f40b411bSPeter Brune Input Parameters: 123078bcb3b5SPeter Brune + linesearch - linesearch context 1231f40b411bSPeter Brune . xnorm - The norm of the current solution 1232f40b411bSPeter Brune . fnorm - The norm of the current function 1233f40b411bSPeter Brune - ynorm - The norm of the current update 1234f40b411bSPeter Brune 123578bcb3b5SPeter Brune Level: advanced 1236f40b411bSPeter Brune 1237f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1238f40b411bSPeter Brune @*/ 1239f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 12406a388c36SPeter Brune { 12416a388c36SPeter Brune PetscFunctionBegin; 1242f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12436a388c36SPeter Brune linesearch->xnorm = xnorm; 12446a388c36SPeter Brune linesearch->fnorm = fnorm; 12456a388c36SPeter Brune linesearch->ynorm = ynorm; 12466a388c36SPeter Brune PetscFunctionReturn(0); 12476a388c36SPeter Brune } 12486a388c36SPeter Brune 12496a388c36SPeter Brune #undef __FUNCT__ 1250f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchComputeNorms" 1251f40b411bSPeter Brune /*@ 1252f1c6b773SPeter Brune SNESLineSearchComputeNorms - Computes the norms of X, F, and Y. 1253f40b411bSPeter Brune 1254f40b411bSPeter Brune Input Parameters: 125578bcb3b5SPeter Brune . linesearch - linesearch context 1256f40b411bSPeter Brune 1257f40b411bSPeter Brune Options Database Keys: 12588e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 1259f40b411bSPeter Brune 1260f40b411bSPeter Brune Level: intermediate 1261f40b411bSPeter Brune 126278bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms() 1263f40b411bSPeter Brune @*/ 1264f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch) 12656a388c36SPeter Brune { 12666a388c36SPeter Brune PetscErrorCode ierr; 12679bd66eb0SPeter Brune SNES snes; 1268bf388a1fSBarry Smith 12696a388c36SPeter Brune PetscFunctionBegin; 12706a388c36SPeter Brune if (linesearch->norms) { 12719bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1272f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 12739bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12749bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12759bd66eb0SPeter Brune ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr); 12769bd66eb0SPeter Brune } else { 12776a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 12786a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12796a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12806a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 12816a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 12826a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 12836a388c36SPeter Brune } 12849bd66eb0SPeter Brune } 12856a388c36SPeter Brune PetscFunctionReturn(0); 12866a388c36SPeter Brune } 12876a388c36SPeter Brune 12886f263ca3SPeter Brune #undef __FUNCT__ 12896f263ca3SPeter Brune #define __FUNCT__ "SNESLineSearchSetComputeNorms" 12906f263ca3SPeter Brune /*@ 12916f263ca3SPeter Brune SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search. 12926f263ca3SPeter Brune 12936f263ca3SPeter Brune Input Parameters: 129478bcb3b5SPeter Brune + linesearch - linesearch context 129578bcb3b5SPeter Brune - flg - indicates whether or not to compute norms 12966f263ca3SPeter Brune 12976f263ca3SPeter Brune Options Database Keys: 12988e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 12996f263ca3SPeter Brune 13006f263ca3SPeter Brune Notes: 13011a4f838cSPeter Brune This is most relevant to the SNESLINESEARCHBASIC line search type. 13026f263ca3SPeter Brune 13036f263ca3SPeter Brune Level: intermediate 13046f263ca3SPeter Brune 13051a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC 13066f263ca3SPeter Brune @*/ 13076f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg) 13086f263ca3SPeter Brune { 13096f263ca3SPeter Brune PetscFunctionBegin; 13106f263ca3SPeter Brune linesearch->norms = flg; 13116f263ca3SPeter Brune PetscFunctionReturn(0); 13126f263ca3SPeter Brune } 13136f263ca3SPeter Brune 13146a388c36SPeter Brune #undef __FUNCT__ 1315f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVecs" 1316f40b411bSPeter Brune /*@ 1317f1c6b773SPeter Brune SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context 1318f40b411bSPeter Brune 1319f40b411bSPeter Brune Input Parameters: 132078bcb3b5SPeter Brune . linesearch - linesearch context 1321f40b411bSPeter Brune 1322f40b411bSPeter Brune Output Parameters: 1323f40b411bSPeter Brune + X - The old solution 1324f40b411bSPeter Brune . F - The old function 1325f40b411bSPeter Brune . Y - The search direction 1326f40b411bSPeter Brune . W - The new solution 1327f40b411bSPeter Brune - G - The new function 1328f40b411bSPeter Brune 132978bcb3b5SPeter Brune Level: advanced 1330f40b411bSPeter Brune 1331f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1332f40b411bSPeter Brune @*/ 1333bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) 1334bf388a1fSBarry Smith { 13356a388c36SPeter Brune PetscFunctionBegin; 1336f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13376a388c36SPeter Brune if (X) { 13386a388c36SPeter Brune PetscValidPointer(X, 2); 13396a388c36SPeter Brune *X = linesearch->vec_sol; 13406a388c36SPeter Brune } 13416a388c36SPeter Brune if (F) { 13426a388c36SPeter Brune PetscValidPointer(F, 3); 13436a388c36SPeter Brune *F = linesearch->vec_func; 13446a388c36SPeter Brune } 13456a388c36SPeter Brune if (Y) { 13466a388c36SPeter Brune PetscValidPointer(Y, 4); 13476a388c36SPeter Brune *Y = linesearch->vec_update; 13486a388c36SPeter Brune } 13496a388c36SPeter Brune if (W) { 13506a388c36SPeter Brune PetscValidPointer(W, 5); 13516a388c36SPeter Brune *W = linesearch->vec_sol_new; 13526a388c36SPeter Brune } 13536a388c36SPeter Brune if (G) { 13546a388c36SPeter Brune PetscValidPointer(G, 6); 13556a388c36SPeter Brune *G = linesearch->vec_func_new; 13566a388c36SPeter Brune } 13576a388c36SPeter Brune 13586a388c36SPeter Brune PetscFunctionReturn(0); 13596a388c36SPeter Brune } 13606a388c36SPeter Brune 13616a388c36SPeter Brune #undef __FUNCT__ 1362f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVecs" 1363f40b411bSPeter Brune /*@ 1364f1c6b773SPeter Brune SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context 1365f40b411bSPeter Brune 1366f40b411bSPeter Brune Input Parameters: 136778bcb3b5SPeter Brune + linesearch - linesearch context 1368f40b411bSPeter Brune . X - The old solution 1369f40b411bSPeter Brune . F - The old function 1370f40b411bSPeter Brune . Y - The search direction 1371f40b411bSPeter Brune . W - The new solution 1372f40b411bSPeter Brune - G - The new function 1373f40b411bSPeter Brune 137478bcb3b5SPeter Brune Level: advanced 1375f40b411bSPeter Brune 1376f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs() 1377f40b411bSPeter Brune @*/ 1378bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) 1379bf388a1fSBarry Smith { 13806a388c36SPeter Brune PetscFunctionBegin; 1381f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13826a388c36SPeter Brune if (X) { 13836a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 13846a388c36SPeter Brune linesearch->vec_sol = X; 13856a388c36SPeter Brune } 13866a388c36SPeter Brune if (F) { 13876a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 13886a388c36SPeter Brune linesearch->vec_func = F; 13896a388c36SPeter Brune } 13906a388c36SPeter Brune if (Y) { 13916a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 13926a388c36SPeter Brune linesearch->vec_update = Y; 13936a388c36SPeter Brune } 13946a388c36SPeter Brune if (W) { 13956a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 13966a388c36SPeter Brune linesearch->vec_sol_new = W; 13976a388c36SPeter Brune } 13986a388c36SPeter Brune if (G) { 13996a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 14006a388c36SPeter Brune linesearch->vec_func_new = G; 14016a388c36SPeter Brune } 14026a388c36SPeter Brune PetscFunctionReturn(0); 14036a388c36SPeter Brune } 14046a388c36SPeter Brune 14056a388c36SPeter Brune #undef __FUNCT__ 1406f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchAppendOptionsPrefix" 1407e7058c64SPeter Brune /*@C 1408f1c6b773SPeter Brune SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1409e7058c64SPeter Brune SNES options in the database. 1410e7058c64SPeter Brune 1411cd7522eaSPeter Brune Logically Collective on SNESLineSearch 1412e7058c64SPeter Brune 1413e7058c64SPeter Brune Input Parameters: 1414e7058c64SPeter Brune + snes - the SNES context 1415e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1416e7058c64SPeter Brune 1417e7058c64SPeter Brune Notes: 1418e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1419e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1420e7058c64SPeter Brune 1421e7058c64SPeter Brune Level: advanced 1422e7058c64SPeter Brune 1423f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database 1424e7058c64SPeter Brune 1425e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1426e7058c64SPeter Brune @*/ 1427f1c6b773SPeter Brune PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[]) 1428e7058c64SPeter Brune { 1429e7058c64SPeter Brune PetscErrorCode ierr; 1430e7058c64SPeter Brune 1431e7058c64SPeter Brune PetscFunctionBegin; 1432f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1433e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1434e7058c64SPeter Brune PetscFunctionReturn(0); 1435e7058c64SPeter Brune } 1436e7058c64SPeter Brune 1437e7058c64SPeter Brune #undef __FUNCT__ 1438f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetOptionsPrefix" 1439e7058c64SPeter Brune /*@C 1440f1c6b773SPeter Brune SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 1441f1c6b773SPeter Brune SNESLineSearch options in the database. 1442e7058c64SPeter Brune 1443e7058c64SPeter Brune Not Collective 1444e7058c64SPeter Brune 1445e7058c64SPeter Brune Input Parameter: 1446cd7522eaSPeter Brune . linesearch - the SNESLineSearch context 1447e7058c64SPeter Brune 1448e7058c64SPeter Brune Output Parameter: 1449e7058c64SPeter Brune . prefix - pointer to the prefix string used 1450e7058c64SPeter Brune 14518e557f58SPeter Brune Notes: 14528e557f58SPeter Brune On the fortran side, the user should pass in a string 'prefix' of 1453e7058c64SPeter Brune sufficient length to hold the prefix. 1454e7058c64SPeter Brune 1455e7058c64SPeter Brune Level: advanced 1456e7058c64SPeter Brune 1457f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database 1458e7058c64SPeter Brune 1459e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1460e7058c64SPeter Brune @*/ 1461f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[]) 1462e7058c64SPeter Brune { 1463e7058c64SPeter Brune PetscErrorCode ierr; 1464e7058c64SPeter Brune 1465e7058c64SPeter Brune PetscFunctionBegin; 1466f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1467e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1468e7058c64SPeter Brune PetscFunctionReturn(0); 1469e7058c64SPeter Brune } 1470bf7f4e0aSPeter Brune 1471bf7f4e0aSPeter Brune #undef __FUNCT__ 1472f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetWork" 1473f40b411bSPeter Brune /*@ 1474f1c6b773SPeter Brune SNESLineSearchGetWork - Gets work vectors for the line search. 1475f40b411bSPeter Brune 1476f40b411bSPeter Brune Input Parameter: 1477f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1478f40b411bSPeter Brune - nwork - the number of work vectors 1479f40b411bSPeter Brune 1480f40b411bSPeter Brune Level: developer 1481f40b411bSPeter Brune 1482cd7522eaSPeter Brune Notes: 1483cd7522eaSPeter Brune This is typically called at the beginning of a SNESLineSearch or SNESLineSearchShell implementation. 1484cd7522eaSPeter Brune 1485f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector 1486f40b411bSPeter Brune 1487f40b411bSPeter Brune .seealso: SNESDefaultGetWork() 1488f40b411bSPeter Brune @*/ 1489f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetWork(SNESLineSearch linesearch, PetscInt nwork) 1490bf7f4e0aSPeter Brune { 1491bf7f4e0aSPeter Brune PetscErrorCode ierr; 1492bf388a1fSBarry Smith 1493bf7f4e0aSPeter Brune PetscFunctionBegin; 1494bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1495bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 1496*0ad7597dSKarl Rupp } 1497*0ad7597dSKarl Rupp SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1498bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1499bf7f4e0aSPeter Brune } 1500bf7f4e0aSPeter Brune 1501bf7f4e0aSPeter Brune #undef __FUNCT__ 1502f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetSuccess" 1503f40b411bSPeter Brune /*@ 1504f1c6b773SPeter Brune SNESLineSearchGetSuccess - Gets the success/failure status of the last line search application 1505f40b411bSPeter Brune 1506f40b411bSPeter Brune Input Parameters: 150778bcb3b5SPeter Brune . linesearch - linesearch context 1508f40b411bSPeter Brune 1509f40b411bSPeter Brune Output Parameters: 15108e557f58SPeter Brune . success - The success or failure status 1511f40b411bSPeter Brune 1512cd7522eaSPeter Brune Notes: 1513cd7522eaSPeter Brune This is typically called after SNESLineSearchApply in order to determine if the line-search failed 1514cd7522eaSPeter Brune (and set the SNES convergence accordingly). 1515cd7522eaSPeter Brune 1516f40b411bSPeter Brune Level: intermediate 1517f40b411bSPeter Brune 1518f1c6b773SPeter Brune .seealso: SNESLineSearchSetSuccess() 1519f40b411bSPeter Brune @*/ 1520f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetSuccess(SNESLineSearch linesearch, PetscBool *success) 1521bf7f4e0aSPeter Brune { 1522bf7f4e0aSPeter Brune PetscFunctionBegin; 1523f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15246a388c36SPeter Brune PetscValidPointer(success, 2); 1525bf7f4e0aSPeter Brune if (success) { 1526bf7f4e0aSPeter Brune *success = linesearch->success; 1527bf7f4e0aSPeter Brune } 1528bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1529bf7f4e0aSPeter Brune } 1530bf7f4e0aSPeter Brune 1531bf7f4e0aSPeter Brune #undef __FUNCT__ 1532f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetSuccess" 1533f40b411bSPeter Brune /*@ 1534f1c6b773SPeter Brune SNESLineSearchSetSuccess - Sets the success/failure status of the last line search application 1535f40b411bSPeter Brune 1536f40b411bSPeter Brune Input Parameters: 153778bcb3b5SPeter Brune + linesearch - linesearch context 15388e557f58SPeter Brune - success - The success or failure status 1539f40b411bSPeter Brune 1540cd7522eaSPeter Brune Notes: 1541cd7522eaSPeter Brune This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set 1542cd7522eaSPeter Brune the success or failure of the line search method. 1543cd7522eaSPeter Brune 154478bcb3b5SPeter Brune Level: developer 1545f40b411bSPeter Brune 1546f1c6b773SPeter Brune .seealso: SNESLineSearchGetSuccess() 1547f40b411bSPeter Brune @*/ 1548f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetSuccess(SNESLineSearch linesearch, PetscBool success) 15496a388c36SPeter Brune { 1550f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15516a388c36SPeter Brune PetscFunctionBegin; 15526a388c36SPeter Brune linesearch->success = success; 15536a388c36SPeter Brune PetscFunctionReturn(0); 15546a388c36SPeter Brune } 15556a388c36SPeter Brune 15566a388c36SPeter Brune #undef __FUNCT__ 1557f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchSetVIFunctions" 15589bd66eb0SPeter Brune /*@C 1559f1c6b773SPeter Brune SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 15609bd66eb0SPeter Brune 15619bd66eb0SPeter Brune Input Parameters: 15629bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 15639bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 15649bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 15659bd66eb0SPeter Brune 15669bd66eb0SPeter Brune Logically Collective on SNES 15679bd66eb0SPeter Brune 15689bd66eb0SPeter Brune Calling sequence of projectfunc: 15699bd66eb0SPeter Brune .vb 15709bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 15719bd66eb0SPeter Brune .ve 15729bd66eb0SPeter Brune 15739bd66eb0SPeter Brune Input parameters for projectfunc: 15749bd66eb0SPeter Brune + snes - nonlinear context 15759bd66eb0SPeter Brune - X - current solution 15769bd66eb0SPeter Brune 1577cd7522eaSPeter Brune Output parameters for projectfunc: 15789bd66eb0SPeter Brune . X - Projected solution 15799bd66eb0SPeter Brune 15809bd66eb0SPeter Brune Calling sequence of normfunc: 15819bd66eb0SPeter Brune .vb 15829bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 15839bd66eb0SPeter Brune .ve 15849bd66eb0SPeter Brune 1585cd7522eaSPeter Brune Input parameters for normfunc: 15869bd66eb0SPeter Brune + snes - nonlinear context 15879bd66eb0SPeter Brune . X - current solution 15889bd66eb0SPeter Brune - F - current residual 15899bd66eb0SPeter Brune 1590cd7522eaSPeter Brune Output parameters for normfunc: 15919bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 15929bd66eb0SPeter Brune 1593cd7522eaSPeter Brune Notes: 1594cd7522eaSPeter Brune The VI solvers require projection of the solution to the feasible set. projectfunc should implement this. 1595cd7522eaSPeter Brune 1596cd7522eaSPeter Brune The VI solvers require special evaluation of the function norm such that the norm is only calculated 1597cd7522eaSPeter Brune on the inactive set. This should be implemented by normfunc. 15989bd66eb0SPeter Brune 15999bd66eb0SPeter Brune Level: developer 16009bd66eb0SPeter Brune 16019bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search 16029bd66eb0SPeter Brune 1603f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() 16049bd66eb0SPeter Brune @*/ 1605f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc) 16069bd66eb0SPeter Brune { 16079bd66eb0SPeter Brune PetscFunctionBegin; 1608f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 16099bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 16109bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 16119bd66eb0SPeter Brune PetscFunctionReturn(0); 16129bd66eb0SPeter Brune } 16139bd66eb0SPeter Brune 16149bd66eb0SPeter Brune #undef __FUNCT__ 1615f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchGetVIFunctions" 16169bd66eb0SPeter Brune /*@C 1617f1c6b773SPeter Brune SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 16189bd66eb0SPeter Brune 16199bd66eb0SPeter Brune Input Parameters: 16209bd66eb0SPeter Brune . snes - nonlinear context obtained from SNESCreate() 16219bd66eb0SPeter Brune 16229bd66eb0SPeter Brune Output Parameters: 16239bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 16249bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16259bd66eb0SPeter Brune 16269bd66eb0SPeter Brune Logically Collective on SNES 16279bd66eb0SPeter Brune 16289bd66eb0SPeter Brune Level: developer 16299bd66eb0SPeter Brune 16309bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search 16319bd66eb0SPeter Brune 1632f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 16339bd66eb0SPeter Brune @*/ 1634f1c6b773SPeter Brune extern PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc) 16359bd66eb0SPeter Brune { 16369bd66eb0SPeter Brune PetscFunctionBegin; 16379bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 16389bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 16399bd66eb0SPeter Brune PetscFunctionReturn(0); 16409bd66eb0SPeter Brune } 16419bd66eb0SPeter Brune 16429bd66eb0SPeter Brune #undef __FUNCT__ 1643f1c6b773SPeter Brune #define __FUNCT__ "SNESLineSearchRegister" 1644bf7f4e0aSPeter Brune /*@C 1645f1c6b773SPeter Brune SNESLineSearchRegister - See SNESLineSearchRegisterDynamic() 1646bf7f4e0aSPeter Brune 1647bf7f4e0aSPeter Brune Level: advanced 1648bf7f4e0aSPeter Brune @*/ 1649f1c6b773SPeter Brune PetscErrorCode SNESLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(SNESLineSearch)) 1650bf7f4e0aSPeter Brune { 1651bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 1652bf7f4e0aSPeter Brune PetscErrorCode ierr; 1653bf7f4e0aSPeter Brune 1654bf7f4e0aSPeter Brune PetscFunctionBegin; 1655140e18c1SBarry Smith ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr); 1656140e18c1SBarry Smith ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&SNESLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1657bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1658bf7f4e0aSPeter Brune } 1659