1bf7f4e0aSPeter Brune #include <private/linesearchimpl.h> /*I "petsclinesearch.h" I*/ 2bf7f4e0aSPeter Brune 3bf7f4e0aSPeter Brune PetscBool LineSearchRegisterAllCalled = PETSC_FALSE; 4bf7f4e0aSPeter Brune PetscFList LineSearchList = PETSC_NULL; 5bf7f4e0aSPeter Brune 6bf7f4e0aSPeter Brune PetscClassId LineSearch_CLASSID; 7bf7f4e0aSPeter Brune PetscLogEvent LineSearch_Apply; 8bf7f4e0aSPeter Brune 9bf7f4e0aSPeter Brune #undef __FUNCT__ 10bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchCreate" 11*f40b411bSPeter Brune /*@ 12*f40b411bSPeter Brune LineSearchCreate - Creates the line search. 13*f40b411bSPeter Brune 14*f40b411bSPeter Brune Collective on LineSearch 15*f40b411bSPeter Brune 16*f40b411bSPeter Brune Input Parameters: 17*f40b411bSPeter Brune . comm - MPI communicator for the line search 18*f40b411bSPeter Brune 19*f40b411bSPeter Brune Output Parameters: 20*f40b411bSPeter Brune . outlinesearch - the line search instance. 21*f40b411bSPeter Brune 22*f40b411bSPeter Brune Level: Beginner 23*f40b411bSPeter Brune 24*f40b411bSPeter Brune .keywords: LineSearch, Create 25*f40b411bSPeter Brune 26*f40b411bSPeter Brune .seealso: LineSearchDestroy() 27*f40b411bSPeter Brune @*/ 28*f40b411bSPeter Brune 29bf7f4e0aSPeter Brune PetscErrorCode LineSearchCreate(MPI_Comm comm, LineSearch * outlinesearch) { 30bf7f4e0aSPeter Brune PetscErrorCode ierr; 31bf7f4e0aSPeter Brune LineSearch linesearch; 32bf7f4e0aSPeter Brune PetscFunctionBegin; 33bf7f4e0aSPeter Brune ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,LineSearch_CLASSID, 0, 34bf7f4e0aSPeter Brune "LineSearch","Line-search method","LineSearch",comm,LineSearchDestroy,LineSearchView);CHKERRQ(ierr); 35bf7f4e0aSPeter Brune 36bf7f4e0aSPeter Brune linesearch->ops->precheckstep = PETSC_NULL; 37bf7f4e0aSPeter Brune linesearch->ops->postcheckstep = PETSC_NULL; 38bf7f4e0aSPeter Brune 39bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 40bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 41bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 42bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 43bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 44bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 45bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 46bf7f4e0aSPeter Brune linesearch->damping = 1.0; 47bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 48bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 49bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 50bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 51bf7f4e0aSPeter Brune linesearch->max_its = 1; 52bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 53bf7f4e0aSPeter Brune *outlinesearch = linesearch; 54bf7f4e0aSPeter Brune PetscFunctionReturn(0); 55bf7f4e0aSPeter Brune } 56bf7f4e0aSPeter Brune 57bf7f4e0aSPeter Brune #undef __FUNCT__ 58bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetUp" 59*f40b411bSPeter Brune /*@ 60*f40b411bSPeter Brune LineSearchSetUp - Prepares the line search for being applied. 61*f40b411bSPeter Brune 62*f40b411bSPeter Brune Collective on LineSearch 63*f40b411bSPeter Brune 64*f40b411bSPeter Brune Input Parameters: 65*f40b411bSPeter Brune . linesearch - The LineSearch instance. 66*f40b411bSPeter Brune 67*f40b411bSPeter Brune Level: Intermediate 68*f40b411bSPeter Brune 69*f40b411bSPeter Brune .keywords: LineSearch, SetUp 70*f40b411bSPeter Brune 71*f40b411bSPeter Brune .seealso: LineSearchReset() 72*f40b411bSPeter Brune @*/ 73*f40b411bSPeter Brune 74bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetUp(LineSearch linesearch) { 75bf7f4e0aSPeter Brune PetscErrorCode ierr; 76bf7f4e0aSPeter Brune PetscFunctionBegin; 77bf7f4e0aSPeter Brune 78bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 79bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,LINESEARCHBASIC);CHKERRQ(ierr); 80bf7f4e0aSPeter Brune } 81bf7f4e0aSPeter Brune 82bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 83bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 84bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_func, &linesearch->vec_func_new);CHKERRQ(ierr); 85bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 86bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 87bf7f4e0aSPeter Brune } 88bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 89bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 90bf7f4e0aSPeter Brune } 91bf7f4e0aSPeter Brune PetscFunctionReturn(0); 92bf7f4e0aSPeter Brune } 93bf7f4e0aSPeter Brune 94bf7f4e0aSPeter Brune #undef __FUNCT__ 95bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchReset" 96*f40b411bSPeter Brune 97*f40b411bSPeter Brune /*@ 98*f40b411bSPeter Brune LineSearchReset - Tears down the structures required for application 99*f40b411bSPeter Brune 100*f40b411bSPeter Brune Collective on LineSearch 101*f40b411bSPeter Brune 102*f40b411bSPeter Brune Input Parameters: 103*f40b411bSPeter Brune . linesearch - The LineSearch instance. 104*f40b411bSPeter Brune 105*f40b411bSPeter Brune Level: Intermediate 106*f40b411bSPeter Brune 107*f40b411bSPeter Brune .keywords: LineSearch, Create 108*f40b411bSPeter Brune 109*f40b411bSPeter Brune .seealso: LineSearchSetUp() 110*f40b411bSPeter Brune @*/ 111*f40b411bSPeter Brune 112bf7f4e0aSPeter Brune PetscErrorCode LineSearchReset(LineSearch linesearch) { 113bf7f4e0aSPeter Brune PetscErrorCode ierr; 114bf7f4e0aSPeter Brune PetscFunctionBegin; 115bf7f4e0aSPeter Brune if (linesearch->ops->reset) { 116bf7f4e0aSPeter Brune (*linesearch->ops->reset)(linesearch); 117bf7f4e0aSPeter Brune } 118bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 119bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 120bf7f4e0aSPeter Brune 121bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 122bf7f4e0aSPeter Brune linesearch->nwork = 0; 123bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 124bf7f4e0aSPeter Brune PetscFunctionReturn(0); 125bf7f4e0aSPeter Brune } 126bf7f4e0aSPeter Brune 127bf7f4e0aSPeter Brune #undef __FUNCT__ 128bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPreCheck" 129*f40b411bSPeter Brune /*@ 130*f40b411bSPeter Brune LineSearchPreCheck - Prepares the line search for being applied. 131*f40b411bSPeter Brune 132*f40b411bSPeter Brune Collective on LineSearch 133*f40b411bSPeter Brune 134*f40b411bSPeter Brune Input Parameters: 135*f40b411bSPeter Brune . linesearch - The linesearch instance. 136*f40b411bSPeter Brune 137*f40b411bSPeter Brune Output Parameters: 138*f40b411bSPeter Brune . changed - Indicator if the pre-check has changed anything. 139*f40b411bSPeter Brune 140*f40b411bSPeter Brune Level: Beginner 141*f40b411bSPeter Brune 142*f40b411bSPeter Brune .keywords: LineSearch, Create 143*f40b411bSPeter Brune 144*f40b411bSPeter Brune .seealso: LineSearchPostCheck() 145*f40b411bSPeter Brune @*/ 146bf7f4e0aSPeter Brune PetscErrorCode LineSearchPreCheck(LineSearch linesearch, PetscBool * changed) 147bf7f4e0aSPeter Brune { 148bf7f4e0aSPeter Brune PetscErrorCode ierr; 149bf7f4e0aSPeter Brune PetscFunctionBegin; 150bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 151bf7f4e0aSPeter Brune if (linesearch->ops->precheckstep) { 152bf7f4e0aSPeter Brune ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr); 153bf7f4e0aSPeter Brune } 154bf7f4e0aSPeter Brune PetscFunctionReturn(0); 155bf7f4e0aSPeter Brune } 156bf7f4e0aSPeter Brune 157bf7f4e0aSPeter Brune #undef __FUNCT__ 158bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPostCheck" 159*f40b411bSPeter Brune /*@ 160*f40b411bSPeter Brune LineSearchPostCheck - Prepares the line search for being applied. 161*f40b411bSPeter Brune 162*f40b411bSPeter Brune Collective on LineSearch 163*f40b411bSPeter Brune 164*f40b411bSPeter Brune Input Parameters: 165*f40b411bSPeter Brune . linesearch - The linesearch instance. 166*f40b411bSPeter Brune 167*f40b411bSPeter Brune Output Parameters: 168*f40b411bSPeter Brune + changed_W - Indicator if the solution has been changed. 169*f40b411bSPeter Brune - changed_Y - Indicator if the direction has been changed. 170*f40b411bSPeter Brune 171*f40b411bSPeter Brune Level: Intermediate 172*f40b411bSPeter Brune 173*f40b411bSPeter Brune .keywords: LineSearch, Create 174*f40b411bSPeter Brune 175*f40b411bSPeter Brune .seealso: LineSearchPreCheck() 176*f40b411bSPeter Brune @*/ 177bf7f4e0aSPeter Brune PetscErrorCode LineSearchPostCheck(LineSearch linesearch, PetscBool * changed_W, PetscBool * changed_Y) 178bf7f4e0aSPeter Brune { 179bf7f4e0aSPeter Brune PetscErrorCode ierr; 180bf7f4e0aSPeter Brune PetscFunctionBegin; 181bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 182bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 183bf7f4e0aSPeter Brune if (linesearch->ops->postcheckstep) { 184bf7f4e0aSPeter Brune ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_sol_new, linesearch->vec_update, changed_W, changed_Y);CHKERRQ(ierr); 185bf7f4e0aSPeter Brune } 186bf7f4e0aSPeter Brune PetscFunctionReturn(0); 187bf7f4e0aSPeter Brune } 188bf7f4e0aSPeter Brune 189bf7f4e0aSPeter Brune #undef __FUNCT__ 190bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchApply" 191*f40b411bSPeter Brune /*@ 192*f40b411bSPeter Brune LineSearchApply - Computes the line-search update 193*f40b411bSPeter Brune 194*f40b411bSPeter Brune Collective on LineSearch 195*f40b411bSPeter Brune 196*f40b411bSPeter Brune Input Parameters: 197*f40b411bSPeter Brune + linesearch - The linesearch instance. 198*f40b411bSPeter Brune . X - The current solution. 199*f40b411bSPeter Brune . F - The current function. 200*f40b411bSPeter Brune . fnorm - The current norm. 201*f40b411bSPeter Brune . Y - The search direction. 202*f40b411bSPeter Brune 203*f40b411bSPeter Brune Output Parameters: 204*f40b411bSPeter Brune + X - The new solution. 205*f40b411bSPeter Brune . F - The new function. 206*f40b411bSPeter Brune - fnorm - The new function norm. 207*f40b411bSPeter Brune 208*f40b411bSPeter Brune Level: Intermediate 209*f40b411bSPeter Brune 210*f40b411bSPeter Brune .keywords: LineSearch, Create 211*f40b411bSPeter Brune 212*f40b411bSPeter Brune .seealso: LineSearchCreate(), LineSearchPreCheck(), LineSearchPostCheck() 213*f40b411bSPeter Brune @*/ 214bf7f4e0aSPeter Brune PetscErrorCode LineSearchApply(LineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) { 215bf7f4e0aSPeter Brune PetscErrorCode ierr; 216bf7f4e0aSPeter Brune PetscFunctionBegin; 217bf7f4e0aSPeter Brune 218bf7f4e0aSPeter Brune /* check the pointers */ 219bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 220bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 221bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 222bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 223bf7f4e0aSPeter Brune 224bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 225bf7f4e0aSPeter Brune 226bf7f4e0aSPeter Brune linesearch->vec_sol = X; 227bf7f4e0aSPeter Brune linesearch->vec_update = Y; 228bf7f4e0aSPeter Brune linesearch->vec_func = F; 229bf7f4e0aSPeter Brune 230bf7f4e0aSPeter Brune ierr = LineSearchSetUp(linesearch);CHKERRQ(ierr); 231bf7f4e0aSPeter Brune 232bf7f4e0aSPeter Brune if (!linesearch->keeplambda) 233bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 234bf7f4e0aSPeter Brune 235bf7f4e0aSPeter Brune if (fnorm) { 236bf7f4e0aSPeter Brune linesearch->fnorm = *fnorm; 237bf7f4e0aSPeter Brune } else { 238bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 239bf7f4e0aSPeter Brune } 240bf7f4e0aSPeter Brune 241bf7f4e0aSPeter Brune ierr = PetscLogEventBegin(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 242bf7f4e0aSPeter Brune 243bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 244bf7f4e0aSPeter Brune 245bf7f4e0aSPeter Brune ierr = PetscLogEventEnd(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 246bf7f4e0aSPeter Brune 247bf7f4e0aSPeter Brune if (fnorm) 248bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 249bf7f4e0aSPeter Brune PetscFunctionReturn(0); 250bf7f4e0aSPeter Brune } 251bf7f4e0aSPeter Brune 252bf7f4e0aSPeter Brune #undef __FUNCT__ 253bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchDestroy" 254*f40b411bSPeter Brune /*@ 255*f40b411bSPeter Brune LineSearchDestroy - Destroys the line search instance. 256*f40b411bSPeter Brune 257*f40b411bSPeter Brune Collective on LineSearch 258*f40b411bSPeter Brune 259*f40b411bSPeter Brune Input Parameters: 260*f40b411bSPeter Brune . linesearch - The linesearch instance. 261*f40b411bSPeter Brune 262*f40b411bSPeter Brune Level: Intermediate 263*f40b411bSPeter Brune 264*f40b411bSPeter Brune .keywords: LineSearch, Create 265*f40b411bSPeter Brune 266*f40b411bSPeter Brune .seealso: LineSearchCreate(), LineSearchReset() 267*f40b411bSPeter Brune @*/ 268bf7f4e0aSPeter Brune PetscErrorCode LineSearchDestroy(LineSearch * linesearch) { 269bf7f4e0aSPeter Brune PetscErrorCode ierr; 270bf7f4e0aSPeter Brune PetscFunctionBegin; 271bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 272bf7f4e0aSPeter Brune PetscValidHeaderSpecific((*linesearch),LineSearch_CLASSID,1); 273bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 274bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 275bf7f4e0aSPeter Brune ierr = LineSearchReset(*linesearch); 276bf7f4e0aSPeter Brune if ((*linesearch)->ops->destroy) { 277bf7f4e0aSPeter Brune (*linesearch)->ops->destroy(*linesearch); 278bf7f4e0aSPeter Brune } 279bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 280e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 281bf7f4e0aSPeter Brune PetscFunctionReturn(0); 282bf7f4e0aSPeter Brune } 283bf7f4e0aSPeter Brune 284bf7f4e0aSPeter Brune #undef __FUNCT__ 285e7058c64SPeter Brune #define __FUNCT__ "LineSearchSetMonitor" 286*f40b411bSPeter Brune /*@ 287*f40b411bSPeter Brune LineSearchSetMonitor - Turns on/off printing useful things about the line search. 288bf7f4e0aSPeter Brune 289bf7f4e0aSPeter Brune Input Parameters: 290bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 291bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 292bf7f4e0aSPeter Brune 293bf7f4e0aSPeter Brune Logically Collective on SNES 294bf7f4e0aSPeter Brune 295bf7f4e0aSPeter Brune Options Database: 296*f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 297bf7f4e0aSPeter Brune 298bf7f4e0aSPeter Brune Level: intermediate 299bf7f4e0aSPeter Brune 300bf7f4e0aSPeter Brune 301*f40b411bSPeter Brune .seealso: LineSearchGetMonitor() 302bf7f4e0aSPeter Brune @*/ 303bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetMonitor(LineSearch linesearch, PetscBool flg) 304bf7f4e0aSPeter Brune { 305bf7f4e0aSPeter Brune 306bf7f4e0aSPeter Brune PetscErrorCode ierr; 307bf7f4e0aSPeter Brune PetscFunctionBegin; 308bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 309bf7f4e0aSPeter Brune ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr); 310bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 311bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 312bf7f4e0aSPeter Brune } 313bf7f4e0aSPeter Brune PetscFunctionReturn(0); 314bf7f4e0aSPeter Brune } 315bf7f4e0aSPeter Brune 316bf7f4e0aSPeter Brune #undef __FUNCT__ 3176a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMonitor" 318*f40b411bSPeter Brune /*@ 319*f40b411bSPeter Brune LineSearchGetMonitor - Gets the monitor instance for the line search 3206a388c36SPeter Brune 321*f40b411bSPeter Brune Input Parameters: 322*f40b411bSPeter Brune . linesearch - linesearch context. 323*f40b411bSPeter Brune 324*f40b411bSPeter Brune Input Parameters: 325*f40b411bSPeter Brune . monitor - monitor context. 326*f40b411bSPeter Brune 327*f40b411bSPeter Brune Logically Collective on SNES 328*f40b411bSPeter Brune 329*f40b411bSPeter Brune 330*f40b411bSPeter Brune Options Database Keys: 331*f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 332*f40b411bSPeter Brune 333*f40b411bSPeter Brune Level: intermediate 334*f40b411bSPeter Brune 335*f40b411bSPeter Brune 336*f40b411bSPeter Brune .seealso: LineSearchSetMonitor() 337*f40b411bSPeter Brune @*/ 3386a388c36SPeter Brune PetscErrorCode LineSearchGetMonitor(LineSearch linesearch, PetscViewer *monitor) 3396a388c36SPeter Brune { 3406a388c36SPeter Brune 3416a388c36SPeter Brune PetscFunctionBegin; 3426a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 3436a388c36SPeter Brune if (monitor) { 3446a388c36SPeter Brune PetscValidPointer(monitor, 2); 3456a388c36SPeter Brune *monitor = linesearch->monitor; 3466a388c36SPeter Brune } 3476a388c36SPeter Brune PetscFunctionReturn(0); 3486a388c36SPeter Brune } 3496a388c36SPeter Brune 3506a388c36SPeter Brune #undef __FUNCT__ 351bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetFromOptions" 352*f40b411bSPeter Brune /*@ 353*f40b411bSPeter Brune LineSearchSetFromOptions - Sets options for the line search 354*f40b411bSPeter Brune 355*f40b411bSPeter Brune Input Parameters: 356*f40b411bSPeter Brune . linesearch - linesearch context. 357*f40b411bSPeter Brune 358*f40b411bSPeter Brune Options Database Keys: 359*f40b411bSPeter Brune + -linesearch_type - The Line search method 360*f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches 361*f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter. 362*f40b411bSPeter Brune . -linesearch_norms - Turn on/off the linesearch norms 363*f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess. 364*f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches. 365*f40b411bSPeter Brune 366*f40b411bSPeter Brune Logically Collective on LineSearch 367*f40b411bSPeter Brune 368*f40b411bSPeter Brune Level: intermediate 369*f40b411bSPeter Brune 370*f40b411bSPeter Brune 371*f40b411bSPeter Brune .seealso: LineSearchCreate() 372*f40b411bSPeter Brune @*/ 373bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetFromOptions(LineSearch linesearch) { 374bf7f4e0aSPeter Brune PetscErrorCode ierr; 375bf7f4e0aSPeter Brune const char *deft = LINESEARCHBASIC; 376bf7f4e0aSPeter Brune char type[256]; 377bf7f4e0aSPeter Brune PetscBool flg, set; 378bf7f4e0aSPeter Brune PetscFunctionBegin; 379bf7f4e0aSPeter Brune if (!LineSearchRegisterAllCalled) {ierr = LineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 380bf7f4e0aSPeter Brune 381bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 382bf7f4e0aSPeter Brune if (((PetscObject)linesearch)->type_name) { 383bf7f4e0aSPeter Brune deft = ((PetscObject)linesearch)->type_name; 384bf7f4e0aSPeter Brune } 385bf7f4e0aSPeter Brune ierr = PetscOptionsList("-linesearch_type","Line-search method","LineSearchSetType",LineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 386bf7f4e0aSPeter Brune if (flg) { 387bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,type);CHKERRQ(ierr); 388bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 389bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,deft);CHKERRQ(ierr); 390bf7f4e0aSPeter Brune } 391bf7f4e0aSPeter Brune if (linesearch->ops->setfromoptions) { 392bf7f4e0aSPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 393bf7f4e0aSPeter Brune } 394bf7f4e0aSPeter Brune 395bf7f4e0aSPeter Brune ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESLineSearchSetMonitor", 396bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 397bf7f4e0aSPeter Brune if (set) {ierr = LineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 398bf7f4e0aSPeter Brune 399bf7f4e0aSPeter Brune ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","LineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 4006a388c36SPeter Brune ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","LineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 4016a388c36SPeter Brune ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","LineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 402bf7f4e0aSPeter Brune ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 403bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 404bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 405bf7f4e0aSPeter Brune PetscFunctionReturn(0); 406bf7f4e0aSPeter Brune } 407bf7f4e0aSPeter Brune 408bf7f4e0aSPeter Brune #undef __FUNCT__ 409bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchView" 410*f40b411bSPeter Brune /*@ 411*f40b411bSPeter Brune LineSearchView - Views useful information for the line search. 412*f40b411bSPeter Brune 413*f40b411bSPeter Brune Input Parameters: 414*f40b411bSPeter Brune . linesearch - linesearch context. 415*f40b411bSPeter Brune 416*f40b411bSPeter Brune Logically Collective on LineSearch 417*f40b411bSPeter Brune 418*f40b411bSPeter Brune Level: intermediate 419*f40b411bSPeter Brune 420*f40b411bSPeter Brune 421*f40b411bSPeter Brune .seealso: LineSearchCreate() 422*f40b411bSPeter Brune @*/ 423bf7f4e0aSPeter Brune PetscErrorCode LineSearchView(LineSearch linesearch) { 424bf7f4e0aSPeter Brune PetscFunctionBegin; 425*f40b411bSPeter Brune 426bf7f4e0aSPeter Brune PetscFunctionReturn(0); 427bf7f4e0aSPeter Brune } 428bf7f4e0aSPeter Brune 429bf7f4e0aSPeter Brune #undef __FUNCT__ 430bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetType" 431*f40b411bSPeter Brune /*@ 432*f40b411bSPeter Brune LineSearchSetType - Sets the linesearch type 433*f40b411bSPeter Brune 434*f40b411bSPeter Brune Input Parameters: 435*f40b411bSPeter Brune + linesearch - linesearch context. 436*f40b411bSPeter Brune - type - The type of line search to be used 437*f40b411bSPeter Brune 438*f40b411bSPeter Brune Logically Collective on LineSearch 439*f40b411bSPeter Brune 440*f40b411bSPeter Brune Level: intermediate 441*f40b411bSPeter Brune 442*f40b411bSPeter Brune 443*f40b411bSPeter Brune .seealso: LineSearchCreate() 444*f40b411bSPeter Brune @*/ 445bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetType(LineSearch linesearch, const LineSearchType type) 446bf7f4e0aSPeter Brune { 447bf7f4e0aSPeter Brune 448bf7f4e0aSPeter Brune PetscErrorCode ierr,(*r)(LineSearch); 449bf7f4e0aSPeter Brune PetscBool match; 450bf7f4e0aSPeter Brune 451bf7f4e0aSPeter Brune PetscFunctionBegin; 452bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 453bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 454bf7f4e0aSPeter Brune 455bf7f4e0aSPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 456bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 457bf7f4e0aSPeter Brune 458bf7f4e0aSPeter Brune ierr = PetscFListFind(LineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 459bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 460bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 461bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 462bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 463bf7f4e0aSPeter Brune linesearch->ops->destroy = PETSC_NULL; 464bf7f4e0aSPeter Brune } 465bf7f4e0aSPeter Brune /* Reinitialize function pointers in LineSearchOps structure */ 466bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 467bf7f4e0aSPeter Brune linesearch->ops->view = 0; 468bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 469bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 470bf7f4e0aSPeter Brune 471bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 472bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 473bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS) 474bf7f4e0aSPeter Brune if (PetscAMSPublishAll) { 475bf7f4e0aSPeter Brune ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr); 476bf7f4e0aSPeter Brune } 477bf7f4e0aSPeter Brune #endif 478bf7f4e0aSPeter Brune PetscFunctionReturn(0); 479bf7f4e0aSPeter Brune } 480bf7f4e0aSPeter Brune 481bf7f4e0aSPeter Brune #undef __FUNCT__ 482bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetSNES" 483*f40b411bSPeter Brune /*@ 484*f40b411bSPeter Brune LineSearchSetSNES - Sets the SNES for the linesearch for function evaluation 485*f40b411bSPeter Brune 486*f40b411bSPeter Brune Input Parameters: 487*f40b411bSPeter Brune + linesearch - linesearch context. 488*f40b411bSPeter Brune - snes - The snes instance 489*f40b411bSPeter Brune 490*f40b411bSPeter Brune Level: intermediate 491*f40b411bSPeter Brune 492*f40b411bSPeter Brune 493*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 494*f40b411bSPeter Brune @*/ 495bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetSNES(LineSearch linesearch, SNES snes){ 496bf7f4e0aSPeter Brune PetscFunctionBegin; 497bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 498bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 499bf7f4e0aSPeter Brune linesearch->snes = snes; 500bf7f4e0aSPeter Brune PetscFunctionReturn(0); 501bf7f4e0aSPeter Brune } 502bf7f4e0aSPeter Brune 503bf7f4e0aSPeter Brune #undef __FUNCT__ 504bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSNES" 505*f40b411bSPeter Brune /*@ 506*f40b411bSPeter Brune LineSearchGetSNES - Gets the SNES for the linesearch for function evaluation 507*f40b411bSPeter Brune 508*f40b411bSPeter Brune Input Parameters: 509*f40b411bSPeter Brune . linesearch - linesearch context. 510*f40b411bSPeter Brune 511*f40b411bSPeter Brune Output Parameters: 512*f40b411bSPeter Brune . snes - The snes instance 513*f40b411bSPeter Brune 514*f40b411bSPeter Brune Level: intermediate 515*f40b411bSPeter Brune 516*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 517*f40b411bSPeter Brune @*/ 518bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSNES(LineSearch linesearch, SNES *snes){ 519bf7f4e0aSPeter Brune PetscFunctionBegin; 5206a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5216a388c36SPeter Brune PetscValidPointer(snes, 2); 522bf7f4e0aSPeter Brune *snes = linesearch->snes; 523bf7f4e0aSPeter Brune PetscFunctionReturn(0); 524bf7f4e0aSPeter Brune } 525bf7f4e0aSPeter Brune 5266a388c36SPeter Brune #undef __FUNCT__ 5276a388c36SPeter Brune #define __FUNCT__ "LineSearchGetLambda" 528*f40b411bSPeter Brune /*@ 529*f40b411bSPeter Brune LineSearchGetLambda - Gets the last linesearch steplength discovered. 530*f40b411bSPeter Brune 531*f40b411bSPeter Brune Input Parameters: 532*f40b411bSPeter Brune . linesearch - linesearch context. 533*f40b411bSPeter Brune 534*f40b411bSPeter Brune Output Parameters: 535*f40b411bSPeter Brune . lambda - The last steplength. 536*f40b411bSPeter Brune 537*f40b411bSPeter Brune Level: intermediate 538*f40b411bSPeter Brune 539*f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 540*f40b411bSPeter Brune @*/ 5416a388c36SPeter Brune PetscErrorCode LineSearchGetLambda(LineSearch linesearch,PetscReal *lambda) 5426a388c36SPeter Brune { 5436a388c36SPeter Brune PetscFunctionBegin; 5446a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5456a388c36SPeter Brune PetscValidPointer(lambda, 2); 5466a388c36SPeter Brune *lambda = linesearch->lambda; 5476a388c36SPeter Brune PetscFunctionReturn(0); 5486a388c36SPeter Brune } 5496a388c36SPeter Brune 5506a388c36SPeter Brune #undef __FUNCT__ 5516a388c36SPeter Brune #define __FUNCT__ "LineSearchSetLambda" 552*f40b411bSPeter Brune /*@ 553*f40b411bSPeter Brune LineSearchSetLambda - Sets the linesearch steplength. 554*f40b411bSPeter Brune 555*f40b411bSPeter Brune Input Parameters: 556*f40b411bSPeter Brune + linesearch - linesearch context. 557*f40b411bSPeter Brune - lambda - The last steplength. 558*f40b411bSPeter Brune 559*f40b411bSPeter Brune Level: intermediate 560*f40b411bSPeter Brune 561*f40b411bSPeter Brune .seealso: LineSearchGetLambda() 562*f40b411bSPeter Brune @*/ 5636a388c36SPeter Brune PetscErrorCode LineSearchSetLambda(LineSearch linesearch, PetscReal lambda) 5646a388c36SPeter Brune { 5656a388c36SPeter Brune PetscFunctionBegin; 5666a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5676a388c36SPeter Brune linesearch->lambda = lambda; 5686a388c36SPeter Brune PetscFunctionReturn(0); 5696a388c36SPeter Brune } 5706a388c36SPeter Brune 5716a388c36SPeter Brune #undef __FUNCT__ 5726a388c36SPeter Brune #define __FUNCT__ "LineSearchGetStepTolerance" 573*f40b411bSPeter Brune /*@ 574*f40b411bSPeter Brune LineSearchGetStepTolerance - Gets the line search step tolerance. 575*f40b411bSPeter Brune 576*f40b411bSPeter Brune Input Parameters: 577*f40b411bSPeter Brune . linesearch - linesearch context. 578*f40b411bSPeter Brune 579*f40b411bSPeter Brune Output Parameters: 580*f40b411bSPeter Brune . steptol - The last steplength. 581*f40b411bSPeter Brune 582*f40b411bSPeter Brune Level: intermediate 583*f40b411bSPeter Brune 584*f40b411bSPeter Brune .seealso: LineSearchSetStepTolerance() 585*f40b411bSPeter Brune @*/ 5866a388c36SPeter Brune PetscErrorCode LineSearchGetStepTolerance(LineSearch linesearch ,PetscReal *steptol) 5876a388c36SPeter Brune { 5886a388c36SPeter Brune PetscFunctionBegin; 5896a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5906a388c36SPeter Brune PetscValidPointer(steptol, 2); 5916a388c36SPeter Brune *steptol = linesearch->steptol; 5926a388c36SPeter Brune PetscFunctionReturn(0); 5936a388c36SPeter Brune } 5946a388c36SPeter Brune 5956a388c36SPeter Brune #undef __FUNCT__ 5966a388c36SPeter Brune #define __FUNCT__ "LineSearchSetStepTolerance" 597*f40b411bSPeter Brune /*@ 598*f40b411bSPeter Brune LineSearchSetStepTolerance - Gets the line search step tolerance. 599*f40b411bSPeter Brune 600*f40b411bSPeter Brune Input Parameters: 601*f40b411bSPeter Brune . linesearch - linesearch context. 602*f40b411bSPeter Brune . steptol - The last steplength. 603*f40b411bSPeter Brune 604*f40b411bSPeter Brune Level: intermediate 605*f40b411bSPeter Brune 606*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance() 607*f40b411bSPeter Brune @*/ 6086a388c36SPeter Brune PetscErrorCode LineSearchSetStepTolerance(LineSearch linesearch,PetscReal steptol) 6096a388c36SPeter Brune { 6106a388c36SPeter Brune PetscFunctionBegin; 6116a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6126a388c36SPeter Brune linesearch->steptol = steptol; 6136a388c36SPeter Brune PetscFunctionReturn(0); 6146a388c36SPeter Brune } 6156a388c36SPeter Brune 6166a388c36SPeter Brune #undef __FUNCT__ 6176a388c36SPeter Brune #define __FUNCT__ "LineSearchGetDamping" 618*f40b411bSPeter Brune /*@ 619*f40b411bSPeter Brune LineSearchGetDamping - Gets the line search damping paramter. 620*f40b411bSPeter Brune 621*f40b411bSPeter Brune Input Parameters: 622*f40b411bSPeter Brune . linesearch - linesearch context. 623*f40b411bSPeter Brune 624*f40b411bSPeter Brune Output Parameters: 625*f40b411bSPeter Brune . damping - The damping parameter. 626*f40b411bSPeter Brune 627*f40b411bSPeter Brune Level: intermediate 628*f40b411bSPeter Brune 629*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance() 630*f40b411bSPeter Brune @*/ 631*f40b411bSPeter Brune 632*f40b411bSPeter Brune PetscErrorCode LineSearchGetDamping(LineSearch linesearch,PetscReal *damping) 6336a388c36SPeter Brune { 6346a388c36SPeter Brune PetscFunctionBegin; 6356a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6366a388c36SPeter Brune PetscValidPointer(damping, 2); 6376a388c36SPeter Brune *damping = linesearch->damping; 6386a388c36SPeter Brune PetscFunctionReturn(0); 6396a388c36SPeter Brune } 6406a388c36SPeter Brune 6416a388c36SPeter Brune #undef __FUNCT__ 6426a388c36SPeter Brune #define __FUNCT__ "LineSearchSetDamping" 643*f40b411bSPeter Brune /*@ 644*f40b411bSPeter Brune LineSearchSetDamping - Sets the line search damping paramter. 645*f40b411bSPeter Brune 646*f40b411bSPeter Brune Input Parameters: 647*f40b411bSPeter Brune . linesearch - linesearch context. 648*f40b411bSPeter Brune . damping - The damping parameter. 649*f40b411bSPeter Brune 650*f40b411bSPeter Brune Level: intermediate 651*f40b411bSPeter Brune 652*f40b411bSPeter Brune .seealso: LineSearchGetDamping() 653*f40b411bSPeter Brune @*/ 654*f40b411bSPeter Brune PetscErrorCode LineSearchSetDamping(LineSearch linesearch,PetscReal damping) 6556a388c36SPeter Brune { 6566a388c36SPeter Brune PetscFunctionBegin; 6576a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6586a388c36SPeter Brune linesearch->damping = damping; 6596a388c36SPeter Brune PetscFunctionReturn(0); 6606a388c36SPeter Brune } 6616a388c36SPeter Brune 6626a388c36SPeter Brune #undef __FUNCT__ 6636a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMaxStep" 664*f40b411bSPeter Brune /*@ 665*f40b411bSPeter Brune LineSearchGetMaxStep - Gets the maximum allowable step size for the line search. 666*f40b411bSPeter Brune 667*f40b411bSPeter Brune Input Parameters: 668*f40b411bSPeter Brune . linesearch - linesearch context. 669*f40b411bSPeter Brune 670*f40b411bSPeter Brune Output Parameters: 671*f40b411bSPeter Brune . maxstep - The maximum step. 672*f40b411bSPeter Brune 673*f40b411bSPeter Brune Level: intermediate 674*f40b411bSPeter Brune 675*f40b411bSPeter Brune .seealso: LineSearchSetMaxStep() 676*f40b411bSPeter Brune @*/ 677*f40b411bSPeter Brune PetscErrorCode LineSearchGetMaxStep(LineSearch linesearch,PetscReal* maxstep) 6786a388c36SPeter Brune { 6796a388c36SPeter Brune PetscFunctionBegin; 6806a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6816a388c36SPeter Brune PetscValidPointer(maxstep, 2); 6826a388c36SPeter Brune *maxstep = linesearch->maxstep; 6836a388c36SPeter Brune PetscFunctionReturn(0); 6846a388c36SPeter Brune } 6856a388c36SPeter Brune 6866a388c36SPeter Brune #undef __FUNCT__ 6876a388c36SPeter Brune #define __FUNCT__ "LineSearchSetMaxStep" 688*f40b411bSPeter Brune /*@ 689*f40b411bSPeter Brune LineSearchSetMaxStep - Sets the maximum allowable step size for the line search. 690*f40b411bSPeter Brune 691*f40b411bSPeter Brune Input Parameters: 692*f40b411bSPeter Brune . linesearch - linesearch context. 693*f40b411bSPeter Brune . maxstep - The maximum step. 694*f40b411bSPeter Brune 695*f40b411bSPeter Brune Level: intermediate 696*f40b411bSPeter Brune 697*f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance() 698*f40b411bSPeter Brune @*/ 699*f40b411bSPeter Brune PetscErrorCode LineSearchSetMaxStep(LineSearch linesearch, PetscReal maxstep) 7006a388c36SPeter Brune { 7016a388c36SPeter Brune PetscFunctionBegin; 7026a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 7036a388c36SPeter Brune linesearch->maxstep = maxstep; 7046a388c36SPeter Brune PetscFunctionReturn(0); 7056a388c36SPeter Brune } 7066a388c36SPeter Brune 7076a388c36SPeter Brune #undef __FUNCT__ 7086a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMaxIts" 709*f40b411bSPeter Brune /*@ 710*f40b411bSPeter Brune LineSearchGetMaxIts - Gets the maximum iterations for iterative line searches. 711*f40b411bSPeter Brune 712*f40b411bSPeter Brune Input Parameters: 713*f40b411bSPeter Brune . linesearch - linesearch context. 714*f40b411bSPeter Brune 715*f40b411bSPeter Brune Output Parameters: 716*f40b411bSPeter Brune . max_its - The maximum number of iterations. 717*f40b411bSPeter Brune 718*f40b411bSPeter Brune Level: intermediate 719*f40b411bSPeter Brune 720*f40b411bSPeter Brune .seealso: LineSearchSetMaxIts() 721*f40b411bSPeter Brune @*/ 7226a388c36SPeter Brune PetscErrorCode LineSearchGetMaxIts(LineSearch linesearch, PetscInt * max_its) 7236a388c36SPeter Brune { 7246a388c36SPeter Brune PetscFunctionBegin; 7256a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 7266a388c36SPeter Brune PetscValidPointer(max_its, 2); 7276a388c36SPeter Brune *max_its = linesearch->max_its; 7286a388c36SPeter Brune PetscFunctionReturn(0); 7296a388c36SPeter Brune } 7306a388c36SPeter Brune 7316a388c36SPeter Brune #undef __FUNCT__ 7326a388c36SPeter Brune #define __FUNCT__ "LineSearchSetMaxIts" 733*f40b411bSPeter Brune /*@ 734*f40b411bSPeter Brune LineSearchSetMaxIts - Sets the maximum iterations for iterative line searches. 735*f40b411bSPeter Brune 736*f40b411bSPeter Brune Input Parameters: 737*f40b411bSPeter Brune . linesearch - linesearch context. 738*f40b411bSPeter Brune . max_its - The maximum number of iterations. 739*f40b411bSPeter Brune 740*f40b411bSPeter Brune Level: intermediate 741*f40b411bSPeter Brune 742*f40b411bSPeter Brune .seealso: LineSearchGetMaxIts() 743*f40b411bSPeter Brune @*/ 7446a388c36SPeter Brune PetscErrorCode LineSearchSetMaxIts(LineSearch linesearch, PetscInt max_its) 7456a388c36SPeter Brune { 7466a388c36SPeter Brune PetscFunctionBegin; 7476a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 7486a388c36SPeter Brune linesearch->max_its = max_its; 7496a388c36SPeter Brune PetscFunctionReturn(0); 7506a388c36SPeter Brune } 751bf7f4e0aSPeter Brune 752bf7f4e0aSPeter Brune #undef __FUNCT__ 753bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetNorms" 754*f40b411bSPeter Brune /*@ 755*f40b411bSPeter Brune LineSearchGetNorms - Gets the norms for for X, Y, and F. 756*f40b411bSPeter Brune 757*f40b411bSPeter Brune Input Parameters: 758*f40b411bSPeter Brune . linesearch - linesearch context. 759*f40b411bSPeter Brune 760*f40b411bSPeter Brune Output Parameters: 761*f40b411bSPeter Brune + xnorm - The norm of the current solution 762*f40b411bSPeter Brune . fnorm - The norm of the current function 763*f40b411bSPeter Brune - ynorm - The norm of the current update 764*f40b411bSPeter Brune 765*f40b411bSPeter Brune Level: intermediate 766*f40b411bSPeter Brune 767*f40b411bSPeter Brune .seealso: LineSearchSetNorms() LineSearchGetVecs() 768*f40b411bSPeter Brune @*/ 769bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetNorms(LineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 770bf7f4e0aSPeter Brune { 771bf7f4e0aSPeter Brune PetscFunctionBegin; 7726a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 773bf7f4e0aSPeter Brune if (xnorm) { 774bf7f4e0aSPeter Brune *xnorm = linesearch->xnorm; 775bf7f4e0aSPeter Brune } 776bf7f4e0aSPeter Brune if (fnorm) { 777bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 778bf7f4e0aSPeter Brune } 779bf7f4e0aSPeter Brune if (ynorm) { 780bf7f4e0aSPeter Brune *ynorm = linesearch->ynorm; 781bf7f4e0aSPeter Brune } 782bf7f4e0aSPeter Brune PetscFunctionReturn(0); 783bf7f4e0aSPeter Brune } 784bf7f4e0aSPeter Brune 785e7058c64SPeter Brune #undef __FUNCT__ 7866a388c36SPeter Brune #define __FUNCT__ "LineSearchSetNorms" 787*f40b411bSPeter Brune /*@ 788*f40b411bSPeter Brune LineSearchSetNorms - Gets the computed norms for for X, Y, and F. 789*f40b411bSPeter Brune 790*f40b411bSPeter Brune Input Parameters: 791*f40b411bSPeter Brune + linesearch - linesearch context. 792*f40b411bSPeter Brune . xnorm - The norm of the current solution 793*f40b411bSPeter Brune . fnorm - The norm of the current function 794*f40b411bSPeter Brune - ynorm - The norm of the current update 795*f40b411bSPeter Brune 796*f40b411bSPeter Brune Level: intermediate 797*f40b411bSPeter Brune 798*f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs() 799*f40b411bSPeter Brune @*/ 8006a388c36SPeter Brune PetscErrorCode LineSearchSetNorms(LineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 8016a388c36SPeter Brune { 8026a388c36SPeter Brune PetscFunctionBegin; 8036a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 8046a388c36SPeter Brune if (xnorm) { 8056a388c36SPeter Brune linesearch->xnorm = xnorm; 8066a388c36SPeter Brune } 8076a388c36SPeter Brune if (fnorm) { 8086a388c36SPeter Brune linesearch->fnorm = fnorm; 8096a388c36SPeter Brune } 8106a388c36SPeter Brune if (ynorm) { 8116a388c36SPeter Brune linesearch->ynorm = ynorm; 8126a388c36SPeter Brune } 8136a388c36SPeter Brune PetscFunctionReturn(0); 8146a388c36SPeter Brune } 8156a388c36SPeter Brune 8166a388c36SPeter Brune #undef __FUNCT__ 8176a388c36SPeter Brune #define __FUNCT__ "LineSearchComputeNorms" 818*f40b411bSPeter Brune /*@ 819*f40b411bSPeter Brune LineSearchComputeNorms - Computes the norms of X, F, and Y. 820*f40b411bSPeter Brune 821*f40b411bSPeter Brune Input Parameters: 822*f40b411bSPeter Brune . linesearch - linesearch context. 823*f40b411bSPeter Brune 824*f40b411bSPeter Brune Options Database Keys: 825*f40b411bSPeter Brune . -linesearch_norms - turn norm computation on or off. 826*f40b411bSPeter Brune 827*f40b411bSPeter Brune Level: intermediate 828*f40b411bSPeter Brune 829*f40b411bSPeter Brune .seealso: LineSearchGetNorms, LineSearchSetNorms() 830*f40b411bSPeter Brune @*/ 8316a388c36SPeter Brune PetscErrorCode LineSearchComputeNorms(LineSearch linesearch) 8326a388c36SPeter Brune { 8336a388c36SPeter Brune PetscErrorCode ierr; 8346a388c36SPeter Brune PetscFunctionBegin; 8356a388c36SPeter Brune if (linesearch->norms) { 8366a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 8376a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 8386a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 8396a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 8406a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 8416a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 8426a388c36SPeter Brune } 8436a388c36SPeter Brune PetscFunctionReturn(0); 8446a388c36SPeter Brune } 8456a388c36SPeter Brune 8466a388c36SPeter Brune #undef __FUNCT__ 8476a388c36SPeter Brune #define __FUNCT__ "LineSearchGetVecs" 848*f40b411bSPeter Brune /*@ 849*f40b411bSPeter Brune LineSearchGetVecs - Gets the vectors from the LineSearch context 850*f40b411bSPeter Brune 851*f40b411bSPeter Brune Input Parameters: 852*f40b411bSPeter Brune . linesearch - linesearch context. 853*f40b411bSPeter Brune 854*f40b411bSPeter Brune Output Parameters: 855*f40b411bSPeter Brune + X - The old solution 856*f40b411bSPeter Brune . F - The old function 857*f40b411bSPeter Brune . Y - The search direction 858*f40b411bSPeter Brune . W - The new solution 859*f40b411bSPeter Brune - G - The new function 860*f40b411bSPeter Brune 861*f40b411bSPeter Brune Level: intermediate 862*f40b411bSPeter Brune 863*f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs() 864*f40b411bSPeter Brune @*/ 8656a388c36SPeter Brune PetscErrorCode LineSearchGetVecs(LineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) { 8666a388c36SPeter Brune PetscFunctionBegin; 8676a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 8686a388c36SPeter Brune if (X) { 8696a388c36SPeter Brune PetscValidPointer(X, 2); 8706a388c36SPeter Brune *X = linesearch->vec_sol; 8716a388c36SPeter Brune } 8726a388c36SPeter Brune if (F) { 8736a388c36SPeter Brune PetscValidPointer(F, 3); 8746a388c36SPeter Brune *F = linesearch->vec_func; 8756a388c36SPeter Brune } 8766a388c36SPeter Brune if (Y) { 8776a388c36SPeter Brune PetscValidPointer(Y, 4); 8786a388c36SPeter Brune *Y = linesearch->vec_update; 8796a388c36SPeter Brune } 8806a388c36SPeter Brune if (W) { 8816a388c36SPeter Brune PetscValidPointer(W, 5); 8826a388c36SPeter Brune *W = linesearch->vec_sol_new; 8836a388c36SPeter Brune } 8846a388c36SPeter Brune if (G) { 8856a388c36SPeter Brune PetscValidPointer(G, 6); 8866a388c36SPeter Brune *G = linesearch->vec_func_new; 8876a388c36SPeter Brune } 8886a388c36SPeter Brune 8896a388c36SPeter Brune PetscFunctionReturn(0); 8906a388c36SPeter Brune } 8916a388c36SPeter Brune 8926a388c36SPeter Brune #undef __FUNCT__ 8936a388c36SPeter Brune #define __FUNCT__ "LineSearchSetVecs" 894*f40b411bSPeter Brune /*@ 895*f40b411bSPeter Brune LineSearchSetVecs - Sets the vectors on the LineSearch context 896*f40b411bSPeter Brune 897*f40b411bSPeter Brune Input Parameters: 898*f40b411bSPeter Brune + linesearch - linesearch context. 899*f40b411bSPeter Brune . X - The old solution 900*f40b411bSPeter Brune . F - The old function 901*f40b411bSPeter Brune . Y - The search direction 902*f40b411bSPeter Brune . W - The new solution 903*f40b411bSPeter Brune - G - The new function 904*f40b411bSPeter Brune 905*f40b411bSPeter Brune Level: intermediate 906*f40b411bSPeter Brune 907*f40b411bSPeter Brune .seealso: LineSearchSetNorms(), LineSearchGetVecs() 908*f40b411bSPeter Brune @*/ 9096a388c36SPeter Brune PetscErrorCode LineSearchSetVecs(LineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) { 9106a388c36SPeter Brune PetscFunctionBegin; 9116a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 9126a388c36SPeter Brune if (X) { 9136a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 9146a388c36SPeter Brune linesearch->vec_sol = X; 9156a388c36SPeter Brune } 9166a388c36SPeter Brune if (F) { 9176a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 9186a388c36SPeter Brune linesearch->vec_func = F; 9196a388c36SPeter Brune } 9206a388c36SPeter Brune if (Y) { 9216a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 9226a388c36SPeter Brune linesearch->vec_update = Y; 9236a388c36SPeter Brune } 9246a388c36SPeter Brune if (W) { 9256a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 9266a388c36SPeter Brune linesearch->vec_sol_new = W; 9276a388c36SPeter Brune } 9286a388c36SPeter Brune if (G) { 9296a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 9306a388c36SPeter Brune linesearch->vec_func_new = G; 9316a388c36SPeter Brune } 9326a388c36SPeter Brune 9336a388c36SPeter Brune PetscFunctionReturn(0); 9346a388c36SPeter Brune } 9356a388c36SPeter Brune 9366a388c36SPeter Brune #undef __FUNCT__ 937e7058c64SPeter Brune #define __FUNCT__ "LineSearchAppendOptionsPrefix" 938e7058c64SPeter Brune /*@C 939e7058c64SPeter Brune LineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 940e7058c64SPeter Brune SNES options in the database. 941e7058c64SPeter Brune 942e7058c64SPeter Brune Logically Collective on SNES 943e7058c64SPeter Brune 944e7058c64SPeter Brune Input Parameters: 945e7058c64SPeter Brune + snes - the SNES context 946e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 947e7058c64SPeter Brune 948e7058c64SPeter Brune Notes: 949e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 950e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 951e7058c64SPeter Brune 952e7058c64SPeter Brune Level: advanced 953e7058c64SPeter Brune 954*f40b411bSPeter Brune .keywords: LineSearch, append, options, prefix, database 955e7058c64SPeter Brune 956e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 957e7058c64SPeter Brune @*/ 958e7058c64SPeter Brune PetscErrorCode LineSearchAppendOptionsPrefix(LineSearch linesearch,const char prefix[]) 959e7058c64SPeter Brune { 960e7058c64SPeter Brune PetscErrorCode ierr; 961e7058c64SPeter Brune 962e7058c64SPeter Brune PetscFunctionBegin; 963e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 964e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 965e7058c64SPeter Brune PetscFunctionReturn(0); 966e7058c64SPeter Brune } 967e7058c64SPeter Brune 968e7058c64SPeter Brune #undef __FUNCT__ 969e7058c64SPeter Brune #define __FUNCT__ "LineSearchGetOptionsPrefix" 970e7058c64SPeter Brune /*@C 971e7058c64SPeter Brune LineSearchGetOptionsPrefix - Sets the prefix used for searching for all 972*f40b411bSPeter Brune LineSearch options in the database. 973e7058c64SPeter Brune 974e7058c64SPeter Brune Not Collective 975e7058c64SPeter Brune 976e7058c64SPeter Brune Input Parameter: 977e7058c64SPeter Brune . snes - the SNES context 978e7058c64SPeter Brune 979e7058c64SPeter Brune Output Parameter: 980e7058c64SPeter Brune . prefix - pointer to the prefix string used 981e7058c64SPeter Brune 982e7058c64SPeter Brune Notes: On the fortran side, the user should pass in a string 'prefix' of 983e7058c64SPeter Brune sufficient length to hold the prefix. 984e7058c64SPeter Brune 985e7058c64SPeter Brune Level: advanced 986e7058c64SPeter Brune 987*f40b411bSPeter Brune .keywords: LineSearch, get, options, prefix, database 988e7058c64SPeter Brune 989e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 990e7058c64SPeter Brune @*/ 991e7058c64SPeter Brune PetscErrorCode LineSearchGetOptionsPrefix(LineSearch linesearch,const char *prefix[]) 992e7058c64SPeter Brune { 993e7058c64SPeter Brune PetscErrorCode ierr; 994e7058c64SPeter Brune 995e7058c64SPeter Brune PetscFunctionBegin; 996e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 997e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 998e7058c64SPeter Brune PetscFunctionReturn(0); 999e7058c64SPeter Brune } 1000bf7f4e0aSPeter Brune 1001bf7f4e0aSPeter Brune #undef __FUNCT__ 1002bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetWork" 1003*f40b411bSPeter Brune /*@ 1004*f40b411bSPeter Brune LineSearchGetWork - Gets work vectors for the line search. 1005*f40b411bSPeter Brune 1006*f40b411bSPeter Brune Input Parameter: 1007*f40b411bSPeter Brune + linesearch - the LineSearch context 1008*f40b411bSPeter Brune - nwork - the number of work vectors 1009*f40b411bSPeter Brune 1010*f40b411bSPeter Brune Level: developer 1011*f40b411bSPeter Brune 1012*f40b411bSPeter Brune .keywords: LineSearch, work, vector 1013*f40b411bSPeter Brune 1014*f40b411bSPeter Brune .seealso: SNESDefaultGetWork() 1015*f40b411bSPeter Brune @*/ 1016bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetWork(LineSearch linesearch, PetscInt nwork) 1017bf7f4e0aSPeter Brune { 1018bf7f4e0aSPeter Brune PetscErrorCode ierr; 1019bf7f4e0aSPeter Brune PetscFunctionBegin; 1020bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 1021bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 1022bf7f4e0aSPeter Brune } else { 1023bf7f4e0aSPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 1024bf7f4e0aSPeter Brune } 1025bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1026bf7f4e0aSPeter Brune } 1027bf7f4e0aSPeter Brune 10286a388c36SPeter Brune 1029bf7f4e0aSPeter Brune #undef __FUNCT__ 1030bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSuccess" 1031*f40b411bSPeter Brune /*@ 1032*f40b411bSPeter Brune LineSearchGetSuccess - Gets the success/failure status of the last line search application 1033*f40b411bSPeter Brune 1034*f40b411bSPeter Brune Input Parameters: 1035*f40b411bSPeter Brune . linesearch - linesearch context. 1036*f40b411bSPeter Brune 1037*f40b411bSPeter Brune Output Parameters: 1038*f40b411bSPeter Brune . success - The success or failure status. 1039*f40b411bSPeter Brune 1040*f40b411bSPeter Brune Level: intermediate 1041*f40b411bSPeter Brune 1042*f40b411bSPeter Brune .seealso: LineSearchSetSuccess() 1043*f40b411bSPeter Brune @*/ 1044bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSuccess(LineSearch linesearch, PetscBool *success) 1045bf7f4e0aSPeter Brune { 1046bf7f4e0aSPeter Brune PetscFunctionBegin; 10476a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 10486a388c36SPeter Brune PetscValidPointer(success, 2); 1049bf7f4e0aSPeter Brune if (success) { 1050bf7f4e0aSPeter Brune *success = linesearch->success; 1051bf7f4e0aSPeter Brune } 1052bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1053bf7f4e0aSPeter Brune } 1054bf7f4e0aSPeter Brune 1055bf7f4e0aSPeter Brune #undef __FUNCT__ 10566a388c36SPeter Brune #define __FUNCT__ "LineSearchSetSuccess" 1057*f40b411bSPeter Brune /*@ 1058*f40b411bSPeter Brune LineSearchSetSuccess - Sets the success/failure status of the last line search application 1059*f40b411bSPeter Brune 1060*f40b411bSPeter Brune Input Parameters: 1061*f40b411bSPeter Brune + linesearch - linesearch context. 1062*f40b411bSPeter Brune - success - The success or failure status. 1063*f40b411bSPeter Brune 1064*f40b411bSPeter Brune Level: intermediate 1065*f40b411bSPeter Brune 1066*f40b411bSPeter Brune .seealso: LineSearchGetSuccess() 1067*f40b411bSPeter Brune @*/ 10686a388c36SPeter Brune PetscErrorCode LineSearchSetSuccess(LineSearch linesearch, PetscBool success) 10696a388c36SPeter Brune { 10706a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 10716a388c36SPeter Brune PetscFunctionBegin; 10726a388c36SPeter Brune linesearch->success = success; 10736a388c36SPeter Brune PetscFunctionReturn(0); 10746a388c36SPeter Brune } 10756a388c36SPeter Brune 10766a388c36SPeter Brune #undef __FUNCT__ 1077bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchRegister" 1078bf7f4e0aSPeter Brune /*@C 1079bf7f4e0aSPeter Brune LineSearchRegister - See LineSearchRegisterDynamic() 1080bf7f4e0aSPeter Brune 1081bf7f4e0aSPeter Brune Level: advanced 1082bf7f4e0aSPeter Brune @*/ 1083bf7f4e0aSPeter Brune PetscErrorCode LineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(LineSearch)) 1084bf7f4e0aSPeter Brune { 1085bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 1086bf7f4e0aSPeter Brune PetscErrorCode ierr; 1087bf7f4e0aSPeter Brune 1088bf7f4e0aSPeter Brune PetscFunctionBegin; 1089bf7f4e0aSPeter Brune ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 1090bf7f4e0aSPeter Brune ierr = PetscFListAdd(&LineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1091bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1092bf7f4e0aSPeter Brune } 1093