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" 11bf7f4e0aSPeter Brune PetscErrorCode LineSearchCreate(MPI_Comm comm, LineSearch * outlinesearch) { 12bf7f4e0aSPeter Brune PetscErrorCode ierr; 13bf7f4e0aSPeter Brune LineSearch linesearch; 14bf7f4e0aSPeter Brune PetscFunctionBegin; 15bf7f4e0aSPeter Brune ierr = PetscHeaderCreate(linesearch, _p_LineSearch,struct _LineSearchOps,LineSearch_CLASSID, 0, 16bf7f4e0aSPeter Brune "LineSearch","Line-search method","LineSearch",comm,LineSearchDestroy,LineSearchView);CHKERRQ(ierr); 17bf7f4e0aSPeter Brune 18bf7f4e0aSPeter Brune linesearch->ops->precheckstep = PETSC_NULL; 19bf7f4e0aSPeter Brune linesearch->ops->postcheckstep = PETSC_NULL; 20bf7f4e0aSPeter Brune 21bf7f4e0aSPeter Brune linesearch->lambda = 1.0; 22bf7f4e0aSPeter Brune linesearch->fnorm = 1.0; 23bf7f4e0aSPeter Brune linesearch->ynorm = 1.0; 24bf7f4e0aSPeter Brune linesearch->xnorm = 1.0; 25bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 26bf7f4e0aSPeter Brune linesearch->norms = PETSC_TRUE; 27bf7f4e0aSPeter Brune linesearch->keeplambda = PETSC_FALSE; 28bf7f4e0aSPeter Brune linesearch->damping = 1.0; 29bf7f4e0aSPeter Brune linesearch->maxstep = 1e8; 30bf7f4e0aSPeter Brune linesearch->steptol = 1e-12; 31bf7f4e0aSPeter Brune linesearch->precheckctx = PETSC_NULL; 32bf7f4e0aSPeter Brune linesearch->postcheckctx = PETSC_NULL; 33bf7f4e0aSPeter Brune linesearch->max_its = 1; 34bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 35bf7f4e0aSPeter Brune *outlinesearch = linesearch; 36bf7f4e0aSPeter Brune PetscFunctionReturn(0); 37bf7f4e0aSPeter Brune } 38bf7f4e0aSPeter Brune 39bf7f4e0aSPeter Brune #undef __FUNCT__ 40bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetUp" 41bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetUp(LineSearch linesearch) { 42bf7f4e0aSPeter Brune PetscErrorCode ierr; 43bf7f4e0aSPeter Brune PetscFunctionBegin; 44bf7f4e0aSPeter Brune 45bf7f4e0aSPeter Brune if (!((PetscObject)linesearch)->type_name) { 46bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,LINESEARCHBASIC);CHKERRQ(ierr); 47bf7f4e0aSPeter Brune } 48bf7f4e0aSPeter Brune 49bf7f4e0aSPeter Brune if (!linesearch->setupcalled) { 50bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_sol, &linesearch->vec_sol_new);CHKERRQ(ierr); 51bf7f4e0aSPeter Brune ierr = VecDuplicate(linesearch->vec_func, &linesearch->vec_func_new);CHKERRQ(ierr); 52bf7f4e0aSPeter Brune if (linesearch->ops->setup) { 53bf7f4e0aSPeter Brune ierr = (*linesearch->ops->setup)(linesearch);CHKERRQ(ierr); 54bf7f4e0aSPeter Brune } 55bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; 56bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_TRUE; 57bf7f4e0aSPeter Brune } 58bf7f4e0aSPeter Brune PetscFunctionReturn(0); 59bf7f4e0aSPeter Brune } 60bf7f4e0aSPeter Brune 61bf7f4e0aSPeter Brune #undef __FUNCT__ 62bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchReset" 63bf7f4e0aSPeter Brune PetscErrorCode LineSearchReset(LineSearch linesearch) { 64bf7f4e0aSPeter Brune PetscErrorCode ierr; 65bf7f4e0aSPeter Brune PetscFunctionBegin; 66bf7f4e0aSPeter Brune if (linesearch->ops->reset) { 67bf7f4e0aSPeter Brune (*linesearch->ops->reset)(linesearch); 68bf7f4e0aSPeter Brune } 69bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_sol_new);CHKERRQ(ierr); 70bf7f4e0aSPeter Brune ierr = VecDestroy(&linesearch->vec_func_new);CHKERRQ(ierr); 71bf7f4e0aSPeter Brune 72bf7f4e0aSPeter Brune ierr = VecDestroyVecs(linesearch->nwork, &linesearch->work);CHKERRQ(ierr); 73bf7f4e0aSPeter Brune linesearch->nwork = 0; 74bf7f4e0aSPeter Brune linesearch->setupcalled = PETSC_FALSE; 75bf7f4e0aSPeter Brune PetscFunctionReturn(0); 76bf7f4e0aSPeter Brune } 77bf7f4e0aSPeter Brune 78bf7f4e0aSPeter Brune #undef __FUNCT__ 79bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPreCheck" 80bf7f4e0aSPeter Brune PetscErrorCode LineSearchPreCheck(LineSearch linesearch, PetscBool * changed) 81bf7f4e0aSPeter Brune { 82bf7f4e0aSPeter Brune PetscErrorCode ierr; 83bf7f4e0aSPeter Brune PetscFunctionBegin; 84bf7f4e0aSPeter Brune *changed = PETSC_FALSE; 85bf7f4e0aSPeter Brune if (linesearch->ops->precheckstep) { 86bf7f4e0aSPeter Brune ierr = (*linesearch->ops->precheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_update, changed);CHKERRQ(ierr); 87bf7f4e0aSPeter Brune } 88bf7f4e0aSPeter Brune PetscFunctionReturn(0); 89bf7f4e0aSPeter Brune } 90bf7f4e0aSPeter Brune 91bf7f4e0aSPeter Brune #undef __FUNCT__ 92bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchPostCheck" 93bf7f4e0aSPeter Brune PetscErrorCode LineSearchPostCheck(LineSearch linesearch, PetscBool * changed_W, PetscBool * changed_Y) 94bf7f4e0aSPeter Brune { 95bf7f4e0aSPeter Brune PetscErrorCode ierr; 96bf7f4e0aSPeter Brune PetscFunctionBegin; 97bf7f4e0aSPeter Brune *changed_Y = PETSC_FALSE; 98bf7f4e0aSPeter Brune *changed_W = PETSC_FALSE; 99bf7f4e0aSPeter Brune if (linesearch->ops->postcheckstep) { 100bf7f4e0aSPeter Brune ierr = (*linesearch->ops->postcheckstep)(linesearch, linesearch->vec_sol, linesearch->vec_sol_new, linesearch->vec_update, changed_W, changed_Y);CHKERRQ(ierr); 101bf7f4e0aSPeter Brune } 102bf7f4e0aSPeter Brune PetscFunctionReturn(0); 103bf7f4e0aSPeter Brune } 104bf7f4e0aSPeter Brune 105bf7f4e0aSPeter Brune #undef __FUNCT__ 106bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchApply" 107bf7f4e0aSPeter Brune PetscErrorCode LineSearchApply(LineSearch linesearch, Vec X, Vec F, PetscReal * fnorm, Vec Y) { 108bf7f4e0aSPeter Brune PetscErrorCode ierr; 109bf7f4e0aSPeter Brune PetscFunctionBegin; 110bf7f4e0aSPeter Brune 111bf7f4e0aSPeter Brune /* check the pointers */ 112bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 113bf7f4e0aSPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 114bf7f4e0aSPeter Brune PetscValidHeaderSpecific(F,VEC_CLASSID,3); 115bf7f4e0aSPeter Brune PetscValidHeaderSpecific(Y,VEC_CLASSID,4); 116bf7f4e0aSPeter Brune 117bf7f4e0aSPeter Brune linesearch->success = PETSC_TRUE; 118bf7f4e0aSPeter Brune 119bf7f4e0aSPeter Brune linesearch->vec_sol = X; 120bf7f4e0aSPeter Brune linesearch->vec_update = Y; 121bf7f4e0aSPeter Brune linesearch->vec_func = F; 122bf7f4e0aSPeter Brune 123bf7f4e0aSPeter Brune ierr = LineSearchSetUp(linesearch);CHKERRQ(ierr); 124bf7f4e0aSPeter Brune 125bf7f4e0aSPeter Brune if (!linesearch->keeplambda) 126bf7f4e0aSPeter Brune linesearch->lambda = linesearch->damping; /* set the initial guess to lambda */ 127bf7f4e0aSPeter Brune 128bf7f4e0aSPeter Brune if (fnorm) { 129bf7f4e0aSPeter Brune linesearch->fnorm = *fnorm; 130bf7f4e0aSPeter Brune } else { 131bf7f4e0aSPeter Brune ierr = VecNorm(F, NORM_2, &linesearch->fnorm);CHKERRQ(ierr); 132bf7f4e0aSPeter Brune } 133bf7f4e0aSPeter Brune 134bf7f4e0aSPeter Brune ierr = PetscLogEventBegin(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 135bf7f4e0aSPeter Brune 136bf7f4e0aSPeter Brune ierr = (*linesearch->ops->apply)(linesearch);CHKERRQ(ierr); 137bf7f4e0aSPeter Brune 138bf7f4e0aSPeter Brune ierr = PetscLogEventEnd(LineSearch_Apply,linesearch,X,F,Y);CHKERRQ(ierr); 139bf7f4e0aSPeter Brune 140bf7f4e0aSPeter Brune if (fnorm) 141bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 142bf7f4e0aSPeter Brune PetscFunctionReturn(0); 143bf7f4e0aSPeter Brune } 144bf7f4e0aSPeter Brune 145bf7f4e0aSPeter Brune #undef __FUNCT__ 146bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchDestroy" 147bf7f4e0aSPeter Brune PetscErrorCode LineSearchDestroy(LineSearch * linesearch) { 148bf7f4e0aSPeter Brune PetscErrorCode ierr; 149bf7f4e0aSPeter Brune PetscFunctionBegin; 150bf7f4e0aSPeter Brune if (!*linesearch) PetscFunctionReturn(0); 151bf7f4e0aSPeter Brune PetscValidHeaderSpecific((*linesearch),LineSearch_CLASSID,1); 152bf7f4e0aSPeter Brune if (--((PetscObject)(*linesearch))->refct > 0) {*linesearch = 0; PetscFunctionReturn(0);} 153bf7f4e0aSPeter Brune ierr = PetscObjectDepublish((*linesearch));CHKERRQ(ierr); 154bf7f4e0aSPeter Brune ierr = LineSearchReset(*linesearch); 155bf7f4e0aSPeter Brune if ((*linesearch)->ops->destroy) { 156bf7f4e0aSPeter Brune (*linesearch)->ops->destroy(*linesearch); 157bf7f4e0aSPeter Brune } 158bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&(*linesearch)->monitor);CHKERRQ(ierr); 159*e7058c64SPeter Brune ierr = PetscHeaderDestroy(linesearch);CHKERRQ(ierr); 160bf7f4e0aSPeter Brune PetscFunctionReturn(0); 161bf7f4e0aSPeter Brune } 162bf7f4e0aSPeter Brune 163bf7f4e0aSPeter Brune #undef __FUNCT__ 164*e7058c64SPeter Brune #define __FUNCT__ "LineSearchSetMonitor" 165bf7f4e0aSPeter Brune /*@C 166bf7f4e0aSPeter Brune SNESLineSearchSetMonitor - Prints information about the progress or lack of progress of the line search 167bf7f4e0aSPeter Brune 168bf7f4e0aSPeter Brune Input Parameters: 169bf7f4e0aSPeter Brune + snes - nonlinear context obtained from SNESCreate() 170bf7f4e0aSPeter Brune - flg - PETSC_TRUE to monitor the line search 171bf7f4e0aSPeter Brune 172bf7f4e0aSPeter Brune Logically Collective on SNES 173bf7f4e0aSPeter Brune 174bf7f4e0aSPeter Brune Options Database: 175bf7f4e0aSPeter Brune . -snes_ls_monitor 176bf7f4e0aSPeter Brune 177bf7f4e0aSPeter Brune Level: intermediate 178bf7f4e0aSPeter Brune 179bf7f4e0aSPeter Brune 180bf7f4e0aSPeter Brune .seealso: SNESLineSearchSet(), SNESLineSearchSetPostCheck(), SNESSetUpdate() 181bf7f4e0aSPeter Brune @*/ 182bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetMonitor(LineSearch linesearch,PetscBool flg) 183bf7f4e0aSPeter Brune { 184bf7f4e0aSPeter Brune 185bf7f4e0aSPeter Brune PetscErrorCode ierr; 186bf7f4e0aSPeter Brune PetscFunctionBegin; 187bf7f4e0aSPeter Brune if (flg && !linesearch->monitor) { 188bf7f4e0aSPeter Brune ierr = PetscViewerASCIIOpen(((PetscObject)linesearch)->comm,"stdout",&linesearch->monitor);CHKERRQ(ierr); 189bf7f4e0aSPeter Brune } else if (!flg && linesearch->monitor) { 190bf7f4e0aSPeter Brune ierr = PetscViewerDestroy(&linesearch->monitor);CHKERRQ(ierr); 191bf7f4e0aSPeter Brune } 192bf7f4e0aSPeter Brune PetscFunctionReturn(0); 193bf7f4e0aSPeter Brune } 194bf7f4e0aSPeter Brune 195bf7f4e0aSPeter Brune #undef __FUNCT__ 196bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetFromOptions" 197bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetFromOptions(LineSearch linesearch) { 198bf7f4e0aSPeter Brune PetscErrorCode ierr; 199bf7f4e0aSPeter Brune const char *deft = LINESEARCHBASIC; 200bf7f4e0aSPeter Brune char type[256]; 201bf7f4e0aSPeter Brune PetscBool flg, set; 202bf7f4e0aSPeter Brune PetscFunctionBegin; 203bf7f4e0aSPeter Brune if (!LineSearchRegisterAllCalled) {ierr = LineSearchRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 204bf7f4e0aSPeter Brune 205bf7f4e0aSPeter Brune ierr = PetscObjectOptionsBegin((PetscObject)linesearch);CHKERRQ(ierr); 206bf7f4e0aSPeter Brune if (((PetscObject)linesearch)->type_name) { 207bf7f4e0aSPeter Brune deft = ((PetscObject)linesearch)->type_name; 208bf7f4e0aSPeter Brune } 209bf7f4e0aSPeter Brune ierr = PetscOptionsList("-linesearch_type","Line-search method","LineSearchSetType",LineSearchList,deft,type,256,&flg);CHKERRQ(ierr); 210bf7f4e0aSPeter Brune if (flg) { 211bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,type);CHKERRQ(ierr); 212bf7f4e0aSPeter Brune } else if (!((PetscObject)linesearch)->type_name) { 213bf7f4e0aSPeter Brune ierr = LineSearchSetType(linesearch,deft);CHKERRQ(ierr); 214bf7f4e0aSPeter Brune } 215bf7f4e0aSPeter Brune if (linesearch->ops->setfromoptions) { 216bf7f4e0aSPeter Brune (*linesearch->ops->setfromoptions)(linesearch);CHKERRQ(ierr); 217bf7f4e0aSPeter Brune } 218bf7f4e0aSPeter Brune 219bf7f4e0aSPeter Brune ierr = PetscOptionsBool("-linesearch_monitor","Print progress of line searches","SNESLineSearchSetMonitor", 220bf7f4e0aSPeter Brune linesearch->monitor ? PETSC_TRUE : PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 221bf7f4e0aSPeter Brune if (set) {ierr = LineSearchSetMonitor(linesearch,flg);CHKERRQ(ierr);} 222bf7f4e0aSPeter Brune 223bf7f4e0aSPeter Brune ierr = PetscOptionsReal("-linesearch_damping","Line search damping and initial step guess","LineSearchSetDamping",linesearch->damping,&linesearch->damping,0);CHKERRQ(ierr); 224bf7f4e0aSPeter Brune ierr = PetscOptionsBool("-linesearch_norms","Compute final norms in line search","LineSearchSetDamping",linesearch->norms,&linesearch->norms,0);CHKERRQ(ierr); 225bf7f4e0aSPeter Brune ierr = PetscOptionsBool("-linesearch_keeplambda","Use previous lambda as damping","LineSearchSetDamping",linesearch->keeplambda,&linesearch->keeplambda,0);CHKERRQ(ierr); 226bf7f4e0aSPeter Brune ierr = PetscOptionsInt("-linesearch_max_it","Maximum iterations for iterative line searches","",linesearch->max_its,&linesearch->max_its,0);CHKERRQ(ierr); 227bf7f4e0aSPeter Brune ierr = PetscObjectProcessOptionsHandlers((PetscObject)linesearch);CHKERRQ(ierr); 228bf7f4e0aSPeter Brune ierr = PetscOptionsEnd();CHKERRQ(ierr); 229bf7f4e0aSPeter Brune PetscFunctionReturn(0); 230bf7f4e0aSPeter Brune } 231bf7f4e0aSPeter Brune 232bf7f4e0aSPeter Brune #undef __FUNCT__ 233bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchView" 234bf7f4e0aSPeter Brune PetscErrorCode LineSearchView(LineSearch linesearch) { 235bf7f4e0aSPeter Brune PetscFunctionBegin; 236bf7f4e0aSPeter Brune PetscFunctionReturn(0); 237bf7f4e0aSPeter Brune } 238bf7f4e0aSPeter Brune 239bf7f4e0aSPeter Brune #undef __FUNCT__ 240bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetType" 241bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetType(LineSearch linesearch, const LineSearchType type) 242bf7f4e0aSPeter Brune { 243bf7f4e0aSPeter Brune 244bf7f4e0aSPeter Brune PetscErrorCode ierr,(*r)(LineSearch); 245bf7f4e0aSPeter Brune PetscBool match; 246bf7f4e0aSPeter Brune 247bf7f4e0aSPeter Brune PetscFunctionBegin; 248bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 249bf7f4e0aSPeter Brune PetscValidCharPointer(type,2); 250bf7f4e0aSPeter Brune 251bf7f4e0aSPeter Brune ierr = PetscTypeCompare((PetscObject)linesearch,type,&match);CHKERRQ(ierr); 252bf7f4e0aSPeter Brune if (match) PetscFunctionReturn(0); 253bf7f4e0aSPeter Brune 254bf7f4e0aSPeter Brune ierr = PetscFListFind(LineSearchList,((PetscObject)linesearch)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 255bf7f4e0aSPeter Brune if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested Line Search type %s",type); 256bf7f4e0aSPeter Brune /* Destroy the previous private linesearch context */ 257bf7f4e0aSPeter Brune if (linesearch->ops->destroy) { 258bf7f4e0aSPeter Brune ierr = (*(linesearch)->ops->destroy)(linesearch);CHKERRQ(ierr); 259bf7f4e0aSPeter Brune linesearch->ops->destroy = PETSC_NULL; 260bf7f4e0aSPeter Brune } 261bf7f4e0aSPeter Brune /* Reinitialize function pointers in LineSearchOps structure */ 262bf7f4e0aSPeter Brune linesearch->ops->apply = 0; 263bf7f4e0aSPeter Brune linesearch->ops->view = 0; 264bf7f4e0aSPeter Brune linesearch->ops->setfromoptions = 0; 265bf7f4e0aSPeter Brune linesearch->ops->destroy = 0; 266bf7f4e0aSPeter Brune 267bf7f4e0aSPeter Brune ierr = PetscObjectChangeTypeName((PetscObject)linesearch,type);CHKERRQ(ierr); 268bf7f4e0aSPeter Brune ierr = (*r)(linesearch);CHKERRQ(ierr); 269bf7f4e0aSPeter Brune #if defined(PETSC_HAVE_AMS) 270bf7f4e0aSPeter Brune if (PetscAMSPublishAll) { 271bf7f4e0aSPeter Brune ierr = PetscObjectAMSPublish((PetscObject)linesearch);CHKERRQ(ierr); 272bf7f4e0aSPeter Brune } 273bf7f4e0aSPeter Brune #endif 274bf7f4e0aSPeter Brune PetscFunctionReturn(0); 275bf7f4e0aSPeter Brune } 276bf7f4e0aSPeter Brune 277bf7f4e0aSPeter Brune #undef __FUNCT__ 278bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchSetSNES" 279bf7f4e0aSPeter Brune PetscErrorCode LineSearchSetSNES(LineSearch linesearch, SNES snes){ 280bf7f4e0aSPeter Brune PetscFunctionBegin; 281bf7f4e0aSPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 282bf7f4e0aSPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,2); 283bf7f4e0aSPeter Brune linesearch->snes = snes; 284bf7f4e0aSPeter Brune PetscFunctionReturn(0); 285bf7f4e0aSPeter Brune } 286bf7f4e0aSPeter Brune 287bf7f4e0aSPeter Brune #undef __FUNCT__ 288bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSNES" 289bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSNES(LineSearch linesearch, SNES *snes){ 290bf7f4e0aSPeter Brune PetscFunctionBegin; 291bf7f4e0aSPeter Brune *snes = linesearch->snes; 292bf7f4e0aSPeter Brune PetscFunctionReturn(0); 293bf7f4e0aSPeter Brune } 294bf7f4e0aSPeter Brune 295bf7f4e0aSPeter Brune 296bf7f4e0aSPeter Brune #undef __FUNCT__ 297bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetNorms" 298bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetNorms(LineSearch linesearch, PetscReal * xnorm, PetscReal * fnorm, PetscReal * ynorm) 299bf7f4e0aSPeter Brune { 300bf7f4e0aSPeter Brune PetscFunctionBegin; 301bf7f4e0aSPeter Brune if (xnorm) { 302bf7f4e0aSPeter Brune *xnorm = linesearch->xnorm; 303bf7f4e0aSPeter Brune } 304bf7f4e0aSPeter Brune if (fnorm) { 305bf7f4e0aSPeter Brune *fnorm = linesearch->fnorm; 306bf7f4e0aSPeter Brune } 307bf7f4e0aSPeter Brune if (ynorm) { 308bf7f4e0aSPeter Brune *ynorm = linesearch->ynorm; 309bf7f4e0aSPeter Brune } 310bf7f4e0aSPeter Brune PetscFunctionReturn(0); 311bf7f4e0aSPeter Brune } 312bf7f4e0aSPeter Brune 313*e7058c64SPeter Brune #undef __FUNCT__ 314*e7058c64SPeter Brune #define __FUNCT__ "LineSearchAppendOptionsPrefix" 315*e7058c64SPeter Brune /*@C 316*e7058c64SPeter Brune LineSearchAppendOptionsPrefix - Appends to the prefix used for searching for all 317*e7058c64SPeter Brune SNES options in the database. 318*e7058c64SPeter Brune 319*e7058c64SPeter Brune Logically Collective on SNES 320*e7058c64SPeter Brune 321*e7058c64SPeter Brune Input Parameters: 322*e7058c64SPeter Brune + snes - the SNES context 323*e7058c64SPeter Brune - prefix - the prefix to prepend to all option names 324*e7058c64SPeter Brune 325*e7058c64SPeter Brune Notes: 326*e7058c64SPeter Brune A hyphen (-) must NOT be given at the beginning of the prefix name. 327*e7058c64SPeter Brune The first character of all runtime options is AUTOMATICALLY the hyphen. 328*e7058c64SPeter Brune 329*e7058c64SPeter Brune Level: advanced 330*e7058c64SPeter Brune 331*e7058c64SPeter Brune .keywords: SNES, append, options, prefix, database 332*e7058c64SPeter Brune 333*e7058c64SPeter Brune .seealso: SNESGetOptionsPrefix() 334*e7058c64SPeter Brune @*/ 335*e7058c64SPeter Brune PetscErrorCode LineSearchAppendOptionsPrefix(LineSearch linesearch,const char prefix[]) 336*e7058c64SPeter Brune { 337*e7058c64SPeter Brune PetscErrorCode ierr; 338*e7058c64SPeter Brune 339*e7058c64SPeter Brune PetscFunctionBegin; 340*e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 341*e7058c64SPeter Brune ierr = PetscObjectAppendOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 342*e7058c64SPeter Brune PetscFunctionReturn(0); 343*e7058c64SPeter Brune } 344*e7058c64SPeter Brune 345*e7058c64SPeter Brune #undef __FUNCT__ 346*e7058c64SPeter Brune #define __FUNCT__ "LineSearchGetOptionsPrefix" 347*e7058c64SPeter Brune /*@C 348*e7058c64SPeter Brune LineSearchGetOptionsPrefix - Sets the prefix used for searching for all 349*e7058c64SPeter Brune SNES options in the database. 350*e7058c64SPeter Brune 351*e7058c64SPeter Brune Not Collective 352*e7058c64SPeter Brune 353*e7058c64SPeter Brune Input Parameter: 354*e7058c64SPeter Brune . snes - the SNES context 355*e7058c64SPeter Brune 356*e7058c64SPeter Brune Output Parameter: 357*e7058c64SPeter Brune . prefix - pointer to the prefix string used 358*e7058c64SPeter Brune 359*e7058c64SPeter Brune Notes: On the fortran side, the user should pass in a string 'prefix' of 360*e7058c64SPeter Brune sufficient length to hold the prefix. 361*e7058c64SPeter Brune 362*e7058c64SPeter Brune Level: advanced 363*e7058c64SPeter Brune 364*e7058c64SPeter Brune .keywords: SNES, get, options, prefix, database 365*e7058c64SPeter Brune 366*e7058c64SPeter Brune .seealso: SNESAppendOptionsPrefix() 367*e7058c64SPeter Brune @*/ 368*e7058c64SPeter Brune PetscErrorCode LineSearchGetOptionsPrefix(LineSearch linesearch,const char *prefix[]) 369*e7058c64SPeter Brune { 370*e7058c64SPeter Brune PetscErrorCode ierr; 371*e7058c64SPeter Brune 372*e7058c64SPeter Brune PetscFunctionBegin; 373*e7058c64SPeter Brune PetscValidHeaderSpecific(linesearch,LineSearch_CLASSID,1); 374*e7058c64SPeter Brune ierr = PetscObjectGetOptionsPrefix((PetscObject)linesearch,prefix);CHKERRQ(ierr); 375*e7058c64SPeter Brune PetscFunctionReturn(0); 376*e7058c64SPeter Brune } 377bf7f4e0aSPeter Brune 378bf7f4e0aSPeter Brune #undef __FUNCT__ 379bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetWork" 380bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetWork(LineSearch linesearch, PetscInt nwork) 381bf7f4e0aSPeter Brune { 382bf7f4e0aSPeter Brune PetscErrorCode ierr; 383bf7f4e0aSPeter Brune PetscFunctionBegin; 384bf7f4e0aSPeter Brune if (linesearch->vec_sol) { 385bf7f4e0aSPeter Brune ierr = VecDuplicateVecs(linesearch->vec_sol, nwork, &linesearch->work);CHKERRQ(ierr); 386bf7f4e0aSPeter Brune } else { 387bf7f4e0aSPeter Brune SETERRQ(((PetscObject)linesearch)->comm, PETSC_ERR_USER, "Cannot get linesearch work-vectors without setting a solution vec!"); 388bf7f4e0aSPeter Brune } 389bf7f4e0aSPeter Brune PetscFunctionReturn(0); 390bf7f4e0aSPeter Brune } 391bf7f4e0aSPeter Brune 392bf7f4e0aSPeter Brune #undef __FUNCT__ 393bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchGetSuccess" 394bf7f4e0aSPeter Brune PetscErrorCode LineSearchGetSuccess(LineSearch linesearch, PetscBool *success) 395bf7f4e0aSPeter Brune { 396bf7f4e0aSPeter Brune PetscFunctionBegin; 397bf7f4e0aSPeter Brune if (success) { 398bf7f4e0aSPeter Brune *success = linesearch->success; 399bf7f4e0aSPeter Brune } 400bf7f4e0aSPeter Brune PetscFunctionReturn(0); 401bf7f4e0aSPeter Brune } 402bf7f4e0aSPeter Brune 403bf7f4e0aSPeter Brune #undef __FUNCT__ 404bf7f4e0aSPeter Brune #define __FUNCT__ "LineSearchRegister" 405bf7f4e0aSPeter Brune /*@C 406bf7f4e0aSPeter Brune LineSearchRegister - See LineSearchRegisterDynamic() 407bf7f4e0aSPeter Brune 408bf7f4e0aSPeter Brune Level: advanced 409bf7f4e0aSPeter Brune @*/ 410bf7f4e0aSPeter Brune PetscErrorCode LineSearchRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(LineSearch)) 411bf7f4e0aSPeter Brune { 412bf7f4e0aSPeter Brune char fullname[PETSC_MAX_PATH_LEN]; 413bf7f4e0aSPeter Brune PetscErrorCode ierr; 414bf7f4e0aSPeter Brune 415bf7f4e0aSPeter Brune PetscFunctionBegin; 416bf7f4e0aSPeter Brune ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 417bf7f4e0aSPeter Brune ierr = PetscFListAdd(&LineSearchList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 418bf7f4e0aSPeter Brune PetscFunctionReturn(0); 419bf7f4e0aSPeter Brune } 420