1af0996ceSBarry Smith #include <petsc/private/linesearchimpl.h> /*I "petscsnes.h" I*/ 2bf7f4e0aSPeter Brune 3f1c6b773SPeter Brune PetscBool SNESLineSearchRegisterAllCalled = PETSC_FALSE; 40298fd71SBarry Smith PetscFunctionList SNESLineSearchList = NULL; 5bf7f4e0aSPeter Brune 6f1c6b773SPeter Brune PetscClassId SNESLINESEARCH_CLASSID; 757a83faaSBarry Smith PetscLogEvent SNESLINESEARCH_Apply; 8bf7f4e0aSPeter Brune 9dcf2fd19SBarry Smith /*@ 10dcf2fd19SBarry Smith SNESLineSearchMonitorCancel - Clears all the monitor functions for a SNESLineSearch object. 11dcf2fd19SBarry Smith 12dcf2fd19SBarry Smith Logically Collective on SNESLineSearch 13dcf2fd19SBarry Smith 14dcf2fd19SBarry Smith Input Parameters: 15dcf2fd19SBarry Smith . ls - the SNESLineSearch context 16dcf2fd19SBarry Smith 17dcf2fd19SBarry Smith Options Database Key: 18dcf2fd19SBarry Smith . -snes_linesearch_monitor_cancel - cancels all monitors that have been hardwired 19dcf2fd19SBarry Smith into a code by calls to SNESLineSearchMonitorSet(), but does not cancel those 20dcf2fd19SBarry Smith set via the options database 21dcf2fd19SBarry Smith 22dcf2fd19SBarry Smith Notes: 23dcf2fd19SBarry Smith There is no way to clear one specific monitor from a SNESLineSearch object. 24dcf2fd19SBarry Smith 25dcf2fd19SBarry Smith This does not clear the monitor set with SNESLineSearchSetDefaultMonitor() use SNESLineSearchSetDefaultMonitor(ls,NULL) to cancel 26dcf2fd19SBarry Smith that one. 27dcf2fd19SBarry Smith 28dcf2fd19SBarry Smith Level: intermediate 29dcf2fd19SBarry Smith 30dcf2fd19SBarry Smith .keywords: SNESLineSearch, nonlinear, set, monitor 31dcf2fd19SBarry Smith 3284238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorSet() 33dcf2fd19SBarry Smith @*/ 34dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitorCancel(SNESLineSearch ls) 35dcf2fd19SBarry Smith { 36dcf2fd19SBarry Smith PetscErrorCode ierr; 37dcf2fd19SBarry Smith PetscInt i; 38dcf2fd19SBarry Smith 39dcf2fd19SBarry Smith PetscFunctionBegin; 40dcf2fd19SBarry Smith PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1); 41dcf2fd19SBarry Smith for (i=0; i<ls->numbermonitors; i++) { 42dcf2fd19SBarry Smith if (ls->monitordestroy[i]) { 43dcf2fd19SBarry Smith ierr = (*ls->monitordestroy[i])(&ls->monitorcontext[i]);CHKERRQ(ierr); 44dcf2fd19SBarry Smith } 45dcf2fd19SBarry Smith } 46dcf2fd19SBarry Smith ls->numbermonitors = 0; 47dcf2fd19SBarry Smith PetscFunctionReturn(0); 48dcf2fd19SBarry Smith } 49dcf2fd19SBarry Smith 50dcf2fd19SBarry Smith /*@ 51dcf2fd19SBarry Smith SNESLineSearchMonitor - runs the user provided monitor routines, if they exist 52dcf2fd19SBarry Smith 53dcf2fd19SBarry Smith Collective on SNES 54dcf2fd19SBarry Smith 55dcf2fd19SBarry Smith Input Parameters: 56dcf2fd19SBarry Smith . ls - the linesearch object 57dcf2fd19SBarry Smith 58dcf2fd19SBarry Smith Notes: 59dcf2fd19SBarry Smith This routine is called by the SNES implementations. 60dcf2fd19SBarry Smith It does not typically need to be called by the user. 61dcf2fd19SBarry Smith 62dcf2fd19SBarry Smith Level: developer 63dcf2fd19SBarry Smith 6484238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorSet() 65dcf2fd19SBarry Smith @*/ 66dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitor(SNESLineSearch ls) 67dcf2fd19SBarry Smith { 68dcf2fd19SBarry Smith PetscErrorCode ierr; 69dcf2fd19SBarry Smith PetscInt i,n = ls->numbermonitors; 70dcf2fd19SBarry Smith 71dcf2fd19SBarry Smith PetscFunctionBegin; 72dcf2fd19SBarry Smith for (i=0; i<n; i++) { 73dcf2fd19SBarry Smith ierr = (*ls->monitorftns[i])(ls,ls->monitorcontext[i]);CHKERRQ(ierr); 74dcf2fd19SBarry Smith } 75dcf2fd19SBarry Smith PetscFunctionReturn(0); 76dcf2fd19SBarry Smith } 77dcf2fd19SBarry Smith 78dcf2fd19SBarry Smith /*@C 79dcf2fd19SBarry Smith SNESLineSearchMonitorSet - Sets an ADDITIONAL function that is to be used at every 80dcf2fd19SBarry Smith iteration of the nonlinear solver to display the iteration's 81dcf2fd19SBarry Smith progress. 82dcf2fd19SBarry Smith 83dcf2fd19SBarry Smith Logically Collective on SNESLineSearch 84dcf2fd19SBarry Smith 85dcf2fd19SBarry Smith Input Parameters: 86dcf2fd19SBarry Smith + ls - the SNESLineSearch context 87dcf2fd19SBarry Smith . f - the monitor function 88dcf2fd19SBarry Smith . mctx - [optional] user-defined context for private data for the 89dcf2fd19SBarry Smith monitor routine (use NULL if no context is desired) 90dcf2fd19SBarry Smith - monitordestroy - [optional] routine that frees monitor context 91dcf2fd19SBarry Smith (may be NULL) 92dcf2fd19SBarry Smith 93dcf2fd19SBarry Smith Notes: 94dcf2fd19SBarry Smith Several different monitoring routines may be set by calling 95dcf2fd19SBarry Smith SNESLineSearchMonitorSet() multiple times; all will be called in the 96dcf2fd19SBarry Smith order in which they were set. 97dcf2fd19SBarry Smith 9895452b02SPatrick Sanan Fortran Notes: 9995452b02SPatrick Sanan Only a single monitor function can be set for each SNESLineSearch object 100dcf2fd19SBarry Smith 101dcf2fd19SBarry Smith Level: intermediate 102dcf2fd19SBarry Smith 103dcf2fd19SBarry Smith .keywords: SNESLineSearch, nonlinear, set, monitor 104dcf2fd19SBarry Smith 10584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorCancel() 106dcf2fd19SBarry Smith @*/ 107dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitorSet(SNESLineSearch ls,PetscErrorCode (*f)(SNESLineSearch,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 108dcf2fd19SBarry Smith { 10978064530SBarry Smith PetscErrorCode ierr; 11078064530SBarry Smith PetscInt i; 11178064530SBarry Smith PetscBool identical; 11278064530SBarry Smith 113dcf2fd19SBarry Smith PetscFunctionBegin; 114dcf2fd19SBarry Smith PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1); 11578064530SBarry Smith for (i=0; i<ls->numbermonitors;i++) { 11678064530SBarry Smith ierr = PetscMonitorCompare((PetscErrorCode (*)(void))f,mctx,monitordestroy,(PetscErrorCode (*)(void))ls->monitorftns[i],ls->monitorcontext[i],ls->monitordestroy[i],&identical);CHKERRQ(ierr); 11778064530SBarry Smith if (identical) PetscFunctionReturn(0); 11878064530SBarry Smith } 119dcf2fd19SBarry Smith if (ls->numbermonitors >= MAXSNESLSMONITORS) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 120dcf2fd19SBarry Smith ls->monitorftns[ls->numbermonitors] = f; 121dcf2fd19SBarry Smith ls->monitordestroy[ls->numbermonitors] = monitordestroy; 122dcf2fd19SBarry Smith ls->monitorcontext[ls->numbermonitors++] = (void*)mctx; 123dcf2fd19SBarry Smith PetscFunctionReturn(0); 124dcf2fd19SBarry Smith } 125dcf2fd19SBarry Smith 126dcf2fd19SBarry Smith /*@C 127dcf2fd19SBarry Smith SNESLineSearchMonitorSolutionUpdate - Monitors each update a new function value the linesearch tries 128dcf2fd19SBarry Smith 129dcf2fd19SBarry Smith Collective on SNESLineSearch 130dcf2fd19SBarry Smith 131dcf2fd19SBarry Smith Input Parameters: 132dcf2fd19SBarry Smith + ls - the SNES linesearch object 133d12e167eSBarry Smith - vf - the context for the monitor, in this case it is an ASCII PetscViewer and format 134dcf2fd19SBarry Smith 135dcf2fd19SBarry Smith Level: intermediate 136dcf2fd19SBarry Smith 137dcf2fd19SBarry Smith .keywords: SNES, nonlinear, default, monitor, norm 138dcf2fd19SBarry Smith 13984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESMonitorSet(), SNESMonitorSolution() 140dcf2fd19SBarry Smith @*/ 141d12e167eSBarry Smith PetscErrorCode SNESLineSearchMonitorSolutionUpdate(SNESLineSearch ls,PetscViewerAndFormat *vf) 142dcf2fd19SBarry Smith { 143dcf2fd19SBarry Smith PetscErrorCode ierr; 144d12e167eSBarry Smith PetscViewer viewer = vf->viewer; 145dcf2fd19SBarry Smith Vec Y,W,G; 146dcf2fd19SBarry Smith 147dcf2fd19SBarry Smith PetscFunctionBegin; 148dcf2fd19SBarry Smith ierr = SNESLineSearchGetVecs(ls,NULL,NULL,&Y,&W,&G);CHKERRQ(ierr); 149d12e167eSBarry Smith ierr = PetscViewerPushFormat(viewer,vf->format);CHKERRQ(ierr); 150dcf2fd19SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted update to solution \n");CHKERRQ(ierr); 151dcf2fd19SBarry Smith ierr = VecView(Y,viewer);CHKERRQ(ierr); 152dcf2fd19SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted new solution \n");CHKERRQ(ierr); 153dcf2fd19SBarry Smith ierr = VecView(W,viewer);CHKERRQ(ierr); 154dcf2fd19SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"LineSearch attempted updated function value\n");CHKERRQ(ierr); 155dcf2fd19SBarry Smith ierr = VecView(G,viewer);CHKERRQ(ierr); 156d12e167eSBarry Smith ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 157dcf2fd19SBarry Smith PetscFunctionReturn(0); 158dcf2fd19SBarry Smith } 159dcf2fd19SBarry Smith 160f40b411bSPeter Brune /*@ 161cd7522eaSPeter Brune SNESLineSearchCreate - Creates the line search context. 162f40b411bSPeter Brune 163cd7522eaSPeter Brune Logically Collective on Comm 164f40b411bSPeter Brune 165f40b411bSPeter Brune Input Parameters: 166cd7522eaSPeter Brune . comm - MPI communicator for the line search (typically from the associated SNES context). 167f40b411bSPeter Brune 168f40b411bSPeter Brune Output Parameters: 1698e557f58SPeter Brune . outlinesearch - the new linesearch context 170f40b411bSPeter Brune 171162e0bf5SPeter Brune Level: developer 172162e0bf5SPeter Brune 173162e0bf5SPeter Brune Notes: 174162e0bf5SPeter Brune The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance 175162e0bf5SPeter Brune already associated with the SNES. This function is for developer use. 176f40b411bSPeter Brune 177cd7522eaSPeter Brune .keywords: LineSearch, create, context 178f40b411bSPeter Brune 179162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch() 180f40b411bSPeter Brune @*/ 181f40b411bSPeter Brune 182bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch) 183bf388a1fSBarry Smith { 184bf7f4e0aSPeter Brune PetscErrorCode ierr; 185f1c6b773SPeter Brune SNESLineSearch linesearch; 186bf388a1fSBarry Smith 187bf7f4e0aSPeter Brune PetscFunctionBegin; 188ea5d4fccSPeter Brune PetscValidPointer(outlinesearch,2); 189f34a81feSMatthew G. Knepley ierr = SNESInitializePackage();CHKERRQ(ierr); 1900298fd71SBarry Smith *outlinesearch = NULL; 191f5af7f23SKarl Rupp 19273107ff1SLisandro Dalcin ierr = PetscHeaderCreate(linesearch,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView);CHKERRQ(ierr); 193bf7f4e0aSPeter Brune 1940298fd71SBarry Smith linesearch->vec_sol_new = NULL; 1950298fd71SBarry Smith linesearch->vec_func_new = NULL; 1960298fd71SBarry Smith linesearch->vec_sol = NULL; 1970298fd71SBarry Smith linesearch->vec_func = NULL; 1980298fd71SBarry Smith linesearch->vec_update = NULL; 1999bd66eb0SPeter Brune 200bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 201bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 202bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 203bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 204422a814eSBarry Smith linesearch->result = SNES_LINESEARCH_SUCCEEDED; 205bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 206bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 207bf7f4e0aSPeter Brune linesearch->damping = 1.0; 208bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 209bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 210516fe3c3SPeter Brune linesearch->rtol = 1e-8; 211516fe3c3SPeter Brune linesearch->atol = 1e-15; 212516fe3c3SPeter Brune linesearch->ltol = 1e-8; 2130298fd71SBarry Smith linesearch->precheckctx = NULL; 2140298fd71SBarry Smith linesearch->postcheckctx = NULL; 21559405d5eSPeter Brune linesearch->max_its = 1; 216bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 217bf7f4e0aSPeter Brune *outlinesearch = linesearch; 218bf7f4e0aSPeter Brune PetscFunctionReturn(0); 219bf7f4e0aSPeter Brune } 220bf7f4e0aSPeter Brune 221f40b411bSPeter Brune /*@ 22278bcb3b5SPeter Brune SNESLineSearchSetUp - Prepares the line search for being applied by allocating 22378bcb3b5SPeter Brune any required vectors. 224f40b411bSPeter Brune 225cd7522eaSPeter Brune Collective on SNESLineSearch 226f40b411bSPeter Brune 227f40b411bSPeter Brune Input Parameters: 228f40b411bSPeter Brune . linesearch - The LineSearch instance. 229f40b411bSPeter Brune 230cd7522eaSPeter Brune Notes: 231f190f2fcSBarry Smith For most cases, this needn't be called by users or outside of SNESLineSearchApply(). 232cd7522eaSPeter Brune The only current case where this is called outside of this is for the VI 23378bcb3b5SPeter Brune solvers, which modify the solution and work vectors before the first call 234cd7522eaSPeter Brune of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be 235cd7522eaSPeter Brune allocated upfront. 236cd7522eaSPeter Brune 23778bcb3b5SPeter Brune Level: advanced 238f40b411bSPeter Brune 239f1c6b773SPeter Brune .keywords: SNESLineSearch, SetUp 240f40b411bSPeter Brune 24184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchReset() 242f40b411bSPeter Brune @*/ 243f40b411bSPeter Brune 244bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) 245bf388a1fSBarry Smith { 246bf7f4e0aSPeter Brune PetscErrorCode ierr; 247bf388a1fSBarry Smith 248bf7f4e0aSPeter Brune PetscFunctionBegin; 249bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 2501a4f838cSPeter Brune ierr = SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);CHKERRQ(ierr); 251bf7f4e0aSPeter Brune } 252bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 2539bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 254bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 2559bd66eb0SPeter Brune } 2569bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 2579bd66eb0SPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new);CHKERRQ(ierr); 2589bd66eb0SPeter Brune } 259bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 260bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 261bf7f4e0aSPeter Brune } 262ed07d7d7SPeter Brune if (!linesearch->ops->snesfunc) {ierr = SNESLineSearchSetFunction(linesearch,SNESComputeFunction);CHKERRQ(ierr);} 263bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 264bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 265bf7f4e0aSPeter Brune } 266bf7f4e0aSPeter Brune PetscFunctionReturn(0); 267bf7f4e0aSPeter Brune } 268bf7f4e0aSPeter Brune 269f40b411bSPeter Brune 270f40b411bSPeter Brune /*@ 271f190f2fcSBarry Smith SNESLineSearchReset - Undoes the SNESLineSearchSetUp() and deletes any Vecs or Mats allocated by the line search. 272f40b411bSPeter Brune 273f1c6b773SPeter Brune Collective on SNESLineSearch 274f40b411bSPeter Brune 275f40b411bSPeter Brune Input Parameters: 276f40b411bSPeter Brune . linesearch - The LineSearch instance. 277f40b411bSPeter Brune 27895452b02SPatrick Sanan Notes: 27995452b02SPatrick Sanan Usually only called by SNESReset() 280f190f2fcSBarry Smith 281f190f2fcSBarry Smith Level: developer 282f40b411bSPeter Brune 283cd7522eaSPeter Brune .keywords: SNESLineSearch, Reset 284f40b411bSPeter Brune 28584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetUp() 286f40b411bSPeter Brune @*/ 287f40b411bSPeter Brune 288bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) 289bf388a1fSBarry Smith { 290bf7f4e0aSPeter Brune PetscErrorCode ierr; 291bf388a1fSBarry Smith 292bf7f4e0aSPeter Brune PetscFunctionBegin; 293f5af7f23SKarl Rupp if (linesearch->ops->reset) (*linesearch->ops->reset)(linesearch); 294f5af7f23SKarl Rupp 295bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 296bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 297bf7f4e0aSPeter Brune 298bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 299f5af7f23SKarl Rupp 300bf7f4e0aSPeter Brune linesearch->nwork = 0; 301bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 302bf7f4e0aSPeter Brune PetscFunctionReturn(0); 303bf7f4e0aSPeter Brune } 304bf7f4e0aSPeter Brune 305ed07d7d7SPeter Brune /*@C 306f190f2fcSBarry Smith SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search 307ed07d7d7SPeter Brune 308ed07d7d7SPeter Brune Input Parameters: 309ed07d7d7SPeter Brune . linesearch - the SNESLineSearch context 310f190f2fcSBarry Smith + func - function evaluation routine 311ed07d7d7SPeter Brune 312ed07d7d7SPeter Brune Level: developer 313ed07d7d7SPeter Brune 31495452b02SPatrick Sanan Notes: 31595452b02SPatrick Sanan This is used internally by PETSc and not called by users 316f190f2fcSBarry Smith 317ed07d7d7SPeter Brune .keywords: get, linesearch, pre-check 318ed07d7d7SPeter Brune 31984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESSetFunction() 320ed07d7d7SPeter Brune @*/ 321ed07d7d7SPeter Brune PetscErrorCode SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec)) 322ed07d7d7SPeter Brune { 323ed07d7d7SPeter Brune PetscFunctionBegin; 324ed07d7d7SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 325ed07d7d7SPeter Brune linesearch->ops->snesfunc = func; 326ed07d7d7SPeter Brune PetscFunctionReturn(0); 327ed07d7d7SPeter Brune } 328ed07d7d7SPeter Brune 32986d74e61SPeter Brune /*@C 330f190f2fcSBarry Smith SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but 331df3898eeSBarry Smith before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that 332f190f2fcSBarry Smith determined the search direction. 33386d74e61SPeter Brune 334f1c6b773SPeter Brune Logically Collective on SNESLineSearch 33586d74e61SPeter Brune 33686d74e61SPeter Brune Input Parameters: 337f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 33884238204SBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for the calling sequence 339f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 34086d74e61SPeter Brune 34186d74e61SPeter Brune Level: intermediate 34286d74e61SPeter Brune 34386d74e61SPeter Brune .keywords: set, linesearch, pre-check 34486d74e61SPeter Brune 34584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 34686d74e61SPeter Brune @*/ 347f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx) 34886d74e61SPeter Brune { 3499bd66eb0SPeter Brune PetscFunctionBegin; 350f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 351f190f2fcSBarry Smith if (func) linesearch->ops->precheck = func; 35286d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 35386d74e61SPeter Brune PetscFunctionReturn(0); 35486d74e61SPeter Brune } 35586d74e61SPeter Brune 35686d74e61SPeter Brune /*@C 35753deb899SBarry Smith SNESLineSearchGetPreCheck - Gets the pre-check function for the line search routine. 35886d74e61SPeter Brune 35986d74e61SPeter Brune Input Parameters: 360f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 36186d74e61SPeter Brune 36286d74e61SPeter Brune Output Parameters: 36384238204SBarry Smith + func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for calling sequence 364f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 36586d74e61SPeter Brune 36686d74e61SPeter Brune Level: intermediate 36786d74e61SPeter Brune 36886d74e61SPeter Brune .keywords: get, linesearch, pre-check 36986d74e61SPeter Brune 37084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 37186d74e61SPeter Brune @*/ 372f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx) 37386d74e61SPeter Brune { 3749bd66eb0SPeter Brune PetscFunctionBegin; 375f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 376f190f2fcSBarry Smith if (func) *func = linesearch->ops->precheck; 37786d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 37886d74e61SPeter Brune PetscFunctionReturn(0); 37986d74e61SPeter Brune } 38086d74e61SPeter Brune 38186d74e61SPeter Brune /*@C 382f190f2fcSBarry Smith SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step 383f190f2fcSBarry Smith direction and length. Allows the user a chance to change or override the decision of the line search routine 38486d74e61SPeter Brune 385f1c6b773SPeter Brune Logically Collective on SNESLineSearch 38686d74e61SPeter Brune 38786d74e61SPeter Brune Input Parameters: 388f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 38984238204SBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPostCheck() for the calling sequence 390f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 39186d74e61SPeter Brune 39286d74e61SPeter Brune Level: intermediate 39386d74e61SPeter Brune 39486d74e61SPeter Brune .keywords: set, linesearch, post-check 39586d74e61SPeter Brune 39684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck() 39786d74e61SPeter Brune @*/ 398f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx) 39986d74e61SPeter Brune { 40086d74e61SPeter Brune PetscFunctionBegin; 401f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 402f190f2fcSBarry Smith if (func) linesearch->ops->postcheck = func; 40386d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 40486d74e61SPeter Brune PetscFunctionReturn(0); 40586d74e61SPeter Brune } 40686d74e61SPeter Brune 40786d74e61SPeter Brune /*@C 408f1c6b773SPeter Brune SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine. 40986d74e61SPeter Brune 41086d74e61SPeter Brune Input Parameters: 411f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 41286d74e61SPeter Brune 41386d74e61SPeter Brune Output Parameters: 41484238204SBarry Smith + func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheck() 415f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 41686d74e61SPeter Brune 41786d74e61SPeter Brune Level: intermediate 41886d74e61SPeter Brune 41986d74e61SPeter Brune .keywords: get, linesearch, post-check 42086d74e61SPeter Brune 42184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck() 42286d74e61SPeter Brune @*/ 423f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx) 42486d74e61SPeter Brune { 4259bd66eb0SPeter Brune PetscFunctionBegin; 426f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 427f190f2fcSBarry Smith if (func) *func = linesearch->ops->postcheck; 42886d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 42986d74e61SPeter Brune PetscFunctionReturn(0); 43086d74e61SPeter Brune } 43186d74e61SPeter Brune 432f40b411bSPeter Brune /*@ 433f1c6b773SPeter Brune SNESLineSearchPreCheck - Prepares the line search for being applied. 434f40b411bSPeter Brune 435cd7522eaSPeter Brune Logically Collective on SNESLineSearch 436f40b411bSPeter Brune 437f40b411bSPeter Brune Input Parameters: 4387b1df9c1SPeter Brune + linesearch - The linesearch instance. 4397b1df9c1SPeter Brune . X - The current solution 4407b1df9c1SPeter Brune - Y - The step direction 441f40b411bSPeter Brune 442f40b411bSPeter Brune Output Parameters: 4438e557f58SPeter Brune . changed - Indicator that the precheck routine has changed anything 444f40b411bSPeter Brune 445f190f2fcSBarry Smith Level: developer 446f40b411bSPeter Brune 447f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 448f40b411bSPeter Brune 44984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck() 450f40b411bSPeter Brune @*/ 4517b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 452bf7f4e0aSPeter Brune { 453bf7f4e0aSPeter Brune PetscErrorCode ierr; 4545fd66863SKarl Rupp 455bf7f4e0aSPeter Brune PetscFunctionBegin; 456bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 4576b2b7091SBarry Smith if (linesearch->ops->precheck) { 4586b2b7091SBarry Smith ierr = (*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx);CHKERRQ(ierr); 45938bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed,4); 460bf7f4e0aSPeter Brune } 461bf7f4e0aSPeter Brune PetscFunctionReturn(0); 462bf7f4e0aSPeter Brune } 463bf7f4e0aSPeter Brune 464f40b411bSPeter Brune /*@ 465f1c6b773SPeter Brune SNESLineSearchPostCheck - Prepares the line search for being applied. 466f40b411bSPeter Brune 467cd7522eaSPeter Brune Logically Collective on SNESLineSearch 468f40b411bSPeter Brune 469f40b411bSPeter Brune Input Parameters: 4707b1df9c1SPeter Brune + linesearch - The linesearch context 4717b1df9c1SPeter Brune . X - The last solution 4727b1df9c1SPeter Brune . Y - The step direction 4737b1df9c1SPeter Brune - W - The updated solution, W = X + lambda*Y for some lambda 474f40b411bSPeter Brune 475f40b411bSPeter Brune Output Parameters: 47678bcb3b5SPeter Brune + changed_Y - Indicator if the direction Y has been changed. 47778bcb3b5SPeter Brune - changed_W - Indicator if the new candidate solution W has been changed. 478f40b411bSPeter Brune 479f190f2fcSBarry Smith Level: developer 480f40b411bSPeter Brune 481f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 482f40b411bSPeter Brune 48384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPrecheck(), SNESLineSearchGetPrecheck() 484f40b411bSPeter Brune @*/ 4857b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W) 486bf7f4e0aSPeter Brune { 487bf7f4e0aSPeter Brune PetscErrorCode ierr; 488bf388a1fSBarry Smith 489bf7f4e0aSPeter Brune PetscFunctionBegin; 490bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 491bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 4926b2b7091SBarry Smith if (linesearch->ops->postcheck) { 4936b2b7091SBarry Smith ierr = (*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx);CHKERRQ(ierr); 49438bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5); 49538bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_W,6); 49686d74e61SPeter Brune } 49786d74e61SPeter Brune PetscFunctionReturn(0); 49886d74e61SPeter Brune } 49986d74e61SPeter Brune 50086d74e61SPeter Brune /*@C 50186d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 50286d74e61SPeter Brune 503cd7522eaSPeter Brune Logically Collective on SNESLineSearch 50486d74e61SPeter Brune 50586d74e61SPeter Brune Input Arguments: 50686d74e61SPeter Brune + linesearch - linesearch context 50786d74e61SPeter Brune . X - base state for this step 50886d74e61SPeter Brune . Y - initial correction 509907376e6SBarry Smith - ctx - context for this function 51086d74e61SPeter Brune 51186d74e61SPeter Brune Output Arguments: 51286d74e61SPeter Brune + Y - correction, possibly modified 51386d74e61SPeter Brune - changed - flag indicating that Y was modified 51486d74e61SPeter Brune 51586d74e61SPeter Brune Options Database Key: 516cd7522eaSPeter Brune + -snes_linesearch_precheck_picard - activate this routine 517cd7522eaSPeter Brune - -snes_linesearch_precheck_picard_angle - angle 51886d74e61SPeter Brune 51986d74e61SPeter Brune Level: advanced 52086d74e61SPeter Brune 52186d74e61SPeter Brune Notes: 52286d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 52386d74e61SPeter Brune 52486d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 52586d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 52686d74e61SPeter Brune is generally not useful when using a Newton linearization. 52786d74e61SPeter Brune 52886d74e61SPeter Brune Reference: 52986d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 53086d74e61SPeter Brune 53184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetPreCheck() 53286d74e61SPeter Brune @*/ 533f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx) 53486d74e61SPeter Brune { 53586d74e61SPeter Brune PetscErrorCode ierr; 53686d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 53786d74e61SPeter Brune Vec Ylast; 53886d74e61SPeter Brune PetscScalar dot; 53986d74e61SPeter Brune PetscInt iter; 54086d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 54186d74e61SPeter Brune SNES snes; 54286d74e61SPeter Brune 54386d74e61SPeter Brune PetscFunctionBegin; 544f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 54586d74e61SPeter Brune ierr = PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast);CHKERRQ(ierr); 54686d74e61SPeter Brune if (!Ylast) { 54786d74e61SPeter Brune ierr = VecDuplicate(Y,&Ylast);CHKERRQ(ierr); 54886d74e61SPeter Brune ierr = PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast);CHKERRQ(ierr); 54986d74e61SPeter Brune ierr = PetscObjectDereference((PetscObject)Ylast);CHKERRQ(ierr); 55086d74e61SPeter Brune } 55186d74e61SPeter Brune ierr = SNESGetIterationNumber(snes,&iter);CHKERRQ(ierr); 55286d74e61SPeter Brune if (iter < 2) { 55386d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 55486d74e61SPeter Brune *changed = PETSC_FALSE; 55586d74e61SPeter Brune PetscFunctionReturn(0); 55686d74e61SPeter Brune } 55786d74e61SPeter Brune 55886d74e61SPeter Brune ierr = VecDot(Y,Ylast,&dot);CHKERRQ(ierr); 55986d74e61SPeter Brune ierr = VecNorm(Y,NORM_2,&ynorm);CHKERRQ(ierr); 56086d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ylastnorm);CHKERRQ(ierr); 56186d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 562255453a1SBarry Smith theta = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 56386d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 56486d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 56586d74e61SPeter Brune /* Modify the step Y */ 56686d74e61SPeter Brune PetscReal alpha,ydiffnorm; 56786d74e61SPeter Brune ierr = VecAXPY(Ylast,-1.0,Y);CHKERRQ(ierr); 56886d74e61SPeter Brune ierr = VecNorm(Ylast,NORM_2,&ydiffnorm);CHKERRQ(ierr); 569*f85e2ce2SBarry Smith alpha = (ydiffnorm > .001*ylastnorm) ? ylastnorm / ydiffnorm : 1000.0; 57086d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 57186d74e61SPeter Brune ierr = VecScale(Y,alpha);CHKERRQ(ierr); 572c69d1a72SBarry 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); 57386d74e61SPeter Brune } else { 574c69d1a72SBarry 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); 57586d74e61SPeter Brune ierr = VecCopy(Y,Ylast);CHKERRQ(ierr); 57686d74e61SPeter Brune *changed = PETSC_FALSE; 577bf7f4e0aSPeter Brune } 578bf7f4e0aSPeter Brune PetscFunctionReturn(0); 579bf7f4e0aSPeter Brune } 580bf7f4e0aSPeter Brune 581f40b411bSPeter Brune /*@ 582cd7522eaSPeter Brune SNESLineSearchApply - Computes the line-search update. 583f40b411bSPeter Brune 584f1c6b773SPeter Brune Collective on SNESLineSearch 585f40b411bSPeter Brune 586f40b411bSPeter Brune Input Parameters: 5878e557f58SPeter Brune + linesearch - The linesearch context 5888e557f58SPeter Brune . X - The current solution 5898e557f58SPeter Brune . F - The current function 5908e557f58SPeter Brune . fnorm - The current norm 5918e557f58SPeter Brune - Y - The search direction 592f40b411bSPeter Brune 593f40b411bSPeter Brune Output Parameters: 5948e557f58SPeter Brune + X - The new solution 5958e557f58SPeter Brune . F - The new function 5968e557f58SPeter Brune - fnorm - The new function norm 597f40b411bSPeter Brune 598cd7522eaSPeter Brune Options Database Keys: 599d4c6564cSPatrick Farrell + -snes_linesearch_type - basic, bt, l2, cp, nleqerr, shell 600dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches 6011fe24845SBarry Smith . -snes_linesearch_damping - The linesearch damping parameter, default is 1.0 (no damping) 6021fe24845SBarry Smith . -snes_linesearch_norms - Turn on/off the linesearch norms computation (SNESLineSearchSetComputeNorms()) 6033c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess 6043c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches 605cd7522eaSPeter Brune 606cd7522eaSPeter Brune Notes: 607cd7522eaSPeter Brune This is typically called from within a SNESSolve() implementation in order to 608cd7522eaSPeter Brune help with convergence of the nonlinear method. Various SNES types use line searches 609cd7522eaSPeter Brune in different ways, but the overarching theme is that a line search is used to determine 610cd7522eaSPeter Brune an optimal damping parameter of a step at each iteration of the method. Each 61184238204SBarry Smith application of the line search may invoke SNESComputeFunction() several times, and 612cd7522eaSPeter Brune therefore may be fairly expensive. 613cd7522eaSPeter Brune 614f40b411bSPeter Brune Level: Intermediate 615f40b411bSPeter Brune 616f1c6b773SPeter Brune .keywords: SNESLineSearch, Create 617f40b411bSPeter Brune 61884238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction(), SNESLineSearchSetComputeNorms(), 6191fe24845SBarry Smith SNESLineSearchType, SNESLineSearchSetType() 620f40b411bSPeter Brune @*/ 621bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) 622bf388a1fSBarry Smith { 623bf7f4e0aSPeter Brune PetscErrorCode ierr; 624bf7f4e0aSPeter Brune 625bf388a1fSBarry Smith PetscFunctionBegin; 626f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 627bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 628bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 629bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 630bf7f4e0aSPeter Brune 631422a814eSBarry Smith linesearch->result = SNES_LINESEARCH_SUCCEEDED; 632bf7f4e0aSPeter Brune 633bf7f4e0aSPeter Brune linesearch->vec_sol = X; 634bf7f4e0aSPeter Brune linesearch->vec_update = Y; 635bf7f4e0aSPeter Brune linesearch->vec_func = F; 636bf7f4e0aSPeter Brune 637f1c6b773SPeter Brune ierr = SNESLineSearchSetUp(linesearch);CHKERRQ(ierr); 638bf7f4e0aSPeter Brune 639f5af7f23SKarl Rupp if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 640bf7f4e0aSPeter Brune 641f5af7f23SKarl Rupp if (fnorm) linesearch->fnorm = *fnorm; 642f5af7f23SKarl Rupp else { 643bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 644bf7f4e0aSPeter Brune } 645bf7f4e0aSPeter Brune 64657a83faaSBarry Smith ierr = PetscLogEventBegin(SNESLINESEARCH_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 647bf7f4e0aSPeter Brune 648bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 649bf7f4e0aSPeter Brune 65057a83faaSBarry Smith ierr = PetscLogEventEnd(SNESLINESEARCH_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 651bf7f4e0aSPeter Brune 652f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 653bf7f4e0aSPeter Brune PetscFunctionReturn(0); 654bf7f4e0aSPeter Brune } 655bf7f4e0aSPeter Brune 656f40b411bSPeter Brune /*@ 657f1c6b773SPeter Brune SNESLineSearchDestroy - Destroys the line search instance. 658f40b411bSPeter Brune 659f1c6b773SPeter Brune Collective on SNESLineSearch 660f40b411bSPeter Brune 661f40b411bSPeter Brune Input Parameters: 6628e557f58SPeter Brune . linesearch - The linesearch context 663f40b411bSPeter Brune 66484238204SBarry Smith Level: developer 665f40b411bSPeter Brune 66678bcb3b5SPeter Brune .keywords: SNESLineSearch, Destroy 667f40b411bSPeter Brune 66884238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy() 669f40b411bSPeter Brune @*/ 670bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) 671bf388a1fSBarry Smith { 672bf7f4e0aSPeter Brune PetscErrorCode ierr; 673bf388a1fSBarry Smith 674bf7f4e0aSPeter Brune PetscFunctionBegin; 675bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 676f1c6b773SPeter Brune PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1); 677bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 678e04113cfSBarry Smith ierr = PetscObjectSAWsViewOff((PetscObject)*linesearch);CHKERRQ(ierr); 67922d28d08SBarry Smith ierr = SNESLineSearchReset(*linesearch);CHKERRQ(ierr); 680f5af7f23SKarl Rupp if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch); 681bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 682dcf2fd19SBarry Smith ierr = SNESLineSearchMonitorCancel((*linesearch));CHKERRQ(ierr); 683e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 684bf7f4e0aSPeter Brune PetscFunctionReturn(0); 685bf7f4e0aSPeter Brune } 686bf7f4e0aSPeter Brune 687f40b411bSPeter Brune /*@ 688dcf2fd19SBarry Smith SNESLineSearchSetDefaultMonitor - Turns on/off printing useful information and debugging output about the line search. 689bf7f4e0aSPeter Brune 690bf7f4e0aSPeter Brune Input Parameters: 691dcf2fd19SBarry Smith + linesearch - the linesearch object 692dcf2fd19SBarry Smith - viewer - an ASCII PetscViewer or NULL to turn off monitor 693bf7f4e0aSPeter Brune 694dcf2fd19SBarry Smith Logically Collective on SNESLineSearch 695bf7f4e0aSPeter Brune 696bf7f4e0aSPeter Brune Options Database: 697dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - enables the monitor 698bf7f4e0aSPeter Brune 699bf7f4e0aSPeter Brune Level: intermediate 700bf7f4e0aSPeter Brune 701dcf2fd19SBarry Smith Developer Note: This monitor is implemented differently than the other SNESLineSearchMonitors that are set with 702d12e167eSBarry Smith SNESLineSearchMonitorSet() since it is called in many locations of the line search routines to display aspects of the 703d12e167eSBarry Smith line search that are not visible to the other monitors. 704dcf2fd19SBarry Smith 70584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetDefaultMonitor(), PetscViewer, SNESLineSearchSetMonitor() 706bf7f4e0aSPeter Brune @*/ 707dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchSetDefaultMonitor(SNESLineSearch linesearch, PetscViewer viewer) 708bf7f4e0aSPeter Brune { 709bf7f4e0aSPeter Brune PetscErrorCode ierr; 710bf388a1fSBarry Smith 711bf7f4e0aSPeter Brune PetscFunctionBegin; 712dcf2fd19SBarry Smith if (viewer) {ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);} 713bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 714dcf2fd19SBarry Smith linesearch->monitor = viewer; 715bf7f4e0aSPeter Brune PetscFunctionReturn(0); 716bf7f4e0aSPeter Brune } 717bf7f4e0aSPeter Brune 718f40b411bSPeter Brune /*@ 719dcf2fd19SBarry Smith SNESLineSearchGetDefaultMonitor - Gets the PetscViewer instance for the line search monitor. 7206a388c36SPeter Brune 721f190f2fcSBarry Smith Input Parameter: 7228e557f58SPeter Brune . linesearch - linesearch context 723f40b411bSPeter Brune 724f190f2fcSBarry Smith Output Parameter: 7258e557f58SPeter Brune . monitor - monitor context 726f40b411bSPeter Brune 727f40b411bSPeter Brune Logically Collective on SNES 728f40b411bSPeter Brune 729f40b411bSPeter Brune Options Database Keys: 7308e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 731f40b411bSPeter Brune 732f40b411bSPeter Brune Level: intermediate 733f40b411bSPeter Brune 73484238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetDefaultMonitor(), PetscViewer 735f40b411bSPeter Brune @*/ 736dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchGetDefaultMonitor(SNESLineSearch linesearch, PetscViewer *monitor) 7376a388c36SPeter Brune { 7386a388c36SPeter Brune PetscFunctionBegin; 739f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 7406a388c36SPeter Brune if (monitor) { 7416a388c36SPeter Brune PetscValidPointer(monitor, 2); 7426a388c36SPeter Brune *monitor = linesearch->monitor; 7436a388c36SPeter Brune } 7446a388c36SPeter Brune PetscFunctionReturn(0); 7456a388c36SPeter Brune } 7466a388c36SPeter Brune 747dcf2fd19SBarry Smith /*@C 748dcf2fd19SBarry Smith SNESLineSearchMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user 749dcf2fd19SBarry Smith 750dcf2fd19SBarry Smith Collective on SNESLineSearch 751dcf2fd19SBarry Smith 752dcf2fd19SBarry Smith Input Parameters: 753dcf2fd19SBarry Smith + ls - LineSearch object you wish to monitor 754dcf2fd19SBarry Smith . name - the monitor type one is seeking 755dcf2fd19SBarry Smith . help - message indicating what monitoring is done 756dcf2fd19SBarry Smith . manual - manual page for the monitor 757dcf2fd19SBarry Smith . monitor - the monitor function 758dcf2fd19SBarry Smith - monitorsetup - a function that is called once ONLY if the user selected this monitor that may set additional features of the SNESLineSearch or PetscViewer objects 759dcf2fd19SBarry Smith 760dcf2fd19SBarry Smith Level: developer 761dcf2fd19SBarry Smith 762dcf2fd19SBarry Smith .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 763dcf2fd19SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 764dcf2fd19SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 765dcf2fd19SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 766dcf2fd19SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 767dcf2fd19SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 768dcf2fd19SBarry Smith PetscOptionsFList(), PetscOptionsEList() 769dcf2fd19SBarry Smith @*/ 770d12e167eSBarry Smith PetscErrorCode SNESLineSearchMonitorSetFromOptions(SNESLineSearch ls,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(SNESLineSearch,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(SNESLineSearch,PetscViewerAndFormat*)) 771dcf2fd19SBarry Smith { 772dcf2fd19SBarry Smith PetscErrorCode ierr; 773dcf2fd19SBarry Smith PetscViewer viewer; 774dcf2fd19SBarry Smith PetscViewerFormat format; 775dcf2fd19SBarry Smith PetscBool flg; 776dcf2fd19SBarry Smith 777dcf2fd19SBarry Smith PetscFunctionBegin; 778dcf2fd19SBarry Smith ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)ls),((PetscObject)ls)->prefix,name,&viewer,&format,&flg);CHKERRQ(ierr); 779dcf2fd19SBarry Smith if (flg) { 780d12e167eSBarry Smith PetscViewerAndFormat *vf; 781d12e167eSBarry Smith ierr = PetscViewerAndFormatCreate(viewer,format,&vf);CHKERRQ(ierr); 782d12e167eSBarry Smith ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 783dcf2fd19SBarry Smith if (monitorsetup) { 784d12e167eSBarry Smith ierr = (*monitorsetup)(ls,vf);CHKERRQ(ierr); 785dcf2fd19SBarry Smith } 786d12e167eSBarry Smith ierr = SNESLineSearchMonitorSet(ls,(PetscErrorCode (*)(SNESLineSearch,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy);CHKERRQ(ierr); 787dcf2fd19SBarry Smith } 788dcf2fd19SBarry Smith PetscFunctionReturn(0); 789dcf2fd19SBarry Smith } 790dcf2fd19SBarry Smith 791f40b411bSPeter Brune /*@ 792f1c6b773SPeter Brune SNESLineSearchSetFromOptions - Sets options for the line search 793f40b411bSPeter Brune 794f40b411bSPeter Brune Input Parameters: 7958e557f58SPeter Brune . linesearch - linesearch context 796f40b411bSPeter Brune 797f40b411bSPeter Brune Options Database Keys: 798d4c6564cSPatrick Farrell + -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell 7993c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3. Most types only support certain orders (bt supports 2 or 3) 8001fe24845SBarry Smith . -snes_linesearch_norms - Turn on/off the linesearch norms for the basic linesearch typem (SNESLineSearchSetComputeNorms()) 80171eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length 8021a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size 8031a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches 8041a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches 8051a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches 8061a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches 807dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches 808dcf2fd19SBarry Smith . -snes_linesearch_monitor_solution_update [viewer:filename:format] - view each update tried by line search routine 8098e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 810cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess. 8111a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method 8121a9b3a06SPeter Brune - -snes_linesearch_precheck_picard_angle - Angle used in picard precheck method 813f40b411bSPeter Brune 814f1c6b773SPeter Brune Logically Collective on SNESLineSearch 815f40b411bSPeter Brune 816f40b411bSPeter Brune Level: intermediate 817f40b411bSPeter Brune 8181fe24845SBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard(), 8191fe24845SBarry Smith SNESLineSearchType, SNESLineSearchSetComputeNorms() 820f40b411bSPeter Brune @*/ 821bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch) 822bf388a1fSBarry Smith { 823bf7f4e0aSPeter Brune PetscErrorCode ierr; 8241a4f838cSPeter Brune const char *deft = SNESLINESEARCHBASIC; 825bf7f4e0aSPeter Brune char type[256]; 826bf7f4e0aSPeter Brune PetscBool flg, set; 827dcf2fd19SBarry Smith PetscViewer viewer; 828bf388a1fSBarry Smith 829bf7f4e0aSPeter Brune PetscFunctionBegin; 8300f51fdf8SToby Isaac ierr = SNESLineSearchRegisterAll();CHKERRQ(ierr); 831bf7f4e0aSPeter Brune 832bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 833f5af7f23SKarl Rupp if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name; 834a264d7a6SBarry Smith ierr = PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 835bf7f4e0aSPeter Brune if (flg) { 836f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,type);CHKERRQ(ierr); 837bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 838f1c6b773SPeter Brune ierr = SNESLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 839bf7f4e0aSPeter Brune } 840bf7f4e0aSPeter Brune 841dcf2fd19SBarry Smith ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)linesearch),((PetscObject)linesearch)->prefix,"-snes_linesearch_monitor",&viewer,NULL,&set);CHKERRQ(ierr); 842dcf2fd19SBarry Smith if (set) { 843dcf2fd19SBarry Smith ierr = SNESLineSearchSetDefaultMonitor(linesearch,viewer);CHKERRQ(ierr); 844dcf2fd19SBarry Smith ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 845dcf2fd19SBarry Smith } 846dcf2fd19SBarry Smith ierr = SNESLineSearchMonitorSetFromOptions(linesearch,"-snes_linesearch_monitor_solution_update","View correction at each iteration","SNESLineSearchMonitorSolutionUpdate",SNESLineSearchMonitorSolutionUpdate,NULL);CHKERRQ(ierr); 847bf7f4e0aSPeter Brune 8481a9b3a06SPeter Brune /* tolerances */ 84994ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL);CHKERRQ(ierr); 85094ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL);CHKERRQ(ierr); 85194ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL);CHKERRQ(ierr); 85294ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL);CHKERRQ(ierr); 85394ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL);CHKERRQ(ierr); 85494ae4db5SBarry Smith ierr = PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL);CHKERRQ(ierr); 8557a35526eSPeter Brune 8561a9b3a06SPeter Brune /* damping parameters */ 85794ae4db5SBarry Smith ierr = PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL);CHKERRQ(ierr); 8581a9b3a06SPeter Brune 85994ae4db5SBarry Smith ierr = PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL);CHKERRQ(ierr); 8601a9b3a06SPeter Brune 8611a9b3a06SPeter Brune /* precheck */ 8627a35526eSPeter Brune ierr = PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set);CHKERRQ(ierr); 8637a35526eSPeter Brune if (set) { 8647a35526eSPeter Brune if (flg) { 8657a35526eSPeter Brune linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */ 866f5af7f23SKarl Rupp 8677a35526eSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction", 8680298fd71SBarry Smith "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr); 8697a35526eSPeter Brune ierr = SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle);CHKERRQ(ierr); 8707a35526eSPeter Brune } else { 8710298fd71SBarry Smith ierr = SNESLineSearchSetPreCheck(linesearch,NULL,NULL);CHKERRQ(ierr); 8727a35526eSPeter Brune } 8737a35526eSPeter Brune } 87494ae4db5SBarry Smith ierr = PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL);CHKERRQ(ierr); 87594ae4db5SBarry Smith ierr = PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL);CHKERRQ(ierr); 8767a35526eSPeter Brune 8775a9b6599SPeter Brune if (linesearch->ops->setfromoptions) { 878e55864a3SBarry Smith (*linesearch->ops->setfromoptions)(PetscOptionsObject,linesearch);CHKERRQ(ierr); 8795a9b6599SPeter Brune } 8805a9b6599SPeter Brune 8810633abcbSJed Brown ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)linesearch);CHKERRQ(ierr); 882bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 883bf7f4e0aSPeter Brune PetscFunctionReturn(0); 884bf7f4e0aSPeter Brune } 885bf7f4e0aSPeter Brune 886f40b411bSPeter Brune /*@ 887f190f2fcSBarry Smith SNESLineSearchView - Prints useful information about the line search 888f40b411bSPeter Brune 889f40b411bSPeter Brune Input Parameters: 8908e557f58SPeter Brune . linesearch - linesearch context 891f40b411bSPeter Brune 892f1c6b773SPeter Brune Logically Collective on SNESLineSearch 893f40b411bSPeter Brune 894f40b411bSPeter Brune Level: intermediate 895f40b411bSPeter Brune 896dcf2fd19SBarry Smith .seealso: SNESLineSearchCreate() 897f40b411bSPeter Brune @*/ 898bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer) 899bf388a1fSBarry Smith { 9007f1410a3SPeter Brune PetscErrorCode ierr; 9017f1410a3SPeter Brune PetscBool iascii; 902bf388a1fSBarry Smith 903bf7f4e0aSPeter Brune PetscFunctionBegin; 9047f1410a3SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 9057f1410a3SPeter Brune if (!viewer) { 906ce94432eSBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer);CHKERRQ(ierr); 9077f1410a3SPeter Brune } 9087f1410a3SPeter Brune PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 9097f1410a3SPeter Brune PetscCheckSameComm(linesearch,1,viewer,2); 910f40b411bSPeter Brune 911251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9127f1410a3SPeter Brune if (iascii) { 913dae58748SBarry Smith ierr = PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer);CHKERRQ(ierr); 9147f1410a3SPeter Brune if (linesearch->ops->view) { 9157f1410a3SPeter Brune ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 9167f1410a3SPeter Brune ierr = (*linesearch->ops->view)(linesearch,viewer);CHKERRQ(ierr); 9177f1410a3SPeter Brune ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 9187f1410a3SPeter Brune } 919c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol);CHKERRQ(ierr); 920c69d1a72SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol);CHKERRQ(ierr); 9217f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," maximum iterations=%D\n", linesearch->max_its);CHKERRQ(ierr); 9226b2b7091SBarry Smith if (linesearch->ops->precheck) { 9236b2b7091SBarry Smith if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) { 9247f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using precheck step to speed up Picard convergence\n", linesearch->max_its);CHKERRQ(ierr); 9257f1410a3SPeter Brune } else { 9267f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined precheck step\n", linesearch->max_its);CHKERRQ(ierr); 9277f1410a3SPeter Brune } 9287f1410a3SPeter Brune } 9296b2b7091SBarry Smith if (linesearch->ops->postcheck) { 9307f1410a3SPeter Brune ierr = PetscViewerASCIIPrintf(viewer," using user-defined postcheck step\n", linesearch->max_its);CHKERRQ(ierr); 9317f1410a3SPeter Brune } 9327f1410a3SPeter Brune } 933bf7f4e0aSPeter Brune PetscFunctionReturn(0); 934bf7f4e0aSPeter Brune } 935bf7f4e0aSPeter Brune 936ea5d4fccSPeter Brune /*@C 937f1c6b773SPeter Brune SNESLineSearchSetType - Sets the linesearch type 938f40b411bSPeter Brune 939f190f2fcSBarry Smith Logically Collective on SNESLineSearch 940f190f2fcSBarry Smith 941f40b411bSPeter Brune Input Parameters: 9428e557f58SPeter Brune + linesearch - linesearch context 943f40b411bSPeter Brune - type - The type of line search to be used 944f40b411bSPeter Brune 945cd7522eaSPeter Brune Available Types: 9461fe24845SBarry Smith + SNESLINESEARCHBASIC - Simple damping line search, defaults to using the full Newton step 9471fe24845SBarry Smith . SNESLINESEARCHBT - Backtracking line search over the L2 norm of the function 9481fe24845SBarry Smith . SNESLINESEARCHL2 - Secant line search over the L2 norm of the function 9491fe24845SBarry Smith . SNESLINESEARCHCP - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x) 9501fe24845SBarry Smith . SNESLINESEARCHNLEQERR - Affine-covariant error-oriented linesearch 9511fe24845SBarry Smith - SNESLINESEARCHSHELL - User provided SNESLineSearch implementation 9521fe24845SBarry Smith 9531fe24845SBarry Smith Options Database: 9541fe24845SBarry Smith . -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell 955cd7522eaSPeter Brune 956f40b411bSPeter Brune Level: intermediate 957f40b411bSPeter Brune 9581fe24845SBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions() 959f40b411bSPeter Brune @*/ 96019fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type) 961bf7f4e0aSPeter Brune { 962f1c6b773SPeter Brune PetscErrorCode ierr,(*r)(SNESLineSearch); 963bf7f4e0aSPeter Brune PetscBool match; 964bf7f4e0aSPeter Brune 965bf7f4e0aSPeter Brune PetscFunctionBegin; 966f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 967bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 968bf7f4e0aSPeter Brune 969251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 970bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 971bf7f4e0aSPeter Brune 9721c9cd337SJed Brown ierr = PetscFunctionListFind(SNESLineSearchList,type,&r);CHKERRQ(ierr); 973bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 974bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 975bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 976bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 977f5af7f23SKarl Rupp 9780298fd71SBarry Smith linesearch->ops->destroy = NULL; 979bf7f4e0aSPeter Brune } 980f1c6b773SPeter Brune /* Reinitialize function pointers in SNESLineSearchOps structure */ 981bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 982bf7f4e0aSPeter Brune linesearch->ops->view = 0; 983bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 984bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 985bf7f4e0aSPeter Brune 986bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 987bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 988bf7f4e0aSPeter Brune PetscFunctionReturn(0); 989bf7f4e0aSPeter Brune } 990bf7f4e0aSPeter Brune 991f40b411bSPeter Brune /*@ 99278bcb3b5SPeter Brune SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation. 993f40b411bSPeter Brune 994f40b411bSPeter Brune Input Parameters: 9958e557f58SPeter Brune + linesearch - linesearch context 996f40b411bSPeter Brune - snes - The snes instance 997f40b411bSPeter Brune 99878bcb3b5SPeter Brune Level: developer 99978bcb3b5SPeter Brune 100078bcb3b5SPeter Brune Notes: 1001f190f2fcSBarry Smith This happens automatically when the line search is obtained/created with 10027601faf0SJed Brown SNESGetLineSearch(). This routine is therefore mainly called within SNES 100378bcb3b5SPeter Brune implementations. 1004f40b411bSPeter Brune 10058141a3b9SPeter Brune Level: developer 1006f40b411bSPeter Brune 1007cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 1008f40b411bSPeter Brune @*/ 1009bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes) 1010bf388a1fSBarry Smith { 1011bf7f4e0aSPeter Brune PetscFunctionBegin; 1012f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1013bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 1014bf7f4e0aSPeter Brune linesearch->snes = snes; 1015bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1016bf7f4e0aSPeter Brune } 1017bf7f4e0aSPeter Brune 1018f40b411bSPeter Brune /*@ 10198141a3b9SPeter Brune SNESLineSearchGetSNES - Gets the SNES instance associated with the line search. 10208141a3b9SPeter Brune Having an associated SNES is necessary because most line search implementations must be able to 10218141a3b9SPeter Brune evaluate the function using SNESComputeFunction() for the associated SNES. This routine 10228141a3b9SPeter Brune is used in the line search implementations when one must get this associated SNES instance. 1023f40b411bSPeter Brune 1024f40b411bSPeter Brune Input Parameters: 10258e557f58SPeter Brune . linesearch - linesearch context 1026f40b411bSPeter Brune 1027f40b411bSPeter Brune Output Parameters: 1028f40b411bSPeter Brune . snes - The snes instance 1029f40b411bSPeter Brune 10308141a3b9SPeter Brune Level: developer 1031f40b411bSPeter Brune 1032cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 1033f40b411bSPeter Brune @*/ 1034bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes) 1035bf388a1fSBarry Smith { 1036bf7f4e0aSPeter Brune PetscFunctionBegin; 1037f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10386a388c36SPeter Brune PetscValidPointer(snes, 2); 1039bf7f4e0aSPeter Brune *snes = linesearch->snes; 1040bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1041bf7f4e0aSPeter Brune } 1042bf7f4e0aSPeter Brune 1043f40b411bSPeter Brune /*@ 1044f1c6b773SPeter Brune SNESLineSearchGetLambda - Gets the last linesearch steplength discovered. 1045f40b411bSPeter Brune 1046f40b411bSPeter Brune Input Parameters: 10478e557f58SPeter Brune . linesearch - linesearch context 1048f40b411bSPeter Brune 1049f40b411bSPeter Brune Output Parameters: 1050cd7522eaSPeter Brune . lambda - The last steplength computed during SNESLineSearchApply() 1051f40b411bSPeter Brune 105278bcb3b5SPeter Brune Level: advanced 105378bcb3b5SPeter Brune 10548e557f58SPeter Brune Notes: 10558e557f58SPeter Brune This is useful in methods where the solver is ill-scaled and 105678bcb3b5SPeter Brune requires some adaptive notion of the difference in scale between the 105778bcb3b5SPeter Brune solution and the function. For instance, SNESQN may be scaled by the 105878bcb3b5SPeter Brune line search lambda using the argument -snes_qn_scaling ls. 105978bcb3b5SPeter Brune 1060cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply() 1061f40b411bSPeter Brune @*/ 1062f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda) 10636a388c36SPeter Brune { 10646a388c36SPeter Brune PetscFunctionBegin; 1065f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10666a388c36SPeter Brune PetscValidPointer(lambda, 2); 10676a388c36SPeter Brune *lambda = linesearch->lambda; 10686a388c36SPeter Brune PetscFunctionReturn(0); 10696a388c36SPeter Brune } 10706a388c36SPeter Brune 1071f40b411bSPeter Brune /*@ 1072f1c6b773SPeter Brune SNESLineSearchSetLambda - Sets the linesearch steplength. 1073f40b411bSPeter Brune 1074f40b411bSPeter Brune Input Parameters: 10758e557f58SPeter Brune + linesearch - linesearch context 1076f40b411bSPeter Brune - lambda - The last steplength. 1077f40b411bSPeter Brune 1078cd7522eaSPeter Brune Notes: 1079f190f2fcSBarry Smith This routine is typically used within implementations of SNESLineSearchApply() 1080cd7522eaSPeter Brune to set the final steplength. This routine (and SNESLineSearchGetLambda()) were 1081cd7522eaSPeter Brune added in order to facilitate Quasi-Newton methods that use the previous steplength 1082cd7522eaSPeter Brune as an inner scaling parameter. 1083cd7522eaSPeter Brune 108478bcb3b5SPeter Brune Level: advanced 1085f40b411bSPeter Brune 1086f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda() 1087f40b411bSPeter Brune @*/ 1088f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda) 10896a388c36SPeter Brune { 10906a388c36SPeter Brune PetscFunctionBegin; 1091f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10926a388c36SPeter Brune linesearch->lambda = lambda; 10936a388c36SPeter Brune PetscFunctionReturn(0); 10946a388c36SPeter Brune } 10956a388c36SPeter Brune 1096f40b411bSPeter Brune /*@ 10973c7d6663SPeter Brune SNESLineSearchGetTolerances - Gets the tolerances for the linesearch. These include 109878bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 109978bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 110078bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1101f40b411bSPeter Brune 1102f40b411bSPeter Brune Input Parameters: 11038e557f58SPeter Brune . linesearch - linesearch context 1104f40b411bSPeter Brune 1105f40b411bSPeter Brune Output Parameters: 1106516fe3c3SPeter Brune + steptol - The minimum steplength 11076cc8e53bSPeter Brune . maxstep - The maximum steplength 1108516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1109516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1110516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1111516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1112f40b411bSPeter Brune 111378bcb3b5SPeter Brune Level: intermediate 111478bcb3b5SPeter Brune 111578bcb3b5SPeter Brune Notes: 111678bcb3b5SPeter Brune Different line searches may implement these parameters slightly differently as 11173c7d6663SPeter Brune the type requires. 1118516fe3c3SPeter Brune 1119f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances() 1120f40b411bSPeter Brune @*/ 1121f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 11226a388c36SPeter Brune { 11236a388c36SPeter Brune PetscFunctionBegin; 1124f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1125516fe3c3SPeter Brune if (steptol) { 11266a388c36SPeter Brune PetscValidPointer(steptol, 2); 11276a388c36SPeter Brune *steptol = linesearch->steptol; 1128516fe3c3SPeter Brune } 1129516fe3c3SPeter Brune if (maxstep) { 1130516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 1131516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 1132516fe3c3SPeter Brune } 1133516fe3c3SPeter Brune if (rtol) { 1134516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 1135516fe3c3SPeter Brune *rtol = linesearch->rtol; 1136516fe3c3SPeter Brune } 1137516fe3c3SPeter Brune if (atol) { 1138516fe3c3SPeter Brune PetscValidPointer(atol, 5); 1139516fe3c3SPeter Brune *atol = linesearch->atol; 1140516fe3c3SPeter Brune } 1141516fe3c3SPeter Brune if (ltol) { 1142516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 1143516fe3c3SPeter Brune *ltol = linesearch->ltol; 1144516fe3c3SPeter Brune } 1145516fe3c3SPeter Brune if (max_its) { 1146516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 1147516fe3c3SPeter Brune *max_its = linesearch->max_its; 1148516fe3c3SPeter Brune } 11496a388c36SPeter Brune PetscFunctionReturn(0); 11506a388c36SPeter Brune } 11516a388c36SPeter Brune 1152f40b411bSPeter Brune /*@ 11533c7d6663SPeter Brune SNESLineSearchSetTolerances - Gets the tolerances for the linesearch. These include 115478bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 115578bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 115678bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1157f40b411bSPeter Brune 1158f40b411bSPeter Brune Input Parameters: 11598e557f58SPeter Brune + linesearch - linesearch context 1160516fe3c3SPeter Brune . steptol - The minimum steplength 11616cc8e53bSPeter Brune . maxstep - The maximum steplength 1162516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1163516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1164516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1165516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1166f40b411bSPeter Brune 116778bcb3b5SPeter Brune Notes: 11683c7d6663SPeter Brune The user may choose to not set any of the tolerances using PETSC_DEFAULT in 116978bcb3b5SPeter Brune place of an argument. 1170f40b411bSPeter Brune 117178bcb3b5SPeter Brune Level: intermediate 1172516fe3c3SPeter Brune 1173f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances() 1174f40b411bSPeter Brune @*/ 1175f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 11766a388c36SPeter Brune { 11776a388c36SPeter Brune PetscFunctionBegin; 1178f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1179d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,steptol,2); 1180d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,maxstep,3); 1181d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,rtol,4); 1182d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,atol,5); 1183d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,ltol,6); 1184d3952184SSatish Balay PetscValidLogicalCollectiveInt(linesearch,max_its,7); 1185d3952184SSatish Balay 1186d3952184SSatish Balay if (steptol!= PETSC_DEFAULT) { 1187ce94432eSBarry Smith if (steptol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol); 11886a388c36SPeter Brune linesearch->steptol = steptol; 1189d3952184SSatish Balay } 1190d3952184SSatish Balay 1191d3952184SSatish Balay if (maxstep!= PETSC_DEFAULT) { 1192ce94432eSBarry Smith if (maxstep < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep); 1193516fe3c3SPeter Brune linesearch->maxstep = maxstep; 1194d3952184SSatish Balay } 1195d3952184SSatish Balay 1196d3952184SSatish Balay if (rtol != PETSC_DEFAULT) { 1197ce94432eSBarry Smith if (rtol < 0.0 || 1.0 <= rtol) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol); 1198516fe3c3SPeter Brune linesearch->rtol = rtol; 1199d3952184SSatish Balay } 1200d3952184SSatish Balay 1201d3952184SSatish Balay if (atol != PETSC_DEFAULT) { 1202ce94432eSBarry Smith if (atol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol); 1203516fe3c3SPeter Brune linesearch->atol = atol; 1204d3952184SSatish Balay } 1205d3952184SSatish Balay 1206d3952184SSatish Balay if (ltol != PETSC_DEFAULT) { 1207ce94432eSBarry Smith if (ltol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Labmda tolerance %14.12e must be non-negative",(double)ltol); 1208516fe3c3SPeter Brune linesearch->ltol = ltol; 1209d3952184SSatish Balay } 1210d3952184SSatish Balay 1211d3952184SSatish Balay if (max_its != PETSC_DEFAULT) { 1212ce94432eSBarry Smith if (max_its < 0) SETERRQ1(PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its); 1213516fe3c3SPeter Brune linesearch->max_its = max_its; 1214d3952184SSatish Balay } 12156a388c36SPeter Brune PetscFunctionReturn(0); 12166a388c36SPeter Brune } 12176a388c36SPeter Brune 1218f40b411bSPeter Brune /*@ 1219f1c6b773SPeter Brune SNESLineSearchGetDamping - Gets the line search damping parameter. 1220f40b411bSPeter Brune 1221f40b411bSPeter Brune Input Parameters: 12228e557f58SPeter Brune . linesearch - linesearch context 1223f40b411bSPeter Brune 1224f40b411bSPeter Brune Output Parameters: 12258e557f58SPeter Brune . damping - The damping parameter 1226f40b411bSPeter Brune 122778bcb3b5SPeter Brune Level: advanced 1228f40b411bSPeter Brune 122978bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN 1230f40b411bSPeter Brune @*/ 1231f40b411bSPeter Brune 1232f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping) 12336a388c36SPeter Brune { 12346a388c36SPeter Brune PetscFunctionBegin; 1235f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12366a388c36SPeter Brune PetscValidPointer(damping, 2); 12376a388c36SPeter Brune *damping = linesearch->damping; 12386a388c36SPeter Brune PetscFunctionReturn(0); 12396a388c36SPeter Brune } 12406a388c36SPeter Brune 1241f40b411bSPeter Brune /*@ 1242f1c6b773SPeter Brune SNESLineSearchSetDamping - Sets the line search damping paramter. 1243f40b411bSPeter Brune 1244f40b411bSPeter Brune Input Parameters: 124503fd4120SBarry Smith + linesearch - linesearch context 124603fd4120SBarry Smith - damping - The damping parameter 1247f40b411bSPeter Brune 124803fd4120SBarry Smith Options Database: 124903fd4120SBarry Smith . -snes_linesearch_damping 1250f40b411bSPeter Brune Level: intermediate 1251f40b411bSPeter Brune 1252cd7522eaSPeter Brune Notes: 1253cd7522eaSPeter Brune The basic line search merely takes the update step scaled by the damping parameter. 1254cd7522eaSPeter Brune The use of the damping parameter in the l2 and cp line searches is much more subtle; 125578bcb3b5SPeter Brune it is used as a starting point in calculating the secant step. However, the eventual 1256cd7522eaSPeter Brune step may be of greater length than the damping parameter. In the bt line search it is 1257cd7522eaSPeter Brune used as the maximum possible step length, as the bt line search only backtracks. 1258cd7522eaSPeter Brune 1259f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping() 1260f40b411bSPeter Brune @*/ 1261f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping) 12626a388c36SPeter Brune { 12636a388c36SPeter Brune PetscFunctionBegin; 1264f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12656a388c36SPeter Brune linesearch->damping = damping; 12666a388c36SPeter Brune PetscFunctionReturn(0); 12676a388c36SPeter Brune } 12686a388c36SPeter Brune 126959405d5eSPeter Brune /*@ 127059405d5eSPeter Brune SNESLineSearchGetOrder - Gets the line search approximation order. 127159405d5eSPeter Brune 127259405d5eSPeter Brune Input Parameters: 127378bcb3b5SPeter Brune . linesearch - linesearch context 127459405d5eSPeter Brune 127559405d5eSPeter Brune Output Parameters: 12768e557f58SPeter Brune . order - The order 127759405d5eSPeter Brune 127878bcb3b5SPeter Brune Possible Values for order: 12793c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 12803c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 12813c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 128278bcb3b5SPeter Brune 128359405d5eSPeter Brune Level: intermediate 128459405d5eSPeter Brune 128559405d5eSPeter Brune .seealso: SNESLineSearchSetOrder() 128659405d5eSPeter Brune @*/ 128759405d5eSPeter Brune 1288b000cd8dSPeter Brune PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order) 128959405d5eSPeter Brune { 129059405d5eSPeter Brune PetscFunctionBegin; 129159405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 129259405d5eSPeter Brune PetscValidPointer(order, 2); 129359405d5eSPeter Brune *order = linesearch->order; 129459405d5eSPeter Brune PetscFunctionReturn(0); 129559405d5eSPeter Brune } 129659405d5eSPeter Brune 129759405d5eSPeter Brune /*@ 12981f8196a2SJed Brown SNESLineSearchSetOrder - Sets the maximum order of the polynomial fit used in the line search 129959405d5eSPeter Brune 130059405d5eSPeter Brune Input Parameters: 130178bcb3b5SPeter Brune . linesearch - linesearch context 130278bcb3b5SPeter Brune . order - The damping parameter 130359405d5eSPeter Brune 130459405d5eSPeter Brune Level: intermediate 130559405d5eSPeter Brune 130678bcb3b5SPeter Brune Possible Values for order: 13073c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 13083c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 13093c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 131078bcb3b5SPeter Brune 131159405d5eSPeter Brune Notes: 131259405d5eSPeter Brune Variable orders are supported by the following line searches: 131378bcb3b5SPeter Brune + bt - cubic and quadratic 131478bcb3b5SPeter Brune - cp - linear and quadratic 131559405d5eSPeter Brune 13161f8196a2SJed Brown .seealso: SNESLineSearchGetOrder(), SNESLineSearchSetDamping() 131759405d5eSPeter Brune @*/ 1318b000cd8dSPeter Brune PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order) 131959405d5eSPeter Brune { 132059405d5eSPeter Brune PetscFunctionBegin; 132159405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 132259405d5eSPeter Brune linesearch->order = order; 132359405d5eSPeter Brune PetscFunctionReturn(0); 132459405d5eSPeter Brune } 132559405d5eSPeter Brune 1326f40b411bSPeter Brune /*@ 1327f1c6b773SPeter Brune SNESLineSearchGetNorms - Gets the norms for for X, Y, and F. 1328f40b411bSPeter Brune 1329f40b411bSPeter Brune Input Parameters: 133078bcb3b5SPeter Brune . linesearch - linesearch context 1331f40b411bSPeter Brune 1332f40b411bSPeter Brune Output Parameters: 1333f40b411bSPeter Brune + xnorm - The norm of the current solution 1334f40b411bSPeter Brune . fnorm - The norm of the current function 1335f40b411bSPeter Brune - ynorm - The norm of the current update 1336f40b411bSPeter Brune 1337cd7522eaSPeter Brune Notes: 1338cd7522eaSPeter Brune This function is mainly called from SNES implementations. 1339cd7522eaSPeter Brune 134078bcb3b5SPeter Brune Level: developer 1341f40b411bSPeter Brune 1342f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs() 1343f40b411bSPeter Brune @*/ 1344f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 1345bf7f4e0aSPeter Brune { 1346bf7f4e0aSPeter Brune PetscFunctionBegin; 1347f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1348f5af7f23SKarl Rupp if (xnorm) *xnorm = linesearch->xnorm; 1349f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 1350f5af7f23SKarl Rupp if (ynorm) *ynorm = linesearch->ynorm; 1351bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1352bf7f4e0aSPeter Brune } 1353bf7f4e0aSPeter Brune 1354f40b411bSPeter Brune /*@ 1355f1c6b773SPeter Brune SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 1356f40b411bSPeter Brune 1357f40b411bSPeter Brune Input Parameters: 135878bcb3b5SPeter Brune + linesearch - linesearch context 1359f40b411bSPeter Brune . xnorm - The norm of the current solution 1360f40b411bSPeter Brune . fnorm - The norm of the current function 1361f40b411bSPeter Brune - ynorm - The norm of the current update 1362f40b411bSPeter Brune 136378bcb3b5SPeter Brune Level: advanced 1364f40b411bSPeter Brune 1365f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1366f40b411bSPeter Brune @*/ 1367f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 13686a388c36SPeter Brune { 13696a388c36SPeter Brune PetscFunctionBegin; 1370f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13716a388c36SPeter Brune linesearch->xnorm = xnorm; 13726a388c36SPeter Brune linesearch->fnorm = fnorm; 13736a388c36SPeter Brune linesearch->ynorm = ynorm; 13746a388c36SPeter Brune PetscFunctionReturn(0); 13756a388c36SPeter Brune } 13766a388c36SPeter Brune 1377f40b411bSPeter Brune /*@ 1378f1c6b773SPeter Brune SNESLineSearchComputeNorms - Computes the norms of X, F, and Y. 1379f40b411bSPeter Brune 1380f40b411bSPeter Brune Input Parameters: 138178bcb3b5SPeter Brune . linesearch - linesearch context 1382f40b411bSPeter Brune 1383f40b411bSPeter Brune Options Database Keys: 13848e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 1385f40b411bSPeter Brune 1386f40b411bSPeter Brune Level: intermediate 1387f40b411bSPeter Brune 138878bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms() 1389f40b411bSPeter Brune @*/ 1390f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch) 13916a388c36SPeter Brune { 13926a388c36SPeter Brune PetscErrorCode ierr; 13939bd66eb0SPeter Brune SNES snes; 1394bf388a1fSBarry Smith 13956a388c36SPeter Brune PetscFunctionBegin; 13966a388c36SPeter Brune if (linesearch->norms) { 13979bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1398f1c6b773SPeter Brune ierr = SNESLineSearchGetSNES(linesearch, &snes);CHKERRQ(ierr); 13999bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 14009bd66eb0SPeter Brune ierr = VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 14019bd66eb0SPeter Brune ierr = (*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm);CHKERRQ(ierr); 14029bd66eb0SPeter Brune } else { 14036a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 14046a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 14056a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 14066a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 14076a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 14086a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 14096a388c36SPeter Brune } 14109bd66eb0SPeter Brune } 14116a388c36SPeter Brune PetscFunctionReturn(0); 14126a388c36SPeter Brune } 14136a388c36SPeter Brune 14146f263ca3SPeter Brune /*@ 14156f263ca3SPeter Brune SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search. 14166f263ca3SPeter Brune 14176f263ca3SPeter Brune Input Parameters: 141878bcb3b5SPeter Brune + linesearch - linesearch context 141978bcb3b5SPeter Brune - flg - indicates whether or not to compute norms 14206f263ca3SPeter Brune 14216f263ca3SPeter Brune Options Database Keys: 14221f8196a2SJed Brown . -snes_linesearch_norms <true> - Turns on/off computation of the norms for basic linesearch 14236f263ca3SPeter Brune 14246f263ca3SPeter Brune Notes: 14251f8196a2SJed Brown This is most relevant to the SNESLINESEARCHBASIC line search type since most line searches have a stopping criteria involving the norm. 14266f263ca3SPeter Brune 14276f263ca3SPeter Brune Level: intermediate 14286f263ca3SPeter Brune 14291a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC 14306f263ca3SPeter Brune @*/ 14316f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg) 14326f263ca3SPeter Brune { 14336f263ca3SPeter Brune PetscFunctionBegin; 14346f263ca3SPeter Brune linesearch->norms = flg; 14356f263ca3SPeter Brune PetscFunctionReturn(0); 14366f263ca3SPeter Brune } 14376f263ca3SPeter Brune 1438f40b411bSPeter Brune /*@ 1439f1c6b773SPeter Brune SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context 1440f40b411bSPeter Brune 1441f40b411bSPeter Brune Input Parameters: 144278bcb3b5SPeter Brune . linesearch - linesearch context 1443f40b411bSPeter Brune 1444f40b411bSPeter Brune Output Parameters: 14456232e825SPeter Brune + X - Solution vector 14466232e825SPeter Brune . F - Function vector 14476232e825SPeter Brune . Y - Search direction vector 14486232e825SPeter Brune . W - Solution work vector 14496232e825SPeter Brune - G - Function work vector 14506232e825SPeter Brune 14517bba9028SPeter Brune Notes: 14527bba9028SPeter Brune At the beginning of a line search application, X should contain a 14536232e825SPeter Brune solution and the vector F the function computed at X. At the end of the 14546232e825SPeter Brune line search application, X should contain the new solution, and F the 14556232e825SPeter Brune function evaluated at the new solution. 1456f40b411bSPeter Brune 14572a7a6963SBarry Smith These vectors are owned by the SNESLineSearch and should not be destroyed by the caller 14582a7a6963SBarry Smith 145978bcb3b5SPeter Brune Level: advanced 1460f40b411bSPeter Brune 1461f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1462f40b411bSPeter Brune @*/ 1463bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) 1464bf388a1fSBarry Smith { 14656a388c36SPeter Brune PetscFunctionBegin; 1466f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 14676a388c36SPeter Brune if (X) { 14686a388c36SPeter Brune PetscValidPointer(X, 2); 14696a388c36SPeter Brune *X = linesearch->vec_sol; 14706a388c36SPeter Brune } 14716a388c36SPeter Brune if (F) { 14726a388c36SPeter Brune PetscValidPointer(F, 3); 14736a388c36SPeter Brune *F = linesearch->vec_func; 14746a388c36SPeter Brune } 14756a388c36SPeter Brune if (Y) { 14766a388c36SPeter Brune PetscValidPointer(Y, 4); 14776a388c36SPeter Brune *Y = linesearch->vec_update; 14786a388c36SPeter Brune } 14796a388c36SPeter Brune if (W) { 14806a388c36SPeter Brune PetscValidPointer(W, 5); 14816a388c36SPeter Brune *W = linesearch->vec_sol_new; 14826a388c36SPeter Brune } 14836a388c36SPeter Brune if (G) { 14846a388c36SPeter Brune PetscValidPointer(G, 6); 14856a388c36SPeter Brune *G = linesearch->vec_func_new; 14866a388c36SPeter Brune } 14876a388c36SPeter Brune PetscFunctionReturn(0); 14886a388c36SPeter Brune } 14896a388c36SPeter Brune 1490f40b411bSPeter Brune /*@ 1491f1c6b773SPeter Brune SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context 1492f40b411bSPeter Brune 1493f40b411bSPeter Brune Input Parameters: 149478bcb3b5SPeter Brune + linesearch - linesearch context 14956232e825SPeter Brune . X - Solution vector 14966232e825SPeter Brune . F - Function vector 14976232e825SPeter Brune . Y - Search direction vector 14986232e825SPeter Brune . W - Solution work vector 14996232e825SPeter Brune - G - Function work vector 1500f40b411bSPeter Brune 150178bcb3b5SPeter Brune Level: advanced 1502f40b411bSPeter Brune 1503f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs() 1504f40b411bSPeter Brune @*/ 1505bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) 1506bf388a1fSBarry Smith { 15076a388c36SPeter Brune PetscFunctionBegin; 1508f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 15096a388c36SPeter Brune if (X) { 15106a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 15116a388c36SPeter Brune linesearch->vec_sol = X; 15126a388c36SPeter Brune } 15136a388c36SPeter Brune if (F) { 15146a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 15156a388c36SPeter Brune linesearch->vec_func = F; 15166a388c36SPeter Brune } 15176a388c36SPeter Brune if (Y) { 15186a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 15196a388c36SPeter Brune linesearch->vec_update = Y; 15206a388c36SPeter Brune } 15216a388c36SPeter Brune if (W) { 15226a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 15236a388c36SPeter Brune linesearch->vec_sol_new = W; 15246a388c36SPeter Brune } 15256a388c36SPeter Brune if (G) { 15266a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 15276a388c36SPeter Brune linesearch->vec_func_new = G; 15286a388c36SPeter Brune } 15296a388c36SPeter Brune PetscFunctionReturn(0); 15306a388c36SPeter Brune } 15316a388c36SPeter Brune 1532e7058c64SPeter Brune /*@C 1533f1c6b773SPeter Brune SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1534e7058c64SPeter Brune SNES options in the database. 1535e7058c64SPeter Brune 1536cd7522eaSPeter Brune Logically Collective on SNESLineSearch 1537e7058c64SPeter Brune 1538e7058c64SPeter Brune Input Parameters: 1539e7058c64SPeter Brune + snes - the SNES context 1540e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1541e7058c64SPeter Brune 1542e7058c64SPeter Brune Notes: 1543e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1544e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1545e7058c64SPeter Brune 1546e7058c64SPeter Brune Level: advanced 1547e7058c64SPeter Brune 1548f1c6b773SPeter Brune .keywords: SNESLineSearch, append, options, prefix, database 1549e7058c64SPeter Brune 1550e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1551e7058c64SPeter Brune @*/ 1552f1c6b773SPeter Brune PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[]) 1553e7058c64SPeter Brune { 1554e7058c64SPeter Brune PetscErrorCode ierr; 1555e7058c64SPeter Brune 1556e7058c64SPeter Brune PetscFunctionBegin; 1557f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1558e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1559e7058c64SPeter Brune PetscFunctionReturn(0); 1560e7058c64SPeter Brune } 1561e7058c64SPeter Brune 1562e7058c64SPeter Brune /*@C 1563f1c6b773SPeter Brune SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 1564f1c6b773SPeter Brune SNESLineSearch options in the database. 1565e7058c64SPeter Brune 1566e7058c64SPeter Brune Not Collective 1567e7058c64SPeter Brune 1568e7058c64SPeter Brune Input Parameter: 1569cd7522eaSPeter Brune . linesearch - the SNESLineSearch context 1570e7058c64SPeter Brune 1571e7058c64SPeter Brune Output Parameter: 1572e7058c64SPeter Brune . prefix - pointer to the prefix string used 1573e7058c64SPeter Brune 15748e557f58SPeter Brune Notes: 15758e557f58SPeter Brune On the fortran side, the user should pass in a string 'prefix' of 1576e7058c64SPeter Brune sufficient length to hold the prefix. 1577e7058c64SPeter Brune 1578e7058c64SPeter Brune Level: advanced 1579e7058c64SPeter Brune 1580f1c6b773SPeter Brune .keywords: SNESLineSearch, get, options, prefix, database 1581e7058c64SPeter Brune 1582e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1583e7058c64SPeter Brune @*/ 1584f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[]) 1585e7058c64SPeter Brune { 1586e7058c64SPeter Brune PetscErrorCode ierr; 1587e7058c64SPeter Brune 1588e7058c64SPeter Brune PetscFunctionBegin; 1589f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1590e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 1591e7058c64SPeter Brune PetscFunctionReturn(0); 1592e7058c64SPeter Brune } 1593bf7f4e0aSPeter Brune 15948d359177SBarry Smith /*@C 1595fa0ddf94SBarry Smith SNESLineSearchSetWorkVecs - Gets work vectors for the line search. 1596f40b411bSPeter Brune 1597f40b411bSPeter Brune Input Parameter: 1598f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1599f40b411bSPeter Brune - nwork - the number of work vectors 1600f40b411bSPeter Brune 1601f40b411bSPeter Brune Level: developer 1602f40b411bSPeter Brune 1603f1c6b773SPeter Brune .keywords: SNESLineSearch, work, vector 1604f40b411bSPeter Brune 1605fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs() 1606f40b411bSPeter Brune @*/ 1607fa0ddf94SBarry Smith PetscErrorCode SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork) 1608bf7f4e0aSPeter Brune { 1609bf7f4e0aSPeter Brune PetscErrorCode ierr; 1610bf388a1fSBarry Smith 1611bf7f4e0aSPeter Brune PetscFunctionBegin; 1612bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1613bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 16148d359177SBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1615bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1616bf7f4e0aSPeter Brune } 1617bf7f4e0aSPeter Brune 1618f40b411bSPeter Brune /*@ 1619422a814eSBarry Smith SNESLineSearchGetReason - Gets the success/failure status of the last line search application 1620f40b411bSPeter Brune 1621f40b411bSPeter Brune Input Parameters: 162278bcb3b5SPeter Brune . linesearch - linesearch context 1623f40b411bSPeter Brune 1624f40b411bSPeter Brune Output Parameters: 1625422a814eSBarry Smith . result - The success or failure status 1626f40b411bSPeter Brune 1627cd7522eaSPeter Brune Notes: 1628c98378a5SBarry Smith This is typically called after SNESLineSearchApply() in order to determine if the line-search failed 1629cd7522eaSPeter Brune (and set the SNES convergence accordingly). 1630cd7522eaSPeter Brune 1631f40b411bSPeter Brune Level: intermediate 1632f40b411bSPeter Brune 1633422a814eSBarry Smith .seealso: SNESLineSearchSetReason(), SNESLineSearchReason 1634f40b411bSPeter Brune @*/ 1635422a814eSBarry Smith PetscErrorCode SNESLineSearchGetReason(SNESLineSearch linesearch, SNESLineSearchReason *result) 1636bf7f4e0aSPeter Brune { 1637bf7f4e0aSPeter Brune PetscFunctionBegin; 1638f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1639422a814eSBarry Smith PetscValidPointer(result, 2); 1640422a814eSBarry Smith *result = linesearch->result; 1641bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1642bf7f4e0aSPeter Brune } 1643bf7f4e0aSPeter Brune 1644f40b411bSPeter Brune /*@ 1645422a814eSBarry Smith SNESLineSearchSetReason - Sets the success/failure status of the last line search application 1646f40b411bSPeter Brune 1647f40b411bSPeter Brune Input Parameters: 164878bcb3b5SPeter Brune + linesearch - linesearch context 1649422a814eSBarry Smith - result - The success or failure status 1650f40b411bSPeter Brune 1651cd7522eaSPeter Brune Notes: 1652cd7522eaSPeter Brune This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set 1653cd7522eaSPeter Brune the success or failure of the line search method. 1654cd7522eaSPeter Brune 165578bcb3b5SPeter Brune Level: developer 1656f40b411bSPeter Brune 1657422a814eSBarry Smith .seealso: SNESLineSearchGetSResult() 1658f40b411bSPeter Brune @*/ 1659422a814eSBarry Smith PetscErrorCode SNESLineSearchSetReason(SNESLineSearch linesearch, SNESLineSearchReason result) 16606a388c36SPeter Brune { 16616a388c36SPeter Brune PetscFunctionBegin; 16625fd66863SKarl Rupp PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1663422a814eSBarry Smith linesearch->result = result; 16646a388c36SPeter Brune PetscFunctionReturn(0); 16656a388c36SPeter Brune } 16666a388c36SPeter Brune 16679bd66eb0SPeter Brune /*@C 1668f1c6b773SPeter Brune SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 16699bd66eb0SPeter Brune 16709bd66eb0SPeter Brune Input Parameters: 16719bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 16729bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 16739bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16749bd66eb0SPeter Brune 16759bd66eb0SPeter Brune Logically Collective on SNES 16769bd66eb0SPeter Brune 16779bd66eb0SPeter Brune Calling sequence of projectfunc: 16789bd66eb0SPeter Brune .vb 16799bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 16809bd66eb0SPeter Brune .ve 16819bd66eb0SPeter Brune 16829bd66eb0SPeter Brune Input parameters for projectfunc: 16839bd66eb0SPeter Brune + snes - nonlinear context 16849bd66eb0SPeter Brune - X - current solution 16859bd66eb0SPeter Brune 1686cd7522eaSPeter Brune Output parameters for projectfunc: 16879bd66eb0SPeter Brune . X - Projected solution 16889bd66eb0SPeter Brune 16899bd66eb0SPeter Brune Calling sequence of normfunc: 16909bd66eb0SPeter Brune .vb 16919bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 16929bd66eb0SPeter Brune .ve 16939bd66eb0SPeter Brune 1694cd7522eaSPeter Brune Input parameters for normfunc: 16959bd66eb0SPeter Brune + snes - nonlinear context 16969bd66eb0SPeter Brune . X - current solution 16979bd66eb0SPeter Brune - F - current residual 16989bd66eb0SPeter Brune 1699cd7522eaSPeter Brune Output parameters for normfunc: 17009bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 17019bd66eb0SPeter Brune 1702cd7522eaSPeter Brune Notes: 1703cd7522eaSPeter Brune The VI solvers require projection of the solution to the feasible set. projectfunc should implement this. 1704cd7522eaSPeter Brune 1705cd7522eaSPeter Brune The VI solvers require special evaluation of the function norm such that the norm is only calculated 1706cd7522eaSPeter Brune on the inactive set. This should be implemented by normfunc. 17079bd66eb0SPeter Brune 17089bd66eb0SPeter Brune Level: developer 17099bd66eb0SPeter Brune 17109bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, set, line search 17119bd66eb0SPeter Brune 1712f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() 17139bd66eb0SPeter Brune @*/ 171425acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc) 17159bd66eb0SPeter Brune { 17169bd66eb0SPeter Brune PetscFunctionBegin; 1717f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 17189bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 17199bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 17209bd66eb0SPeter Brune PetscFunctionReturn(0); 17219bd66eb0SPeter Brune } 17229bd66eb0SPeter Brune 17239bd66eb0SPeter Brune /*@C 1724f1c6b773SPeter Brune SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 17259bd66eb0SPeter Brune 17269bd66eb0SPeter Brune Input Parameters: 1727907376e6SBarry Smith . linesearch - the line search context, obtain with SNESGetLineSearch() 17289bd66eb0SPeter Brune 17299bd66eb0SPeter Brune Output Parameters: 17309bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 17319bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 17329bd66eb0SPeter Brune 17339bd66eb0SPeter Brune Logically Collective on SNES 17349bd66eb0SPeter Brune 17359bd66eb0SPeter Brune Level: developer 17369bd66eb0SPeter Brune 17379bd66eb0SPeter Brune .keywords: SNES, line search, VI, nonlinear, get, line search 17389bd66eb0SPeter Brune 1739f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 17409bd66eb0SPeter Brune @*/ 174125acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc) 17429bd66eb0SPeter Brune { 17439bd66eb0SPeter Brune PetscFunctionBegin; 17449bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 17459bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 17469bd66eb0SPeter Brune PetscFunctionReturn(0); 17479bd66eb0SPeter Brune } 17489bd66eb0SPeter Brune 1749bf7f4e0aSPeter Brune /*@C 17501c84c290SBarry Smith SNESLineSearchRegister - See SNESLineSearchRegister() 1751bf7f4e0aSPeter Brune 1752bf7f4e0aSPeter Brune Level: advanced 1753bf7f4e0aSPeter Brune @*/ 1754bdf89e91SBarry Smith PetscErrorCode SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch)) 1755bf7f4e0aSPeter Brune { 1756bf7f4e0aSPeter Brune PetscErrorCode ierr; 1757bf7f4e0aSPeter Brune 1758bf7f4e0aSPeter Brune PetscFunctionBegin; 17591d36bdfdSBarry Smith ierr = SNESInitializePackage();CHKERRQ(ierr); 1760a240a19fSJed Brown ierr = PetscFunctionListAdd(&SNESLineSearchList,sname,function);CHKERRQ(ierr); 1761bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1762bf7f4e0aSPeter Brune } 1763