xref: /petsc/src/snes/linesearch/interface/linesearch.c (revision e7058c64bd2072109d5be3914c0b8ecac89ed00d)
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