1*9e764e56SPeter Brune #include <private/linesearchimpl.h> /*I "petscsnes.h" I*/ 2bf7f4e0aSPeter Brune 36188f407SPeter Brune PetscBool PetscLineSearchRegisterAllCalled = PETSC_FALSE; 46188f407SPeter Brune PetscFList PetscLineSearchList = PETSC_NULL; 5bf7f4e0aSPeter Brune 66188f407SPeter Brune PetscClassId PETSCLINESEARCH_CLASSID; 76188f407SPeter Brune PetscLogEvent PetscLineSearch_Apply; 8bf7f4e0aSPeter Brune 9bf7f4e0aSPeter Brune #undef __FUNCT__ 106188f407SPeter Brune #define __FUNCT__ "PetscLineSearchCreate" 11f40b411bSPeter Brune /*@ 126188f407SPeter Brune PetscLineSearchCreate - 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 296188f407SPeter Brune PetscErrorCode PetscLineSearchCreate(MPI_Comm comm, PetscLineSearch * outlinesearch) { 30bf7f4e0aSPeter Brune PetscErrorCode ierr; 316188f407SPeter Brune PetscLineSearch linesearch; 32bf7f4e0aSPeter Brune PetscFunctionBegin; 336188f407SPeter Brune ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,PETSCLINESEARCH_CLASSID, 0, 346188f407SPeter Brune "LineSearch","Line-search method","LineSearch",comm,PetscLineSearchDestroy,PetscLineSearchView);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; 49516fe3c3SPeter Brune linesearch->rtol = 1e-8; 50516fe3c3SPeter Brune linesearch->atol = 1e-15; 51516fe3c3SPeter Brune linesearch->ltol = 1e-8; 52bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 53bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 54516fe3c3SPeter 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__ 616188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetUp" 62f40b411bSPeter Brune /*@ 636188f407SPeter Brune PetscLineSearchSetUp - 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 726188f407SPeter Brune .keywords: PetscLineSearch, SetUp 73f40b411bSPeter Brune 746188f407SPeter Brune .seealso: PetscLineSearchReset() 75f40b411bSPeter Brune @*/ 76f40b411bSPeter Brune 776188f407SPeter Brune PetscErrorCode PetscLineSearchSetUp(PetscLineSearch linesearch) { 78bf7f4e0aSPeter Brune PetscErrorCode ierr; 79bf7f4e0aSPeter Brune PetscFunctionBegin; 80bf7f4e0aSPeter Brune 81bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 826188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,PETSCLINESEARCHBASIC);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__ 986188f407SPeter Brune #define __FUNCT__ "PetscLineSearchReset" 99f40b411bSPeter Brune 100f40b411bSPeter Brune /*@ 1016188f407SPeter Brune PetscLineSearchReset - Tears down the structures required for application 102f40b411bSPeter Brune 1036188f407SPeter Brune Collective on PetscLineSearch 104f40b411bSPeter Brune 105f40b411bSPeter Brune Input Parameters: 106f40b411bSPeter Brune . linesearch - The LineSearch instance. 107f40b411bSPeter Brune 108f40b411bSPeter Brune Level: Intermediate 109f40b411bSPeter Brune 1106188f407SPeter Brune .keywords: PetscLineSearch, Create 111f40b411bSPeter Brune 1126188f407SPeter Brune .seealso: PetscLineSearchSetUp() 113f40b411bSPeter Brune @*/ 114f40b411bSPeter Brune 1156188f407SPeter Brune PetscErrorCode PetscLineSearchReset(PetscLineSearch 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__ 1316188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPreCheck" 132f40b411bSPeter Brune /*@ 1336188f407SPeter Brune PetscLineSearchPreCheck - Prepares the line search for being applied. 134f40b411bSPeter Brune 1356188f407SPeter Brune Collective on PetscLineSearch 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 1456188f407SPeter Brune .keywords: PetscLineSearch, Create 146f40b411bSPeter Brune 1476188f407SPeter Brune .seealso: PetscLineSearchPostCheck() 148f40b411bSPeter Brune @*/ 1496188f407SPeter Brune PetscErrorCode PetscLineSearchPreCheck(PetscLineSearch 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__ 1616188f407SPeter Brune #define __FUNCT__ "PetscLineSearchPostCheck" 162f40b411bSPeter Brune /*@ 1636188f407SPeter Brune PetscLineSearchPostCheck - Prepares the line search for being applied. 164f40b411bSPeter Brune 1656188f407SPeter Brune Collective on PetscLineSearch 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 1766188f407SPeter Brune .keywords: PetscLineSearch, Create 177f40b411bSPeter Brune 1786188f407SPeter Brune .seealso: PetscLineSearchPreCheck() 179f40b411bSPeter Brune @*/ 1806188f407SPeter Brune PetscErrorCode PetscLineSearchPostCheck(PetscLineSearch 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__ 1936188f407SPeter Brune #define __FUNCT__ "PetscLineSearchApply" 194f40b411bSPeter Brune /*@ 1956188f407SPeter Brune PetscLineSearchApply - Computes the line-search update 196f40b411bSPeter Brune 1976188f407SPeter Brune Collective on PetscLineSearch 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 2136188f407SPeter Brune .keywords: PetscLineSearch, Create 214f40b411bSPeter Brune 2156188f407SPeter Brune .seealso: PetscLineSearchCreate(), PetscLineSearchPreCheck(), PetscLineSearchPostCheck() 216f40b411bSPeter Brune @*/ 2176188f407SPeter Brune PetscErrorCode PetscLineSearchApply(PetscLineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) { 218bf7f4e0aSPeter Brune PetscErrorCode ierr; 219bf7f4e0aSPeter Brune PetscFunctionBegin; 220bf7f4e0aSPeter Brune 221bf7f4e0aSPeter Brune /* check the pointers */ 2226188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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 2336188f407SPeter Brune ierr = PetscLineSearchSetUp(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 2446188f407SPeter Brune ierr = PetscLogEventBegin(PetscLineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 245bf7f4e0aSPeter Brune 246bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 247bf7f4e0aSPeter Brune 2486188f407SPeter Brune ierr = PetscLogEventEnd(PetscLineSearch_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__ 2566188f407SPeter Brune #define __FUNCT__ "PetscLineSearchDestroy" 257f40b411bSPeter Brune /*@ 2586188f407SPeter Brune PetscLineSearchDestroy - Destroys the line search instance. 259f40b411bSPeter Brune 2606188f407SPeter Brune Collective on PetscLineSearch 261f40b411bSPeter Brune 262f40b411bSPeter Brune Input Parameters: 263f40b411bSPeter Brune . linesearch - The linesearch instance. 264f40b411bSPeter Brune 265f40b411bSPeter Brune Level: Intermediate 266f40b411bSPeter Brune 2676188f407SPeter Brune .keywords: PetscLineSearch, Create 268f40b411bSPeter Brune 2696188f407SPeter Brune .seealso: PetscLineSearchCreate(), PetscLineSearchReset() 270f40b411bSPeter Brune @*/ 2716188f407SPeter Brune PetscErrorCode PetscLineSearchDestroy(PetscLineSearch * linesearch) { 272bf7f4e0aSPeter Brune PetscErrorCode ierr; 273bf7f4e0aSPeter Brune PetscFunctionBegin; 274bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 2756188f407SPeter Brune PetscValidHeaderSpecific((*linesearch),PETSCLINESEARCH_CLASSID,1); 276bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 277bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 2786188f407SPeter Brune ierr = PetscLineSearchReset(*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__ 2886188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetMonitor" 289f40b411bSPeter Brune /*@ 2906188f407SPeter Brune PetscLineSearchSetMonitor - 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 3046188f407SPeter Brune .seealso: PetscLineSearchGetMonitor() 305bf7f4e0aSPeter Brune @*/ 3066188f407SPeter Brune PetscErrorCode PetscLineSearchSetMonitor(PetscLineSearch 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__ 3206188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetMonitor" 321f40b411bSPeter Brune /*@ 3226188f407SPeter Brune PetscLineSearchGetMonitor - 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 3396188f407SPeter Brune .seealso: PetscLineSearchSetMonitor() 340f40b411bSPeter Brune @*/ 3416188f407SPeter Brune PetscErrorCode PetscLineSearchGetMonitor(PetscLineSearch linesearch, PetscViewer *monitor) 3426a388c36SPeter Brune { 3436a388c36SPeter Brune 3446a388c36SPeter Brune PetscFunctionBegin; 3456188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__ 3546188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetFromOptions" 355f40b411bSPeter Brune /*@ 3566188f407SPeter Brune PetscLineSearchSetFromOptions - 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 3696188f407SPeter Brune Logically Collective on PetscLineSearch 370f40b411bSPeter Brune 371f40b411bSPeter Brune Level: intermediate 372f40b411bSPeter Brune 373f40b411bSPeter Brune 3746188f407SPeter Brune .seealso: PetscLineSearchCreate() 375f40b411bSPeter Brune @*/ 3766188f407SPeter Brune PetscErrorCode PetscLineSearchSetFromOptions(PetscLineSearch linesearch) { 377bf7f4e0aSPeter Brune PetscErrorCode ierr; 3786188f407SPeter Brune const char *deft = PETSCLINESEARCHBASIC; 379bf7f4e0aSPeter Brune char type[256]; 380bf7f4e0aSPeter Brune PetscBool flg, set; 381bf7f4e0aSPeter Brune PetscFunctionBegin; 3826188f407SPeter Brune if (!PetscLineSearchRegisterAllCalled) {ierr = PetscLineSearchRegisterAll(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 } 3886188f407SPeter Brune ierr = PetscOptionsList("-linesearch_type","Line-search method","PetscLineSearchSetType",PetscLineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 389bf7f4e0aSPeter Brune if (flg) { 3906188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,type);CHKERRQ(ierr); 391bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 3926188f407SPeter Brune ierr = PetscLineSearchSetType(linesearch,deft);CHKERRQ(ierr); 393bf7f4e0aSPeter Brune } 394bf7f4e0aSPeter Brune if (linesearch->ops->setfromoptions) { 395bf7f4e0aSPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 396bf7f4e0aSPeter Brune } 397bf7f4e0aSPeter Brune 3986188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESPetscLineSearchSetMonitor", 399bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 4006188f407SPeter Brune if (set) {ierr = PetscLineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 401bf7f4e0aSPeter Brune 4026188f407SPeter Brune ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","PetscLineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 4036188f407SPeter Brune ierr = PetscOptionsReal("-linesearch_rtol","Tolerance for iterative line search","PetscLineSearchSetRTolerance",linesearch->rtol,&linesearch->rtol,0);CHKERRQ(ierr); 4046188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","PetscLineSearchSetComputeNorms",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 4056188f407SPeter Brune ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","PetscLineSearchSetKeepLambda",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__ 4136188f407SPeter Brune #define __FUNCT__ "PetscLineSearchView" 414f40b411bSPeter Brune /*@ 4156188f407SPeter Brune PetscLineSearchView - Views useful information for the line search. 416f40b411bSPeter Brune 417f40b411bSPeter Brune Input Parameters: 418f40b411bSPeter Brune . linesearch - linesearch context. 419f40b411bSPeter Brune 4206188f407SPeter Brune Logically Collective on PetscLineSearch 421f40b411bSPeter Brune 422f40b411bSPeter Brune Level: intermediate 423f40b411bSPeter Brune 424f40b411bSPeter Brune 4256188f407SPeter Brune .seealso: PetscLineSearchCreate() 426f40b411bSPeter Brune @*/ 4276188f407SPeter Brune PetscErrorCode PetscLineSearchView(PetscLineSearch linesearch) { 428bf7f4e0aSPeter Brune PetscFunctionBegin; 429f40b411bSPeter Brune 430bf7f4e0aSPeter Brune PetscFunctionReturn(0); 431bf7f4e0aSPeter Brune } 432bf7f4e0aSPeter Brune 433bf7f4e0aSPeter Brune #undef __FUNCT__ 4346188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetType" 435f40b411bSPeter Brune /*@ 4366188f407SPeter Brune PetscLineSearchSetType - 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 4426188f407SPeter Brune Logically Collective on PetscLineSearch 443f40b411bSPeter Brune 444f40b411bSPeter Brune Level: intermediate 445f40b411bSPeter Brune 446f40b411bSPeter Brune 4476188f407SPeter Brune .seealso: PetscLineSearchCreate() 448f40b411bSPeter Brune @*/ 4496188f407SPeter Brune PetscErrorCode PetscLineSearchSetType(PetscLineSearch linesearch, const PetscLineSearchType type) 450bf7f4e0aSPeter Brune { 451bf7f4e0aSPeter Brune 4526188f407SPeter Brune PetscErrorCode ierr,(*r)(PetscLineSearch); 453bf7f4e0aSPeter Brune PetscBool match; 454bf7f4e0aSPeter Brune 455bf7f4e0aSPeter Brune PetscFunctionBegin; 4566188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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 4626188f407SPeter Brune ierr = PetscFListFind(PetscLineSearchList,((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 } 4696188f407SPeter Brune /* Reinitialize function pointers in PetscLineSearchOps 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__ 4866188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSNES" 487f40b411bSPeter Brune /*@ 4886188f407SPeter Brune PetscLineSearchSetSNES - 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 4976188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 498f40b411bSPeter Brune @*/ 4996188f407SPeter Brune PetscErrorCode PetscLineSearchSetSNES(PetscLineSearch linesearch, SNES snes){ 500bf7f4e0aSPeter Brune PetscFunctionBegin; 5016188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__ 5086188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSNES" 509f40b411bSPeter Brune /*@ 5106188f407SPeter Brune PetscLineSearchGetSNES - 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 5206188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 521f40b411bSPeter Brune @*/ 5226188f407SPeter Brune PetscErrorCode PetscLineSearchGetSNES(PetscLineSearch linesearch, SNES *snes){ 523bf7f4e0aSPeter Brune PetscFunctionBegin; 5246188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 5256a388c36SPeter Brune PetscValidPointer(snes, 2); 526bf7f4e0aSPeter Brune *snes = linesearch->snes; 527bf7f4e0aSPeter Brune PetscFunctionReturn(0); 528bf7f4e0aSPeter Brune } 529bf7f4e0aSPeter Brune 5306a388c36SPeter Brune #undef __FUNCT__ 5316188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetLambda" 532f40b411bSPeter Brune /*@ 5336188f407SPeter Brune PetscLineSearchGetLambda - 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 5436188f407SPeter Brune .seealso: PetscLineSearchGetSNES(), PetscLineSearchSetVecs() 544f40b411bSPeter Brune @*/ 5456188f407SPeter Brune PetscErrorCode PetscLineSearchGetLambda(PetscLineSearch linesearch,PetscReal *lambda) 5466a388c36SPeter Brune { 5476a388c36SPeter Brune PetscFunctionBegin; 5486188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 5496a388c36SPeter Brune PetscValidPointer(lambda, 2); 5506a388c36SPeter Brune *lambda = linesearch->lambda; 5516a388c36SPeter Brune PetscFunctionReturn(0); 5526a388c36SPeter Brune } 5536a388c36SPeter Brune 5546a388c36SPeter Brune #undef __FUNCT__ 5556188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetLambda" 556f40b411bSPeter Brune /*@ 5576188f407SPeter Brune PetscLineSearchSetLambda - 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 5656188f407SPeter Brune .seealso: PetscLineSearchGetLambda() 566f40b411bSPeter Brune @*/ 5676188f407SPeter Brune PetscErrorCode PetscLineSearchSetLambda(PetscLineSearch linesearch, PetscReal lambda) 5686a388c36SPeter Brune { 5696a388c36SPeter Brune PetscFunctionBegin; 5706188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 5716a388c36SPeter Brune linesearch->lambda = lambda; 5726a388c36SPeter Brune PetscFunctionReturn(0); 5736a388c36SPeter Brune } 5746a388c36SPeter Brune 5756a388c36SPeter Brune #undef __FUNCT__ 5766188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetTolerances" 577f40b411bSPeter Brune /*@ 5786188f407SPeter Brune PetscLineSearchGetTolerances - Gets the tolerances for the method 579f40b411bSPeter Brune 580f40b411bSPeter Brune Input Parameters: 581f40b411bSPeter Brune . linesearch - linesearch context. 582f40b411bSPeter Brune 583f40b411bSPeter Brune Output Parameters: 584516fe3c3SPeter Brune + steptol - The minimum steplength 585516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 586516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 587516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 588516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 589f40b411bSPeter Brune 590f40b411bSPeter Brune 591516fe3c3SPeter Brune Level: advanced 592516fe3c3SPeter Brune 5936188f407SPeter Brune .seealso: PetscLineSearchSetTolerances() 594f40b411bSPeter Brune @*/ 5956188f407SPeter Brune PetscErrorCode PetscLineSearchGetTolerances(PetscLineSearch linesearch,PetscReal *steptol,PetscReal *maxstep, PetscReal *rtol, PetscReal *atol, PetscReal *ltol, PetscInt *max_its) 5966a388c36SPeter Brune { 5976a388c36SPeter Brune PetscFunctionBegin; 5986188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 599516fe3c3SPeter Brune if (steptol) { 6006a388c36SPeter Brune PetscValidPointer(steptol, 2); 6016a388c36SPeter Brune *steptol = linesearch->steptol; 602516fe3c3SPeter Brune } 603516fe3c3SPeter Brune if (maxstep) { 604516fe3c3SPeter Brune PetscValidPointer(maxstep, 3); 605516fe3c3SPeter Brune *maxstep = linesearch->maxstep; 606516fe3c3SPeter Brune } 607516fe3c3SPeter Brune if (rtol) { 608516fe3c3SPeter Brune PetscValidPointer(rtol, 4); 609516fe3c3SPeter Brune *rtol = linesearch->rtol; 610516fe3c3SPeter Brune } 611516fe3c3SPeter Brune if (atol) { 612516fe3c3SPeter Brune PetscValidPointer(atol, 5); 613516fe3c3SPeter Brune *atol = linesearch->atol; 614516fe3c3SPeter Brune } 615516fe3c3SPeter Brune if (ltol) { 616516fe3c3SPeter Brune PetscValidPointer(ltol, 6); 617516fe3c3SPeter Brune *ltol = linesearch->ltol; 618516fe3c3SPeter Brune } 619516fe3c3SPeter Brune if (max_its) { 620516fe3c3SPeter Brune PetscValidPointer(max_its, 7); 621516fe3c3SPeter Brune *max_its = linesearch->max_its; 622516fe3c3SPeter Brune } 6236a388c36SPeter Brune PetscFunctionReturn(0); 6246a388c36SPeter Brune } 6256a388c36SPeter Brune 6266a388c36SPeter Brune #undef __FUNCT__ 6276188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetTolerances" 628f40b411bSPeter Brune /*@ 6296188f407SPeter Brune PetscLineSearchSetTolerances - Sets the tolerances for the method 630f40b411bSPeter Brune 631f40b411bSPeter Brune Input Parameters: 632516fe3c3SPeter Brune + linesearch - linesearch context. 633516fe3c3SPeter Brune . steptol - The minimum steplength 634516fe3c3SPeter Brune . rtol - The relative tolerance for iterative line searches 635516fe3c3SPeter Brune . atol - The absolute tolerance for iterative line searches 636516fe3c3SPeter Brune . ltol - The change in lambda tolerance for iterative line searches 637516fe3c3SPeter Brune - max_it - The maximum number of iterations of the line search 638f40b411bSPeter Brune 639f40b411bSPeter Brune 640516fe3c3SPeter Brune Level: advanced 641516fe3c3SPeter Brune 6426188f407SPeter Brune .seealso: PetscLineSearchGetTolerances() 643f40b411bSPeter Brune @*/ 6446188f407SPeter Brune PetscErrorCode PetscLineSearchSetTolerances(PetscLineSearch linesearch,PetscReal steptol,PetscReal maxstep, PetscReal rtol, PetscReal atol, PetscReal ltol, PetscInt max_its) 6456a388c36SPeter Brune { 6466a388c36SPeter Brune PetscFunctionBegin; 6476188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 6486a388c36SPeter Brune linesearch->steptol = steptol; 649516fe3c3SPeter Brune linesearch->maxstep = maxstep; 650516fe3c3SPeter Brune linesearch->rtol = rtol; 651516fe3c3SPeter Brune linesearch->atol = atol; 652516fe3c3SPeter Brune linesearch->ltol = ltol; 653516fe3c3SPeter Brune linesearch->max_its = max_its; 6546a388c36SPeter Brune PetscFunctionReturn(0); 6556a388c36SPeter Brune } 6566a388c36SPeter Brune 657516fe3c3SPeter Brune 6586a388c36SPeter Brune #undef __FUNCT__ 6596188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetDamping" 660f40b411bSPeter Brune /*@ 6616188f407SPeter Brune PetscLineSearchGetDamping - 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 6716188f407SPeter Brune .seealso: PetscLineSearchGetStepTolerance() 672f40b411bSPeter Brune @*/ 673f40b411bSPeter Brune 6746188f407SPeter Brune PetscErrorCode PetscLineSearchGetDamping(PetscLineSearch linesearch,PetscReal *damping) 6756a388c36SPeter Brune { 6766a388c36SPeter Brune PetscFunctionBegin; 6776188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 6786a388c36SPeter Brune PetscValidPointer(damping, 2); 6796a388c36SPeter Brune *damping = linesearch->damping; 6806a388c36SPeter Brune PetscFunctionReturn(0); 6816a388c36SPeter Brune } 6826a388c36SPeter Brune 6836a388c36SPeter Brune #undef __FUNCT__ 6846188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetDamping" 685f40b411bSPeter Brune /*@ 6866188f407SPeter Brune PetscLineSearchSetDamping - 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 6946188f407SPeter Brune .seealso: PetscLineSearchGetDamping() 695f40b411bSPeter Brune @*/ 6966188f407SPeter Brune PetscErrorCode PetscLineSearchSetDamping(PetscLineSearch linesearch,PetscReal damping) 6976a388c36SPeter Brune { 6986a388c36SPeter Brune PetscFunctionBegin; 6996188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 7006a388c36SPeter Brune linesearch->damping = damping; 7016a388c36SPeter Brune PetscFunctionReturn(0); 7026a388c36SPeter Brune } 7036a388c36SPeter Brune 7046a388c36SPeter Brune #undef __FUNCT__ 7056188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetNorms" 706f40b411bSPeter Brune /*@ 7076188f407SPeter Brune PetscLineSearchGetNorms - 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 7196188f407SPeter Brune .seealso: PetscLineSearchSetNorms() PetscLineSearchGetVecs() 720f40b411bSPeter Brune @*/ 7216188f407SPeter Brune PetscErrorCode PetscLineSearchGetNorms(PetscLineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 722bf7f4e0aSPeter Brune { 723bf7f4e0aSPeter Brune PetscFunctionBegin; 7246188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_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__ 7386188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetNorms" 739f40b411bSPeter Brune /*@ 7406188f407SPeter Brune PetscLineSearchSetNorms - 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 7506188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs() 751f40b411bSPeter Brune @*/ 7526188f407SPeter Brune PetscErrorCode PetscLineSearchSetNorms(PetscLineSearch linesearch, PetscReal xnorm, PetscReal fnorm, PetscReal ynorm) 7536a388c36SPeter Brune { 7546a388c36SPeter Brune PetscFunctionBegin; 7556188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 7566a388c36SPeter Brune linesearch->xnorm = xnorm; 7576a388c36SPeter Brune linesearch->fnorm = fnorm; 7586a388c36SPeter Brune linesearch->ynorm = ynorm; 7596a388c36SPeter Brune PetscFunctionReturn(0); 7606a388c36SPeter Brune } 7616a388c36SPeter Brune 7626a388c36SPeter Brune #undef __FUNCT__ 7636188f407SPeter Brune #define __FUNCT__ "PetscLineSearchComputeNorms" 764f40b411bSPeter Brune /*@ 7656188f407SPeter Brune PetscLineSearchComputeNorms - Computes the norms of X, F, and Y. 766f40b411bSPeter Brune 767f40b411bSPeter Brune Input Parameters: 768f40b411bSPeter Brune . linesearch - linesearch context. 769f40b411bSPeter Brune 770f40b411bSPeter Brune Options Database Keys: 771f40b411bSPeter Brune . -linesearch_norms - turn norm computation on or off. 772f40b411bSPeter Brune 773f40b411bSPeter Brune Level: intermediate 774f40b411bSPeter Brune 7756188f407SPeter Brune .seealso: PetscLineSearchGetNorms, PetscLineSearchSetNorms() 776f40b411bSPeter Brune @*/ 7776188f407SPeter Brune PetscErrorCode PetscLineSearchComputeNorms(PetscLineSearch linesearch) 7786a388c36SPeter Brune { 7796a388c36SPeter Brune PetscErrorCode ierr; 7806a388c36SPeter Brune PetscFunctionBegin; 7816a388c36SPeter Brune if (linesearch->norms) { 7826a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 7836a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 7846a388c36SPeter Brune ierr = VecNormBegin(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 7856a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_func, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 7866a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_sol, NORM_2, &linesearch->xnorm);CHKERRQ(ierr); 7876a388c36SPeter Brune ierr = VecNormEnd(linesearch->vec_update, NORM_2, &linesearch->ynorm);CHKERRQ(ierr); 7886a388c36SPeter Brune } 7896a388c36SPeter Brune PetscFunctionReturn(0); 7906a388c36SPeter Brune } 7916a388c36SPeter Brune 7926a388c36SPeter Brune #undef __FUNCT__ 7936188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetVecs" 794f40b411bSPeter Brune /*@ 7956188f407SPeter Brune PetscLineSearchGetVecs - Gets the vectors from the PetscLineSearch context 796f40b411bSPeter Brune 797f40b411bSPeter Brune Input Parameters: 798f40b411bSPeter Brune . linesearch - linesearch context. 799f40b411bSPeter Brune 800f40b411bSPeter Brune Output Parameters: 801f40b411bSPeter Brune + X - The old solution 802f40b411bSPeter Brune . F - The old function 803f40b411bSPeter Brune . Y - The search direction 804f40b411bSPeter Brune . W - The new solution 805f40b411bSPeter Brune - G - The new function 806f40b411bSPeter Brune 807f40b411bSPeter Brune Level: intermediate 808f40b411bSPeter Brune 8096188f407SPeter Brune .seealso: PetscLineSearchGetNorms(), PetscLineSearchSetVecs() 810f40b411bSPeter Brune @*/ 8116188f407SPeter Brune PetscErrorCode PetscLineSearchGetVecs(PetscLineSearch linesearch,Vec *X,Vec *F, Vec *Y,Vec *W,Vec *G) { 8126a388c36SPeter Brune PetscFunctionBegin; 8136188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 8146a388c36SPeter Brune if (X) { 8156a388c36SPeter Brune PetscValidPointer(X, 2); 8166a388c36SPeter Brune *X = linesearch->vec_sol; 8176a388c36SPeter Brune } 8186a388c36SPeter Brune if (F) { 8196a388c36SPeter Brune PetscValidPointer(F, 3); 8206a388c36SPeter Brune *F = linesearch->vec_func; 8216a388c36SPeter Brune } 8226a388c36SPeter Brune if (Y) { 8236a388c36SPeter Brune PetscValidPointer(Y, 4); 8246a388c36SPeter Brune *Y = linesearch->vec_update; 8256a388c36SPeter Brune } 8266a388c36SPeter Brune if (W) { 8276a388c36SPeter Brune PetscValidPointer(W, 5); 8286a388c36SPeter Brune *W = linesearch->vec_sol_new; 8296a388c36SPeter Brune } 8306a388c36SPeter Brune if (G) { 8316a388c36SPeter Brune PetscValidPointer(G, 6); 8326a388c36SPeter Brune *G = linesearch->vec_func_new; 8336a388c36SPeter Brune } 8346a388c36SPeter Brune 8356a388c36SPeter Brune PetscFunctionReturn(0); 8366a388c36SPeter Brune } 8376a388c36SPeter Brune 8386a388c36SPeter Brune #undef __FUNCT__ 8396188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetVecs" 840f40b411bSPeter Brune /*@ 8416188f407SPeter Brune PetscLineSearchSetVecs - Sets the vectors on the PetscLineSearch context 842f40b411bSPeter Brune 843f40b411bSPeter Brune Input Parameters: 844f40b411bSPeter Brune + linesearch - linesearch context. 845f40b411bSPeter Brune . X - The old solution 846f40b411bSPeter Brune . F - The old function 847f40b411bSPeter Brune . Y - The search direction 848f40b411bSPeter Brune . W - The new solution 849f40b411bSPeter Brune - G - The new function 850f40b411bSPeter Brune 851f40b411bSPeter Brune Level: intermediate 852f40b411bSPeter Brune 8536188f407SPeter Brune .seealso: PetscLineSearchSetNorms(), PetscLineSearchGetVecs() 854f40b411bSPeter Brune @*/ 8556188f407SPeter Brune PetscErrorCode PetscLineSearchSetVecs(PetscLineSearch linesearch,Vec X,Vec F,Vec Y,Vec W, Vec G) { 8566a388c36SPeter Brune PetscFunctionBegin; 8576188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 8586a388c36SPeter Brune if (X) { 8596a388c36SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 8606a388c36SPeter Brune linesearch->vec_sol = X; 8616a388c36SPeter Brune } 8626a388c36SPeter Brune if (F) { 8636a388c36SPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 8646a388c36SPeter Brune linesearch->vec_func = F; 8656a388c36SPeter Brune } 8666a388c36SPeter Brune if (Y) { 8676a388c36SPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 8686a388c36SPeter Brune linesearch->vec_update = Y; 8696a388c36SPeter Brune } 8706a388c36SPeter Brune if (W) { 8716a388c36SPeter Brune PetscValidHeaderSpecific(W,VEC_CLASSID,5); 8726a388c36SPeter Brune linesearch->vec_sol_new = W; 8736a388c36SPeter Brune } 8746a388c36SPeter Brune if (G) { 8756a388c36SPeter Brune PetscValidHeaderSpecific(G,VEC_CLASSID,6); 8766a388c36SPeter Brune linesearch->vec_func_new = G; 8776a388c36SPeter Brune } 8786a388c36SPeter Brune 8796a388c36SPeter Brune PetscFunctionReturn(0); 8806a388c36SPeter Brune } 8816a388c36SPeter Brune 8826a388c36SPeter Brune #undef __FUNCT__ 8836188f407SPeter Brune #define __FUNCT__ "PetscLineSearchAppendOptionsPrefix" 884e7058c64SPeter Brune /*@C 8856188f407SPeter Brune PetscLineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 886e7058c64SPeter Brune SNES options in the database. 887e7058c64SPeter Brune 888e7058c64SPeter Brune Logically Collective on SNES 889e7058c64SPeter Brune 890e7058c64SPeter Brune Input Parameters: 891e7058c64SPeter Brune + snes - the SNES context 892e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 893e7058c64SPeter Brune 894e7058c64SPeter Brune Notes: 895e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 896e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 897e7058c64SPeter Brune 898e7058c64SPeter Brune Level: advanced 899e7058c64SPeter Brune 9006188f407SPeter Brune .keywords: PetscLineSearch, append, options, prefix, database 901e7058c64SPeter Brune 902e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 903e7058c64SPeter Brune @*/ 9046188f407SPeter Brune PetscErrorCode PetscLineSearchAppendOptionsPrefix(PetscLineSearch linesearch,const char prefix[]) 905e7058c64SPeter Brune { 906e7058c64SPeter Brune PetscErrorCode ierr; 907e7058c64SPeter Brune 908e7058c64SPeter Brune PetscFunctionBegin; 9096188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 910e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 911e7058c64SPeter Brune PetscFunctionReturn(0); 912e7058c64SPeter Brune } 913e7058c64SPeter Brune 914e7058c64SPeter Brune #undef __FUNCT__ 9156188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetOptionsPrefix" 916e7058c64SPeter Brune /*@C 9176188f407SPeter Brune PetscLineSearchGetOptionsPrefix - Sets the prefix used for searching for all 9186188f407SPeter Brune PetscLineSearch options in the database. 919e7058c64SPeter Brune 920e7058c64SPeter Brune Not Collective 921e7058c64SPeter Brune 922e7058c64SPeter Brune Input Parameter: 923e7058c64SPeter Brune . snes - the SNES context 924e7058c64SPeter Brune 925e7058c64SPeter Brune Output Parameter: 926e7058c64SPeter Brune . prefix - pointer to the prefix string used 927e7058c64SPeter Brune 928e7058c64SPeter Brune Notes: On the fortran side, the user should pass in a string 'prefix' of 929e7058c64SPeter Brune sufficient length to hold the prefix. 930e7058c64SPeter Brune 931e7058c64SPeter Brune Level: advanced 932e7058c64SPeter Brune 9336188f407SPeter Brune .keywords: PetscLineSearch, get, options, prefix, database 934e7058c64SPeter Brune 935e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 936e7058c64SPeter Brune @*/ 9376188f407SPeter Brune PetscErrorCode PetscLineSearchGetOptionsPrefix(PetscLineSearch linesearch,const char *prefix[]) 938e7058c64SPeter Brune { 939e7058c64SPeter Brune PetscErrorCode ierr; 940e7058c64SPeter Brune 941e7058c64SPeter Brune PetscFunctionBegin; 9426188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 943e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 944e7058c64SPeter Brune PetscFunctionReturn(0); 945e7058c64SPeter Brune } 946bf7f4e0aSPeter Brune 947bf7f4e0aSPeter Brune #undef __FUNCT__ 9486188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetWork" 949f40b411bSPeter Brune /*@ 9506188f407SPeter Brune PetscLineSearchGetWork - Gets work vectors for the line search. 951f40b411bSPeter Brune 952f40b411bSPeter Brune Input Parameter: 9536188f407SPeter Brune + linesearch - the PetscLineSearch context 954f40b411bSPeter Brune - nwork - the number of work vectors 955f40b411bSPeter Brune 956f40b411bSPeter Brune Level: developer 957f40b411bSPeter Brune 9586188f407SPeter Brune .keywords: PetscLineSearch, work, vector 959f40b411bSPeter Brune 960f40b411bSPeter Brune .seealso: SNESDefaultGetWork() 961f40b411bSPeter Brune @*/ 9626188f407SPeter Brune PetscErrorCode PetscLineSearchGetWork(PetscLineSearch linesearch, PetscInt nwork) 963bf7f4e0aSPeter Brune { 964bf7f4e0aSPeter Brune PetscErrorCode ierr; 965bf7f4e0aSPeter Brune PetscFunctionBegin; 966bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 967bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 968bf7f4e0aSPeter Brune } else { 969bf7f4e0aSPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 970bf7f4e0aSPeter Brune } 971bf7f4e0aSPeter Brune PetscFunctionReturn(0); 972bf7f4e0aSPeter Brune } 973bf7f4e0aSPeter Brune 9746a388c36SPeter Brune 975bf7f4e0aSPeter Brune #undef __FUNCT__ 9766188f407SPeter Brune #define __FUNCT__ "PetscLineSearchGetSuccess" 977f40b411bSPeter Brune /*@ 9786188f407SPeter Brune PetscLineSearchGetSuccess - Gets the success/failure status of the last line search application 979f40b411bSPeter Brune 980f40b411bSPeter Brune Input Parameters: 981f40b411bSPeter Brune . linesearch - linesearch context. 982f40b411bSPeter Brune 983f40b411bSPeter Brune Output Parameters: 984f40b411bSPeter Brune . success - The success or failure status. 985f40b411bSPeter Brune 986f40b411bSPeter Brune Level: intermediate 987f40b411bSPeter Brune 9886188f407SPeter Brune .seealso: PetscLineSearchSetSuccess() 989f40b411bSPeter Brune @*/ 9906188f407SPeter Brune PetscErrorCode PetscLineSearchGetSuccess(PetscLineSearch linesearch, PetscBool *success) 991bf7f4e0aSPeter Brune { 992bf7f4e0aSPeter Brune PetscFunctionBegin; 9936188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 9946a388c36SPeter Brune PetscValidPointer(success, 2); 995bf7f4e0aSPeter Brune if (success) { 996bf7f4e0aSPeter Brune *success = linesearch->success; 997bf7f4e0aSPeter Brune } 998bf7f4e0aSPeter Brune PetscFunctionReturn(0); 999bf7f4e0aSPeter Brune } 1000bf7f4e0aSPeter Brune 1001bf7f4e0aSPeter Brune #undef __FUNCT__ 10026188f407SPeter Brune #define __FUNCT__ "PetscLineSearchSetSuccess" 1003f40b411bSPeter Brune /*@ 10046188f407SPeter Brune PetscLineSearchSetSuccess - Sets the success/failure status of the last line search application 1005f40b411bSPeter Brune 1006f40b411bSPeter Brune Input Parameters: 1007f40b411bSPeter Brune + linesearch - linesearch context. 1008f40b411bSPeter Brune - success - The success or failure status. 1009f40b411bSPeter Brune 1010f40b411bSPeter Brune Level: intermediate 1011f40b411bSPeter Brune 10126188f407SPeter Brune .seealso: PetscLineSearchGetSuccess() 1013f40b411bSPeter Brune @*/ 10146188f407SPeter Brune PetscErrorCode PetscLineSearchSetSuccess(PetscLineSearch linesearch, PetscBool success) 10156a388c36SPeter Brune { 10166188f407SPeter Brune PetscValidHeaderSpecific(linesearch,PETSCLINESEARCH_CLASSID,1); 10176a388c36SPeter Brune PetscFunctionBegin; 10186a388c36SPeter Brune linesearch->success = success; 10196a388c36SPeter Brune PetscFunctionReturn(0); 10206a388c36SPeter Brune } 10216a388c36SPeter Brune 10226a388c36SPeter Brune #undef __FUNCT__ 10236188f407SPeter Brune #define __FUNCT__ "PetscLineSearchRegister" 1024bf7f4e0aSPeter Brune /*@C 10256188f407SPeter Brune PetscLineSearchRegister - See PetscLineSearchRegisterDynamic() 1026bf7f4e0aSPeter Brune 1027bf7f4e0aSPeter Brune Level: advanced 1028bf7f4e0aSPeter Brune @*/ 10296188f407SPeter Brune PetscErrorCode PetscLineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(PetscLineSearch)) 1030bf7f4e0aSPeter Brune { 1031bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 1032bf7f4e0aSPeter Brune PetscErrorCode ierr; 1033bf7f4e0aSPeter Brune 1034bf7f4e0aSPeter Brune PetscFunctionBegin; 1035bf7f4e0aSPeter Brune ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 10366188f407SPeter Brune ierr = PetscFListAdd(&PetscLineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1037bf7f4e0aSPeter Brune PetscFunctionReturn(0); 1038bf7f4e0aSPeter Brune } 1039