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 3084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorSet() 31dcf2fd19SBarry Smith @*/ 32dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitorCancel(SNESLineSearch ls) 33dcf2fd19SBarry Smith { 34dcf2fd19SBarry Smith PetscInt i; 35dcf2fd19SBarry Smith 36dcf2fd19SBarry Smith PetscFunctionBegin; 37dcf2fd19SBarry Smith PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1); 38dcf2fd19SBarry Smith for (i=0; i<ls->numbermonitors; i++) { 39dcf2fd19SBarry Smith if (ls->monitordestroy[i]) { 40*5f80ce2aSJacob Faibussowitsch CHKERRQ((*ls->monitordestroy[i])(&ls->monitorcontext[i])); 41dcf2fd19SBarry Smith } 42dcf2fd19SBarry Smith } 43dcf2fd19SBarry Smith ls->numbermonitors = 0; 44dcf2fd19SBarry Smith PetscFunctionReturn(0); 45dcf2fd19SBarry Smith } 46dcf2fd19SBarry Smith 47dcf2fd19SBarry Smith /*@ 48dcf2fd19SBarry Smith SNESLineSearchMonitor - runs the user provided monitor routines, if they exist 49dcf2fd19SBarry Smith 50dcf2fd19SBarry Smith Collective on SNES 51dcf2fd19SBarry Smith 52dcf2fd19SBarry Smith Input Parameters: 53dcf2fd19SBarry Smith . ls - the linesearch object 54dcf2fd19SBarry Smith 55dcf2fd19SBarry Smith Notes: 56dcf2fd19SBarry Smith This routine is called by the SNES implementations. 57dcf2fd19SBarry Smith It does not typically need to be called by the user. 58dcf2fd19SBarry Smith 59dcf2fd19SBarry Smith Level: developer 60dcf2fd19SBarry Smith 6184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorSet() 62dcf2fd19SBarry Smith @*/ 63dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitor(SNESLineSearch ls) 64dcf2fd19SBarry Smith { 65dcf2fd19SBarry Smith PetscInt i,n = ls->numbermonitors; 66dcf2fd19SBarry Smith 67dcf2fd19SBarry Smith PetscFunctionBegin; 68dcf2fd19SBarry Smith for (i=0; i<n; i++) { 69*5f80ce2aSJacob Faibussowitsch CHKERRQ((*ls->monitorftns[i])(ls,ls->monitorcontext[i])); 70dcf2fd19SBarry Smith } 71dcf2fd19SBarry Smith PetscFunctionReturn(0); 72dcf2fd19SBarry Smith } 73dcf2fd19SBarry Smith 74dcf2fd19SBarry Smith /*@C 75dcf2fd19SBarry Smith SNESLineSearchMonitorSet - Sets an ADDITIONAL function that is to be used at every 76dcf2fd19SBarry Smith iteration of the nonlinear solver to display the iteration's 77dcf2fd19SBarry Smith progress. 78dcf2fd19SBarry Smith 79dcf2fd19SBarry Smith Logically Collective on SNESLineSearch 80dcf2fd19SBarry Smith 81dcf2fd19SBarry Smith Input Parameters: 82dcf2fd19SBarry Smith + ls - the SNESLineSearch context 83dcf2fd19SBarry Smith . f - the monitor function 84dcf2fd19SBarry Smith . mctx - [optional] user-defined context for private data for the 85dcf2fd19SBarry Smith monitor routine (use NULL if no context is desired) 86dcf2fd19SBarry Smith - monitordestroy - [optional] routine that frees monitor context 87dcf2fd19SBarry Smith (may be NULL) 88dcf2fd19SBarry Smith 89dcf2fd19SBarry Smith Notes: 90dcf2fd19SBarry Smith Several different monitoring routines may be set by calling 91dcf2fd19SBarry Smith SNESLineSearchMonitorSet() multiple times; all will be called in the 92dcf2fd19SBarry Smith order in which they were set. 93dcf2fd19SBarry Smith 9495452b02SPatrick Sanan Fortran Notes: 9595452b02SPatrick Sanan Only a single monitor function can be set for each SNESLineSearch object 96dcf2fd19SBarry Smith 97dcf2fd19SBarry Smith Level: intermediate 98dcf2fd19SBarry Smith 9984238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchMonitorDefault(), SNESLineSearchMonitorCancel() 100dcf2fd19SBarry Smith @*/ 101dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchMonitorSet(SNESLineSearch ls,PetscErrorCode (*f)(SNESLineSearch,void*),void *mctx,PetscErrorCode (*monitordestroy)(void**)) 102dcf2fd19SBarry Smith { 10378064530SBarry Smith PetscInt i; 10478064530SBarry Smith PetscBool identical; 10578064530SBarry Smith 106dcf2fd19SBarry Smith PetscFunctionBegin; 107dcf2fd19SBarry Smith PetscValidHeaderSpecific(ls,SNESLINESEARCH_CLASSID,1); 10878064530SBarry Smith for (i=0; i<ls->numbermonitors;i++) { 109*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMonitorCompare((PetscErrorCode (*)(void))f,mctx,monitordestroy,(PetscErrorCode (*)(void))ls->monitorftns[i],ls->monitorcontext[i],ls->monitordestroy[i],&identical)); 11078064530SBarry Smith if (identical) PetscFunctionReturn(0); 11178064530SBarry Smith } 112*5f80ce2aSJacob Faibussowitsch PetscCheck(ls->numbermonitors < MAXSNESLSMONITORS,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Too many monitors set"); 113dcf2fd19SBarry Smith ls->monitorftns[ls->numbermonitors] = f; 114dcf2fd19SBarry Smith ls->monitordestroy[ls->numbermonitors] = monitordestroy; 115dcf2fd19SBarry Smith ls->monitorcontext[ls->numbermonitors++] = (void*)mctx; 116dcf2fd19SBarry Smith PetscFunctionReturn(0); 117dcf2fd19SBarry Smith } 118dcf2fd19SBarry Smith 119dcf2fd19SBarry Smith /*@C 120dcf2fd19SBarry Smith SNESLineSearchMonitorSolutionUpdate - Monitors each update a new function value the linesearch tries 121dcf2fd19SBarry Smith 122dcf2fd19SBarry Smith Collective on SNESLineSearch 123dcf2fd19SBarry Smith 124dcf2fd19SBarry Smith Input Parameters: 125dcf2fd19SBarry Smith + ls - the SNES linesearch object 126d12e167eSBarry Smith - vf - the context for the monitor, in this case it is an ASCII PetscViewer and format 127dcf2fd19SBarry Smith 128dcf2fd19SBarry Smith Level: intermediate 129dcf2fd19SBarry Smith 13084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESMonitorSet(), SNESMonitorSolution() 131dcf2fd19SBarry Smith @*/ 132d12e167eSBarry Smith PetscErrorCode SNESLineSearchMonitorSolutionUpdate(SNESLineSearch ls,PetscViewerAndFormat *vf) 133dcf2fd19SBarry Smith { 134d12e167eSBarry Smith PetscViewer viewer = vf->viewer; 135dcf2fd19SBarry Smith Vec Y,W,G; 136dcf2fd19SBarry Smith 137dcf2fd19SBarry Smith PetscFunctionBegin; 138*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchGetVecs(ls,NULL,NULL,&Y,&W,&G)); 139*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerPushFormat(viewer,vf->format)); 140*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted update to solution \n")); 141*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(Y,viewer)); 142*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted new solution \n")); 143*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(W,viewer)); 144*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"LineSearch attempted updated function value\n")); 145*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(G,viewer)); 146*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerPopFormat(viewer)); 147dcf2fd19SBarry Smith PetscFunctionReturn(0); 148dcf2fd19SBarry Smith } 149dcf2fd19SBarry Smith 150f40b411bSPeter Brune /*@ 151cd7522eaSPeter Brune SNESLineSearchCreate - Creates the line search context. 152f40b411bSPeter Brune 153cd7522eaSPeter Brune Logically Collective on Comm 154f40b411bSPeter Brune 155f40b411bSPeter Brune Input Parameters: 156cd7522eaSPeter Brune . comm - MPI communicator for the line search (typically from the associated SNES context). 157f40b411bSPeter Brune 158f40b411bSPeter Brune Output Parameters: 1598e557f58SPeter Brune . outlinesearch - the new linesearch context 160f40b411bSPeter Brune 161162e0bf5SPeter Brune Level: developer 162162e0bf5SPeter Brune 163162e0bf5SPeter Brune Notes: 164162e0bf5SPeter Brune The preferred calling sequence for users is to use SNESGetLineSearch() to acquire the SNESLineSearch instance 165162e0bf5SPeter Brune already associated with the SNES. This function is for developer use. 166f40b411bSPeter Brune 167162e0bf5SPeter Brune .seealso: LineSearchDestroy(), SNESGetLineSearch() 168f40b411bSPeter Brune @*/ 169f40b411bSPeter Brune 170bf388a1fSBarry Smith PetscErrorCode SNESLineSearchCreate(MPI_Comm comm, SNESLineSearch *outlinesearch) 171bf388a1fSBarry Smith { 172f1c6b773SPeter Brune SNESLineSearch linesearch; 173bf388a1fSBarry Smith 174bf7f4e0aSPeter Brune PetscFunctionBegin; 175ea5d4fccSPeter Brune PetscValidPointer(outlinesearch,2); 176*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESInitializePackage()); 1770298fd71SBarry Smith *outlinesearch = NULL; 178f5af7f23SKarl Rupp 179*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(linesearch,SNESLINESEARCH_CLASSID, "SNESLineSearch","Linesearch","SNESLineSearch",comm,SNESLineSearchDestroy,SNESLineSearchView)); 180bf7f4e0aSPeter Brune 1810298fd71SBarry Smith linesearch->vec_sol_new = NULL; 1820298fd71SBarry Smith linesearch->vec_func_new = NULL; 1830298fd71SBarry Smith linesearch->vec_sol = NULL; 1840298fd71SBarry Smith linesearch->vec_func = NULL; 1850298fd71SBarry Smith linesearch->vec_update = NULL; 1869bd66eb0SPeter Brune 187bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 188bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 189bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 190bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 191422a814eSBarry Smith linesearch->result = SNES_LINESEARCH_SUCCEEDED; 192bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 193bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 194bf7f4e0aSPeter Brune linesearch->damping = 1.0; 195bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 196bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 197516fe3c3SPeter Brune linesearch->rtol = 1e-8; 198516fe3c3SPeter Brune linesearch->atol = 1e-15; 199516fe3c3SPeter Brune linesearch->ltol = 1e-8; 2000298fd71SBarry Smith linesearch->precheckctx = NULL; 2010298fd71SBarry Smith linesearch->postcheckctx = NULL; 20259405d5eSPeter Brune linesearch->max_its = 1; 203bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 2043add74b1SBarry Smith linesearch->monitor = NULL; 205bf7f4e0aSPeter Brune *outlinesearch = linesearch; 206bf7f4e0aSPeter Brune PetscFunctionReturn(0); 207bf7f4e0aSPeter Brune } 208bf7f4e0aSPeter Brune 209f40b411bSPeter Brune /*@ 21078bcb3b5SPeter Brune SNESLineSearchSetUp - Prepares the line search for being applied by allocating 21178bcb3b5SPeter Brune any required vectors. 212f40b411bSPeter Brune 213cd7522eaSPeter Brune Collective on SNESLineSearch 214f40b411bSPeter Brune 215f40b411bSPeter Brune Input Parameters: 216f40b411bSPeter Brune . linesearch - The LineSearch instance. 217f40b411bSPeter Brune 218cd7522eaSPeter Brune Notes: 219f190f2fcSBarry Smith For most cases, this needn't be called by users or outside of SNESLineSearchApply(). 220cd7522eaSPeter Brune The only current case where this is called outside of this is for the VI 22178bcb3b5SPeter Brune solvers, which modify the solution and work vectors before the first call 222cd7522eaSPeter Brune of SNESLineSearchApply, requiring the SNESLineSearch work vectors to be 223cd7522eaSPeter Brune allocated upfront. 224cd7522eaSPeter Brune 22578bcb3b5SPeter Brune Level: advanced 226f40b411bSPeter Brune 22784238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchReset() 228f40b411bSPeter Brune @*/ 229f40b411bSPeter Brune 230bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetUp(SNESLineSearch linesearch) 231bf388a1fSBarry Smith { 232bf7f4e0aSPeter Brune PetscFunctionBegin; 233bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 234*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC)); 235bf7f4e0aSPeter Brune } 236bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 2379bd66eb0SPeter Brune if (!linesearch->vec_sol_new) { 238*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new)); 2399bd66eb0SPeter Brune } 2409bd66eb0SPeter Brune if (!linesearch->vec_func_new) { 241*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(linesearch->vec_sol, &linesearch->vec_func_new)); 2429bd66eb0SPeter Brune } 243bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 244*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->setup)(linesearch)); 245bf7f4e0aSPeter Brune } 246*5f80ce2aSJacob Faibussowitsch if (!linesearch->ops->snesfunc) CHKERRQ(SNESLineSearchSetFunction(linesearch,SNESComputeFunction)); 247bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 248bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 249bf7f4e0aSPeter Brune } 250bf7f4e0aSPeter Brune PetscFunctionReturn(0); 251bf7f4e0aSPeter Brune } 252bf7f4e0aSPeter Brune 253f40b411bSPeter Brune /*@ 254f190f2fcSBarry Smith SNESLineSearchReset - Undoes the SNESLineSearchSetUp() and deletes any Vecs or Mats allocated by the line search. 255f40b411bSPeter Brune 256f1c6b773SPeter Brune Collective on SNESLineSearch 257f40b411bSPeter Brune 258f40b411bSPeter Brune Input Parameters: 259f40b411bSPeter Brune . linesearch - The LineSearch instance. 260f40b411bSPeter Brune 26195452b02SPatrick Sanan Notes: 26295452b02SPatrick Sanan Usually only called by SNESReset() 263f190f2fcSBarry Smith 264f190f2fcSBarry Smith Level: developer 265f40b411bSPeter Brune 26684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetUp() 267f40b411bSPeter Brune @*/ 268f40b411bSPeter Brune 269bf388a1fSBarry Smith PetscErrorCode SNESLineSearchReset(SNESLineSearch linesearch) 270bf388a1fSBarry Smith { 271bf7f4e0aSPeter Brune PetscFunctionBegin; 272*5f80ce2aSJacob Faibussowitsch if (linesearch->ops->reset) CHKERRQ((*linesearch->ops->reset)(linesearch)); 273f5af7f23SKarl Rupp 274*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&linesearch->vec_sol_new)); 275*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&linesearch->vec_func_new)); 276bf7f4e0aSPeter Brune 277*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroyVecs(linesearch->nwork, &linesearch->work)); 278f5af7f23SKarl Rupp 279bf7f4e0aSPeter Brune linesearch->nwork = 0; 280bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 281bf7f4e0aSPeter Brune PetscFunctionReturn(0); 282bf7f4e0aSPeter Brune } 283bf7f4e0aSPeter Brune 284ed07d7d7SPeter Brune /*@C 285f190f2fcSBarry Smith SNESLineSearchSetFunction - Sets the function evaluation used by the SNES line search 286ed07d7d7SPeter Brune 287ed07d7d7SPeter Brune Input Parameters: 288ed07d7d7SPeter Brune . linesearch - the SNESLineSearch context 289f190f2fcSBarry Smith + func - function evaluation routine 290ed07d7d7SPeter Brune 291ed07d7d7SPeter Brune Level: developer 292ed07d7d7SPeter Brune 29395452b02SPatrick Sanan Notes: 29495452b02SPatrick Sanan This is used internally by PETSc and not called by users 295f190f2fcSBarry Smith 29684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESSetFunction() 297ed07d7d7SPeter Brune @*/ 298ed07d7d7SPeter Brune PetscErrorCode SNESLineSearchSetFunction(SNESLineSearch linesearch, PetscErrorCode (*func)(SNES,Vec,Vec)) 299ed07d7d7SPeter Brune { 300ed07d7d7SPeter Brune PetscFunctionBegin; 301ed07d7d7SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 302ed07d7d7SPeter Brune linesearch->ops->snesfunc = func; 303ed07d7d7SPeter Brune PetscFunctionReturn(0); 304ed07d7d7SPeter Brune } 305ed07d7d7SPeter Brune 30686d74e61SPeter Brune /*@C 307f190f2fcSBarry Smith SNESLineSearchSetPreCheck - Sets a user function that is called after the initial search direction has been computed but 308df3898eeSBarry Smith before the line search routine has been applied. Allows the user to adjust the result of (usually a linear solve) that 309f190f2fcSBarry Smith determined the search direction. 31086d74e61SPeter Brune 311f1c6b773SPeter Brune Logically Collective on SNESLineSearch 31286d74e61SPeter Brune 31386d74e61SPeter Brune Input Parameters: 314f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 31584238204SBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for the calling sequence 316f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 31786d74e61SPeter Brune 31886d74e61SPeter Brune Level: intermediate 31986d74e61SPeter Brune 32084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 32186d74e61SPeter Brune @*/ 322f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPreCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void *ctx) 32386d74e61SPeter Brune { 3249bd66eb0SPeter Brune PetscFunctionBegin; 325f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 326f190f2fcSBarry Smith if (func) linesearch->ops->precheck = func; 32786d74e61SPeter Brune if (ctx) linesearch->precheckctx = ctx; 32886d74e61SPeter Brune PetscFunctionReturn(0); 32986d74e61SPeter Brune } 33086d74e61SPeter Brune 33186d74e61SPeter Brune /*@C 33253deb899SBarry Smith SNESLineSearchGetPreCheck - Gets the pre-check function for the line search routine. 33386d74e61SPeter Brune 334f899ff85SJose E. Roman Input Parameter: 335f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 33686d74e61SPeter Brune 33786d74e61SPeter Brune Output Parameters: 33884238204SBarry Smith + func - [optional] function evaluation routine, see SNESLineSearchPreCheck() for 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 34384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchSetPostCheck() 34486d74e61SPeter Brune @*/ 345f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPreCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,PetscBool*,void*),void **ctx) 34686d74e61SPeter Brune { 3479bd66eb0SPeter Brune PetscFunctionBegin; 348f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 349f190f2fcSBarry Smith if (func) *func = linesearch->ops->precheck; 35086d74e61SPeter Brune if (ctx) *ctx = linesearch->precheckctx; 35186d74e61SPeter Brune PetscFunctionReturn(0); 35286d74e61SPeter Brune } 35386d74e61SPeter Brune 35486d74e61SPeter Brune /*@C 355f190f2fcSBarry Smith SNESLineSearchSetPostCheck - Sets a user function that is called after the line search has been applied to determine the step 356f190f2fcSBarry Smith direction and length. Allows the user a chance to change or override the decision of the line search routine 35786d74e61SPeter Brune 358f1c6b773SPeter Brune Logically Collective on SNESLineSearch 35986d74e61SPeter Brune 36086d74e61SPeter Brune Input Parameters: 361f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 36284238204SBarry Smith . func - [optional] function evaluation routine, see SNESLineSearchPostCheck() for the calling sequence 363f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 36486d74e61SPeter Brune 36586d74e61SPeter Brune Level: intermediate 36686d74e61SPeter Brune 36784238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchGetPostCheck() 36886d74e61SPeter Brune @*/ 369f190f2fcSBarry Smith PetscErrorCode SNESLineSearchSetPostCheck(SNESLineSearch linesearch, PetscErrorCode (*func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx) 37086d74e61SPeter Brune { 37186d74e61SPeter Brune PetscFunctionBegin; 372f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 373f190f2fcSBarry Smith if (func) linesearch->ops->postcheck = func; 37486d74e61SPeter Brune if (ctx) linesearch->postcheckctx = ctx; 37586d74e61SPeter Brune PetscFunctionReturn(0); 37686d74e61SPeter Brune } 37786d74e61SPeter Brune 37886d74e61SPeter Brune /*@C 379f1c6b773SPeter Brune SNESLineSearchGetPostCheck - Gets the post-check function for the line search routine. 38086d74e61SPeter Brune 381f899ff85SJose E. Roman Input Parameter: 382f1c6b773SPeter Brune . linesearch - the SNESLineSearch context 38386d74e61SPeter Brune 38486d74e61SPeter Brune Output Parameters: 38584238204SBarry Smith + func - [optional] function evaluation routine, see for the calling sequence SNESLineSearchPostCheck() 386f190f2fcSBarry Smith - ctx - [optional] user-defined context for private data for the function evaluation routine (may be NULL) 38786d74e61SPeter Brune 38886d74e61SPeter Brune Level: intermediate 38986d74e61SPeter Brune 39084238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck() 39186d74e61SPeter Brune @*/ 392f190f2fcSBarry Smith PetscErrorCode SNESLineSearchGetPostCheck(SNESLineSearch linesearch, PetscErrorCode (**func)(SNESLineSearch,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void **ctx) 39386d74e61SPeter Brune { 3949bd66eb0SPeter Brune PetscFunctionBegin; 395f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 396f190f2fcSBarry Smith if (func) *func = linesearch->ops->postcheck; 39786d74e61SPeter Brune if (ctx) *ctx = linesearch->postcheckctx; 39886d74e61SPeter Brune PetscFunctionReturn(0); 39986d74e61SPeter Brune } 40086d74e61SPeter Brune 401f40b411bSPeter Brune /*@ 402f1c6b773SPeter Brune SNESLineSearchPreCheck - Prepares the line search for being applied. 403f40b411bSPeter Brune 404cd7522eaSPeter Brune Logically Collective on SNESLineSearch 405f40b411bSPeter Brune 406f40b411bSPeter Brune Input Parameters: 4077b1df9c1SPeter Brune + linesearch - The linesearch instance. 4087b1df9c1SPeter Brune . X - The current solution 4097b1df9c1SPeter Brune - Y - The step direction 410f40b411bSPeter Brune 411f40b411bSPeter Brune Output Parameters: 4128e557f58SPeter Brune . changed - Indicator that the precheck routine has changed anything 413f40b411bSPeter Brune 414f190f2fcSBarry Smith Level: developer 415f40b411bSPeter Brune 41684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPostCheck(), SNESLineSearchSetPreCheck(), SNESLineSearchGetPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck() 417f40b411bSPeter Brune @*/ 4187b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPreCheck(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed) 419bf7f4e0aSPeter Brune { 420bf7f4e0aSPeter Brune PetscFunctionBegin; 421bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 4226b2b7091SBarry Smith if (linesearch->ops->precheck) { 423*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->precheck)(linesearch, X, Y, changed, linesearch->precheckctx)); 42438bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed,4); 425bf7f4e0aSPeter Brune } 426bf7f4e0aSPeter Brune PetscFunctionReturn(0); 427bf7f4e0aSPeter Brune } 428bf7f4e0aSPeter Brune 429f40b411bSPeter Brune /*@ 430f1c6b773SPeter Brune SNESLineSearchPostCheck - Prepares the line search for being applied. 431f40b411bSPeter Brune 432cd7522eaSPeter Brune Logically Collective on SNESLineSearch 433f40b411bSPeter Brune 434f40b411bSPeter Brune Input Parameters: 4357b1df9c1SPeter Brune + linesearch - The linesearch context 4367b1df9c1SPeter Brune . X - The last solution 4377b1df9c1SPeter Brune . Y - The step direction 4387b1df9c1SPeter Brune - W - The updated solution, W = X + lambda*Y for some lambda 439f40b411bSPeter Brune 440f40b411bSPeter Brune Output Parameters: 44178bcb3b5SPeter Brune + changed_Y - Indicator if the direction Y has been changed. 44278bcb3b5SPeter Brune - changed_W - Indicator if the new candidate solution W has been changed. 443f40b411bSPeter Brune 444f190f2fcSBarry Smith Level: developer 445f40b411bSPeter Brune 44684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchPreCheck(), SNESLineSearchSetPostCheck(), SNESLineSearchGetPostCheck(), SNESLineSearchSetPrecheck(), SNESLineSearchGetPrecheck() 447f40b411bSPeter Brune @*/ 4487b1df9c1SPeter Brune PetscErrorCode SNESLineSearchPostCheck(SNESLineSearch linesearch,Vec X,Vec Y,Vec W,PetscBool *changed_Y,PetscBool *changed_W) 449bf7f4e0aSPeter Brune { 450bf7f4e0aSPeter Brune PetscFunctionBegin; 451bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 452bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 4536b2b7091SBarry Smith if (linesearch->ops->postcheck) { 454*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->postcheck)(linesearch,X,Y,W,changed_Y,changed_W,linesearch->postcheckctx)); 45538bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_Y,5); 45638bcdd5aSPeter Brune PetscValidLogicalCollectiveBool(linesearch,*changed_W,6); 45786d74e61SPeter Brune } 45886d74e61SPeter Brune PetscFunctionReturn(0); 45986d74e61SPeter Brune } 46086d74e61SPeter Brune 46186d74e61SPeter Brune /*@C 46286d74e61SPeter Brune SNESLineSearchPreCheckPicard - Implements a correction that is sometimes useful to improve the convergence rate of Picard iteration 46386d74e61SPeter Brune 464cd7522eaSPeter Brune Logically Collective on SNESLineSearch 46586d74e61SPeter Brune 4664165533cSJose E. Roman Input Parameters: 46786d74e61SPeter Brune + linesearch - linesearch context 46886d74e61SPeter Brune . X - base state for this step 469907376e6SBarry Smith - ctx - context for this function 47086d74e61SPeter Brune 47197bb3fdcSJose E. Roman Input/Output Parameter: 47297bb3fdcSJose E. Roman . Y - correction, possibly modified 47397bb3fdcSJose E. Roman 47497bb3fdcSJose E. Roman Output Parameter: 47597bb3fdcSJose E. Roman . changed - flag indicating that Y was modified 47686d74e61SPeter Brune 47786d74e61SPeter Brune Options Database Key: 478cd7522eaSPeter Brune + -snes_linesearch_precheck_picard - activate this routine 479cd7522eaSPeter Brune - -snes_linesearch_precheck_picard_angle - angle 48086d74e61SPeter Brune 48186d74e61SPeter Brune Level: advanced 48286d74e61SPeter Brune 48386d74e61SPeter Brune Notes: 48486d74e61SPeter Brune This function should be passed to SNESLineSearchSetPreCheck() 48586d74e61SPeter Brune 48686d74e61SPeter Brune The justification for this method involves the linear convergence of a Picard iteration 48786d74e61SPeter Brune so the Picard linearization should be provided in place of the "Jacobian". This correction 48886d74e61SPeter Brune is generally not useful when using a Newton linearization. 48986d74e61SPeter Brune 49086d74e61SPeter Brune Reference: 49186d74e61SPeter Brune Hindmarsh and Payne (1996) Time step limits for stable solutions of the ice sheet equation, Annals of Glaciology. 49286d74e61SPeter Brune 49384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetPreCheck() 49486d74e61SPeter Brune @*/ 495f1c6b773SPeter Brune PetscErrorCode SNESLineSearchPreCheckPicard(SNESLineSearch linesearch,Vec X,Vec Y,PetscBool *changed,void *ctx) 49686d74e61SPeter Brune { 49786d74e61SPeter Brune PetscReal angle = *(PetscReal*)linesearch->precheckctx; 49886d74e61SPeter Brune Vec Ylast; 49986d74e61SPeter Brune PetscScalar dot; 50086d74e61SPeter Brune PetscInt iter; 50186d74e61SPeter Brune PetscReal ynorm,ylastnorm,theta,angle_radians; 50286d74e61SPeter Brune SNES snes; 50386d74e61SPeter Brune 50486d74e61SPeter Brune PetscFunctionBegin; 505*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchGetSNES(linesearch, &snes)); 506*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject*)&Ylast)); 50786d74e61SPeter Brune if (!Ylast) { 508*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(Y,&Ylast)); 509*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectCompose((PetscObject)snes,"SNESLineSearchPreCheckPicard_Ylast",(PetscObject)Ylast)); 510*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectDereference((PetscObject)Ylast)); 51186d74e61SPeter Brune } 512*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESGetIterationNumber(snes,&iter)); 51386d74e61SPeter Brune if (iter < 2) { 514*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(Y,Ylast)); 51586d74e61SPeter Brune *changed = PETSC_FALSE; 51686d74e61SPeter Brune PetscFunctionReturn(0); 51786d74e61SPeter Brune } 51886d74e61SPeter Brune 519*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDot(Y,Ylast,&dot)); 520*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Y,NORM_2,&ynorm)); 521*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ylast,NORM_2,&ylastnorm)); 52286d74e61SPeter Brune /* Compute the angle between the vectors Y and Ylast, clip to keep inside the domain of acos() */ 523255453a1SBarry Smith theta = PetscAcosReal((PetscReal)PetscClipInterval(PetscAbsScalar(dot) / (ynorm * ylastnorm),-1.0,1.0)); 52486d74e61SPeter Brune angle_radians = angle * PETSC_PI / 180.; 52586d74e61SPeter Brune if (PetscAbsReal(theta) < angle_radians || PetscAbsReal(theta - PETSC_PI) < angle_radians) { 52686d74e61SPeter Brune /* Modify the step Y */ 52786d74e61SPeter Brune PetscReal alpha,ydiffnorm; 528*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecAXPY(Ylast,-1.0,Y)); 529*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(Ylast,NORM_2,&ydiffnorm)); 530f85e2ce2SBarry Smith alpha = (ydiffnorm > .001*ylastnorm) ? ylastnorm / ydiffnorm : 1000.0; 531*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(Y,Ylast)); 532*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecScale(Y,alpha)); 533*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(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)); 534a47ec85fSBarry Smith *changed = PETSC_TRUE; 53586d74e61SPeter Brune } else { 536*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(snes,"Angle %14.12e degrees exceeds threshold %14.12e, no correction applied\n",(double)(theta*180./PETSC_PI),(double)angle)); 537*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(Y,Ylast)); 53886d74e61SPeter Brune *changed = PETSC_FALSE; 539bf7f4e0aSPeter Brune } 540bf7f4e0aSPeter Brune PetscFunctionReturn(0); 541bf7f4e0aSPeter Brune } 542bf7f4e0aSPeter Brune 543f40b411bSPeter Brune /*@ 544cd7522eaSPeter Brune SNESLineSearchApply - Computes the line-search update. 545f40b411bSPeter Brune 546f1c6b773SPeter Brune Collective on SNESLineSearch 547f40b411bSPeter Brune 548f40b411bSPeter Brune Input Parameters: 5498e557f58SPeter Brune + linesearch - The linesearch context 5508e557f58SPeter Brune - Y - The search direction 551f40b411bSPeter Brune 5526b867d5aSJose E. Roman Input/Output Parameters: 5536b867d5aSJose E. Roman + X - The current solution, on output the new solution 5546b867d5aSJose E. Roman . F - The current function, on output the new function 5556b867d5aSJose E. Roman - fnorm - The current norm, on output the new function norm 556f40b411bSPeter Brune 557cd7522eaSPeter Brune Options Database Keys: 558d4c6564cSPatrick Farrell + -snes_linesearch_type - basic, bt, l2, cp, nleqerr, shell 559dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches 5601fe24845SBarry Smith . -snes_linesearch_damping - The linesearch damping parameter, default is 1.0 (no damping) 5611fe24845SBarry Smith . -snes_linesearch_norms - Turn on/off the linesearch norms computation (SNESLineSearchSetComputeNorms()) 5623c7d6663SPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess 5633c7d6663SPeter Brune - -snes_linesearch_max_it - The number of iterations for iterative line searches 564cd7522eaSPeter Brune 565cd7522eaSPeter Brune Notes: 566cd7522eaSPeter Brune This is typically called from within a SNESSolve() implementation in order to 567cd7522eaSPeter Brune help with convergence of the nonlinear method. Various SNES types use line searches 568cd7522eaSPeter Brune in different ways, but the overarching theme is that a line search is used to determine 569cd7522eaSPeter Brune an optimal damping parameter of a step at each iteration of the method. Each 57084238204SBarry Smith application of the line search may invoke SNESComputeFunction() several times, and 571cd7522eaSPeter Brune therefore may be fairly expensive. 572cd7522eaSPeter Brune 573f40b411bSPeter Brune Level: Intermediate 574f40b411bSPeter Brune 57584238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchPreCheck(), SNESLineSearchPostCheck(), SNESSolve(), SNESComputeFunction(), SNESLineSearchSetComputeNorms(), 5761fe24845SBarry Smith SNESLineSearchType, SNESLineSearchSetType() 577f40b411bSPeter Brune @*/ 578bf388a1fSBarry Smith PetscErrorCode SNESLineSearchApply(SNESLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) 579bf388a1fSBarry Smith { 580bf388a1fSBarry Smith PetscFunctionBegin; 581f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 582bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 583bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 584064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(Y,VEC_CLASSID,5); 585bf7f4e0aSPeter Brune 586422a814eSBarry Smith linesearch->result = SNES_LINESEARCH_SUCCEEDED; 587bf7f4e0aSPeter Brune 588bf7f4e0aSPeter Brune linesearch->vec_sol = X; 589bf7f4e0aSPeter Brune linesearch->vec_update = Y; 590bf7f4e0aSPeter Brune linesearch->vec_func = F; 591bf7f4e0aSPeter Brune 592*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetUp(linesearch)); 593bf7f4e0aSPeter Brune 594f5af7f23SKarl Rupp if (!linesearch->keeplambda) linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 595bf7f4e0aSPeter Brune 596f5af7f23SKarl Rupp if (fnorm) linesearch->fnorm = *fnorm; 597f5af7f23SKarl Rupp else { 598*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(F, NORM_2, &linesearch->fnorm)); 599bf7f4e0aSPeter Brune } 600bf7f4e0aSPeter Brune 601*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventBegin(SNESLINESEARCH_Apply,linesearch,X,F,Y)); 602bf7f4e0aSPeter Brune 603*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->apply)(linesearch)); 604bf7f4e0aSPeter Brune 605*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(SNESLINESEARCH_Apply,linesearch,X,F,Y)); 606bf7f4e0aSPeter Brune 607f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 608bf7f4e0aSPeter Brune PetscFunctionReturn(0); 609bf7f4e0aSPeter Brune } 610bf7f4e0aSPeter Brune 611f40b411bSPeter Brune /*@ 612f1c6b773SPeter Brune SNESLineSearchDestroy - Destroys the line search instance. 613f40b411bSPeter Brune 614f1c6b773SPeter Brune Collective on SNESLineSearch 615f40b411bSPeter Brune 616f40b411bSPeter Brune Input Parameters: 6178e557f58SPeter Brune . linesearch - The linesearch context 618f40b411bSPeter Brune 61984238204SBarry Smith Level: developer 620f40b411bSPeter Brune 62184238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchCreate(), SNESLineSearchReset(), SNESDestroy() 622f40b411bSPeter Brune @*/ 623bf388a1fSBarry Smith PetscErrorCode SNESLineSearchDestroy(SNESLineSearch * linesearch) 624bf388a1fSBarry Smith { 625bf7f4e0aSPeter Brune PetscFunctionBegin; 626bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 627f1c6b773SPeter Brune PetscValidHeaderSpecific((*linesearch),SNESLINESEARCH_CLASSID,1); 6289e5d0892SLisandro Dalcin if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = NULL; PetscFunctionReturn(0);} 629*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSAWsViewOff((PetscObject)*linesearch)); 630*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchReset(*linesearch)); 631f5af7f23SKarl Rupp if ((*linesearch)->ops->destroy) (*linesearch)->ops->destroy(*linesearch); 632*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&(*linesearch)->monitor)); 633*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchMonitorCancel((*linesearch))); 634*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(linesearch)); 635bf7f4e0aSPeter Brune PetscFunctionReturn(0); 636bf7f4e0aSPeter Brune } 637bf7f4e0aSPeter Brune 638f40b411bSPeter Brune /*@ 639dcf2fd19SBarry Smith SNESLineSearchSetDefaultMonitor - Turns on/off printing useful information and debugging output about the line search. 640bf7f4e0aSPeter Brune 641bf7f4e0aSPeter Brune Input Parameters: 642dcf2fd19SBarry Smith + linesearch - the linesearch object 643dcf2fd19SBarry Smith - viewer - an ASCII PetscViewer or NULL to turn off monitor 644bf7f4e0aSPeter Brune 645dcf2fd19SBarry Smith Logically Collective on SNESLineSearch 646bf7f4e0aSPeter Brune 647bf7f4e0aSPeter Brune Options Database: 648dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - enables the monitor 649bf7f4e0aSPeter Brune 650bf7f4e0aSPeter Brune Level: intermediate 651bf7f4e0aSPeter Brune 652dcf2fd19SBarry Smith Developer Note: This monitor is implemented differently than the other SNESLineSearchMonitors that are set with 653d12e167eSBarry Smith SNESLineSearchMonitorSet() since it is called in many locations of the line search routines to display aspects of the 654d12e167eSBarry Smith line search that are not visible to the other monitors. 655dcf2fd19SBarry Smith 65684238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchGetDefaultMonitor(), PetscViewer, SNESLineSearchSetMonitor() 657bf7f4e0aSPeter Brune @*/ 658dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchSetDefaultMonitor(SNESLineSearch linesearch, PetscViewer viewer) 659bf7f4e0aSPeter Brune { 660bf7f4e0aSPeter Brune PetscFunctionBegin; 661*5f80ce2aSJacob Faibussowitsch if (viewer) CHKERRQ(PetscObjectReference((PetscObject)viewer)); 662*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&linesearch->monitor)); 663dcf2fd19SBarry Smith linesearch->monitor = viewer; 664bf7f4e0aSPeter Brune PetscFunctionReturn(0); 665bf7f4e0aSPeter Brune } 666bf7f4e0aSPeter Brune 667f40b411bSPeter Brune /*@ 668dcf2fd19SBarry Smith SNESLineSearchGetDefaultMonitor - Gets the PetscViewer instance for the line search monitor. 6696a388c36SPeter Brune 670f190f2fcSBarry Smith Input Parameter: 6718e557f58SPeter Brune . linesearch - linesearch context 672f40b411bSPeter Brune 673f190f2fcSBarry Smith Output Parameter: 6748e557f58SPeter Brune . monitor - monitor context 675f40b411bSPeter Brune 676f40b411bSPeter Brune Logically Collective on SNES 677f40b411bSPeter Brune 678f40b411bSPeter Brune Options Database Keys: 6798e557f58SPeter Brune . -snes_linesearch_monitor - enables the monitor 680f40b411bSPeter Brune 681f40b411bSPeter Brune Level: intermediate 682f40b411bSPeter Brune 68384238204SBarry Smith .seealso: SNESGetLineSearch(), SNESLineSearchSetDefaultMonitor(), PetscViewer 684f40b411bSPeter Brune @*/ 685dcf2fd19SBarry Smith PetscErrorCode SNESLineSearchGetDefaultMonitor(SNESLineSearch linesearch, PetscViewer *monitor) 6866a388c36SPeter Brune { 6876a388c36SPeter Brune PetscFunctionBegin; 688f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 6896a388c36SPeter Brune *monitor = linesearch->monitor; 6906a388c36SPeter Brune PetscFunctionReturn(0); 6916a388c36SPeter Brune } 6926a388c36SPeter Brune 693dcf2fd19SBarry Smith /*@C 694dcf2fd19SBarry Smith SNESLineSearchMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user 695dcf2fd19SBarry Smith 696dcf2fd19SBarry Smith Collective on SNESLineSearch 697dcf2fd19SBarry Smith 698dcf2fd19SBarry Smith Input Parameters: 699dcf2fd19SBarry Smith + ls - LineSearch object you wish to monitor 700dcf2fd19SBarry Smith . name - the monitor type one is seeking 701dcf2fd19SBarry Smith . help - message indicating what monitoring is done 702dcf2fd19SBarry Smith . manual - manual page for the monitor 703dcf2fd19SBarry Smith . monitor - the monitor function 704dcf2fd19SBarry 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 705dcf2fd19SBarry Smith 706dcf2fd19SBarry Smith Level: developer 707dcf2fd19SBarry Smith 708dcf2fd19SBarry Smith .seealso: PetscOptionsGetViewer(), PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 709dcf2fd19SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 710dcf2fd19SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 711dcf2fd19SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 712dcf2fd19SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 713dcf2fd19SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 714dcf2fd19SBarry Smith PetscOptionsFList(), PetscOptionsEList() 715dcf2fd19SBarry Smith @*/ 716d12e167eSBarry Smith PetscErrorCode SNESLineSearchMonitorSetFromOptions(SNESLineSearch ls,const char name[],const char help[], const char manual[],PetscErrorCode (*monitor)(SNESLineSearch,PetscViewerAndFormat*),PetscErrorCode (*monitorsetup)(SNESLineSearch,PetscViewerAndFormat*)) 717dcf2fd19SBarry Smith { 718dcf2fd19SBarry Smith PetscViewer viewer; 719dcf2fd19SBarry Smith PetscViewerFormat format; 720dcf2fd19SBarry Smith PetscBool flg; 721dcf2fd19SBarry Smith 722dcf2fd19SBarry Smith PetscFunctionBegin; 723*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetViewer(PetscObjectComm((PetscObject)ls),((PetscObject) ls)->options,((PetscObject)ls)->prefix,name,&viewer,&format,&flg)); 724dcf2fd19SBarry Smith if (flg) { 725d12e167eSBarry Smith PetscViewerAndFormat *vf; 726*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerAndFormatCreate(viewer,format,&vf)); 727*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectDereference((PetscObject)viewer)); 728dcf2fd19SBarry Smith if (monitorsetup) { 729*5f80ce2aSJacob Faibussowitsch CHKERRQ((*monitorsetup)(ls,vf)); 730dcf2fd19SBarry Smith } 731*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchMonitorSet(ls,(PetscErrorCode (*)(SNESLineSearch,void*))monitor,vf,(PetscErrorCode (*)(void**))PetscViewerAndFormatDestroy)); 732dcf2fd19SBarry Smith } 733dcf2fd19SBarry Smith PetscFunctionReturn(0); 734dcf2fd19SBarry Smith } 735dcf2fd19SBarry Smith 736f40b411bSPeter Brune /*@ 737f1c6b773SPeter Brune SNESLineSearchSetFromOptions - Sets options for the line search 738f40b411bSPeter Brune 739f899ff85SJose E. Roman Input Parameter: 7408e557f58SPeter Brune . linesearch - linesearch context 741f40b411bSPeter Brune 742f40b411bSPeter Brune Options Database Keys: 743d4c6564cSPatrick Farrell + -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell 7443c7d6663SPeter Brune . -snes_linesearch_order <order> - 1, 2, 3. Most types only support certain orders (bt supports 2 or 3) 7451fe24845SBarry Smith . -snes_linesearch_norms - Turn on/off the linesearch norms for the basic linesearch typem (SNESLineSearchSetComputeNorms()) 74671eef1aeSPeter Brune . -snes_linesearch_minlambda - The minimum step length 7471a9b3a06SPeter Brune . -snes_linesearch_maxstep - The maximum step size 7481a9b3a06SPeter Brune . -snes_linesearch_rtol - Relative tolerance for iterative line searches 7491a9b3a06SPeter Brune . -snes_linesearch_atol - Absolute tolerance for iterative line searches 7501a9b3a06SPeter Brune . -snes_linesearch_ltol - Change in lambda tolerance for iterative line searches 7511a9b3a06SPeter Brune . -snes_linesearch_max_it - The number of iterations for iterative line searches 752dcf2fd19SBarry Smith . -snes_linesearch_monitor [:filename] - Print progress of line searches 753dcf2fd19SBarry Smith . -snes_linesearch_monitor_solution_update [viewer:filename:format] - view each update tried by line search routine 7548e557f58SPeter Brune . -snes_linesearch_damping - The linesearch damping parameter 755cd7522eaSPeter Brune . -snes_linesearch_keeplambda - Keep the previous search length as the initial guess. 7561a9b3a06SPeter Brune . -snes_linesearch_precheck_picard - Use precheck that speeds up convergence of picard method 757d8d34be6SBarry Smith - -snes_linesearch_precheck_picard_angle - Angle used in Picard precheck method 758f40b411bSPeter Brune 759f1c6b773SPeter Brune Logically Collective on SNESLineSearch 760f40b411bSPeter Brune 761f40b411bSPeter Brune Level: intermediate 762f40b411bSPeter Brune 7631fe24845SBarry Smith .seealso: SNESLineSearchCreate(), SNESLineSearchSetOrder(), SNESLineSearchSetType(), SNESLineSearchSetTolerances(), SNESLineSearchSetDamping(), SNESLineSearchPreCheckPicard(), 7641fe24845SBarry Smith SNESLineSearchType, SNESLineSearchSetComputeNorms() 765f40b411bSPeter Brune @*/ 766bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetFromOptions(SNESLineSearch linesearch) 767bf388a1fSBarry Smith { 768bf7f4e0aSPeter Brune PetscErrorCode ierr; 7691a4f838cSPeter Brune const char *deft = SNESLINESEARCHBASIC; 770bf7f4e0aSPeter Brune char type[256]; 771bf7f4e0aSPeter Brune PetscBool flg, set; 772dcf2fd19SBarry Smith PetscViewer viewer; 773bf388a1fSBarry Smith 774bf7f4e0aSPeter Brune PetscFunctionBegin; 775*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchRegisterAll()); 776bf7f4e0aSPeter Brune 777bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 778f5af7f23SKarl Rupp if (((PetscObject)linesearch)->type_name) deft = ((PetscObject)linesearch)->type_name; 779*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsFList("-snes_linesearch_type","Linesearch type","SNESLineSearchSetType",SNESLineSearchList,deft,type,256,&flg)); 780bf7f4e0aSPeter Brune if (flg) { 781*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetType(linesearch,type)); 782bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 783*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetType(linesearch,deft)); 784bf7f4e0aSPeter Brune } 785bf7f4e0aSPeter Brune 786*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetViewer(PetscObjectComm((PetscObject)linesearch),((PetscObject) linesearch)->options,((PetscObject)linesearch)->prefix,"-snes_linesearch_monitor",&viewer,NULL,&set)); 787dcf2fd19SBarry Smith if (set) { 788*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetDefaultMonitor(linesearch,viewer)); 789*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 790dcf2fd19SBarry Smith } 791*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchMonitorSetFromOptions(linesearch,"-snes_linesearch_monitor_solution_update","View correction at each iteration","SNESLineSearchMonitorSolutionUpdate",SNESLineSearchMonitorSolutionUpdate,NULL)); 792bf7f4e0aSPeter Brune 7931a9b3a06SPeter Brune /* tolerances */ 794*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_minlambda","Minimum step length","SNESLineSearchSetTolerances",linesearch->steptol,&linesearch->steptol,NULL)); 795*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_maxstep","Maximum step size","SNESLineSearchSetTolerances",linesearch->maxstep,&linesearch->maxstep,NULL)); 796*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_rtol","Relative tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->rtol,&linesearch->rtol,NULL)); 797*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_atol","Absolute tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->atol,&linesearch->atol,NULL)); 798*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_ltol","Change in lambda tolerance for iterative line search","SNESLineSearchSetTolerances",linesearch->ltol,&linesearch->ltol,NULL)); 799*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsInt("-snes_linesearch_max_it","Maximum iterations for iterative line searches","SNESLineSearchSetTolerances",linesearch->max_its,&linesearch->max_its,NULL)); 8007a35526eSPeter Brune 8011a9b3a06SPeter Brune /* damping parameters */ 802*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal("-snes_linesearch_damping","Line search damping and initial step guess","SNESLineSearchSetDamping",linesearch->damping,&linesearch->damping,NULL)); 8031a9b3a06SPeter Brune 804*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-snes_linesearch_keeplambda","Use previous lambda as damping","SNESLineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,NULL)); 8051a9b3a06SPeter Brune 8061a9b3a06SPeter Brune /* precheck */ 807*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-snes_linesearch_precheck_picard","Use a correction that sometimes improves convergence of Picard iteration","SNESLineSearchPreCheckPicard",flg,&flg,&set)); 8087a35526eSPeter Brune if (set) { 8097a35526eSPeter Brune if (flg) { 8107a35526eSPeter Brune linesearch->precheck_picard_angle = 10.; /* correction only active if angle is less than 10 degrees */ 811f5af7f23SKarl Rupp 8127a35526eSPeter Brune ierr = PetscOptionsReal("-snes_linesearch_precheck_picard_angle","Maximum angle at which to activate the correction", 8130298fd71SBarry Smith "none",linesearch->precheck_picard_angle,&linesearch->precheck_picard_angle,NULL);CHKERRQ(ierr); 814*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetPreCheck(linesearch,SNESLineSearchPreCheckPicard,&linesearch->precheck_picard_angle)); 8157a35526eSPeter Brune } else { 816*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchSetPreCheck(linesearch,NULL,NULL)); 8177a35526eSPeter Brune } 8187a35526eSPeter Brune } 819*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsInt("-snes_linesearch_order","Order of approximation used in the line search","SNESLineSearchSetOrder",linesearch->order,&linesearch->order,NULL)); 820*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-snes_linesearch_norms","Compute final norms in line search","SNESLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,NULL)); 8217a35526eSPeter Brune 8225a9b6599SPeter Brune if (linesearch->ops->setfromoptions) { 823*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->setfromoptions)(PetscOptionsObject,linesearch)); 8245a9b6599SPeter Brune } 8255a9b6599SPeter Brune 826*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)linesearch)); 827bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 828bf7f4e0aSPeter Brune PetscFunctionReturn(0); 829bf7f4e0aSPeter Brune } 830bf7f4e0aSPeter Brune 831f40b411bSPeter Brune /*@ 832f190f2fcSBarry Smith SNESLineSearchView - Prints useful information about the line search 833f40b411bSPeter Brune 834f40b411bSPeter Brune Input Parameters: 8358e557f58SPeter Brune . linesearch - linesearch context 836f40b411bSPeter Brune 837f1c6b773SPeter Brune Logically Collective on SNESLineSearch 838f40b411bSPeter Brune 839f40b411bSPeter Brune Level: intermediate 840f40b411bSPeter Brune 841dcf2fd19SBarry Smith .seealso: SNESLineSearchCreate() 842f40b411bSPeter Brune @*/ 843bf388a1fSBarry Smith PetscErrorCode SNESLineSearchView(SNESLineSearch linesearch, PetscViewer viewer) 844bf388a1fSBarry Smith { 8457f1410a3SPeter Brune PetscBool iascii; 846bf388a1fSBarry Smith 847bf7f4e0aSPeter Brune PetscFunctionBegin; 8487f1410a3SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 8497f1410a3SPeter Brune if (!viewer) { 850*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)linesearch),&viewer)); 8517f1410a3SPeter Brune } 8527f1410a3SPeter Brune PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 8537f1410a3SPeter Brune PetscCheckSameComm(linesearch,1,viewer,2); 854f40b411bSPeter Brune 855*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii)); 8567f1410a3SPeter Brune if (iascii) { 857*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)linesearch,viewer)); 8587f1410a3SPeter Brune if (linesearch->ops->view) { 859*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 860*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->view)(linesearch,viewer)); 861*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 8627f1410a3SPeter Brune } 863*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," maxstep=%e, minlambda=%e\n", (double)linesearch->maxstep,(double)linesearch->steptol)); 864*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," tolerances: relative=%e, absolute=%e, lambda=%e\n", (double)linesearch->rtol,(double)linesearch->atol,(double)linesearch->ltol)); 865*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," maximum iterations=%D\n", linesearch->max_its)); 8666b2b7091SBarry Smith if (linesearch->ops->precheck) { 8676b2b7091SBarry Smith if (linesearch->ops->precheck == SNESLineSearchPreCheckPicard) { 868*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," using precheck step to speed up Picard convergence\n", linesearch->max_its)); 8697f1410a3SPeter Brune } else { 870*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," using user-defined precheck step\n", linesearch->max_its)); 8717f1410a3SPeter Brune } 8727f1410a3SPeter Brune } 8736b2b7091SBarry Smith if (linesearch->ops->postcheck) { 874*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," using user-defined postcheck step\n", linesearch->max_its)); 8757f1410a3SPeter Brune } 8767f1410a3SPeter Brune } 877bf7f4e0aSPeter Brune PetscFunctionReturn(0); 878bf7f4e0aSPeter Brune } 879bf7f4e0aSPeter Brune 880ea5d4fccSPeter Brune /*@C 881a80ff896SJed Brown SNESLineSearchGetType - Gets the linesearch type 882a80ff896SJed Brown 883a80ff896SJed Brown Logically Collective on SNESLineSearch 884a80ff896SJed Brown 885a80ff896SJed Brown Input Parameters: 886a80ff896SJed Brown . linesearch - linesearch context 887a80ff896SJed Brown 888a80ff896SJed Brown Output Parameters: 889a80ff896SJed Brown - type - The type of line search, or NULL if not set 890a80ff896SJed Brown 891a80ff896SJed Brown Level: intermediate 892a80ff896SJed Brown 893a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchSetType() 894a80ff896SJed Brown @*/ 895a80ff896SJed Brown PetscErrorCode SNESLineSearchGetType(SNESLineSearch linesearch, SNESLineSearchType *type) 896a80ff896SJed Brown { 897a80ff896SJed Brown PetscFunctionBegin; 898a80ff896SJed Brown PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 899a80ff896SJed Brown PetscValidCharPointer(type,2); 900a80ff896SJed Brown *type = ((PetscObject)linesearch)->type_name; 901a80ff896SJed Brown PetscFunctionReturn(0); 902a80ff896SJed Brown } 903a80ff896SJed Brown 904a80ff896SJed Brown /*@C 905f1c6b773SPeter Brune SNESLineSearchSetType - Sets the linesearch type 906f40b411bSPeter Brune 907f190f2fcSBarry Smith Logically Collective on SNESLineSearch 908f190f2fcSBarry Smith 909f40b411bSPeter Brune Input Parameters: 9108e557f58SPeter Brune + linesearch - linesearch context 911f40b411bSPeter Brune - type - The type of line search to be used 912f40b411bSPeter Brune 913cd7522eaSPeter Brune Available Types: 9141fe24845SBarry Smith + SNESLINESEARCHBASIC - Simple damping line search, defaults to using the full Newton step 9151fe24845SBarry Smith . SNESLINESEARCHBT - Backtracking line search over the L2 norm of the function 9161fe24845SBarry Smith . SNESLINESEARCHL2 - Secant line search over the L2 norm of the function 9171fe24845SBarry Smith . SNESLINESEARCHCP - Critical point secant line search assuming F(x) = grad G(x) for some unknown G(x) 9181fe24845SBarry Smith . SNESLINESEARCHNLEQERR - Affine-covariant error-oriented linesearch 9191fe24845SBarry Smith - SNESLINESEARCHSHELL - User provided SNESLineSearch implementation 9201fe24845SBarry Smith 9211fe24845SBarry Smith Options Database: 9221fe24845SBarry Smith . -snes_linesearch_type <type> - basic, bt, l2, cp, nleqerr, shell 923cd7522eaSPeter Brune 924f40b411bSPeter Brune Level: intermediate 925f40b411bSPeter Brune 926a80ff896SJed Brown .seealso: SNESLineSearchCreate(), SNESLineSearchType, SNESLineSearchSetFromOptions(), SNESLineSearchGetType() 927f40b411bSPeter Brune @*/ 92819fd82e9SBarry Smith PetscErrorCode SNESLineSearchSetType(SNESLineSearch linesearch, SNESLineSearchType type) 929bf7f4e0aSPeter Brune { 930bf7f4e0aSPeter Brune PetscBool match; 931*5f80ce2aSJacob Faibussowitsch PetscErrorCode (*r)(SNESLineSearch); 932bf7f4e0aSPeter Brune 933bf7f4e0aSPeter Brune PetscFunctionBegin; 934f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 935bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 936bf7f4e0aSPeter Brune 937*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)linesearch,type,&match)); 938bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 939bf7f4e0aSPeter Brune 940*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFunctionListFind(SNESLineSearchList,type,&r)); 941*5f80ce2aSJacob Faibussowitsch PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 942bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 943bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 944*5f80ce2aSJacob Faibussowitsch CHKERRQ((*(linesearch)->ops->destroy)(linesearch)); 9450298fd71SBarry Smith linesearch->ops->destroy = NULL; 946bf7f4e0aSPeter Brune } 947f1c6b773SPeter Brune /* Reinitialize function pointers in SNESLineSearchOps structure */ 9489e5d0892SLisandro Dalcin linesearch->ops->apply = NULL; 9499e5d0892SLisandro Dalcin linesearch->ops->view = NULL; 9509e5d0892SLisandro Dalcin linesearch->ops->setfromoptions = NULL; 9519e5d0892SLisandro Dalcin linesearch->ops->destroy = NULL; 952bf7f4e0aSPeter Brune 953*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectChangeTypeName((PetscObject)linesearch,type)); 954*5f80ce2aSJacob Faibussowitsch CHKERRQ((*r)(linesearch)); 955bf7f4e0aSPeter Brune PetscFunctionReturn(0); 956bf7f4e0aSPeter Brune } 957bf7f4e0aSPeter Brune 958f40b411bSPeter Brune /*@ 95978bcb3b5SPeter Brune SNESLineSearchSetSNES - Sets the SNES for the linesearch for function evaluation. 960f40b411bSPeter Brune 961f40b411bSPeter Brune Input Parameters: 9628e557f58SPeter Brune + linesearch - linesearch context 963f40b411bSPeter Brune - snes - The snes instance 964f40b411bSPeter Brune 96578bcb3b5SPeter Brune Level: developer 96678bcb3b5SPeter Brune 96778bcb3b5SPeter Brune Notes: 968f190f2fcSBarry Smith This happens automatically when the line search is obtained/created with 9697601faf0SJed Brown SNESGetLineSearch(). This routine is therefore mainly called within SNES 97078bcb3b5SPeter Brune implementations. 971f40b411bSPeter Brune 9728141a3b9SPeter Brune Level: developer 973f40b411bSPeter Brune 974cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 975f40b411bSPeter Brune @*/ 976bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetSNES(SNESLineSearch linesearch, SNES snes) 977bf388a1fSBarry Smith { 978bf7f4e0aSPeter Brune PetscFunctionBegin; 979f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 980bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 981bf7f4e0aSPeter Brune linesearch->snes = snes; 982bf7f4e0aSPeter Brune PetscFunctionReturn(0); 983bf7f4e0aSPeter Brune } 984bf7f4e0aSPeter Brune 985f40b411bSPeter Brune /*@ 9868141a3b9SPeter Brune SNESLineSearchGetSNES - Gets the SNES instance associated with the line search. 9878141a3b9SPeter Brune Having an associated SNES is necessary because most line search implementations must be able to 9888141a3b9SPeter Brune evaluate the function using SNESComputeFunction() for the associated SNES. This routine 9898141a3b9SPeter Brune is used in the line search implementations when one must get this associated SNES instance. 990f40b411bSPeter Brune 991f40b411bSPeter Brune Input Parameters: 9928e557f58SPeter Brune . linesearch - linesearch context 993f40b411bSPeter Brune 994f40b411bSPeter Brune Output Parameters: 995f40b411bSPeter Brune . snes - The snes instance 996f40b411bSPeter Brune 9978141a3b9SPeter Brune Level: developer 998f40b411bSPeter Brune 999cd7522eaSPeter Brune .seealso: SNESLineSearchGetSNES(), SNESLineSearchSetVecs(), SNES 1000f40b411bSPeter Brune @*/ 1001bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetSNES(SNESLineSearch linesearch, SNES *snes) 1002bf388a1fSBarry Smith { 1003bf7f4e0aSPeter Brune PetscFunctionBegin; 1004f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10056a388c36SPeter Brune PetscValidPointer(snes,2); 1006bf7f4e0aSPeter Brune *snes = linesearch->snes; 1007bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1008bf7f4e0aSPeter Brune } 1009bf7f4e0aSPeter Brune 1010f40b411bSPeter Brune /*@ 1011f1c6b773SPeter Brune SNESLineSearchGetLambda - Gets the last linesearch steplength discovered. 1012f40b411bSPeter Brune 1013f40b411bSPeter Brune Input Parameters: 10148e557f58SPeter Brune . linesearch - linesearch context 1015f40b411bSPeter Brune 1016f40b411bSPeter Brune Output Parameters: 1017cd7522eaSPeter Brune . lambda - The last steplength computed during SNESLineSearchApply() 1018f40b411bSPeter Brune 101978bcb3b5SPeter Brune Level: advanced 102078bcb3b5SPeter Brune 10218e557f58SPeter Brune Notes: 10228e557f58SPeter Brune This is useful in methods where the solver is ill-scaled and 102378bcb3b5SPeter Brune requires some adaptive notion of the difference in scale between the 102478bcb3b5SPeter Brune solution and the function. For instance, SNESQN may be scaled by the 102578bcb3b5SPeter Brune line search lambda using the argument -snes_qn_scaling ls. 102678bcb3b5SPeter Brune 1027cd7522eaSPeter Brune .seealso: SNESLineSearchSetLambda(), SNESLineSearchGetDamping(), SNESLineSearchApply() 1028f40b411bSPeter Brune @*/ 1029f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetLambda(SNESLineSearch linesearch,PetscReal *lambda) 10306a388c36SPeter Brune { 10316a388c36SPeter Brune PetscFunctionBegin; 1032f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1033534a8f05SLisandro Dalcin PetscValidRealPointer(lambda, 2); 10346a388c36SPeter Brune *lambda = linesearch->lambda; 10356a388c36SPeter Brune PetscFunctionReturn(0); 10366a388c36SPeter Brune } 10376a388c36SPeter Brune 1038f40b411bSPeter Brune /*@ 1039f1c6b773SPeter Brune SNESLineSearchSetLambda - Sets the linesearch steplength. 1040f40b411bSPeter Brune 1041f40b411bSPeter Brune Input Parameters: 10428e557f58SPeter Brune + linesearch - linesearch context 1043f40b411bSPeter Brune - lambda - The last steplength. 1044f40b411bSPeter Brune 1045cd7522eaSPeter Brune Notes: 1046f190f2fcSBarry Smith This routine is typically used within implementations of SNESLineSearchApply() 1047cd7522eaSPeter Brune to set the final steplength. This routine (and SNESLineSearchGetLambda()) were 1048cd7522eaSPeter Brune added in order to facilitate Quasi-Newton methods that use the previous steplength 1049cd7522eaSPeter Brune as an inner scaling parameter. 1050cd7522eaSPeter Brune 105178bcb3b5SPeter Brune Level: advanced 1052f40b411bSPeter Brune 1053f1c6b773SPeter Brune .seealso: SNESLineSearchGetLambda() 1054f40b411bSPeter Brune @*/ 1055f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetLambda(SNESLineSearch linesearch, PetscReal lambda) 10566a388c36SPeter Brune { 10576a388c36SPeter Brune PetscFunctionBegin; 1058f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 10596a388c36SPeter Brune linesearch->lambda = lambda; 10606a388c36SPeter Brune PetscFunctionReturn(0); 10616a388c36SPeter Brune } 10626a388c36SPeter Brune 1063f40b411bSPeter Brune /*@ 10643c7d6663SPeter Brune SNESLineSearchGetTolerances - Gets the tolerances for the linesearch. These include 106578bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 106678bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 106778bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1068f40b411bSPeter Brune 1069f899ff85SJose E. Roman Input Parameter: 10708e557f58SPeter Brune . linesearch - linesearch context 1071f40b411bSPeter Brune 1072f40b411bSPeter Brune Output Parameters: 1073516fe3c3SPeter Brune + steptol - The minimum steplength 10746cc8e53bSPeter Brune . maxstep - The maximum steplength 1075516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1076516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1077516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1078516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1079f40b411bSPeter Brune 108078bcb3b5SPeter Brune Level: intermediate 108178bcb3b5SPeter Brune 108278bcb3b5SPeter Brune Notes: 108378bcb3b5SPeter Brune Different line searches may implement these parameters slightly differently as 10843c7d6663SPeter Brune the type requires. 1085516fe3c3SPeter Brune 1086f1c6b773SPeter Brune .seealso: SNESLineSearchSetTolerances() 1087f40b411bSPeter Brune @*/ 1088f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetTolerances(SNESLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 10896a388c36SPeter Brune { 10906a388c36SPeter Brune PetscFunctionBegin; 1091f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1092516fe3c3SPeter Brune if (steptol) { 1093534a8f05SLisandro Dalcin PetscValidRealPointer(steptol, 2); 10946a388c36SPeter Brune *steptol = linesearch->steptol; 1095516fe3c3SPeter Brune } 1096516fe3c3SPeter Brune if (maxstep) { 1097534a8f05SLisandro Dalcin PetscValidRealPointer(maxstep, 3); 1098516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 1099516fe3c3SPeter Brune } 1100516fe3c3SPeter Brune if (rtol) { 1101534a8f05SLisandro Dalcin PetscValidRealPointer(rtol, 4); 1102516fe3c3SPeter Brune *rtol = linesearch->rtol; 1103516fe3c3SPeter Brune } 1104516fe3c3SPeter Brune if (atol) { 1105534a8f05SLisandro Dalcin PetscValidRealPointer(atol, 5); 1106516fe3c3SPeter Brune *atol = linesearch->atol; 1107516fe3c3SPeter Brune } 1108516fe3c3SPeter Brune if (ltol) { 1109534a8f05SLisandro Dalcin PetscValidRealPointer(ltol, 6); 1110516fe3c3SPeter Brune *ltol = linesearch->ltol; 1111516fe3c3SPeter Brune } 1112516fe3c3SPeter Brune if (max_its) { 1113534a8f05SLisandro Dalcin PetscValidIntPointer(max_its, 7); 1114516fe3c3SPeter Brune *max_its = linesearch->max_its; 1115516fe3c3SPeter Brune } 11166a388c36SPeter Brune PetscFunctionReturn(0); 11176a388c36SPeter Brune } 11186a388c36SPeter Brune 1119f40b411bSPeter Brune /*@ 11203c7d6663SPeter Brune SNESLineSearchSetTolerances - Gets the tolerances for the linesearch. These include 112178bcb3b5SPeter Brune tolerances for the relative and absolute change in the function norm, the change 112278bcb3b5SPeter Brune in lambda for iterative line searches, the minimum steplength, the maximum steplength, 112378bcb3b5SPeter Brune and the maximum number of iterations the line search procedure may take. 1124f40b411bSPeter Brune 1125f40b411bSPeter Brune Input Parameters: 11268e557f58SPeter Brune + linesearch - linesearch context 1127516fe3c3SPeter Brune . steptol - The minimum steplength 11286cc8e53bSPeter Brune . maxstep - The maximum steplength 1129516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 1130516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 1131516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 1132516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 1133f40b411bSPeter Brune 113478bcb3b5SPeter Brune Notes: 11353c7d6663SPeter Brune The user may choose to not set any of the tolerances using PETSC_DEFAULT in 113678bcb3b5SPeter Brune place of an argument. 1137f40b411bSPeter Brune 113878bcb3b5SPeter Brune Level: intermediate 1139516fe3c3SPeter Brune 1140f1c6b773SPeter Brune .seealso: SNESLineSearchGetTolerances() 1141f40b411bSPeter Brune @*/ 1142f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetTolerances(SNESLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 11436a388c36SPeter Brune { 11446a388c36SPeter Brune PetscFunctionBegin; 1145f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1146d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,steptol,2); 1147d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,maxstep,3); 1148d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,rtol,4); 1149d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,atol,5); 1150d3952184SSatish Balay PetscValidLogicalCollectiveReal(linesearch,ltol,6); 1151d3952184SSatish Balay PetscValidLogicalCollectiveInt(linesearch,max_its,7); 1152d3952184SSatish Balay 1153d3952184SSatish Balay if (steptol!= PETSC_DEFAULT) { 1154*5f80ce2aSJacob Faibussowitsch PetscCheck(steptol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Minimum step length %14.12e must be non-negative",(double)steptol); 11556a388c36SPeter Brune linesearch->steptol = steptol; 1156d3952184SSatish Balay } 1157d3952184SSatish Balay 1158d3952184SSatish Balay if (maxstep!= PETSC_DEFAULT) { 1159*5f80ce2aSJacob Faibussowitsch PetscCheck(maxstep >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum step length %14.12e must be non-negative",(double)maxstep); 1160516fe3c3SPeter Brune linesearch->maxstep = maxstep; 1161d3952184SSatish Balay } 1162d3952184SSatish Balay 1163d3952184SSatish Balay if (rtol != PETSC_DEFAULT) { 1164*5f80ce2aSJacob Faibussowitsch PetscCheck(rtol >= 0.0 && 1.0 < rtol,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Relative tolerance %14.12e must be non-negative and less than 1.0",(double)rtol); 1165516fe3c3SPeter Brune linesearch->rtol = rtol; 1166d3952184SSatish Balay } 1167d3952184SSatish Balay 1168d3952184SSatish Balay if (atol != PETSC_DEFAULT) { 1169*5f80ce2aSJacob Faibussowitsch PetscCheck(atol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Absolute tolerance %14.12e must be non-negative",(double)atol); 1170516fe3c3SPeter Brune linesearch->atol = atol; 1171d3952184SSatish Balay } 1172d3952184SSatish Balay 1173d3952184SSatish Balay if (ltol != PETSC_DEFAULT) { 1174*5f80ce2aSJacob Faibussowitsch PetscCheck(ltol >= 0.0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Lambda tolerance %14.12e must be non-negative",(double)ltol); 1175516fe3c3SPeter Brune linesearch->ltol = ltol; 1176d3952184SSatish Balay } 1177d3952184SSatish Balay 1178d3952184SSatish Balay if (max_its != PETSC_DEFAULT) { 1179*5f80ce2aSJacob Faibussowitsch PetscCheck(max_its >= 0,PetscObjectComm((PetscObject)linesearch),PETSC_ERR_ARG_OUTOFRANGE,"Maximum number of iterations %D must be non-negative",max_its); 1180516fe3c3SPeter Brune linesearch->max_its = max_its; 1181d3952184SSatish Balay } 11826a388c36SPeter Brune PetscFunctionReturn(0); 11836a388c36SPeter Brune } 11846a388c36SPeter Brune 1185f40b411bSPeter Brune /*@ 1186f1c6b773SPeter Brune SNESLineSearchGetDamping - Gets the line search damping parameter. 1187f40b411bSPeter Brune 1188f40b411bSPeter Brune Input Parameters: 11898e557f58SPeter Brune . linesearch - linesearch context 1190f40b411bSPeter Brune 1191f40b411bSPeter Brune Output Parameters: 11928e557f58SPeter Brune . damping - The damping parameter 1193f40b411bSPeter Brune 119478bcb3b5SPeter Brune Level: advanced 1195f40b411bSPeter Brune 119678bcb3b5SPeter Brune .seealso: SNESLineSearchGetStepTolerance(), SNESQN 1197f40b411bSPeter Brune @*/ 1198f40b411bSPeter Brune 1199f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetDamping(SNESLineSearch linesearch,PetscReal *damping) 12006a388c36SPeter Brune { 12016a388c36SPeter Brune PetscFunctionBegin; 1202f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1203534a8f05SLisandro Dalcin PetscValidRealPointer(damping, 2); 12046a388c36SPeter Brune *damping = linesearch->damping; 12056a388c36SPeter Brune PetscFunctionReturn(0); 12066a388c36SPeter Brune } 12076a388c36SPeter Brune 1208f40b411bSPeter Brune /*@ 1209fd292e60Sprj- SNESLineSearchSetDamping - Sets the line search damping parameter. 1210f40b411bSPeter Brune 1211f40b411bSPeter Brune Input Parameters: 121203fd4120SBarry Smith + linesearch - linesearch context 121303fd4120SBarry Smith - damping - The damping parameter 1214f40b411bSPeter Brune 121503fd4120SBarry Smith Options Database: 121603fd4120SBarry Smith . -snes_linesearch_damping 1217f40b411bSPeter Brune Level: intermediate 1218f40b411bSPeter Brune 1219cd7522eaSPeter Brune Notes: 1220cd7522eaSPeter Brune The basic line search merely takes the update step scaled by the damping parameter. 1221cd7522eaSPeter Brune The use of the damping parameter in the l2 and cp line searches is much more subtle; 122278bcb3b5SPeter Brune it is used as a starting point in calculating the secant step. However, the eventual 1223cd7522eaSPeter Brune step may be of greater length than the damping parameter. In the bt line search it is 1224cd7522eaSPeter Brune used as the maximum possible step length, as the bt line search only backtracks. 1225cd7522eaSPeter Brune 1226f1c6b773SPeter Brune .seealso: SNESLineSearchGetDamping() 1227f40b411bSPeter Brune @*/ 1228f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetDamping(SNESLineSearch linesearch,PetscReal damping) 12296a388c36SPeter Brune { 12306a388c36SPeter Brune PetscFunctionBegin; 1231f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 12326a388c36SPeter Brune linesearch->damping = damping; 12336a388c36SPeter Brune PetscFunctionReturn(0); 12346a388c36SPeter Brune } 12356a388c36SPeter Brune 123659405d5eSPeter Brune /*@ 123759405d5eSPeter Brune SNESLineSearchGetOrder - Gets the line search approximation order. 123859405d5eSPeter Brune 123959405d5eSPeter Brune Input Parameters: 124078bcb3b5SPeter Brune . linesearch - linesearch context 124159405d5eSPeter Brune 124259405d5eSPeter Brune Output Parameters: 12438e557f58SPeter Brune . order - The order 124459405d5eSPeter Brune 124578bcb3b5SPeter Brune Possible Values for order: 12463c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 12473c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 12483c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 124978bcb3b5SPeter Brune 125059405d5eSPeter Brune Level: intermediate 125159405d5eSPeter Brune 125259405d5eSPeter Brune .seealso: SNESLineSearchSetOrder() 125359405d5eSPeter Brune @*/ 125459405d5eSPeter Brune 1255b000cd8dSPeter Brune PetscErrorCode SNESLineSearchGetOrder(SNESLineSearch linesearch,PetscInt *order) 125659405d5eSPeter Brune { 125759405d5eSPeter Brune PetscFunctionBegin; 125859405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1259534a8f05SLisandro Dalcin PetscValidIntPointer(order, 2); 126059405d5eSPeter Brune *order = linesearch->order; 126159405d5eSPeter Brune PetscFunctionReturn(0); 126259405d5eSPeter Brune } 126359405d5eSPeter Brune 126459405d5eSPeter Brune /*@ 12651f8196a2SJed Brown SNESLineSearchSetOrder - Sets the maximum order of the polynomial fit used in the line search 126659405d5eSPeter Brune 126759405d5eSPeter Brune Input Parameters: 1268a2b725a8SWilliam Gropp + linesearch - linesearch context 1269a2b725a8SWilliam Gropp - order - The damping parameter 127059405d5eSPeter Brune 127159405d5eSPeter Brune Level: intermediate 127259405d5eSPeter Brune 127378bcb3b5SPeter Brune Possible Values for order: 12743c7d6663SPeter Brune + 1 or SNES_LINESEARCH_ORDER_LINEAR - linear order 12753c7d6663SPeter Brune . 2 or SNES_LINESEARCH_ORDER_QUADRATIC - quadratic order 12763c7d6663SPeter Brune - 3 or SNES_LINESEARCH_ORDER_CUBIC - cubic order 127778bcb3b5SPeter Brune 127859405d5eSPeter Brune Notes: 127959405d5eSPeter Brune Variable orders are supported by the following line searches: 128078bcb3b5SPeter Brune + bt - cubic and quadratic 128178bcb3b5SPeter Brune - cp - linear and quadratic 128259405d5eSPeter Brune 12831f8196a2SJed Brown .seealso: SNESLineSearchGetOrder(), SNESLineSearchSetDamping() 128459405d5eSPeter Brune @*/ 1285b000cd8dSPeter Brune PetscErrorCode SNESLineSearchSetOrder(SNESLineSearch linesearch,PetscInt order) 128659405d5eSPeter Brune { 128759405d5eSPeter Brune PetscFunctionBegin; 128859405d5eSPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 128959405d5eSPeter Brune linesearch->order = order; 129059405d5eSPeter Brune PetscFunctionReturn(0); 129159405d5eSPeter Brune } 129259405d5eSPeter Brune 1293f40b411bSPeter Brune /*@ 1294f1c6b773SPeter Brune SNESLineSearchGetNorms - Gets the norms for for X, Y, and F. 1295f40b411bSPeter Brune 1296f899ff85SJose E. Roman Input Parameter: 129778bcb3b5SPeter Brune . linesearch - linesearch context 1298f40b411bSPeter Brune 1299f40b411bSPeter Brune Output Parameters: 1300f40b411bSPeter Brune + xnorm - The norm of the current solution 1301f40b411bSPeter Brune . fnorm - The norm of the current function 1302f40b411bSPeter Brune - ynorm - The norm of the current update 1303f40b411bSPeter Brune 1304cd7522eaSPeter Brune Notes: 1305cd7522eaSPeter Brune This function is mainly called from SNES implementations. 1306cd7522eaSPeter Brune 130778bcb3b5SPeter Brune Level: developer 1308f40b411bSPeter Brune 1309f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms() SNESLineSearchGetVecs() 1310f40b411bSPeter Brune @*/ 1311f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetNorms(SNESLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 1312bf7f4e0aSPeter Brune { 1313bf7f4e0aSPeter Brune PetscFunctionBegin; 1314f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1315f5af7f23SKarl Rupp if (xnorm) *xnorm = linesearch->xnorm; 1316f5af7f23SKarl Rupp if (fnorm) *fnorm = linesearch->fnorm; 1317f5af7f23SKarl Rupp if (ynorm) *ynorm = linesearch->ynorm; 1318bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1319bf7f4e0aSPeter Brune } 1320bf7f4e0aSPeter Brune 1321f40b411bSPeter Brune /*@ 1322f1c6b773SPeter Brune SNESLineSearchSetNorms - Gets the computed norms for for X, Y, and F. 1323f40b411bSPeter Brune 1324f40b411bSPeter Brune Input Parameters: 132578bcb3b5SPeter Brune + linesearch - linesearch context 1326f40b411bSPeter Brune . xnorm - The norm of the current solution 1327f40b411bSPeter Brune . fnorm - The norm of the current function 1328f40b411bSPeter Brune - ynorm - The norm of the current update 1329f40b411bSPeter Brune 133078bcb3b5SPeter Brune Level: advanced 1331f40b411bSPeter Brune 1332f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1333f40b411bSPeter Brune @*/ 1334f1c6b773SPeter Brune PetscErrorCode SNESLineSearchSetNorms(SNESLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 13356a388c36SPeter Brune { 13366a388c36SPeter Brune PetscFunctionBegin; 1337f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 13386a388c36SPeter Brune linesearch->xnorm = xnorm; 13396a388c36SPeter Brune linesearch->fnorm = fnorm; 13406a388c36SPeter Brune linesearch->ynorm = ynorm; 13416a388c36SPeter Brune PetscFunctionReturn(0); 13426a388c36SPeter Brune } 13436a388c36SPeter Brune 1344f40b411bSPeter Brune /*@ 1345f1c6b773SPeter Brune SNESLineSearchComputeNorms - Computes the norms of X, F, and Y. 1346f40b411bSPeter Brune 1347f40b411bSPeter Brune Input Parameters: 134878bcb3b5SPeter Brune . linesearch - linesearch context 1349f40b411bSPeter Brune 1350f40b411bSPeter Brune Options Database Keys: 13518e557f58SPeter Brune . -snes_linesearch_norms - turn norm computation on or off 1352f40b411bSPeter Brune 1353f40b411bSPeter Brune Level: intermediate 1354f40b411bSPeter Brune 135578bcb3b5SPeter Brune .seealso: SNESLineSearchGetNorms, SNESLineSearchSetNorms(), SNESLineSearchSetComputeNorms() 1356f40b411bSPeter Brune @*/ 1357f1c6b773SPeter Brune PetscErrorCode SNESLineSearchComputeNorms(SNESLineSearch linesearch) 13586a388c36SPeter Brune { 13599bd66eb0SPeter Brune SNES snes; 1360bf388a1fSBarry Smith 13616a388c36SPeter Brune PetscFunctionBegin; 13626a388c36SPeter Brune if (linesearch->norms) { 13639bd66eb0SPeter Brune if (linesearch->ops->vinorm) { 1364*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESLineSearchGetSNES(linesearch, &snes)); 1365*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(linesearch->vec_sol, NORM_2, &linesearch->xnorm)); 1366*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNorm(linesearch->vec_update, NORM_2, &linesearch->ynorm)); 1367*5f80ce2aSJacob Faibussowitsch CHKERRQ((*linesearch->ops->vinorm)(snes, linesearch->vec_func, linesearch->vec_sol, &linesearch->fnorm)); 13689bd66eb0SPeter Brune } else { 1369*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm)); 1370*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm)); 1371*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm)); 1372*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm)); 1373*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm)); 1374*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm)); 13756a388c36SPeter Brune } 13769bd66eb0SPeter Brune } 13776a388c36SPeter Brune PetscFunctionReturn(0); 13786a388c36SPeter Brune } 13796a388c36SPeter Brune 13806f263ca3SPeter Brune /*@ 13816f263ca3SPeter Brune SNESLineSearchSetComputeNorms - Turns on or off the computation of final norms in the line search. 13826f263ca3SPeter Brune 13836f263ca3SPeter Brune Input Parameters: 138478bcb3b5SPeter Brune + linesearch - linesearch context 138578bcb3b5SPeter Brune - flg - indicates whether or not to compute norms 13866f263ca3SPeter Brune 13876f263ca3SPeter Brune Options Database Keys: 13881f8196a2SJed Brown . -snes_linesearch_norms <true> - Turns on/off computation of the norms for basic linesearch 13896f263ca3SPeter Brune 13906f263ca3SPeter Brune Notes: 13911f8196a2SJed Brown This is most relevant to the SNESLINESEARCHBASIC line search type since most line searches have a stopping criteria involving the norm. 13926f263ca3SPeter Brune 13936f263ca3SPeter Brune Level: intermediate 13946f263ca3SPeter Brune 13951a4f838cSPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetNorms(), SNESLineSearchComputeNorms(), SNESLINESEARCHBASIC 13966f263ca3SPeter Brune @*/ 13976f263ca3SPeter Brune PetscErrorCode SNESLineSearchSetComputeNorms(SNESLineSearch linesearch, PetscBool flg) 13986f263ca3SPeter Brune { 13996f263ca3SPeter Brune PetscFunctionBegin; 14006f263ca3SPeter Brune linesearch->norms = flg; 14016f263ca3SPeter Brune PetscFunctionReturn(0); 14026f263ca3SPeter Brune } 14036f263ca3SPeter Brune 1404f40b411bSPeter Brune /*@ 1405f1c6b773SPeter Brune SNESLineSearchGetVecs - Gets the vectors from the SNESLineSearch context 1406f40b411bSPeter Brune 1407f899ff85SJose E. Roman Input Parameter: 140878bcb3b5SPeter Brune . linesearch - linesearch context 1409f40b411bSPeter Brune 1410f40b411bSPeter Brune Output Parameters: 14116232e825SPeter Brune + X - Solution vector 14126232e825SPeter Brune . F - Function vector 14136232e825SPeter Brune . Y - Search direction vector 14146232e825SPeter Brune . W - Solution work vector 14156232e825SPeter Brune - G - Function work vector 14166232e825SPeter Brune 14177bba9028SPeter Brune Notes: 14187bba9028SPeter Brune At the beginning of a line search application, X should contain a 14196232e825SPeter Brune solution and the vector F the function computed at X. At the end of the 14206232e825SPeter Brune line search application, X should contain the new solution, and F the 14216232e825SPeter Brune function evaluated at the new solution. 1422f40b411bSPeter Brune 14232a7a6963SBarry Smith These vectors are owned by the SNESLineSearch and should not be destroyed by the caller 14242a7a6963SBarry Smith 142578bcb3b5SPeter Brune Level: advanced 1426f40b411bSPeter Brune 1427f1c6b773SPeter Brune .seealso: SNESLineSearchGetNorms(), SNESLineSearchSetVecs() 1428f40b411bSPeter Brune @*/ 1429bf388a1fSBarry Smith PetscErrorCode SNESLineSearchGetVecs(SNESLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) 1430bf388a1fSBarry Smith { 14316a388c36SPeter Brune PetscFunctionBegin; 1432f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 14336a388c36SPeter Brune if (X) { 14346a388c36SPeter Brune PetscValidPointer(X, 2); 14356a388c36SPeter Brune *X = linesearch->vec_sol; 14366a388c36SPeter Brune } 14376a388c36SPeter Brune if (F) { 14386a388c36SPeter Brune PetscValidPointer(F, 3); 14396a388c36SPeter Brune *F = linesearch->vec_func; 14406a388c36SPeter Brune } 14416a388c36SPeter Brune if (Y) { 14426a388c36SPeter Brune PetscValidPointer(Y, 4); 14436a388c36SPeter Brune *Y = linesearch->vec_update; 14446a388c36SPeter Brune } 14456a388c36SPeter Brune if (W) { 14466a388c36SPeter Brune PetscValidPointer(W, 5); 14476a388c36SPeter Brune *W = linesearch->vec_sol_new; 14486a388c36SPeter Brune } 14496a388c36SPeter Brune if (G) { 14506a388c36SPeter Brune PetscValidPointer(G, 6); 14516a388c36SPeter Brune *G = linesearch->vec_func_new; 14526a388c36SPeter Brune } 14536a388c36SPeter Brune PetscFunctionReturn(0); 14546a388c36SPeter Brune } 14556a388c36SPeter Brune 1456f40b411bSPeter Brune /*@ 1457f1c6b773SPeter Brune SNESLineSearchSetVecs - Sets the vectors on the SNESLineSearch context 1458f40b411bSPeter Brune 1459f40b411bSPeter Brune Input Parameters: 146078bcb3b5SPeter Brune + linesearch - linesearch context 14616232e825SPeter Brune . X - Solution vector 14626232e825SPeter Brune . F - Function vector 14636232e825SPeter Brune . Y - Search direction vector 14646232e825SPeter Brune . W - Solution work vector 14656232e825SPeter Brune - G - Function work vector 1466f40b411bSPeter Brune 146778bcb3b5SPeter Brune Level: advanced 1468f40b411bSPeter Brune 1469f1c6b773SPeter Brune .seealso: SNESLineSearchSetNorms(), SNESLineSearchGetVecs() 1470f40b411bSPeter Brune @*/ 1471bf388a1fSBarry Smith PetscErrorCode SNESLineSearchSetVecs(SNESLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) 1472bf388a1fSBarry Smith { 14736a388c36SPeter Brune PetscFunctionBegin; 1474f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 14756a388c36SPeter Brune if (X) { 14766a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 14776a388c36SPeter Brune linesearch->vec_sol = X; 14786a388c36SPeter Brune } 14796a388c36SPeter Brune if (F) { 14806a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 14816a388c36SPeter Brune linesearch->vec_func = F; 14826a388c36SPeter Brune } 14836a388c36SPeter Brune if (Y) { 14846a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 14856a388c36SPeter Brune linesearch->vec_update = Y; 14866a388c36SPeter Brune } 14876a388c36SPeter Brune if (W) { 14886a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 14896a388c36SPeter Brune linesearch->vec_sol_new = W; 14906a388c36SPeter Brune } 14916a388c36SPeter Brune if (G) { 14926a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 14936a388c36SPeter Brune linesearch->vec_func_new = G; 14946a388c36SPeter Brune } 14956a388c36SPeter Brune PetscFunctionReturn(0); 14966a388c36SPeter Brune } 14976a388c36SPeter Brune 1498e7058c64SPeter Brune /*@C 1499f1c6b773SPeter Brune SNESLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 1500e7058c64SPeter Brune SNES options in the database. 1501e7058c64SPeter Brune 1502cd7522eaSPeter Brune Logically Collective on SNESLineSearch 1503e7058c64SPeter Brune 1504e7058c64SPeter Brune Input Parameters: 1505e7058c64SPeter Brune + snes - the SNES context 1506e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 1507e7058c64SPeter Brune 1508e7058c64SPeter Brune Notes: 1509e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 1510e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 1511e7058c64SPeter Brune 1512e7058c64SPeter Brune Level: advanced 1513e7058c64SPeter Brune 1514e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 1515e7058c64SPeter Brune @*/ 1516f1c6b773SPeter Brune PetscErrorCode SNESLineSearchAppendOptionsPrefix(SNESLineSearch linesearch,const char prefix[]) 1517e7058c64SPeter Brune { 1518e7058c64SPeter Brune PetscFunctionBegin; 1519f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1520*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix)); 1521e7058c64SPeter Brune PetscFunctionReturn(0); 1522e7058c64SPeter Brune } 1523e7058c64SPeter Brune 1524e7058c64SPeter Brune /*@C 1525f1c6b773SPeter Brune SNESLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 1526f1c6b773SPeter Brune SNESLineSearch options in the database. 1527e7058c64SPeter Brune 1528e7058c64SPeter Brune Not Collective 1529e7058c64SPeter Brune 1530e7058c64SPeter Brune Input Parameter: 1531cd7522eaSPeter Brune . linesearch - the SNESLineSearch context 1532e7058c64SPeter Brune 1533e7058c64SPeter Brune Output Parameter: 1534e7058c64SPeter Brune . prefix - pointer to the prefix string used 1535e7058c64SPeter Brune 15368e557f58SPeter Brune Notes: 15378e557f58SPeter Brune On the fortran side, the user should pass in a string 'prefix' of 1538e7058c64SPeter Brune sufficient length to hold the prefix. 1539e7058c64SPeter Brune 1540e7058c64SPeter Brune Level: advanced 1541e7058c64SPeter Brune 1542e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 1543e7058c64SPeter Brune @*/ 1544f1c6b773SPeter Brune PetscErrorCode SNESLineSearchGetOptionsPrefix(SNESLineSearch linesearch,const char *prefix[]) 1545e7058c64SPeter Brune { 1546e7058c64SPeter Brune PetscFunctionBegin; 1547f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1548*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix)); 1549e7058c64SPeter Brune PetscFunctionReturn(0); 1550e7058c64SPeter Brune } 1551bf7f4e0aSPeter Brune 15528d359177SBarry Smith /*@C 1553fa0ddf94SBarry Smith SNESLineSearchSetWorkVecs - Gets work vectors for the line search. 1554f40b411bSPeter Brune 1555d8d19677SJose E. Roman Input Parameters: 1556f1c6b773SPeter Brune + linesearch - the SNESLineSearch context 1557f40b411bSPeter Brune - nwork - the number of work vectors 1558f40b411bSPeter Brune 1559f40b411bSPeter Brune Level: developer 1560f40b411bSPeter Brune 1561fa0ddf94SBarry Smith .seealso: SNESSetWorkVecs() 1562f40b411bSPeter Brune @*/ 1563fa0ddf94SBarry Smith PetscErrorCode SNESLineSearchSetWorkVecs(SNESLineSearch linesearch, PetscInt nwork) 1564bf7f4e0aSPeter Brune { 1565bf7f4e0aSPeter Brune PetscFunctionBegin; 1566bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1567*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work)); 15688d359177SBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)linesearch), PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1569bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1570bf7f4e0aSPeter Brune } 1571bf7f4e0aSPeter Brune 1572f40b411bSPeter Brune /*@ 1573422a814eSBarry Smith SNESLineSearchGetReason - Gets the success/failure status of the last line search application 1574f40b411bSPeter Brune 1575f40b411bSPeter Brune Input Parameters: 157678bcb3b5SPeter Brune . linesearch - linesearch context 1577f40b411bSPeter Brune 1578f40b411bSPeter Brune Output Parameters: 1579422a814eSBarry Smith . result - The success or failure status 1580f40b411bSPeter Brune 1581cd7522eaSPeter Brune Notes: 1582c98378a5SBarry Smith This is typically called after SNESLineSearchApply() in order to determine if the line-search failed 1583cd7522eaSPeter Brune (and set the SNES convergence accordingly). 1584cd7522eaSPeter Brune 1585f40b411bSPeter Brune Level: intermediate 1586f40b411bSPeter Brune 1587422a814eSBarry Smith .seealso: SNESLineSearchSetReason(), SNESLineSearchReason 1588f40b411bSPeter Brune @*/ 1589422a814eSBarry Smith PetscErrorCode SNESLineSearchGetReason(SNESLineSearch linesearch, SNESLineSearchReason *result) 1590bf7f4e0aSPeter Brune { 1591bf7f4e0aSPeter Brune PetscFunctionBegin; 1592f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1593422a814eSBarry Smith PetscValidPointer(result, 2); 1594422a814eSBarry Smith *result = linesearch->result; 1595bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1596bf7f4e0aSPeter Brune } 1597bf7f4e0aSPeter Brune 1598f40b411bSPeter Brune /*@ 1599422a814eSBarry Smith SNESLineSearchSetReason - Sets the success/failure status of the last line search application 1600f40b411bSPeter Brune 1601f40b411bSPeter Brune Input Parameters: 160278bcb3b5SPeter Brune + linesearch - linesearch context 1603422a814eSBarry Smith - result - The success or failure status 1604f40b411bSPeter Brune 1605cd7522eaSPeter Brune Notes: 1606cd7522eaSPeter Brune This is typically called in a SNESLineSearchApply() or SNESLineSearchShell implementation to set 1607cd7522eaSPeter Brune the success or failure of the line search method. 1608cd7522eaSPeter Brune 160978bcb3b5SPeter Brune Level: developer 1610f40b411bSPeter Brune 1611422a814eSBarry Smith .seealso: SNESLineSearchGetSResult() 1612f40b411bSPeter Brune @*/ 1613422a814eSBarry Smith PetscErrorCode SNESLineSearchSetReason(SNESLineSearch linesearch, SNESLineSearchReason result) 16146a388c36SPeter Brune { 16156a388c36SPeter Brune PetscFunctionBegin; 16165fd66863SKarl Rupp PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 1617422a814eSBarry Smith linesearch->result = result; 16186a388c36SPeter Brune PetscFunctionReturn(0); 16196a388c36SPeter Brune } 16206a388c36SPeter Brune 16219bd66eb0SPeter Brune /*@C 1622f1c6b773SPeter Brune SNESLineSearchSetVIFunctions - Sets VI-specific functions for line search computation. 16239bd66eb0SPeter Brune 16249bd66eb0SPeter Brune Input Parameters: 16259bd66eb0SPeter Brune + snes - nonlinear context obtained from SNESCreate() 16269bd66eb0SPeter Brune . projectfunc - function for projecting the function to the bounds 16279bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16289bd66eb0SPeter Brune 16299bd66eb0SPeter Brune Logically Collective on SNES 16309bd66eb0SPeter Brune 16319bd66eb0SPeter Brune Calling sequence of projectfunc: 16329bd66eb0SPeter Brune .vb 16339bd66eb0SPeter Brune projectfunc (SNES snes, Vec X) 16349bd66eb0SPeter Brune .ve 16359bd66eb0SPeter Brune 16369bd66eb0SPeter Brune Input parameters for projectfunc: 16379bd66eb0SPeter Brune + snes - nonlinear context 16389bd66eb0SPeter Brune - X - current solution 16399bd66eb0SPeter Brune 1640cd7522eaSPeter Brune Output parameters for projectfunc: 16419bd66eb0SPeter Brune . X - Projected solution 16429bd66eb0SPeter Brune 16439bd66eb0SPeter Brune Calling sequence of normfunc: 16449bd66eb0SPeter Brune .vb 16459bd66eb0SPeter Brune projectfunc (SNES snes, Vec X, Vec F, PetscScalar * fnorm) 16469bd66eb0SPeter Brune .ve 16479bd66eb0SPeter Brune 1648cd7522eaSPeter Brune Input parameters for normfunc: 16499bd66eb0SPeter Brune + snes - nonlinear context 16509bd66eb0SPeter Brune . X - current solution 16519bd66eb0SPeter Brune - F - current residual 16529bd66eb0SPeter Brune 1653cd7522eaSPeter Brune Output parameters for normfunc: 16549bd66eb0SPeter Brune . fnorm - VI-specific norm of the function 16559bd66eb0SPeter Brune 1656cd7522eaSPeter Brune Notes: 1657cd7522eaSPeter Brune The VI solvers require projection of the solution to the feasible set. projectfunc should implement this. 1658cd7522eaSPeter Brune 1659cd7522eaSPeter Brune The VI solvers require special evaluation of the function norm such that the norm is only calculated 1660cd7522eaSPeter Brune on the inactive set. This should be implemented by normfunc. 16619bd66eb0SPeter Brune 16629bd66eb0SPeter Brune Level: developer 16639bd66eb0SPeter Brune 1664f1c6b773SPeter Brune .seealso: SNESLineSearchGetVIFunctions(), SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() 16659bd66eb0SPeter Brune @*/ 166625acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchSetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc projectfunc, SNESLineSearchVINormFunc normfunc) 16679bd66eb0SPeter Brune { 16689bd66eb0SPeter Brune PetscFunctionBegin; 1669f1c6b773SPeter Brune PetscValidHeaderSpecific(linesearch,SNESLINESEARCH_CLASSID,1); 16709bd66eb0SPeter Brune if (projectfunc) linesearch->ops->viproject = projectfunc; 16719bd66eb0SPeter Brune if (normfunc) linesearch->ops->vinorm = normfunc; 16729bd66eb0SPeter Brune PetscFunctionReturn(0); 16739bd66eb0SPeter Brune } 16749bd66eb0SPeter Brune 16759bd66eb0SPeter Brune /*@C 1676f1c6b773SPeter Brune SNESLineSearchGetVIFunctions - Sets VI-specific functions for line search computation. 16779bd66eb0SPeter Brune 1678f899ff85SJose E. Roman Input Parameter: 1679907376e6SBarry Smith . linesearch - the line search context, obtain with SNESGetLineSearch() 16809bd66eb0SPeter Brune 16819bd66eb0SPeter Brune Output Parameters: 16829bd66eb0SPeter Brune + projectfunc - function for projecting the function to the bounds 16839bd66eb0SPeter Brune - normfunc - function for computing the norm of an active set 16849bd66eb0SPeter Brune 16859bd66eb0SPeter Brune Logically Collective on SNES 16869bd66eb0SPeter Brune 16879bd66eb0SPeter Brune Level: developer 16889bd66eb0SPeter Brune 1689f1c6b773SPeter Brune .seealso: SNESLineSearchSetVIFunctions(), SNESLineSearchGetPostCheck(), SNESLineSearchGetPreCheck() 16909bd66eb0SPeter Brune @*/ 169125acbd8eSLisandro Dalcin PetscErrorCode SNESLineSearchGetVIFunctions(SNESLineSearch linesearch, SNESLineSearchVIProjectFunc *projectfunc, SNESLineSearchVINormFunc *normfunc) 16929bd66eb0SPeter Brune { 16939bd66eb0SPeter Brune PetscFunctionBegin; 16949bd66eb0SPeter Brune if (projectfunc) *projectfunc = linesearch->ops->viproject; 16959bd66eb0SPeter Brune if (normfunc) *normfunc = linesearch->ops->vinorm; 16969bd66eb0SPeter Brune PetscFunctionReturn(0); 16979bd66eb0SPeter Brune } 16989bd66eb0SPeter Brune 1699bf7f4e0aSPeter Brune /*@C 17001c84c290SBarry Smith SNESLineSearchRegister - See SNESLineSearchRegister() 1701bf7f4e0aSPeter Brune 1702bf7f4e0aSPeter Brune Level: advanced 1703bf7f4e0aSPeter Brune @*/ 1704bdf89e91SBarry Smith PetscErrorCode SNESLineSearchRegister(const char sname[],PetscErrorCode (*function)(SNESLineSearch)) 1705bf7f4e0aSPeter Brune { 1706bf7f4e0aSPeter Brune PetscFunctionBegin; 1707*5f80ce2aSJacob Faibussowitsch CHKERRQ(SNESInitializePackage()); 1708*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFunctionListAdd(&SNESLineSearchList,sname,function)); 1709bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1710bf7f4e0aSPeter Brune } 1711