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" 11f40b411bSPeter Brune /*@ 12f40b411bSPeter Brune LineSearchCreate - Creates the line search. 13f40b411bSPeter Brune 14f40b411bSPeter Brune Collective on LineSearch 15f40b411bSPeter Brune 16f40b411bSPeter Brune Input Parameters: 17f40b411bSPeter Brune . comm - MPI communicator for the line search 18f40b411bSPeter Brune 19f40b411bSPeter Brune Output Parameters: 20f40b411bSPeter Brune . outlinesearch - the line search instance. 21f40b411bSPeter Brune 22f40b411bSPeter Brune Level: Beginner 23f40b411bSPeter Brune 24f40b411bSPeter Brune .keywords: LineSearch, Create 25f40b411bSPeter Brune 26f40b411bSPeter Brune .seealso: LineSearchDestroy() 27f40b411bSPeter Brune @*/ 28f40b411bSPeter 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; 49*516fe3c3SPeter Brune linesearch->rtol = 1e-8; 50*516fe3c3SPeter Brune linesearch->atol = 1e-15; 51*516fe3c3SPeter Brune linesearch->ltol = 1e-8; 52bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 53bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 54*516fe3c3SPeter Brune linesearch->max_its = 3; 55bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 56bf7f4e0aSPeter Brune *outlinesearch = linesearch; 57bf7f4e0aSPeter Brune PetscFunctionReturn(0); 58bf7f4e0aSPeter Brune } 59bf7f4e0aSPeter Brune 60bf7f4e0aSPeter Brune #undef __FUNCT__ 61bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetUp" 62f40b411bSPeter Brune /*@ 63f40b411bSPeter Brune LineSearchSetUp - Prepares the line search for being applied. 64f40b411bSPeter Brune 65f40b411bSPeter Brune Collective on LineSearch 66f40b411bSPeter Brune 67f40b411bSPeter Brune Input Parameters: 68f40b411bSPeter Brune . linesearch - The LineSearch instance. 69f40b411bSPeter Brune 70f40b411bSPeter Brune Level: Intermediate 71f40b411bSPeter Brune 72f40b411bSPeter Brune .keywords: LineSearch, SetUp 73f40b411bSPeter Brune 74f40b411bSPeter Brune .seealso: LineSearchReset() 75f40b411bSPeter Brune @*/ 76f40b411bSPeter Brune 77bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetUp(LineSearch linesearch) { 78bf7f4e0aSPeter Brune PetscErrorCode ierr; 79bf7f4e0aSPeter Brune PetscFunctionBegin; 80bf7f4e0aSPeter Brune 81bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 82bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,LINESEARCHBASIC);CHKERRQ(ierr); 83bf7f4e0aSPeter Brune } 84bf7f4e0aSPeter Brune 85bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 86bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 87bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_func, &linesearch->vec_func_new);CHKERRQ(ierr); 88bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 89bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 90bf7f4e0aSPeter Brune } 91bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 92bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 93bf7f4e0aSPeter Brune } 94bf7f4e0aSPeter Brune PetscFunctionReturn(0); 95bf7f4e0aSPeter Brune } 96bf7f4e0aSPeter Brune 97bf7f4e0aSPeter Brune #undef __FUNCT__ 98bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchReset" 99f40b411bSPeter Brune 100f40b411bSPeter Brune /*@ 101f40b411bSPeter Brune LineSearchReset - Tears down the structures required for application 102f40b411bSPeter Brune 103f40b411bSPeter Brune Collective on LineSearch 104f40b411bSPeter Brune 105f40b411bSPeter Brune Input Parameters: 106f40b411bSPeter Brune . linesearch - The LineSearch instance. 107f40b411bSPeter Brune 108f40b411bSPeter Brune Level: Intermediate 109f40b411bSPeter Brune 110f40b411bSPeter Brune .keywords: LineSearch, Create 111f40b411bSPeter Brune 112f40b411bSPeter Brune .seealso: LineSearchSetUp() 113f40b411bSPeter Brune @*/ 114f40b411bSPeter Brune 115bf7f4e0aSPeter Brune PetscErrorCode LineSearchReset(LineSearch linesearch) { 116bf7f4e0aSPeter Brune PetscErrorCode ierr; 117bf7f4e0aSPeter Brune PetscFunctionBegin; 118bf7f4e0aSPeter Brune if (linesearch->ops->reset) { 119bf7f4e0aSPeter Brune (*linesearch->ops->reset)(linesearch); 120bf7f4e0aSPeter Brune } 121bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 122bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 123bf7f4e0aSPeter Brune 124bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 125bf7f4e0aSPeter Brune linesearch->nwork = 0; 126bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 127bf7f4e0aSPeter Brune PetscFunctionReturn(0); 128bf7f4e0aSPeter Brune } 129bf7f4e0aSPeter Brune 130bf7f4e0aSPeter Brune #undef __FUNCT__ 131bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPreCheck" 132f40b411bSPeter Brune /*@ 133f40b411bSPeter Brune LineSearchPreCheck - Prepares the line search for being applied. 134f40b411bSPeter Brune 135f40b411bSPeter Brune Collective on LineSearch 136f40b411bSPeter Brune 137f40b411bSPeter Brune Input Parameters: 138f40b411bSPeter Brune . linesearch - The linesearch instance. 139f40b411bSPeter Brune 140f40b411bSPeter Brune Output Parameters: 141f40b411bSPeter Brune . changed - Indicator if the pre-check has changed anything. 142f40b411bSPeter Brune 143f40b411bSPeter Brune Level: Beginner 144f40b411bSPeter Brune 145f40b411bSPeter Brune .keywords: LineSearch, Create 146f40b411bSPeter Brune 147f40b411bSPeter Brune .seealso: LineSearchPostCheck() 148f40b411bSPeter Brune @*/ 149bf7f4e0aSPeter Brune PetscErrorCode LineSearchPreCheck(LineSearch linesearch, PetscBool * changed) 150bf7f4e0aSPeter Brune { 151bf7f4e0aSPeter Brune PetscErrorCode ierr; 152bf7f4e0aSPeter Brune PetscFunctionBegin; 153bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 154bf7f4e0aSPeter Brune if (linesearch->ops->precheckstep) { 155bf7f4e0aSPeter Brune ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr); 156bf7f4e0aSPeter Brune } 157bf7f4e0aSPeter Brune PetscFunctionReturn(0); 158bf7f4e0aSPeter Brune } 159bf7f4e0aSPeter Brune 160bf7f4e0aSPeter Brune #undef __FUNCT__ 161bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPostCheck" 162f40b411bSPeter Brune /*@ 163f40b411bSPeter Brune LineSearchPostCheck - Prepares the line search for being applied. 164f40b411bSPeter Brune 165f40b411bSPeter Brune Collective on LineSearch 166f40b411bSPeter Brune 167f40b411bSPeter Brune Input Parameters: 168f40b411bSPeter Brune . linesearch - The linesearch instance. 169f40b411bSPeter Brune 170f40b411bSPeter Brune Output Parameters: 171f40b411bSPeter Brune + changed_W - Indicator if the solution has been changed. 172f40b411bSPeter Brune - changed_Y - Indicator if the direction has been changed. 173f40b411bSPeter Brune 174f40b411bSPeter Brune Level: Intermediate 175f40b411bSPeter Brune 176f40b411bSPeter Brune .keywords: LineSearch, Create 177f40b411bSPeter Brune 178f40b411bSPeter Brune .seealso: LineSearchPreCheck() 179f40b411bSPeter Brune @*/ 180bf7f4e0aSPeter Brune PetscErrorCode LineSearchPostCheck(LineSearch linesearch, PetscBool * changed_W, PetscBool * changed_Y) 181bf7f4e0aSPeter Brune { 182bf7f4e0aSPeter Brune PetscErrorCode ierr; 183bf7f4e0aSPeter Brune PetscFunctionBegin; 184bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 185bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 186bf7f4e0aSPeter Brune if (linesearch->ops->postcheckstep) { 187bf7f4e0aSPeter Brune ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_sol_new, linesearch->vec_update, changed_W, changed_Y);CHKERRQ(ierr); 188bf7f4e0aSPeter Brune } 189bf7f4e0aSPeter Brune PetscFunctionReturn(0); 190bf7f4e0aSPeter Brune } 191bf7f4e0aSPeter Brune 192bf7f4e0aSPeter Brune #undef __FUNCT__ 193bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchApply" 194f40b411bSPeter Brune /*@ 195f40b411bSPeter Brune LineSearchApply - Computes the line-search update 196f40b411bSPeter Brune 197f40b411bSPeter Brune Collective on LineSearch 198f40b411bSPeter Brune 199f40b411bSPeter Brune Input Parameters: 200f40b411bSPeter Brune + linesearch - The linesearch instance. 201f40b411bSPeter Brune . X - The current solution. 202f40b411bSPeter Brune . F - The current function. 203f40b411bSPeter Brune . fnorm - The current norm. 204f40b411bSPeter Brune . Y - The search direction. 205f40b411bSPeter Brune 206f40b411bSPeter Brune Output Parameters: 207f40b411bSPeter Brune + X - The new solution. 208f40b411bSPeter Brune . F - The new function. 209f40b411bSPeter Brune - fnorm - The new function norm. 210f40b411bSPeter Brune 211f40b411bSPeter Brune Level: Intermediate 212f40b411bSPeter Brune 213f40b411bSPeter Brune .keywords: LineSearch, Create 214f40b411bSPeter Brune 215f40b411bSPeter Brune .seealso: LineSearchCreate(), LineSearchPreCheck(), LineSearchPostCheck() 216f40b411bSPeter Brune @*/ 217bf7f4e0aSPeter Brune PetscErrorCode LineSearchApply(LineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) { 218bf7f4e0aSPeter Brune PetscErrorCode ierr; 219bf7f4e0aSPeter Brune PetscFunctionBegin; 220bf7f4e0aSPeter Brune 221bf7f4e0aSPeter Brune /* check the pointers */ 222bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 223bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 224bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 225bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 226bf7f4e0aSPeter Brune 227bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 228bf7f4e0aSPeter Brune 229bf7f4e0aSPeter Brune linesearch->vec_sol = X; 230bf7f4e0aSPeter Brune linesearch->vec_update = Y; 231bf7f4e0aSPeter Brune linesearch->vec_func = F; 232bf7f4e0aSPeter Brune 233bf7f4e0aSPeter Brune ierr = LineSearchSetUp(linesearch);CHKERRQ(ierr); 234bf7f4e0aSPeter Brune 235bf7f4e0aSPeter Brune if (!linesearch->keeplambda) 236bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 237bf7f4e0aSPeter Brune 238bf7f4e0aSPeter Brune if (fnorm) { 239bf7f4e0aSPeter Brune linesearch->fnorm = *fnorm; 240bf7f4e0aSPeter Brune } else { 241bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 242bf7f4e0aSPeter Brune } 243bf7f4e0aSPeter Brune 244bf7f4e0aSPeter Brune ierr = PetscLogEventBegin(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 245bf7f4e0aSPeter Brune 246bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 247bf7f4e0aSPeter Brune 248bf7f4e0aSPeter Brune ierr = PetscLogEventEnd(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 249bf7f4e0aSPeter Brune 250bf7f4e0aSPeter Brune if (fnorm) 251bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 252bf7f4e0aSPeter Brune PetscFunctionReturn(0); 253bf7f4e0aSPeter Brune } 254bf7f4e0aSPeter Brune 255bf7f4e0aSPeter Brune #undef __FUNCT__ 256bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchDestroy" 257f40b411bSPeter Brune /*@ 258f40b411bSPeter Brune LineSearchDestroy - Destroys the line search instance. 259f40b411bSPeter Brune 260f40b411bSPeter Brune Collective on LineSearch 261f40b411bSPeter Brune 262f40b411bSPeter Brune Input Parameters: 263f40b411bSPeter Brune . linesearch - The linesearch instance. 264f40b411bSPeter Brune 265f40b411bSPeter Brune Level: Intermediate 266f40b411bSPeter Brune 267f40b411bSPeter Brune .keywords: LineSearch, Create 268f40b411bSPeter Brune 269f40b411bSPeter Brune .seealso: LineSearchCreate(), LineSearchReset() 270f40b411bSPeter Brune @*/ 271bf7f4e0aSPeter Brune PetscErrorCode LineSearchDestroy(LineSearch * linesearch) { 272bf7f4e0aSPeter Brune PetscErrorCode ierr; 273bf7f4e0aSPeter Brune PetscFunctionBegin; 274bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 275bf7f4e0aSPeter Brune PetscValidHeaderSpecific((*linesearch),LineSearch_CLASSID,1); 276bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 277bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 278bf7f4e0aSPeter Brune ierr = LineSearchReset(*linesearch); 279bf7f4e0aSPeter Brune if ((*linesearch)->ops->destroy) { 280bf7f4e0aSPeter Brune (*linesearch)->ops->destroy(*linesearch); 281bf7f4e0aSPeter Brune } 282bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 283e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 284bf7f4e0aSPeter Brune PetscFunctionReturn(0); 285bf7f4e0aSPeter Brune } 286bf7f4e0aSPeter Brune 287bf7f4e0aSPeter Brune #undef __FUNCT__ 288e7058c64SPeter Brune #define __FUNCT__ "LineSearchSetMonitor" 289f40b411bSPeter Brune /*@ 290f40b411bSPeter Brune LineSearchSetMonitor - Turns on/off printing useful things about the line search. 291bf7f4e0aSPeter Brune 292bf7f4e0aSPeter Brune Input Parameters: 293bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 294bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 295bf7f4e0aSPeter Brune 296bf7f4e0aSPeter Brune Logically Collective on SNES 297bf7f4e0aSPeter Brune 298bf7f4e0aSPeter Brune Options Database: 299f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 300bf7f4e0aSPeter Brune 301bf7f4e0aSPeter Brune Level: intermediate 302bf7f4e0aSPeter Brune 303bf7f4e0aSPeter Brune 304f40b411bSPeter Brune .seealso: LineSearchGetMonitor() 305bf7f4e0aSPeter Brune @*/ 306bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetMonitor(LineSearch linesearch, PetscBool flg) 307bf7f4e0aSPeter Brune { 308bf7f4e0aSPeter Brune 309bf7f4e0aSPeter Brune PetscErrorCode ierr; 310bf7f4e0aSPeter Brune PetscFunctionBegin; 311bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 312bf7f4e0aSPeter Brune ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr); 313bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 314bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 315bf7f4e0aSPeter Brune } 316bf7f4e0aSPeter Brune PetscFunctionReturn(0); 317bf7f4e0aSPeter Brune } 318bf7f4e0aSPeter Brune 319bf7f4e0aSPeter Brune #undef __FUNCT__ 3206a388c36SPeter Brune #define __FUNCT__ "LineSearchGetMonitor" 321f40b411bSPeter Brune /*@ 322f40b411bSPeter Brune LineSearchGetMonitor - Gets the monitor instance for the line search 3236a388c36SPeter Brune 324f40b411bSPeter Brune Input Parameters: 325f40b411bSPeter Brune . linesearch - linesearch context. 326f40b411bSPeter Brune 327f40b411bSPeter Brune Input Parameters: 328f40b411bSPeter Brune . monitor - monitor context. 329f40b411bSPeter Brune 330f40b411bSPeter Brune Logically Collective on SNES 331f40b411bSPeter Brune 332f40b411bSPeter Brune 333f40b411bSPeter Brune Options Database Keys: 334f40b411bSPeter Brune . -linesearch_monitor - enables the monitor. 335f40b411bSPeter Brune 336f40b411bSPeter Brune Level: intermediate 337f40b411bSPeter Brune 338f40b411bSPeter Brune 339f40b411bSPeter Brune .seealso: LineSearchSetMonitor() 340f40b411bSPeter Brune @*/ 3416a388c36SPeter Brune PetscErrorCode LineSearchGetMonitor(LineSearch linesearch, PetscViewer *monitor) 3426a388c36SPeter Brune { 3436a388c36SPeter Brune 3446a388c36SPeter Brune PetscFunctionBegin; 3456a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 3466a388c36SPeter Brune if (monitor) { 3476a388c36SPeter Brune PetscValidPointer(monitor, 2); 3486a388c36SPeter Brune *monitor = linesearch->monitor; 3496a388c36SPeter Brune } 3506a388c36SPeter Brune PetscFunctionReturn(0); 3516a388c36SPeter Brune } 3526a388c36SPeter Brune 3536a388c36SPeter Brune #undef __FUNCT__ 354bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetFromOptions" 355f40b411bSPeter Brune /*@ 356f40b411bSPeter Brune LineSearchSetFromOptions - Sets options for the line search 357f40b411bSPeter Brune 358f40b411bSPeter Brune Input Parameters: 359f40b411bSPeter Brune . linesearch - linesearch context. 360f40b411bSPeter Brune 361f40b411bSPeter Brune Options Database Keys: 362f40b411bSPeter Brune + -linesearch_type - The Line search method 363f40b411bSPeter Brune . -linesearch_monitor - Print progress of line searches 364f40b411bSPeter Brune . -linesearch_damping - The linesearch damping parameter. 365f40b411bSPeter Brune . -linesearch_norms - Turn on/off the linesearch norms 366f40b411bSPeter Brune . -linesearch_keeplambda - Keep the previous search length as the initial guess. 367f40b411bSPeter Brune - -linesearch_max_it - The number of iterations for iterative line searches. 368f40b411bSPeter Brune 369f40b411bSPeter Brune Logically Collective on LineSearch 370f40b411bSPeter Brune 371f40b411bSPeter Brune Level: intermediate 372f40b411bSPeter Brune 373f40b411bSPeter Brune 374f40b411bSPeter Brune .seealso: LineSearchCreate() 375f40b411bSPeter Brune @*/ 376bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetFromOptions(LineSearch linesearch) { 377bf7f4e0aSPeter Brune PetscErrorCode ierr; 378bf7f4e0aSPeter Brune const char *deft = LINESEARCHBASIC; 379bf7f4e0aSPeter Brune char type[256]; 380bf7f4e0aSPeter Brune PetscBool flg, set; 381bf7f4e0aSPeter Brune PetscFunctionBegin; 382bf7f4e0aSPeter Brune if (!LineSearchRegisterAllCalled) {ierr = LineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 383bf7f4e0aSPeter Brune 384bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 385bf7f4e0aSPeter Brune if (((PetscObject)linesearch)->type_name) { 386bf7f4e0aSPeter Brune deft = ((PetscObject)linesearch)->type_name; 387bf7f4e0aSPeter Brune } 388bf7f4e0aSPeter Brune ierr = PetscOptionsList("-linesearch_type","Line-search method","LineSearchSetType",LineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 389bf7f4e0aSPeter Brune if (flg) { 390bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,type);CHKERRQ(ierr); 391bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 392bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,deft);CHKERRQ(ierr); 393bf7f4e0aSPeter Brune } 394bf7f4e0aSPeter Brune if (linesearch->ops->setfromoptions) { 395bf7f4e0aSPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 396bf7f4e0aSPeter Brune } 397bf7f4e0aSPeter Brune 398bf7f4e0aSPeter Brune ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESLineSearchSetMonitor", 399bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 400bf7f4e0aSPeter Brune if (set) {ierr = LineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 401bf7f4e0aSPeter Brune 402bf7f4e0aSPeter Brune ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","LineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 403*516fe3c3SPeter Brune ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","LineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr); 4046a388c36SPeter Brune ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","LineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 4056a388c36SPeter Brune ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","LineSearchSetKeepLambda",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 406bf7f4e0aSPeter Brune ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 407bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 408bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 409bf7f4e0aSPeter Brune PetscFunctionReturn(0); 410bf7f4e0aSPeter Brune } 411bf7f4e0aSPeter Brune 412bf7f4e0aSPeter Brune #undef __FUNCT__ 413bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchView" 414f40b411bSPeter Brune /*@ 415f40b411bSPeter Brune LineSearchView - Views useful information for the line search. 416f40b411bSPeter Brune 417f40b411bSPeter Brune Input Parameters: 418f40b411bSPeter Brune . linesearch - linesearch context. 419f40b411bSPeter Brune 420f40b411bSPeter Brune Logically Collective on LineSearch 421f40b411bSPeter Brune 422f40b411bSPeter Brune Level: intermediate 423f40b411bSPeter Brune 424f40b411bSPeter Brune 425f40b411bSPeter Brune .seealso: LineSearchCreate() 426f40b411bSPeter Brune @*/ 427bf7f4e0aSPeter Brune PetscErrorCode LineSearchView(LineSearch linesearch) { 428bf7f4e0aSPeter Brune PetscFunctionBegin; 429f40b411bSPeter Brune 430bf7f4e0aSPeter Brune PetscFunctionReturn(0); 431bf7f4e0aSPeter Brune } 432bf7f4e0aSPeter Brune 433bf7f4e0aSPeter Brune #undef __FUNCT__ 434bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetType" 435f40b411bSPeter Brune /*@ 436f40b411bSPeter Brune LineSearchSetType - Sets the linesearch type 437f40b411bSPeter Brune 438f40b411bSPeter Brune Input Parameters: 439f40b411bSPeter Brune + linesearch - linesearch context. 440f40b411bSPeter Brune - type - The type of line search to be used 441f40b411bSPeter Brune 442f40b411bSPeter Brune Logically Collective on LineSearch 443f40b411bSPeter Brune 444f40b411bSPeter Brune Level: intermediate 445f40b411bSPeter Brune 446f40b411bSPeter Brune 447f40b411bSPeter Brune .seealso: LineSearchCreate() 448f40b411bSPeter Brune @*/ 449bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetType(LineSearch linesearch, const LineSearchType type) 450bf7f4e0aSPeter Brune { 451bf7f4e0aSPeter Brune 452bf7f4e0aSPeter Brune PetscErrorCode ierr,(*r)(LineSearch); 453bf7f4e0aSPeter Brune PetscBool match; 454bf7f4e0aSPeter Brune 455bf7f4e0aSPeter Brune PetscFunctionBegin; 456bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 457bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 458bf7f4e0aSPeter Brune 459bf7f4e0aSPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 460bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 461bf7f4e0aSPeter Brune 462bf7f4e0aSPeter Brune ierr = PetscFListFind(LineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 463bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 464bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 465bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 466bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 467bf7f4e0aSPeter Brune linesearch->ops->destroy = PETSC_NULL; 468bf7f4e0aSPeter Brune } 469bf7f4e0aSPeter Brune /* Reinitialize function pointers in LineSearchOps structure */ 470bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 471bf7f4e0aSPeter Brune linesearch->ops->view = 0; 472bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 473bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 474bf7f4e0aSPeter Brune 475bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 476bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 477bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS) 478bf7f4e0aSPeter Brune if (PetscAMSPublishAll) { 479bf7f4e0aSPeter Brune ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr); 480bf7f4e0aSPeter Brune } 481bf7f4e0aSPeter Brune #endif 482bf7f4e0aSPeter Brune PetscFunctionReturn(0); 483bf7f4e0aSPeter Brune } 484bf7f4e0aSPeter Brune 485bf7f4e0aSPeter Brune #undef __FUNCT__ 486bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetSNES" 487f40b411bSPeter Brune /*@ 488f40b411bSPeter Brune LineSearchSetSNES - Sets the SNES for the linesearch for function evaluation 489f40b411bSPeter Brune 490f40b411bSPeter Brune Input Parameters: 491f40b411bSPeter Brune + linesearch - linesearch context. 492f40b411bSPeter Brune - snes - The snes instance 493f40b411bSPeter Brune 494f40b411bSPeter Brune Level: intermediate 495f40b411bSPeter Brune 496f40b411bSPeter Brune 497f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 498f40b411bSPeter Brune @*/ 499bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetSNES(LineSearch linesearch, SNES snes){ 500bf7f4e0aSPeter Brune PetscFunctionBegin; 501bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 502bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 503bf7f4e0aSPeter Brune linesearch->snes = snes; 504bf7f4e0aSPeter Brune PetscFunctionReturn(0); 505bf7f4e0aSPeter Brune } 506bf7f4e0aSPeter Brune 507bf7f4e0aSPeter Brune #undef __FUNCT__ 508bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSNES" 509f40b411bSPeter Brune /*@ 510f40b411bSPeter Brune LineSearchGetSNES - Gets the SNES for the linesearch for function evaluation 511f40b411bSPeter Brune 512f40b411bSPeter Brune Input Parameters: 513f40b411bSPeter Brune . linesearch - linesearch context. 514f40b411bSPeter Brune 515f40b411bSPeter Brune Output Parameters: 516f40b411bSPeter Brune . snes - The snes instance 517f40b411bSPeter Brune 518f40b411bSPeter Brune Level: intermediate 519f40b411bSPeter Brune 520f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 521f40b411bSPeter Brune @*/ 522bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSNES(LineSearch linesearch, SNES *snes){ 523bf7f4e0aSPeter Brune PetscFunctionBegin; 5246a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5256a388c36SPeter Brune PetscValidPointer(snes, 2); 526bf7f4e0aSPeter Brune *snes = linesearch->snes; 527bf7f4e0aSPeter Brune PetscFunctionReturn(0); 528bf7f4e0aSPeter Brune } 529bf7f4e0aSPeter Brune 5306a388c36SPeter Brune #undef __FUNCT__ 5316a388c36SPeter Brune #define __FUNCT__ "LineSearchGetLambda" 532f40b411bSPeter Brune /*@ 533f40b411bSPeter Brune LineSearchGetLambda - Gets the last linesearch steplength discovered. 534f40b411bSPeter Brune 535f40b411bSPeter Brune Input Parameters: 536f40b411bSPeter Brune . linesearch - linesearch context. 537f40b411bSPeter Brune 538f40b411bSPeter Brune Output Parameters: 539f40b411bSPeter Brune . lambda - The last steplength. 540f40b411bSPeter Brune 541f40b411bSPeter Brune Level: intermediate 542f40b411bSPeter Brune 543f40b411bSPeter Brune .seealso: LineSearchGetSNES(), LineSearchSetVecs() 544f40b411bSPeter Brune @*/ 5456a388c36SPeter Brune PetscErrorCode LineSearchGetLambda(LineSearch linesearch,PetscReal *lambda) 5466a388c36SPeter Brune { 5476a388c36SPeter Brune PetscFunctionBegin; 5486a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5496a388c36SPeter Brune PetscValidPointer(lambda, 2); 5506a388c36SPeter Brune *lambda = linesearch->lambda; 5516a388c36SPeter Brune PetscFunctionReturn(0); 5526a388c36SPeter Brune } 5536a388c36SPeter Brune 5546a388c36SPeter Brune #undef __FUNCT__ 5556a388c36SPeter Brune #define __FUNCT__ "LineSearchSetLambda" 556f40b411bSPeter Brune /*@ 557f40b411bSPeter Brune LineSearchSetLambda - Sets the linesearch steplength. 558f40b411bSPeter Brune 559f40b411bSPeter Brune Input Parameters: 560f40b411bSPeter Brune + linesearch - linesearch context. 561f40b411bSPeter Brune - lambda - The last steplength. 562f40b411bSPeter Brune 563f40b411bSPeter Brune Level: intermediate 564f40b411bSPeter Brune 565f40b411bSPeter Brune .seealso: LineSearchGetLambda() 566f40b411bSPeter Brune @*/ 5676a388c36SPeter Brune PetscErrorCode LineSearchSetLambda(LineSearch linesearch, PetscReal lambda) 5686a388c36SPeter Brune { 5696a388c36SPeter Brune PetscFunctionBegin; 5706a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 5716a388c36SPeter Brune linesearch->lambda = lambda; 5726a388c36SPeter Brune PetscFunctionReturn(0); 5736a388c36SPeter Brune } 5746a388c36SPeter Brune 5756a388c36SPeter Brune #undef __FUNCT__ 576*516fe3c3SPeter Brune #define __FUNCT__ "LineSearchGetTolerances" 577f40b411bSPeter Brune /*@ 578*516fe3c3SPeter Brune LineSearchGetTolerances - Gets the tolerances for the method 579f40b411bSPeter Brune 580f40b411bSPeter Brune Input Parameters: 581f40b411bSPeter Brune . linesearch - linesearch context. 582f40b411bSPeter Brune 583f40b411bSPeter Brune Output Parameters: 584*516fe3c3SPeter Brune + steptol - The minimum steplength 585*516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 586*516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 587*516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 588*516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 589f40b411bSPeter Brune 590f40b411bSPeter Brune 591*516fe3c3SPeter Brune Level: advanced 592*516fe3c3SPeter Brune 593*516fe3c3SPeter Brune .seealso: LineSearchSetTolerances() 594f40b411bSPeter Brune @*/ 595*516fe3c3SPeter Brune PetscErrorCode LineSearchGetTolerances(LineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 5966a388c36SPeter Brune { 5976a388c36SPeter Brune PetscFunctionBegin; 5986a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 599*516fe3c3SPeter Brune if (steptol) { 6006a388c36SPeter Brune PetscValidPointer(steptol, 2); 6016a388c36SPeter Brune *steptol = linesearch->steptol; 602*516fe3c3SPeter Brune } 603*516fe3c3SPeter Brune if (maxstep) { 604*516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 605*516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 606*516fe3c3SPeter Brune } 607*516fe3c3SPeter Brune if (rtol) { 608*516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 609*516fe3c3SPeter Brune *rtol = linesearch->rtol; 610*516fe3c3SPeter Brune } 611*516fe3c3SPeter Brune if (atol) { 612*516fe3c3SPeter Brune PetscValidPointer(atol, 5); 613*516fe3c3SPeter Brune *atol = linesearch->atol; 614*516fe3c3SPeter Brune } 615*516fe3c3SPeter Brune if (ltol) { 616*516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 617*516fe3c3SPeter Brune *ltol = linesearch->ltol; 618*516fe3c3SPeter Brune } 619*516fe3c3SPeter Brune if (max_its) { 620*516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 621*516fe3c3SPeter Brune *max_its = linesearch->max_its; 622*516fe3c3SPeter Brune } 6236a388c36SPeter Brune PetscFunctionReturn(0); 6246a388c36SPeter Brune } 6256a388c36SPeter Brune 6266a388c36SPeter Brune #undef __FUNCT__ 627*516fe3c3SPeter Brune #define __FUNCT__ "LineSearchSetTolerances" 628f40b411bSPeter Brune /*@ 629*516fe3c3SPeter Brune LineSearchSetTolerances - Sets the tolerances for the method 630f40b411bSPeter Brune 631f40b411bSPeter Brune Input Parameters: 632*516fe3c3SPeter Brune + linesearch - linesearch context. 633*516fe3c3SPeter Brune . steptol - The minimum steplength 634*516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 635*516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 636*516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 637*516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 638f40b411bSPeter Brune 639f40b411bSPeter Brune 640*516fe3c3SPeter Brune Level: advanced 641*516fe3c3SPeter Brune 642*516fe3c3SPeter Brune .seealso: LineSearchGetTolerances() 643f40b411bSPeter Brune @*/ 644*516fe3c3SPeter Brune PetscErrorCode LineSearchSetTolerances(LineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 6456a388c36SPeter Brune { 6466a388c36SPeter Brune PetscFunctionBegin; 6476a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6486a388c36SPeter Brune linesearch->steptol = steptol; 649*516fe3c3SPeter Brune linesearch->maxstep = maxstep; 650*516fe3c3SPeter Brune linesearch->rtol = rtol; 651*516fe3c3SPeter Brune linesearch->atol = atol; 652*516fe3c3SPeter Brune linesearch->ltol = ltol; 653*516fe3c3SPeter Brune linesearch->max_its = max_its; 6546a388c36SPeter Brune PetscFunctionReturn(0); 6556a388c36SPeter Brune } 6566a388c36SPeter Brune 657*516fe3c3SPeter Brune 6586a388c36SPeter Brune #undef __FUNCT__ 6596a388c36SPeter Brune #define __FUNCT__ "LineSearchGetDamping" 660f40b411bSPeter Brune /*@ 661*516fe3c3SPeter Brune LineSearchGetDamping - Gets the line search damping parameter. 662f40b411bSPeter Brune 663f40b411bSPeter Brune Input Parameters: 664f40b411bSPeter Brune . linesearch - linesearch context. 665f40b411bSPeter Brune 666f40b411bSPeter Brune Output Parameters: 667f40b411bSPeter Brune . damping - The damping parameter. 668f40b411bSPeter Brune 669f40b411bSPeter Brune Level: intermediate 670f40b411bSPeter Brune 671f40b411bSPeter Brune .seealso: LineSearchGetStepTolerance() 672f40b411bSPeter Brune @*/ 673f40b411bSPeter Brune 674f40b411bSPeter Brune PetscErrorCode LineSearchGetDamping(LineSearch linesearch,PetscReal *damping) 6756a388c36SPeter Brune { 6766a388c36SPeter Brune PetscFunctionBegin; 6776a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 6786a388c36SPeter Brune PetscValidPointer(damping, 2); 6796a388c36SPeter Brune *damping = linesearch->damping; 6806a388c36SPeter Brune PetscFunctionReturn(0); 6816a388c36SPeter Brune } 6826a388c36SPeter Brune 6836a388c36SPeter Brune #undef __FUNCT__ 6846a388c36SPeter Brune #define __FUNCT__ "LineSearchSetDamping" 685f40b411bSPeter Brune /*@ 686f40b411bSPeter Brune LineSearchSetDamping - Sets the line search damping paramter. 687f40b411bSPeter Brune 688f40b411bSPeter Brune Input Parameters: 689f40b411bSPeter Brune . linesearch - linesearch context. 690f40b411bSPeter Brune . damping - The damping parameter. 691f40b411bSPeter Brune 692f40b411bSPeter Brune Level: intermediate 693f40b411bSPeter Brune 694f40b411bSPeter Brune .seealso: LineSearchGetDamping() 695f40b411bSPeter Brune @*/ 696f40b411bSPeter Brune PetscErrorCode LineSearchSetDamping(LineSearch linesearch,PetscReal damping) 6976a388c36SPeter Brune { 6986a388c36SPeter Brune PetscFunctionBegin; 6996a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 7006a388c36SPeter Brune linesearch->damping = damping; 7016a388c36SPeter Brune PetscFunctionReturn(0); 7026a388c36SPeter Brune } 7036a388c36SPeter Brune 7046a388c36SPeter Brune #undef __FUNCT__ 705bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetNorms" 706f40b411bSPeter Brune /*@ 707f40b411bSPeter Brune LineSearchGetNorms - Gets the norms for for X, Y, and F. 708f40b411bSPeter Brune 709f40b411bSPeter Brune Input Parameters: 710f40b411bSPeter Brune . linesearch - linesearch context. 711f40b411bSPeter Brune 712f40b411bSPeter Brune Output Parameters: 713f40b411bSPeter Brune + xnorm - The norm of the current solution 714f40b411bSPeter Brune . fnorm - The norm of the current function 715f40b411bSPeter Brune - ynorm - The norm of the current update 716f40b411bSPeter Brune 717f40b411bSPeter Brune Level: intermediate 718f40b411bSPeter Brune 719f40b411bSPeter Brune .seealso: LineSearchSetNorms() LineSearchGetVecs() 720f40b411bSPeter Brune @*/ 721bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetNorms(LineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 722bf7f4e0aSPeter Brune { 723bf7f4e0aSPeter Brune PetscFunctionBegin; 7246a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 725bf7f4e0aSPeter Brune if (xnorm) { 726bf7f4e0aSPeter Brune *xnorm = linesearch->xnorm; 727bf7f4e0aSPeter Brune } 728bf7f4e0aSPeter Brune if (fnorm) { 729bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 730bf7f4e0aSPeter Brune } 731bf7f4e0aSPeter Brune if (ynorm) { 732bf7f4e0aSPeter Brune *ynorm = linesearch->ynorm; 733bf7f4e0aSPeter Brune } 734bf7f4e0aSPeter Brune PetscFunctionReturn(0); 735bf7f4e0aSPeter Brune } 736bf7f4e0aSPeter Brune 737e7058c64SPeter Brune #undef __FUNCT__ 7386a388c36SPeter Brune #define __FUNCT__ "LineSearchSetNorms" 739f40b411bSPeter Brune /*@ 740f40b411bSPeter Brune LineSearchSetNorms - Gets the computed norms for for X, Y, and F. 741f40b411bSPeter Brune 742f40b411bSPeter Brune Input Parameters: 743f40b411bSPeter Brune + linesearch - linesearch context. 744f40b411bSPeter Brune . xnorm - The norm of the current solution 745f40b411bSPeter Brune . fnorm - The norm of the current function 746f40b411bSPeter Brune - ynorm - The norm of the current update 747f40b411bSPeter Brune 748f40b411bSPeter Brune Level: intermediate 749f40b411bSPeter Brune 750f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs() 751f40b411bSPeter Brune @*/ 7526a388c36SPeter Brune PetscErrorCode LineSearchSetNorms(LineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 7536a388c36SPeter Brune { 7546a388c36SPeter Brune PetscFunctionBegin; 7556a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 7566a388c36SPeter Brune if (xnorm) { 7576a388c36SPeter Brune linesearch->xnorm = xnorm; 7586a388c36SPeter Brune } 7596a388c36SPeter Brune if (fnorm) { 7606a388c36SPeter Brune linesearch->fnorm = fnorm; 7616a388c36SPeter Brune } 7626a388c36SPeter Brune if (ynorm) { 7636a388c36SPeter Brune linesearch->ynorm = ynorm; 7646a388c36SPeter Brune } 7656a388c36SPeter Brune PetscFunctionReturn(0); 7666a388c36SPeter Brune } 7676a388c36SPeter Brune 7686a388c36SPeter Brune #undef __FUNCT__ 7696a388c36SPeter Brune #define __FUNCT__ "LineSearchComputeNorms" 770f40b411bSPeter Brune /*@ 771f40b411bSPeter Brune LineSearchComputeNorms - Computes the norms of X, F, and Y. 772f40b411bSPeter Brune 773f40b411bSPeter Brune Input Parameters: 774f40b411bSPeter Brune . linesearch - linesearch context. 775f40b411bSPeter Brune 776f40b411bSPeter Brune Options Database Keys: 777f40b411bSPeter Brune . -linesearch_norms - turn norm computation on or off. 778f40b411bSPeter Brune 779f40b411bSPeter Brune Level: intermediate 780f40b411bSPeter Brune 781f40b411bSPeter Brune .seealso: LineSearchGetNorms, LineSearchSetNorms() 782f40b411bSPeter Brune @*/ 7836a388c36SPeter Brune PetscErrorCode LineSearchComputeNorms(LineSearch linesearch) 7846a388c36SPeter Brune { 7856a388c36SPeter Brune PetscErrorCode ierr; 7866a388c36SPeter Brune PetscFunctionBegin; 7876a388c36SPeter Brune if (linesearch->norms) { 7886a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 7896a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 7906a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 7916a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 7926a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 7936a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 7946a388c36SPeter Brune } 7956a388c36SPeter Brune PetscFunctionReturn(0); 7966a388c36SPeter Brune } 7976a388c36SPeter Brune 7986a388c36SPeter Brune #undef __FUNCT__ 7996a388c36SPeter Brune #define __FUNCT__ "LineSearchGetVecs" 800f40b411bSPeter Brune /*@ 801f40b411bSPeter Brune LineSearchGetVecs - Gets the vectors from the LineSearch context 802f40b411bSPeter Brune 803f40b411bSPeter Brune Input Parameters: 804f40b411bSPeter Brune . linesearch - linesearch context. 805f40b411bSPeter Brune 806f40b411bSPeter Brune Output Parameters: 807f40b411bSPeter Brune + X - The old solution 808f40b411bSPeter Brune . F - The old function 809f40b411bSPeter Brune . Y - The search direction 810f40b411bSPeter Brune . W - The new solution 811f40b411bSPeter Brune - G - The new function 812f40b411bSPeter Brune 813f40b411bSPeter Brune Level: intermediate 814f40b411bSPeter Brune 815f40b411bSPeter Brune .seealso: LineSearchGetNorms(), LineSearchSetVecs() 816f40b411bSPeter Brune @*/ 8176a388c36SPeter Brune PetscErrorCode LineSearchGetVecs(LineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) { 8186a388c36SPeter Brune PetscFunctionBegin; 8196a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 8206a388c36SPeter Brune if (X) { 8216a388c36SPeter Brune PetscValidPointer(X, 2); 8226a388c36SPeter Brune *X = linesearch->vec_sol; 8236a388c36SPeter Brune } 8246a388c36SPeter Brune if (F) { 8256a388c36SPeter Brune PetscValidPointer(F, 3); 8266a388c36SPeter Brune *F = linesearch->vec_func; 8276a388c36SPeter Brune } 8286a388c36SPeter Brune if (Y) { 8296a388c36SPeter Brune PetscValidPointer(Y, 4); 8306a388c36SPeter Brune *Y = linesearch->vec_update; 8316a388c36SPeter Brune } 8326a388c36SPeter Brune if (W) { 8336a388c36SPeter Brune PetscValidPointer(W, 5); 8346a388c36SPeter Brune *W = linesearch->vec_sol_new; 8356a388c36SPeter Brune } 8366a388c36SPeter Brune if (G) { 8376a388c36SPeter Brune PetscValidPointer(G, 6); 8386a388c36SPeter Brune *G = linesearch->vec_func_new; 8396a388c36SPeter Brune } 8406a388c36SPeter Brune 8416a388c36SPeter Brune PetscFunctionReturn(0); 8426a388c36SPeter Brune } 8436a388c36SPeter Brune 8446a388c36SPeter Brune #undef __FUNCT__ 8456a388c36SPeter Brune #define __FUNCT__ "LineSearchSetVecs" 846f40b411bSPeter Brune /*@ 847f40b411bSPeter Brune LineSearchSetVecs - Sets the vectors on the LineSearch context 848f40b411bSPeter Brune 849f40b411bSPeter Brune Input Parameters: 850f40b411bSPeter Brune + linesearch - linesearch context. 851f40b411bSPeter Brune . X - The old solution 852f40b411bSPeter Brune . F - The old function 853f40b411bSPeter Brune . Y - The search direction 854f40b411bSPeter Brune . W - The new solution 855f40b411bSPeter Brune - G - The new function 856f40b411bSPeter Brune 857f40b411bSPeter Brune Level: intermediate 858f40b411bSPeter Brune 859f40b411bSPeter Brune .seealso: LineSearchSetNorms(), LineSearchGetVecs() 860f40b411bSPeter Brune @*/ 8616a388c36SPeter Brune PetscErrorCode LineSearchSetVecs(LineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) { 8626a388c36SPeter Brune PetscFunctionBegin; 8636a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 8646a388c36SPeter Brune if (X) { 8656a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 8666a388c36SPeter Brune linesearch->vec_sol = X; 8676a388c36SPeter Brune } 8686a388c36SPeter Brune if (F) { 8696a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 8706a388c36SPeter Brune linesearch->vec_func = F; 8716a388c36SPeter Brune } 8726a388c36SPeter Brune if (Y) { 8736a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 8746a388c36SPeter Brune linesearch->vec_update = Y; 8756a388c36SPeter Brune } 8766a388c36SPeter Brune if (W) { 8776a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 8786a388c36SPeter Brune linesearch->vec_sol_new = W; 8796a388c36SPeter Brune } 8806a388c36SPeter Brune if (G) { 8816a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 8826a388c36SPeter Brune linesearch->vec_func_new = G; 8836a388c36SPeter Brune } 8846a388c36SPeter Brune 8856a388c36SPeter Brune PetscFunctionReturn(0); 8866a388c36SPeter Brune } 8876a388c36SPeter Brune 8886a388c36SPeter Brune #undef __FUNCT__ 889e7058c64SPeter Brune #define __FUNCT__ "LineSearchAppendOptionsPrefix" 890e7058c64SPeter Brune /*@C 891e7058c64SPeter Brune LineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 892e7058c64SPeter Brune SNES options in the database. 893e7058c64SPeter Brune 894e7058c64SPeter Brune Logically Collective on SNES 895e7058c64SPeter Brune 896e7058c64SPeter Brune Input Parameters: 897e7058c64SPeter Brune + snes - the SNES context 898e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 899e7058c64SPeter Brune 900e7058c64SPeter Brune Notes: 901e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 902e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 903e7058c64SPeter Brune 904e7058c64SPeter Brune Level: advanced 905e7058c64SPeter Brune 906f40b411bSPeter Brune .keywords: LineSearch, append, options, prefix, database 907e7058c64SPeter Brune 908e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 909e7058c64SPeter Brune @*/ 910e7058c64SPeter Brune PetscErrorCode LineSearchAppendOptionsPrefix(LineSearch linesearch,const char prefix[]) 911e7058c64SPeter Brune { 912e7058c64SPeter Brune PetscErrorCode ierr; 913e7058c64SPeter Brune 914e7058c64SPeter Brune PetscFunctionBegin; 915e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 916e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 917e7058c64SPeter Brune PetscFunctionReturn(0); 918e7058c64SPeter Brune } 919e7058c64SPeter Brune 920e7058c64SPeter Brune #undef __FUNCT__ 921e7058c64SPeter Brune #define __FUNCT__ "LineSearchGetOptionsPrefix" 922e7058c64SPeter Brune /*@C 923e7058c64SPeter Brune LineSearchGetOptionsPrefix - Sets the prefix used for searching for all 924f40b411bSPeter Brune LineSearch options in the database. 925e7058c64SPeter Brune 926e7058c64SPeter Brune Not Collective 927e7058c64SPeter Brune 928e7058c64SPeter Brune Input Parameter: 929e7058c64SPeter Brune . snes - the SNES context 930e7058c64SPeter Brune 931e7058c64SPeter Brune Output Parameter: 932e7058c64SPeter Brune . prefix - pointer to the prefix string used 933e7058c64SPeter Brune 934e7058c64SPeter Brune Notes: On the fortran side, the user should pass in a string 'prefix' of 935e7058c64SPeter Brune sufficient length to hold the prefix. 936e7058c64SPeter Brune 937e7058c64SPeter Brune Level: advanced 938e7058c64SPeter Brune 939f40b411bSPeter Brune .keywords: LineSearch, get, options, prefix, database 940e7058c64SPeter Brune 941e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 942e7058c64SPeter Brune @*/ 943e7058c64SPeter Brune PetscErrorCode LineSearchGetOptionsPrefix(LineSearch linesearch,const char *prefix[]) 944e7058c64SPeter Brune { 945e7058c64SPeter Brune PetscErrorCode ierr; 946e7058c64SPeter Brune 947e7058c64SPeter Brune PetscFunctionBegin; 948e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 949e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 950e7058c64SPeter Brune PetscFunctionReturn(0); 951e7058c64SPeter Brune } 952bf7f4e0aSPeter Brune 953bf7f4e0aSPeter Brune #undef __FUNCT__ 954bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetWork" 955f40b411bSPeter Brune /*@ 956f40b411bSPeter Brune LineSearchGetWork - Gets work vectors for the line search. 957f40b411bSPeter Brune 958f40b411bSPeter Brune Input Parameter: 959f40b411bSPeter Brune + linesearch - the LineSearch context 960f40b411bSPeter Brune - nwork - the number of work vectors 961f40b411bSPeter Brune 962f40b411bSPeter Brune Level: developer 963f40b411bSPeter Brune 964f40b411bSPeter Brune .keywords: LineSearch, work, vector 965f40b411bSPeter Brune 966f40b411bSPeter Brune .seealso: SNESDefaultGetWork() 967f40b411bSPeter Brune @*/ 968bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetWork(LineSearch linesearch, PetscInt nwork) 969bf7f4e0aSPeter Brune { 970bf7f4e0aSPeter Brune PetscErrorCode ierr; 971bf7f4e0aSPeter Brune PetscFunctionBegin; 972bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 973bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 974bf7f4e0aSPeter Brune } else { 975bf7f4e0aSPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 976bf7f4e0aSPeter Brune } 977bf7f4e0aSPeter Brune PetscFunctionReturn(0); 978bf7f4e0aSPeter Brune } 979bf7f4e0aSPeter Brune 9806a388c36SPeter Brune 981bf7f4e0aSPeter Brune #undef __FUNCT__ 982bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSuccess" 983f40b411bSPeter Brune /*@ 984f40b411bSPeter Brune LineSearchGetSuccess - Gets the success/failure status of the last line search application 985f40b411bSPeter Brune 986f40b411bSPeter Brune Input Parameters: 987f40b411bSPeter Brune . linesearch - linesearch context. 988f40b411bSPeter Brune 989f40b411bSPeter Brune Output Parameters: 990f40b411bSPeter Brune . success - The success or failure status. 991f40b411bSPeter Brune 992f40b411bSPeter Brune Level: intermediate 993f40b411bSPeter Brune 994f40b411bSPeter Brune .seealso: LineSearchSetSuccess() 995f40b411bSPeter Brune @*/ 996bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSuccess(LineSearch linesearch, PetscBool *success) 997bf7f4e0aSPeter Brune { 998bf7f4e0aSPeter Brune PetscFunctionBegin; 9996a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 10006a388c36SPeter Brune PetscValidPointer(success, 2); 1001bf7f4e0aSPeter Brune if (success) { 1002bf7f4e0aSPeter Brune *success = linesearch->success; 1003bf7f4e0aSPeter Brune } 1004bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1005bf7f4e0aSPeter Brune } 1006bf7f4e0aSPeter Brune 1007bf7f4e0aSPeter Brune #undef __FUNCT__ 10086a388c36SPeter Brune #define __FUNCT__ "LineSearchSetSuccess" 1009f40b411bSPeter Brune /*@ 1010f40b411bSPeter Brune LineSearchSetSuccess - Sets the success/failure status of the last line search application 1011f40b411bSPeter Brune 1012f40b411bSPeter Brune Input Parameters: 1013f40b411bSPeter Brune + linesearch - linesearch context. 1014f40b411bSPeter Brune - success - The success or failure status. 1015f40b411bSPeter Brune 1016f40b411bSPeter Brune Level: intermediate 1017f40b411bSPeter Brune 1018f40b411bSPeter Brune .seealso: LineSearchGetSuccess() 1019f40b411bSPeter Brune @*/ 10206a388c36SPeter Brune PetscErrorCode LineSearchSetSuccess(LineSearch linesearch, PetscBool success) 10216a388c36SPeter Brune { 10226a388c36SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 10236a388c36SPeter Brune PetscFunctionBegin; 10246a388c36SPeter Brune linesearch->success = success; 10256a388c36SPeter Brune PetscFunctionReturn(0); 10266a388c36SPeter Brune } 10276a388c36SPeter Brune 10286a388c36SPeter Brune #undef __FUNCT__ 1029bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchRegister" 1030bf7f4e0aSPeter Brune /*@C 1031bf7f4e0aSPeter Brune LineSearchRegister - See LineSearchRegisterDynamic() 1032bf7f4e0aSPeter Brune 1033bf7f4e0aSPeter Brune Level: advanced 1034bf7f4e0aSPeter Brune @*/ 1035bf7f4e0aSPeter Brune PetscErrorCode LineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(LineSearch)) 1036bf7f4e0aSPeter Brune { 1037bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 1038bf7f4e0aSPeter Brune PetscErrorCode ierr; 1039bf7f4e0aSPeter Brune 1040bf7f4e0aSPeter Brune PetscFunctionBegin; 1041bf7f4e0aSPeter Brune ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 1042bf7f4e0aSPeter Brune ierr = PetscFListAdd(&LineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1043bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1044bf7f4e0aSPeter Brune } 1045