xref: /petsc/src/tao/interface/taosolver.c (revision a7e14dcfba0d07adf6226a919460249440ec94c7)
1*a7e14dcfSSatish Balay #define TAOSOLVER_DLL
2*a7e14dcfSSatish Balay 
3*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/
4*a7e14dcfSSatish Balay 
5*a7e14dcfSSatish Balay PetscBool TaoSolverRegisterAllCalled = PETSC_FALSE;
6*a7e14dcfSSatish Balay PetscFunctionList TaoSolverList = PETSC_NULL;
7*a7e14dcfSSatish Balay 
8*a7e14dcfSSatish Balay PetscClassId TAOSOLVER_CLASSID;
9*a7e14dcfSSatish Balay PetscLogEvent TaoSolver_Solve, TaoSolver_ObjectiveEval, TaoSolver_GradientEval, TaoSolver_ObjGradientEval, TaoSolver_HessianEval, TaoSolver_ConstraintsEval, TaoSolver_JacobianEval;
10*a7e14dcfSSatish Balay 
11*a7e14dcfSSatish Balay 
12*a7e14dcfSSatish Balay 
13*a7e14dcfSSatish Balay static const char *TAO_SUBSET[64] = {
14*a7e14dcfSSatish Balay   "subvec","mask","matrixfree"
15*a7e14dcfSSatish Balay };
16*a7e14dcfSSatish Balay 
17*a7e14dcfSSatish Balay #undef __FUNCT__
18*a7e14dcfSSatish Balay #define __FUNCT__ "TaoCreate"
19*a7e14dcfSSatish Balay /*@
20*a7e14dcfSSatish Balay   TaoCreate - Creates a TAO solver
21*a7e14dcfSSatish Balay 
22*a7e14dcfSSatish Balay   Collective on MPI_Comm
23*a7e14dcfSSatish Balay 
24*a7e14dcfSSatish Balay   Input Parameter:
25*a7e14dcfSSatish Balay . comm - MPI communicator
26*a7e14dcfSSatish Balay 
27*a7e14dcfSSatish Balay   Output Parameter:
28*a7e14dcfSSatish Balay . newtao - the new TaoSolver context
29*a7e14dcfSSatish Balay 
30*a7e14dcfSSatish Balay   Available methods include:
31*a7e14dcfSSatish Balay +    tao_nls - Newton's method with line search for unconstrained minimization
32*a7e14dcfSSatish Balay .    tao_ntr - Newton's method with trust region for unconstrained minimization
33*a7e14dcfSSatish Balay .    tao_ntl - Newton's method with trust region, line search for unconstrained minimization
34*a7e14dcfSSatish Balay .    tao_lmvm - Limited memory variable metric method for unconstrained minimization
35*a7e14dcfSSatish Balay .    tao_cg - Nonlinear conjugate gradient method for unconstrained minimization
36*a7e14dcfSSatish Balay .    tao_nm - Nelder-Mead algorithm for derivate-free unconstrained minimization
37*a7e14dcfSSatish Balay ation
38*a7e14dcfSSatish Balay .    tao_tron - Newton Trust Region method for bound constrained minimization
39*a7e14dcfSSatish Balay .    tao_gpcg - Newton Trust Region method for quadratic bound constrained minimization
40*a7e14dcfSSatish Balay .    tao_blmvm - Limited memory variable metric method for bound constrained minimization
41*a7e14dcfSSatish Balay .    tao_lcl - Linearly constrained Lagrangian method for pde-constrained minimization
42*a7e14dcfSSatish Balay -    tao_pounders - Model-based algorithm for nonlinear least squares
43*a7e14dcfSSatish Balay 
44*a7e14dcfSSatish Balay    Options Database Keys:
45*a7e14dcfSSatish Balay +   -tao_method - select which method TAO should use
46*a7e14dcfSSatish Balay -   -tao_type - identical to -tao_method
47*a7e14dcfSSatish Balay 
48*a7e14dcfSSatish Balay    Level: beginner
49*a7e14dcfSSatish Balay 
50*a7e14dcfSSatish Balay .seealso: TaoSolve(), TaoDestroy()
51*a7e14dcfSSatish Balay @*/
52*a7e14dcfSSatish Balay PetscErrorCode TaoCreate(MPI_Comm comm, TaoSolver *newtao)
53*a7e14dcfSSatish Balay {
54*a7e14dcfSSatish Balay     PetscErrorCode ierr;
55*a7e14dcfSSatish Balay     TaoSolver tao;
56*a7e14dcfSSatish Balay 
57*a7e14dcfSSatish Balay     PetscFunctionBegin;
58*a7e14dcfSSatish Balay     PetscValidPointer(newtao,2);
59*a7e14dcfSSatish Balay     *newtao = PETSC_NULL;
60*a7e14dcfSSatish Balay 
61*a7e14dcfSSatish Balay     ierr = TaoInitializePackage(); CHKERRQ(ierr);
62*a7e14dcfSSatish Balay     ierr = TaoLineSearchInitializePackage(); CHKERRQ(ierr);
63*a7e14dcfSSatish Balay 
64*a7e14dcfSSatish Balay     ierr = PetscHeaderCreate(tao,_p_TaoSolver, struct _TaoSolverOps, TAOSOLVER_CLASSID,"TaoSolver",0,0,comm,TaoDestroy,TaoView); CHKERRQ(ierr);
65*a7e14dcfSSatish Balay 
66*a7e14dcfSSatish Balay     tao->ops->computeobjective=0;
67*a7e14dcfSSatish Balay     tao->ops->computeobjectiveandgradient=0;
68*a7e14dcfSSatish Balay     tao->ops->computegradient=0;
69*a7e14dcfSSatish Balay     tao->ops->computehessian=0;
70*a7e14dcfSSatish Balay     tao->ops->computeseparableobjective=0;
71*a7e14dcfSSatish Balay     tao->ops->computeconstraints=0;
72*a7e14dcfSSatish Balay     tao->ops->computejacobian=0;
73*a7e14dcfSSatish Balay     tao->ops->computejacobianequality=0;
74*a7e14dcfSSatish Balay     tao->ops->computejacobianinequality=0;
75*a7e14dcfSSatish Balay     tao->ops->computeequalityconstraints=0;
76*a7e14dcfSSatish Balay     tao->ops->computeinequalityconstraints=0;
77*a7e14dcfSSatish Balay     tao->ops->convergencetest=TaoDefaultConvergenceTest;
78*a7e14dcfSSatish Balay     tao->ops->convergencedestroy=0;
79*a7e14dcfSSatish Balay     tao->ops->computedual=0;
80*a7e14dcfSSatish Balay     tao->ops->setup=0;
81*a7e14dcfSSatish Balay     tao->ops->solve=0;
82*a7e14dcfSSatish Balay     tao->ops->view=0;
83*a7e14dcfSSatish Balay     tao->ops->setfromoptions=0;
84*a7e14dcfSSatish Balay     tao->ops->destroy=0;
85*a7e14dcfSSatish Balay 
86*a7e14dcfSSatish Balay     tao->solution=PETSC_NULL;
87*a7e14dcfSSatish Balay     tao->gradient=PETSC_NULL;
88*a7e14dcfSSatish Balay     tao->sep_objective = PETSC_NULL;
89*a7e14dcfSSatish Balay     tao->constraints=PETSC_NULL;
90*a7e14dcfSSatish Balay     tao->constraints_equality=PETSC_NULL;
91*a7e14dcfSSatish Balay     tao->constraints_inequality=PETSC_NULL;
92*a7e14dcfSSatish Balay     tao->stepdirection=PETSC_NULL;
93*a7e14dcfSSatish Balay     tao->XL = PETSC_NULL;
94*a7e14dcfSSatish Balay     tao->XU = PETSC_NULL;
95*a7e14dcfSSatish Balay     tao->IL = PETSC_NULL;
96*a7e14dcfSSatish Balay     tao->IU = PETSC_NULL;
97*a7e14dcfSSatish Balay     tao->DI = PETSC_NULL;
98*a7e14dcfSSatish Balay     tao->DE = PETSC_NULL;
99*a7e14dcfSSatish Balay     tao->hessian = PETSC_NULL;
100*a7e14dcfSSatish Balay     tao->hessian_pre = PETSC_NULL;
101*a7e14dcfSSatish Balay     tao->jacobian = PETSC_NULL;
102*a7e14dcfSSatish Balay     tao->jacobian_pre = PETSC_NULL;
103*a7e14dcfSSatish Balay     tao->jacobian_state = PETSC_NULL;
104*a7e14dcfSSatish Balay     tao->jacobian_state_pre = PETSC_NULL;
105*a7e14dcfSSatish Balay     tao->jacobian_state_inv = PETSC_NULL;
106*a7e14dcfSSatish Balay     tao->jacobian_design = PETSC_NULL;
107*a7e14dcfSSatish Balay     tao->jacobian_design_pre = PETSC_NULL;
108*a7e14dcfSSatish Balay     tao->jacobian_equality = PETSC_NULL;
109*a7e14dcfSSatish Balay     tao->jacobian_equality_pre = PETSC_NULL;
110*a7e14dcfSSatish Balay     tao->jacobian_inequality = PETSC_NULL;
111*a7e14dcfSSatish Balay     tao->jacobian_inequality_pre = PETSC_NULL;
112*a7e14dcfSSatish Balay     tao->state_is = PETSC_NULL;
113*a7e14dcfSSatish Balay     tao->design_is = PETSC_NULL;
114*a7e14dcfSSatish Balay 
115*a7e14dcfSSatish Balay     tao->max_it     = 10000;
116*a7e14dcfSSatish Balay     tao->max_funcs   = 10000;
117*a7e14dcfSSatish Balay     tao->fatol       = 1e-8;
118*a7e14dcfSSatish Balay     tao->frtol       = 1e-8;
119*a7e14dcfSSatish Balay     tao->gatol       = 1e-8;
120*a7e14dcfSSatish Balay     tao->grtol       = 1e-8;
121*a7e14dcfSSatish Balay     tao->gttol       = 0.0;
122*a7e14dcfSSatish Balay     tao->catol       = 0.0;
123*a7e14dcfSSatish Balay     tao->crtol       = 0.0;
124*a7e14dcfSSatish Balay     tao->xtol        = 0.0;
125*a7e14dcfSSatish Balay     tao->steptol       = 0.0;
126*a7e14dcfSSatish Balay     tao->trust0      = TAO_INFINITY;
127*a7e14dcfSSatish Balay     tao->fmin        = -1e100;
128*a7e14dcfSSatish Balay     tao->hist_reset = PETSC_TRUE;
129*a7e14dcfSSatish Balay     tao->hist_max = 0;
130*a7e14dcfSSatish Balay     tao->hist_len = 0;
131*a7e14dcfSSatish Balay     tao->hist_obj = PETSC_NULL;
132*a7e14dcfSSatish Balay     tao->hist_resid = PETSC_NULL;
133*a7e14dcfSSatish Balay     tao->hist_cnorm = PETSC_NULL;
134*a7e14dcfSSatish Balay 
135*a7e14dcfSSatish Balay     tao->numbermonitors=0;
136*a7e14dcfSSatish Balay     tao->viewsolution=PETSC_FALSE;
137*a7e14dcfSSatish Balay     tao->viewhessian=PETSC_FALSE;
138*a7e14dcfSSatish Balay     tao->viewgradient=PETSC_FALSE;
139*a7e14dcfSSatish Balay     tao->viewjacobian=PETSC_FALSE;
140*a7e14dcfSSatish Balay     tao->viewconstraints = PETSC_FALSE;
141*a7e14dcfSSatish Balay     tao->viewtao = PETSC_FALSE;
142*a7e14dcfSSatish Balay 
143*a7e14dcfSSatish Balay     ierr = TaoResetStatistics(tao); CHKERRQ(ierr);
144*a7e14dcfSSatish Balay 
145*a7e14dcfSSatish Balay 
146*a7e14dcfSSatish Balay     *newtao = tao;
147*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
148*a7e14dcfSSatish Balay }
149*a7e14dcfSSatish Balay 
150*a7e14dcfSSatish Balay 
151*a7e14dcfSSatish Balay #undef __FUNCT__
152*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolve"
153*a7e14dcfSSatish Balay /*@
154*a7e14dcfSSatish Balay   TaoSolve - Solves an optimization problem min F(x) s.t. l <= x <= u
155*a7e14dcfSSatish Balay 
156*a7e14dcfSSatish Balay   Collective on TaoSolver
157*a7e14dcfSSatish Balay 
158*a7e14dcfSSatish Balay   Input Parameters:
159*a7e14dcfSSatish Balay . tao - the TaoSolver context
160*a7e14dcfSSatish Balay 
161*a7e14dcfSSatish Balay   Notes:
162*a7e14dcfSSatish Balay   The user must set up the TaoSolver with calls to TaoSetInitialVector(),
163*a7e14dcfSSatish Balay   TaoSetObjectiveRoutine(),
164*a7e14dcfSSatish Balay   TaoSetGradientRoutine(), and (if using 2nd order method) TaoSetHessianRoutine().
165*a7e14dcfSSatish Balay 
166*a7e14dcfSSatish Balay   Level: beginner
167*a7e14dcfSSatish Balay 
168*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSetObjectiveRoutine(), TaoSetGradientRoutine(), TaoSetHessianRoutine()
169*a7e14dcfSSatish Balay  @*/
170*a7e14dcfSSatish Balay PetscErrorCode TaoSolve(TaoSolver tao)
171*a7e14dcfSSatish Balay {
172*a7e14dcfSSatish Balay   PetscErrorCode ierr;
173*a7e14dcfSSatish Balay   char           filename[PETSC_MAX_PATH_LEN];
174*a7e14dcfSSatish Balay   PetscBool      flg;
175*a7e14dcfSSatish Balay   PetscViewer    viewer;
176*a7e14dcfSSatish Balay   PetscFunctionBegin;
177*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
178*a7e14dcfSSatish Balay 
179*a7e14dcfSSatish Balay   ierr = TaoSetUp(tao);CHKERRQ(ierr);
180*a7e14dcfSSatish Balay   ierr = TaoResetStatistics(tao); CHKERRQ(ierr);
181*a7e14dcfSSatish Balay   if (tao->linesearch) {
182*a7e14dcfSSatish Balay     ierr = TaoLineSearchReset(tao->linesearch); CHKERRQ(ierr);
183*a7e14dcfSSatish Balay   }
184*a7e14dcfSSatish Balay 
185*a7e14dcfSSatish Balay   ierr = PetscLogEventBegin(TaoSolver_Solve,tao,0,0,0); CHKERRQ(ierr);
186*a7e14dcfSSatish Balay   if (tao->ops->solve){ ierr = (*tao->ops->solve)(tao);CHKERRQ(ierr); }
187*a7e14dcfSSatish Balay   ierr = PetscLogEventEnd(TaoSolver_Solve,tao,0,0,0); CHKERRQ(ierr);
188*a7e14dcfSSatish Balay 
189*a7e14dcfSSatish Balay 
190*a7e14dcfSSatish Balay 
191*a7e14dcfSSatish Balay   ierr = PetscOptionsGetString(((PetscObject)tao)->prefix,"-tao_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
192*a7e14dcfSSatish Balay   if (flg && !PetscPreLoadingOn) {
193*a7e14dcfSSatish Balay     ierr = PetscViewerASCIIOpen(((PetscObject)tao)->comm,filename,&viewer);CHKERRQ(ierr);
194*a7e14dcfSSatish Balay     ierr = TaoView(tao,viewer);CHKERRQ(ierr);
195*a7e14dcfSSatish Balay     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
196*a7e14dcfSSatish Balay   }
197*a7e14dcfSSatish Balay 
198*a7e14dcfSSatish Balay 
199*a7e14dcfSSatish Balay   if (tao->printreason) {
200*a7e14dcfSSatish Balay       if (tao->reason > 0) {
201*a7e14dcfSSatish Balay 	  ierr = PetscPrintf(((PetscObject)tao)->comm,"TAO solve converged due to %s\n",TaoSolverTerminationReasons[tao->reason]); CHKERRQ(ierr);
202*a7e14dcfSSatish Balay       } else {
203*a7e14dcfSSatish Balay 	  ierr = PetscPrintf(((PetscObject)tao)->comm,"TAO solve did not converge due to %s\n",TaoSolverTerminationReasons[tao->reason]); CHKERRQ(ierr);
204*a7e14dcfSSatish Balay       }
205*a7e14dcfSSatish Balay   }
206*a7e14dcfSSatish Balay 
207*a7e14dcfSSatish Balay 
208*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
209*a7e14dcfSSatish Balay 
210*a7e14dcfSSatish Balay 
211*a7e14dcfSSatish Balay }
212*a7e14dcfSSatish Balay 
213*a7e14dcfSSatish Balay 
214*a7e14dcfSSatish Balay #undef __FUNCT__
215*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetUp"
216*a7e14dcfSSatish Balay /*@
217*a7e14dcfSSatish Balay   TaoSetUp - Sets up the internal data structures for the later use
218*a7e14dcfSSatish Balay   of a Tao solver
219*a7e14dcfSSatish Balay 
220*a7e14dcfSSatish Balay   Collective on tao
221*a7e14dcfSSatish Balay 
222*a7e14dcfSSatish Balay   Input Parameters:
223*a7e14dcfSSatish Balay . tao - the TAO context
224*a7e14dcfSSatish Balay 
225*a7e14dcfSSatish Balay   Notes:
226*a7e14dcfSSatish Balay   The user will not need to explicitly call TaoSetUp(), as it will
227*a7e14dcfSSatish Balay   automatically be called in TaoSolve().  However, if the user
228*a7e14dcfSSatish Balay   desires to call it explicitly, it should come after TaoCreate()
229*a7e14dcfSSatish Balay   and any TaoSetSomething() routines, but before TaoSolve().
230*a7e14dcfSSatish Balay 
231*a7e14dcfSSatish Balay   Level: advanced
232*a7e14dcfSSatish Balay 
233*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve()
234*a7e14dcfSSatish Balay @*/
235*a7e14dcfSSatish Balay PetscErrorCode TaoSetUp(TaoSolver tao)
236*a7e14dcfSSatish Balay {
237*a7e14dcfSSatish Balay   PetscErrorCode ierr;
238*a7e14dcfSSatish Balay   PetscFunctionBegin;
239*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao, TAOSOLVER_CLASSID,1);
240*a7e14dcfSSatish Balay   if (tao->setupcalled) PetscFunctionReturn(0);
241*a7e14dcfSSatish Balay 
242*a7e14dcfSSatish Balay   if (!tao->solution) {
243*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetInitialVector");
244*a7e14dcfSSatish Balay   }
245*a7e14dcfSSatish Balay   if (tao->ops->setup) {
246*a7e14dcfSSatish Balay     ierr = (*tao->ops->setup)(tao); CHKERRQ(ierr);
247*a7e14dcfSSatish Balay   }
248*a7e14dcfSSatish Balay 
249*a7e14dcfSSatish Balay   tao->setupcalled = PETSC_TRUE;
250*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
251*a7e14dcfSSatish Balay }
252*a7e14dcfSSatish Balay 
253*a7e14dcfSSatish Balay #undef __FUNCT__
254*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDestroy"
255*a7e14dcfSSatish Balay /*@
256*a7e14dcfSSatish Balay   TaoDestroy - Destroys the TAO context that was created with
257*a7e14dcfSSatish Balay   TaoCreate()
258*a7e14dcfSSatish Balay 
259*a7e14dcfSSatish Balay   Collective on TaoSolver
260*a7e14dcfSSatish Balay 
261*a7e14dcfSSatish Balay   Input Parameter:
262*a7e14dcfSSatish Balay . tao - the TaoSolver context
263*a7e14dcfSSatish Balay 
264*a7e14dcfSSatish Balay   Level: beginner
265*a7e14dcfSSatish Balay 
266*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve()
267*a7e14dcfSSatish Balay @*/
268*a7e14dcfSSatish Balay PetscErrorCode TaoDestroy(TaoSolver *tao)
269*a7e14dcfSSatish Balay {
270*a7e14dcfSSatish Balay   PetscErrorCode ierr;
271*a7e14dcfSSatish Balay   PetscFunctionBegin;
272*a7e14dcfSSatish Balay   if (!*tao) PetscFunctionReturn(0);
273*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(*tao,TAOSOLVER_CLASSID,1);
274*a7e14dcfSSatish Balay 
275*a7e14dcfSSatish Balay   if (--((PetscObject)*tao)->refct > 0) {*tao=0;PetscFunctionReturn(0);}
276*a7e14dcfSSatish Balay 
277*a7e14dcfSSatish Balay 
278*a7e14dcfSSatish Balay   if ((*tao)->ops->destroy) {
279*a7e14dcfSSatish Balay     ierr = (*((*tao))->ops->destroy)(*tao); CHKERRQ(ierr);
280*a7e14dcfSSatish Balay   }
281*a7e14dcfSSatish Balay   ierr = KSPDestroy(&(*tao)->ksp); CHKERRQ(ierr);
282*a7e14dcfSSatish Balay   ierr = TaoLineSearchDestroy(&(*tao)->linesearch); CHKERRQ(ierr);
283*a7e14dcfSSatish Balay 
284*a7e14dcfSSatish Balay   if ((*tao)->ops->convergencedestroy) {
285*a7e14dcfSSatish Balay     ierr = (*(*tao)->ops->convergencedestroy)((*tao)->cnvP); CHKERRQ(ierr);
286*a7e14dcfSSatish Balay     if ((*tao)->jacobian_state_inv) {
287*a7e14dcfSSatish Balay       ierr = MatDestroy(&(*tao)->jacobian_state_inv); CHKERRQ(ierr);
288*a7e14dcfSSatish Balay       (*tao)->jacobian_state_inv = PETSC_NULL;
289*a7e14dcfSSatish Balay     }
290*a7e14dcfSSatish Balay   }
291*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->solution); CHKERRQ(ierr);
292*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->gradient); CHKERRQ(ierr);
293*a7e14dcfSSatish Balay 
294*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->XL); CHKERRQ(ierr);
295*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->XU); CHKERRQ(ierr);
296*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->IL); CHKERRQ(ierr);
297*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->IU); CHKERRQ(ierr);
298*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->DE); CHKERRQ(ierr);
299*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->DI); CHKERRQ(ierr);
300*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->constraints_equality); CHKERRQ(ierr);
301*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->constraints_inequality); CHKERRQ(ierr);
302*a7e14dcfSSatish Balay   ierr = VecDestroy(&(*tao)->stepdirection); CHKERRQ(ierr);
303*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->hessian_pre); CHKERRQ(ierr);
304*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->hessian); CHKERRQ(ierr);
305*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_pre); CHKERRQ(ierr);
306*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian); CHKERRQ(ierr);
307*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_state_pre); CHKERRQ(ierr);
308*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_state); CHKERRQ(ierr);
309*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_state_inv); CHKERRQ(ierr);
310*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_design_pre); CHKERRQ(ierr);
311*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_equality); CHKERRQ(ierr);
312*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_equality_pre); CHKERRQ(ierr);
313*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_inequality); CHKERRQ(ierr);
314*a7e14dcfSSatish Balay   ierr = MatDestroy(&(*tao)->jacobian_inequality_pre); CHKERRQ(ierr);
315*a7e14dcfSSatish Balay   ierr = ISDestroy(&(*tao)->state_is); CHKERRQ(ierr);
316*a7e14dcfSSatish Balay   ierr = ISDestroy(&(*tao)->design_is); CHKERRQ(ierr);
317*a7e14dcfSSatish Balay   ierr = TaoCancelMonitors(*tao); CHKERRQ(ierr);
318*a7e14dcfSSatish Balay   ierr = PetscHeaderDestroy(tao); CHKERRQ(ierr);
319*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
320*a7e14dcfSSatish Balay }
321*a7e14dcfSSatish Balay 
322*a7e14dcfSSatish Balay #undef __FUNCT__
323*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFromOptions"
324*a7e14dcfSSatish Balay /*@
325*a7e14dcfSSatish Balay   TaoSetFromOptions - Sets various TaoSolver parameters from user
326*a7e14dcfSSatish Balay   options.
327*a7e14dcfSSatish Balay 
328*a7e14dcfSSatish Balay   Collective on TaoSolver
329*a7e14dcfSSatish Balay 
330*a7e14dcfSSatish Balay   Input Paremeter:
331*a7e14dcfSSatish Balay . tao - the TaoSolver solver context
332*a7e14dcfSSatish Balay 
333*a7e14dcfSSatish Balay   options Database Keys:
334*a7e14dcfSSatish Balay + -tao_method <type> - The algorithm that TAO uses (tao_lmvm, tao_nls, etc.)
335*a7e14dcfSSatish Balay . -tao_fatol <fatol> - absolute error tolerance in function value
336*a7e14dcfSSatish Balay . -tao_frtol <frtol> - relative error tolerance in function value
337*a7e14dcfSSatish Balay . -tao_gatol <gatol> - absolute error tolerance for ||gradient||
338*a7e14dcfSSatish Balay . -tao_grtol <grtol> - relative error tolerance for ||gradient||
339*a7e14dcfSSatish Balay . -tao_gttol <gttol> - reduction of ||gradient|| relative to initial gradient
340*a7e14dcfSSatish Balay . -tao_max_it <max> - sets maximum number of iterations
341*a7e14dcfSSatish Balay . -tao_max_funcs <max> - sets maximum number of function evaluations
342*a7e14dcfSSatish Balay . -tao_fmin <fmin> - stop if function value reaches fmin
343*a7e14dcfSSatish Balay . -tao_steptol <tol> - stop if trust region radius less than <tol>
344*a7e14dcfSSatish Balay . -tao_trust0 <t> - initial trust region radius
345*a7e14dcfSSatish Balay . -tao_monitor - prints function value and residual at each iteration
346*a7e14dcfSSatish Balay . -tao_smonitor - same as tao_monitor, but truncates very small values
347*a7e14dcfSSatish Balay . -tao_cmonitor - prints function value, residual, and constraint norm at each iteration
348*a7e14dcfSSatish Balay . -tao_view_solution - prints solution vector at each iteration
349*a7e14dcfSSatish Balay . -tao_view_separableobjective - prints separable objective vector at each iteration
350*a7e14dcfSSatish Balay . -tao_view_step - prints step direction vector at each iteration
351*a7e14dcfSSatish Balay . -tao_view_gradient - prints gradient vector at each iteration
352*a7e14dcfSSatish Balay . -tao_draw_solution - graphically view solution vector at each iteration
353*a7e14dcfSSatish Balay . -tao_draw_step - graphically view step vector at each iteration
354*a7e14dcfSSatish Balay . -tao_draw_gradient - graphically view gradient at each iteration
355*a7e14dcfSSatish Balay . -tao_fd_gradient - use gradient computed with finite differences
356*a7e14dcfSSatish Balay . -tao_cancelmonitors - cancels all monitors (except those set with command line)
357*a7e14dcfSSatish Balay . -tao_view - prints information about the TaoSolver after solving
358*a7e14dcfSSatish Balay - -tao_converged_reason - prints the reason TAO stopped iterating
359*a7e14dcfSSatish Balay 
360*a7e14dcfSSatish Balay   Notes:
361*a7e14dcfSSatish Balay   To see all options, run your program with the -help option or consult the
362*a7e14dcfSSatish Balay   user's manual. Should be called after TaoCreate() but before TaoSolve()
363*a7e14dcfSSatish Balay 
364*a7e14dcfSSatish Balay   Level: beginner
365*a7e14dcfSSatish Balay @*/
366*a7e14dcfSSatish Balay PetscErrorCode TaoSetFromOptions(TaoSolver tao)
367*a7e14dcfSSatish Balay {
368*a7e14dcfSSatish Balay     PetscErrorCode ierr;
369*a7e14dcfSSatish Balay     const TaoSolverType default_type = "tao_lmvm";
370*a7e14dcfSSatish Balay     const char *prefix;
371*a7e14dcfSSatish Balay     char type[256], monfilename[PETSC_MAX_PATH_LEN];
372*a7e14dcfSSatish Balay     PetscViewer monviewer;
373*a7e14dcfSSatish Balay     PetscBool flg;
374*a7e14dcfSSatish Balay     MPI_Comm comm;
375*a7e14dcfSSatish Balay 
376*a7e14dcfSSatish Balay     PetscFunctionBegin;
377*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
378*a7e14dcfSSatish Balay     ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr);
379*a7e14dcfSSatish Balay     ierr = TaoGetOptionsPrefix(tao,&prefix);
380*a7e14dcfSSatish Balay     /* So no warnings are given about unused options */
381*a7e14dcfSSatish Balay     ierr = PetscOptionsHasName(prefix,"-tao_ksp_type",&flg);
382*a7e14dcfSSatish Balay     ierr = PetscOptionsHasName(prefix,"-tao_pc_type",&flg);
383*a7e14dcfSSatish Balay     ierr = PetscOptionsHasName(prefix,"-tao_ls_type",&flg);
384*a7e14dcfSSatish Balay 
385*a7e14dcfSSatish Balay 
386*a7e14dcfSSatish Balay     ierr = PetscObjectOptionsBegin((PetscObject)tao); CHKERRQ(ierr);
387*a7e14dcfSSatish Balay     {
388*a7e14dcfSSatish Balay 
389*a7e14dcfSSatish Balay 
390*a7e14dcfSSatish Balay 	if (!TaoSolverRegisterAllCalled) {
391*a7e14dcfSSatish Balay 	    ierr = TaoSolverRegisterAll(); CHKERRQ(ierr);
392*a7e14dcfSSatish Balay 	}
393*a7e14dcfSSatish Balay 	if (((PetscObject)tao)->type_name) {
394*a7e14dcfSSatish Balay 	    default_type = ((PetscObject)tao)->type_name;
395*a7e14dcfSSatish Balay 	}
396*a7e14dcfSSatish Balay 	/* Check for type from options */
397*a7e14dcfSSatish Balay 	ierr = PetscOptionsList("-tao_type","Tao Solver type","TaoSetType",TaoSolverList,default_type,type,256,&flg); CHKERRQ(ierr);
398*a7e14dcfSSatish Balay 	if (flg) {
399*a7e14dcfSSatish Balay 	    ierr = TaoSetType(tao,type); CHKERRQ(ierr);
400*a7e14dcfSSatish Balay 	} else {
401*a7e14dcfSSatish Balay 	  ierr = PetscOptionsList("-tao_method","Tao Solver type","TaoSetType",TaoSolverList,default_type,type,256,&flg); CHKERRQ(ierr);
402*a7e14dcfSSatish Balay 	  if (flg) {
403*a7e14dcfSSatish Balay   	    ierr = TaoSetType(tao,type); CHKERRQ(ierr);
404*a7e14dcfSSatish Balay 	  } else if (!((PetscObject)tao)->type_name) {
405*a7e14dcfSSatish Balay 	    ierr = TaoSetType(tao,default_type);
406*a7e14dcfSSatish Balay 	  }
407*a7e14dcfSSatish Balay 	}
408*a7e14dcfSSatish Balay 
409*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_view","view TaoSolver info after each minimization has completed","TaoView",PETSC_FALSE,&tao->viewtao,&flg);CHKERRQ(ierr);
410*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_fatol","Stop if solution within","TaoSetTolerances",tao->fatol,&tao->fatol,&flg);CHKERRQ(ierr);
411*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_frtol","Stop if relative solution within","TaoSetTolerances",tao->frtol,&tao->frtol,&flg);CHKERRQ(ierr);
412*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_catol","Stop if constraints violations within","TaoSetConstraintTolerances",tao->catol,&tao->catol,&flg);CHKERRQ(ierr);
413*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_crtol","Stop if relative contraint violations within","TaoSetConstraintTolerances",tao->crtol,&tao->crtol,&flg);CHKERRQ(ierr);
414*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_gatol","Stop if norm of gradient less than","TaoSetTolerances",tao->gatol,&tao->gatol,&flg);CHKERRQ(ierr);
415*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_grtol","Stop if norm of gradient divided by the function value is less than","TaoSetTolerances",tao->grtol,&tao->grtol,&flg);CHKERRQ(ierr);
416*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_gttol","Stop if the norm of the gradient is less than the norm of the initial gradient times tol","TaoSetTolerances",tao->gttol,&tao->gttol,&flg);CHKERRQ(ierr);
417*a7e14dcfSSatish Balay 	ierr = PetscOptionsInt("-tao_max_it","Stop if iteration number exceeds",
418*a7e14dcfSSatish Balay 			    "TaoSetMaximumIterations",tao->max_it,&tao->max_it,
419*a7e14dcfSSatish Balay 			    &flg);CHKERRQ(ierr);
420*a7e14dcfSSatish Balay 	ierr = PetscOptionsInt("-tao_max_funcs","Stop if number of function evaluations exceeds","TaoSetMaximumFunctionEvaluations",tao->max_funcs,&tao->max_funcs,&flg); CHKERRQ(ierr);
421*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_fmin","Stop if function less than","TaoSetFunctionLowerBound",tao->fmin,&tao->fmin,&flg); CHKERRQ(ierr);
422*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_steptol","Stop if step size or trust region radius less than","",tao->steptol,&tao->steptol,&flg);CHKERRQ(ierr);
423*a7e14dcfSSatish Balay 	ierr = PetscOptionsReal("-tao_trust0","Initial trust region radius","TaoSetTrustRegionRadius",tao->trust0,&tao->trust0,&flg);CHKERRQ(ierr);
424*a7e14dcfSSatish Balay 
425*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_view_solution","view solution vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
426*a7e14dcfSSatish Balay 	if (flg) {
427*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
428*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoSolutionMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr);
429*a7e14dcfSSatish Balay 	}
430*a7e14dcfSSatish Balay 
431*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_converged_reason","Print reason for TAO termination","TaoSolve",flg,&flg,PETSC_NULL); CHKERRQ(ierr);
432*a7e14dcfSSatish Balay 	if (flg) {
433*a7e14dcfSSatish Balay 	  tao->printreason = PETSC_TRUE;
434*a7e14dcfSSatish Balay 	}
435*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_view_gradient","view gradient vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
436*a7e14dcfSSatish Balay 	if (flg) {
437*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
438*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoGradientMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr);
439*a7e14dcfSSatish Balay 	}
440*a7e14dcfSSatish Balay 
441*a7e14dcfSSatish Balay 
442*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_view_stepdirection","view step direction vector after each iteration","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
443*a7e14dcfSSatish Balay 	if (flg) {
444*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
445*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoStepDirectionMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr);
446*a7e14dcfSSatish Balay 	}
447*a7e14dcfSSatish Balay 
448*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_view_separableobjective","view separable objective vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
449*a7e14dcfSSatish Balay 	if (flg) {
450*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
451*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoSeparableObjectiveMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr);
452*a7e14dcfSSatish Balay 	}
453*a7e14dcfSSatish Balay 
454*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_monitor","Use the default convergence monitor","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
455*a7e14dcfSSatish Balay 	if (flg) {
456*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
457*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDefaultMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
458*a7e14dcfSSatish Balay 	}
459*a7e14dcfSSatish Balay 
460*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_smonitor","Use the short convergence monitor","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
461*a7e14dcfSSatish Balay 	if (flg) {
462*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
463*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDefaultSMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
464*a7e14dcfSSatish Balay 	}
465*a7e14dcfSSatish Balay 
466*a7e14dcfSSatish Balay 	ierr = PetscOptionsString("-tao_cmonitor","Use the default convergence monitor with constraint norm","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
467*a7e14dcfSSatish Balay 	if (flg) {
468*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr);
469*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDefaultCMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr);
470*a7e14dcfSSatish Balay 	}
471*a7e14dcfSSatish Balay 
472*a7e14dcfSSatish Balay 
473*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_cancelmonitors","cancel all monitors and call any registered destroy routines","TaoCancelMonitors",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr);
474*a7e14dcfSSatish Balay 	if (flg) {ierr = TaoCancelMonitors(tao);CHKERRQ(ierr);}
475*a7e14dcfSSatish Balay 
476*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_draw_solution","Plot solution vector at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr);
477*a7e14dcfSSatish Balay 	if (flg) {
478*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDrawSolutionMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
479*a7e14dcfSSatish Balay 	}
480*a7e14dcfSSatish Balay 
481*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_draw_step","plots step direction at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr);
482*a7e14dcfSSatish Balay 	if (flg) {
483*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDrawStepMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
484*a7e14dcfSSatish Balay 	}
485*a7e14dcfSSatish Balay 
486*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_draw_gradient","plots gradient at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr);
487*a7e14dcfSSatish Balay 	if (flg) {
488*a7e14dcfSSatish Balay 	  ierr = TaoSetMonitor(tao,TaoDrawGradientMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
489*a7e14dcfSSatish Balay 	}
490*a7e14dcfSSatish Balay 	ierr = PetscOptionsBool("-tao_fd_gradient","compute gradient using finite differences","TaoDefaultComputeGradient",PETSC_FALSE,&flg,PETSC_NULL); CHKERRQ(ierr);
491*a7e14dcfSSatish Balay 	if (flg) {
492*a7e14dcfSSatish Balay 	  ierr = TaoSetGradientRoutine(tao,TaoDefaultComputeGradient,PETSC_NULL); CHKERRQ(ierr);
493*a7e14dcfSSatish Balay 	}
494*a7e14dcfSSatish Balay 	ierr = PetscOptionsEList("-tao_subset_type","subset type", "", TAO_SUBSET, TAO_SUBSET_TYPES,TAO_SUBSET[tao->subset_type], &tao->subset_type, 0); CHKERRQ(ierr);
495*a7e14dcfSSatish Balay 
496*a7e14dcfSSatish Balay 	if (tao->ops->setfromoptions) {
497*a7e14dcfSSatish Balay 	    ierr = (*tao->ops->setfromoptions)(tao); CHKERRQ(ierr);
498*a7e14dcfSSatish Balay 	}
499*a7e14dcfSSatish Balay 
500*a7e14dcfSSatish Balay     }
501*a7e14dcfSSatish Balay     ierr = PetscOptionsEnd(); CHKERRQ(ierr);
502*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
503*a7e14dcfSSatish Balay 
504*a7e14dcfSSatish Balay }
505*a7e14dcfSSatish Balay 
506*a7e14dcfSSatish Balay 
507*a7e14dcfSSatish Balay #undef __FUNCT__
508*a7e14dcfSSatish Balay #define __FUNCT__ "TaoView"
509*a7e14dcfSSatish Balay /*@C
510*a7e14dcfSSatish Balay   TaoView - Prints information about the TaoSolver
511*a7e14dcfSSatish Balay 
512*a7e14dcfSSatish Balay   Collective on TaoSolver
513*a7e14dcfSSatish Balay 
514*a7e14dcfSSatish Balay   InputParameters:
515*a7e14dcfSSatish Balay + tao - the TaoSolver context
516*a7e14dcfSSatish Balay - viewer - visualization context
517*a7e14dcfSSatish Balay 
518*a7e14dcfSSatish Balay   Options Database Key:
519*a7e14dcfSSatish Balay . -tao_view - Calls TaoView() at the end of TaoSolve()
520*a7e14dcfSSatish Balay 
521*a7e14dcfSSatish Balay   Notes:
522*a7e14dcfSSatish Balay   The available visualization contexts include
523*a7e14dcfSSatish Balay +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
524*a7e14dcfSSatish Balay -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
525*a7e14dcfSSatish Balay          output where only the first processor opens
526*a7e14dcfSSatish Balay          the file.  All other processors send their
527*a7e14dcfSSatish Balay          data to the first processor to print.
528*a7e14dcfSSatish Balay 
529*a7e14dcfSSatish Balay   Level: beginner
530*a7e14dcfSSatish Balay 
531*a7e14dcfSSatish Balay .seealso: PetscViewerASCIIOpen()
532*a7e14dcfSSatish Balay @*/
533*a7e14dcfSSatish Balay PetscErrorCode TaoView(TaoSolver tao, PetscViewer viewer)
534*a7e14dcfSSatish Balay {
535*a7e14dcfSSatish Balay     PetscErrorCode ierr;
536*a7e14dcfSSatish Balay     PetscBool isascii,isstring;
537*a7e14dcfSSatish Balay     const TaoSolverType type;
538*a7e14dcfSSatish Balay     PetscFunctionBegin;
539*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
540*a7e14dcfSSatish Balay     if (!viewer) {
541*a7e14dcfSSatish Balay       ierr = PetscViewerASCIIGetStdout(((PetscObject)tao)->comm,&viewer); CHKERRQ(ierr);
542*a7e14dcfSSatish Balay     }
543*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
544*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,viewer,2);
545*a7e14dcfSSatish Balay 
546*a7e14dcfSSatish Balay     ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii); CHKERRQ(ierr);
547*a7e14dcfSSatish Balay     ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring); CHKERRQ(ierr);
548*a7e14dcfSSatish Balay     if (isascii) {
549*a7e14dcfSSatish Balay       /*Temporarily check version. Remove check for release*/
550*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0)
551*a7e14dcfSSatish Balay       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tao,viewer); CHKERRQ(ierr);
552*a7e14dcfSSatish Balay #else
553*a7e14dcfSSatish Balay       ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tao,viewer,"TaoSolver"); CHKERRQ(ierr);
554*a7e14dcfSSatish Balay #endif
555*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPushTab(viewer); CHKERRQ(ierr);
556*a7e14dcfSSatish Balay 
557*a7e14dcfSSatish Balay 	if (tao->ops->view) {
558*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPushTab(viewer); CHKERRQ(ierr);
559*a7e14dcfSSatish Balay 	    ierr = (*tao->ops->view)(tao,viewer); CHKERRQ(ierr);
560*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPopTab(viewer); CHKERRQ(ierr);
561*a7e14dcfSSatish Balay 	}
562*a7e14dcfSSatish Balay 	if (tao->linesearch) {
563*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0)
564*a7e14dcfSSatish Balay 	  ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->linesearch),viewer); CHKERRQ(ierr);
565*a7e14dcfSSatish Balay #else
566*a7e14dcfSSatish Balay 	  ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->linesearch),viewer,"TaoLineSearch"); CHKERRQ(ierr);
567*a7e14dcfSSatish Balay #endif
568*a7e14dcfSSatish Balay 	}
569*a7e14dcfSSatish Balay 	if (tao->ksp) {
570*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0)
571*a7e14dcfSSatish Balay 	  ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->ksp),viewer); CHKERRQ(ierr);
572*a7e14dcfSSatish Balay #else
573*a7e14dcfSSatish Balay 	  ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->ksp),viewer,"KSP Solver"); CHKERRQ(ierr);
574*a7e14dcfSSatish Balay #endif
575*a7e14dcfSSatish Balay 
576*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIPrintf(viewer,"total KSP iterations: %D\n",tao->ksp_its); CHKERRQ(ierr);
577*a7e14dcfSSatish Balay 	}
578*a7e14dcfSSatish Balay 	if (tao->XL || tao->XU) {
579*a7e14dcfSSatish Balay 	  ierr = PetscViewerASCIIPrintf(viewer,"Active Set subset type: %s\n",TAO_SUBSET[tao->subset_type]);
580*a7e14dcfSSatish Balay 	}
581*a7e14dcfSSatish Balay 
582*a7e14dcfSSatish Balay 	ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: fatol=%G,",tao->fatol);CHKERRQ(ierr);
583*a7e14dcfSSatish Balay 	ierr=PetscViewerASCIIPrintf(viewer," frtol=%G\n",tao->frtol);CHKERRQ(ierr);
584*a7e14dcfSSatish Balay 
585*a7e14dcfSSatish Balay 	ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: gatol=%G,",tao->gatol);CHKERRQ(ierr);
586*a7e14dcfSSatish Balay 	ierr=PetscViewerASCIIPrintf(viewer," steptol=%G,",tao->steptol);CHKERRQ(ierr);
587*a7e14dcfSSatish Balay 	ierr=PetscViewerASCIIPrintf(viewer," gttol=%G\n",tao->gttol);CHKERRQ(ierr);
588*a7e14dcfSSatish Balay 
589*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPrintf(viewer,"Residual in Function/Gradient:=%G\n",tao->residual);CHKERRQ(ierr);
590*a7e14dcfSSatish Balay 
591*a7e14dcfSSatish Balay 	if (tao->cnorm>0 || tao->catol>0 || tao->crtol>0){
592*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances:");CHKERRQ(ierr);
593*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer," catol=%G,",tao->catol);CHKERRQ(ierr);
594*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer," crtol=%G\n",tao->crtol);CHKERRQ(ierr);
595*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"Residual in Constraints:=%G\n",tao->cnorm);CHKERRQ(ierr);
596*a7e14dcfSSatish Balay 	}
597*a7e14dcfSSatish Balay 
598*a7e14dcfSSatish Balay 	if (tao->trust < tao->steptol){
599*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: steptol=%G\n",tao->steptol);CHKERRQ(ierr);
600*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer,"Final trust region radius:=%G\n",tao->trust);CHKERRQ(ierr);
601*a7e14dcfSSatish Balay 	}
602*a7e14dcfSSatish Balay 
603*a7e14dcfSSatish Balay 	if (tao->fmin>-1.e25){
604*a7e14dcfSSatish Balay 	    ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: function minimum=%G\n"
605*a7e14dcfSSatish Balay 					,tao->fmin);CHKERRQ(ierr);
606*a7e14dcfSSatish Balay 	}
607*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPrintf(viewer,"Objective value=%G\n",
608*a7e14dcfSSatish Balay 				      tao->fc);CHKERRQ(ierr);
609*a7e14dcfSSatish Balay 
610*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPrintf(viewer,"total number of iterations=%D,          ",
611*a7e14dcfSSatish Balay 				      tao->niter);CHKERRQ(ierr);
612*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPrintf(viewer,"              (max: %D)\n",tao->max_it);CHKERRQ(ierr);
613*a7e14dcfSSatish Balay 
614*a7e14dcfSSatish Balay 	if (tao->nfuncs>0){
615*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of function evaluations=%D,",
616*a7e14dcfSSatish Balay 					  tao->nfuncs);CHKERRQ(ierr);
617*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"                max: %D\n",
618*a7e14dcfSSatish Balay 					  tao->max_funcs);CHKERRQ(ierr);
619*a7e14dcfSSatish Balay 	}
620*a7e14dcfSSatish Balay 	if (tao->ngrads>0){
621*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of gradient evaluations=%D,",
622*a7e14dcfSSatish Balay 					  tao->ngrads);CHKERRQ(ierr);
623*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"                max: %D\n",
624*a7e14dcfSSatish Balay 					  tao->max_funcs);CHKERRQ(ierr);
625*a7e14dcfSSatish Balay 	}
626*a7e14dcfSSatish Balay 	if (tao->nfuncgrads>0){
627*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of function/gradient evaluations=%D,",
628*a7e14dcfSSatish Balay 					  tao->nfuncgrads);CHKERRQ(ierr);
629*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"    (max: %D)\n",
630*a7e14dcfSSatish Balay 					  tao->max_funcs);CHKERRQ(ierr);
631*a7e14dcfSSatish Balay 	}
632*a7e14dcfSSatish Balay 	if (tao->nhess>0){
633*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of Hessian evaluations=%D\n",
634*a7e14dcfSSatish Balay 					  tao->nhess);CHKERRQ(ierr);
635*a7e14dcfSSatish Balay 	}
636*a7e14dcfSSatish Balay /*	if (tao->linear_its>0){
637*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"  total Krylov method iterations=%D\n",
638*a7e14dcfSSatish Balay 					  tao->linear_its);CHKERRQ(ierr);
639*a7e14dcfSSatish Balay 					  }*/
640*a7e14dcfSSatish Balay 	if (tao->nconstraints>0){
641*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of constraint function evaluations=%D\n",
642*a7e14dcfSSatish Balay 					  tao->nconstraints);CHKERRQ(ierr);
643*a7e14dcfSSatish Balay 	}
644*a7e14dcfSSatish Balay 	if (tao->njac>0){
645*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"total number of Jacobian evaluations=%D\n",
646*a7e14dcfSSatish Balay 					  tao->njac);CHKERRQ(ierr);
647*a7e14dcfSSatish Balay 	}
648*a7e14dcfSSatish Balay 
649*a7e14dcfSSatish Balay 	if (tao->reason>0){
650*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,    "Solution converged: ");CHKERRQ(ierr);
651*a7e14dcfSSatish Balay 	    switch (tao->reason) {
652*a7e14dcfSSatish Balay 		case TAO_CONVERGED_FATOL:
653*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer,"estimated f(x)-f(X*) <= fatol\n"); CHKERRQ(ierr);
654*a7e14dcfSSatish Balay 		    break;
655*a7e14dcfSSatish Balay 		case TAO_CONVERGED_FRTOL:
656*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer,"estimated |f(x)-f(X*)|/|f(X*)| <= frtol\n"); CHKERRQ(ierr);
657*a7e14dcfSSatish Balay 		    break;
658*a7e14dcfSSatish Balay 		case TAO_CONVERGED_GATOL:
659*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," ||g(X)|| <= gatol\n"); CHKERRQ(ierr);
660*a7e14dcfSSatish Balay 		    break;
661*a7e14dcfSSatish Balay 		case TAO_CONVERGED_GRTOL:
662*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," ||g(X)||/|f(X)| <= grtol\n"); CHKERRQ(ierr);
663*a7e14dcfSSatish Balay 		    break;
664*a7e14dcfSSatish Balay 		case TAO_CONVERGED_GTTOL:
665*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," ||g(X)||/||g(X0)|| <= gttol\n"); CHKERRQ(ierr);
666*a7e14dcfSSatish Balay 		    break;
667*a7e14dcfSSatish Balay 		case TAO_CONVERGED_STEPTOL:
668*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," Steptol -- step size small\n"); CHKERRQ(ierr);
669*a7e14dcfSSatish Balay 		    break;
670*a7e14dcfSSatish Balay 		case TAO_CONVERGED_MINF:
671*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," Minf --  f < fmin\n"); CHKERRQ(ierr);
672*a7e14dcfSSatish Balay 		    break;
673*a7e14dcfSSatish Balay 		case TAO_CONVERGED_USER:
674*a7e14dcfSSatish Balay 		    ierr = PetscViewerASCIIPrintf(viewer," User Terminated\n"); CHKERRQ(ierr);
675*a7e14dcfSSatish Balay 		    break;
676*a7e14dcfSSatish Balay 		default:
677*a7e14dcfSSatish Balay   		    ierr = PetscViewerASCIIPrintf(viewer,"\n"); CHKERRQ(ierr);
678*a7e14dcfSSatish Balay 		    break;
679*a7e14dcfSSatish Balay 	    }
680*a7e14dcfSSatish Balay 
681*a7e14dcfSSatish Balay 	} else {
682*a7e14dcfSSatish Balay 	    ierr = PetscViewerASCIIPrintf(viewer,"Solver terminated: %D",tao->reason);CHKERRQ(ierr);
683*a7e14dcfSSatish Balay 	    switch (tao->reason) {
684*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_MAXITS:
685*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," Maximum Iterations\n");
686*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
687*a7e14dcfSSatish Balay 	      break;
688*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_NAN:
689*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," NAN or Inf encountered\n");
690*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
691*a7e14dcfSSatish Balay 	      break;
692*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_MAXFCN:
693*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," Maximum Function Evaluations\n");
694*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
695*a7e14dcfSSatish Balay 	      break;
696*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_LS_FAILURE:
697*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," Line Search Failure\n");
698*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
699*a7e14dcfSSatish Balay 	      break;
700*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_TR_REDUCTION:
701*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," Trust Region too small\n");
702*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
703*a7e14dcfSSatish Balay 	      break;
704*a7e14dcfSSatish Balay 	    case TAO_DIVERGED_USER:
705*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer," User Terminated\n");
706*a7e14dcfSSatish Balay 	      CHKERRQ(ierr);
707*a7e14dcfSSatish Balay 	      break;
708*a7e14dcfSSatish Balay 	    default:
709*a7e14dcfSSatish Balay 	      ierr = PetscViewerASCIIPrintf(viewer,"\n"); CHKERRQ(ierr);
710*a7e14dcfSSatish Balay 	      break;
711*a7e14dcfSSatish Balay 	    }
712*a7e14dcfSSatish Balay 	}
713*a7e14dcfSSatish Balay 	ierr = PetscViewerASCIIPopTab(viewer); CHKERRQ(ierr);
714*a7e14dcfSSatish Balay     } else if (isstring) {
715*a7e14dcfSSatish Balay 	ierr = TaoGetType(tao,&type); CHKERRQ(ierr);
716*a7e14dcfSSatish Balay 	ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type); CHKERRQ(ierr);
717*a7e14dcfSSatish Balay     }
718*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
719*a7e14dcfSSatish Balay 
720*a7e14dcfSSatish Balay }
721*a7e14dcfSSatish Balay 
722*a7e14dcfSSatish Balay #undef __FUNCT__
723*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetTolerances"
724*a7e14dcfSSatish Balay /*@
725*a7e14dcfSSatish Balay   TaoSetTolerances - Sets parameters used in TAO convergence tests
726*a7e14dcfSSatish Balay 
727*a7e14dcfSSatish Balay   Logically collective on TaoSolver
728*a7e14dcfSSatish Balay 
729*a7e14dcfSSatish Balay   Input Parameters:
730*a7e14dcfSSatish Balay + tao - the TaoSolver context
731*a7e14dcfSSatish Balay . fatol - absolute convergence tolerance
732*a7e14dcfSSatish Balay . frtol - relative convergence tolerance
733*a7e14dcfSSatish Balay . gatol - stop if norm of gradient is less than this
734*a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this
735*a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by this factor
736*a7e14dcfSSatish Balay 
737*a7e14dcfSSatish Balay   Options Database Keys:
738*a7e14dcfSSatish Balay + -tao_fatol <fatol> - Sets fatol
739*a7e14dcfSSatish Balay . -tao_frtol <frtol> - Sets frtol
740*a7e14dcfSSatish Balay . -tao_gatol <gatol> - Sets gatol
741*a7e14dcfSSatish Balay . -tao_grtol <grtol> - Sets grtol
742*a7e14dcfSSatish Balay - -tao_gttol <gttol> - Sets gttol
743*a7e14dcfSSatish Balay 
744*a7e14dcfSSatish Balay   Stopping Criteria:
745*a7e14dcfSSatish Balay $ f(X) - f(X*) (estimated)            <= fatol
746*a7e14dcfSSatish Balay $ |f(X) - f(X*)| (estimated) / |f(X)| <= frtol
747*a7e14dcfSSatish Balay $ ||g(X)||                            <= gatol
748*a7e14dcfSSatish Balay $ ||g(X)|| / |f(X)|                   <= grtol
749*a7e14dcfSSatish Balay $ ||g(X)|| / ||g(X0)||                <= gttol
750*a7e14dcfSSatish Balay 
751*a7e14dcfSSatish Balay   Notes:
752*a7e14dcfSSatish Balay   Use PETSC_DEFAULT to leave one or more tolerances unchanged.
753*a7e14dcfSSatish Balay 
754*a7e14dcfSSatish Balay   Level: beginner
755*a7e14dcfSSatish Balay 
756*a7e14dcfSSatish Balay .seealso: TaoGetTolerances()
757*a7e14dcfSSatish Balay 
758*a7e14dcfSSatish Balay @*/
759*a7e14dcfSSatish Balay PetscErrorCode TaoSetTolerances(TaoSolver tao, PetscReal fatol, PetscReal frtol, PetscReal gatol, PetscReal grtol, PetscReal gttol)
760*a7e14dcfSSatish Balay {
761*a7e14dcfSSatish Balay     PetscErrorCode ierr;
762*a7e14dcfSSatish Balay     PetscFunctionBegin;
763*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
764*a7e14dcfSSatish Balay 
765*a7e14dcfSSatish Balay     if (fatol != PETSC_DEFAULT) {
766*a7e14dcfSSatish Balay       if (fatol<0) {
767*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative fatol -- ignored.");
768*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
769*a7e14dcfSSatish Balay       } else {
770*a7e14dcfSSatish Balay 	tao->fatol = PetscMax(0,fatol);
771*a7e14dcfSSatish Balay       }
772*a7e14dcfSSatish Balay     }
773*a7e14dcfSSatish Balay 
774*a7e14dcfSSatish Balay     if (frtol != PETSC_DEFAULT) {
775*a7e14dcfSSatish Balay       if (frtol<0) {
776*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative frtol -- ignored.");
777*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
778*a7e14dcfSSatish Balay       } else {
779*a7e14dcfSSatish Balay 	tao->frtol = PetscMax(0,frtol);
780*a7e14dcfSSatish Balay       }
781*a7e14dcfSSatish Balay     }
782*a7e14dcfSSatish Balay 
783*a7e14dcfSSatish Balay     if (gatol != PETSC_DEFAULT) {
784*a7e14dcfSSatish Balay       if (gatol<0) {
785*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative gatol -- ignored.");
786*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
787*a7e14dcfSSatish Balay       } else {
788*a7e14dcfSSatish Balay 	tao->gatol = PetscMax(0,gatol);
789*a7e14dcfSSatish Balay       }
790*a7e14dcfSSatish Balay     }
791*a7e14dcfSSatish Balay 
792*a7e14dcfSSatish Balay     if (grtol != PETSC_DEFAULT) {
793*a7e14dcfSSatish Balay       if (grtol<0) {
794*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative grtol -- ignored.");
795*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
796*a7e14dcfSSatish Balay       } else {
797*a7e14dcfSSatish Balay 	tao->grtol = PetscMax(0,grtol);
798*a7e14dcfSSatish Balay       }
799*a7e14dcfSSatish Balay     }
800*a7e14dcfSSatish Balay 
801*a7e14dcfSSatish Balay     if (gttol != PETSC_DEFAULT) {
802*a7e14dcfSSatish Balay       if (gttol<0) {
803*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative gttol -- ignored.");
804*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
805*a7e14dcfSSatish Balay       } else {
806*a7e14dcfSSatish Balay 	tao->gttol = PetscMax(0,gttol);
807*a7e14dcfSSatish Balay       }
808*a7e14dcfSSatish Balay     }
809*a7e14dcfSSatish Balay 
810*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
811*a7e14dcfSSatish Balay }
812*a7e14dcfSSatish Balay 
813*a7e14dcfSSatish Balay #undef __FUNCT__
814*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintTolerances"
815*a7e14dcfSSatish Balay /*@
816*a7e14dcfSSatish Balay   TaoSetConstraintTolerances - Sets contraint tolerance parameters used in TAO
817*a7e14dcfSSatish Balay   convergence tests
818*a7e14dcfSSatish Balay 
819*a7e14dcfSSatish Balay   Logically collective on TaoSolver
820*a7e14dcfSSatish Balay 
821*a7e14dcfSSatish Balay   Input Parameters:
822*a7e14dcfSSatish Balay + tao - the TaoSolver context
823*a7e14dcfSSatish Balay . catol - absolute constraint tolerance, constraint norm must be less than catol for used for fatol, gatol convergence criteria
824*a7e14dcfSSatish Balay - crtol - relative contraint tolerance, constraint norm must be less than crtol for used for fatol, gatol, gttol convergence criteria
825*a7e14dcfSSatish Balay 
826*a7e14dcfSSatish Balay   Options Database Keys:
827*a7e14dcfSSatish Balay + -tao_catol <catol> - Sets catol
828*a7e14dcfSSatish Balay - -tao_crtol <crtol> - Sets crtol
829*a7e14dcfSSatish Balay 
830*a7e14dcfSSatish Balay   Level: intermediate
831*a7e14dcfSSatish Balay 
832*a7e14dcfSSatish Balay .seealso: TaoGetTolerances()
833*a7e14dcfSSatish Balay 
834*a7e14dcfSSatish Balay @*/
835*a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintTolerances(TaoSolver tao, PetscReal catol, PetscReal crtol)
836*a7e14dcfSSatish Balay {
837*a7e14dcfSSatish Balay     PetscErrorCode ierr;
838*a7e14dcfSSatish Balay     PetscFunctionBegin;
839*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
840*a7e14dcfSSatish Balay 
841*a7e14dcfSSatish Balay     if (catol != PETSC_DEFAULT) {
842*a7e14dcfSSatish Balay       if (catol<0) {
843*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative catol -- ignored.");
844*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
845*a7e14dcfSSatish Balay       } else {
846*a7e14dcfSSatish Balay 	tao->catol = PetscMax(0,catol);
847*a7e14dcfSSatish Balay       }
848*a7e14dcfSSatish Balay     }
849*a7e14dcfSSatish Balay 
850*a7e14dcfSSatish Balay     if (crtol != PETSC_DEFAULT) {
851*a7e14dcfSSatish Balay       if (crtol<0) {
852*a7e14dcfSSatish Balay 	ierr = PetscInfo(tao,"Tried to set negative crtol -- ignored.");
853*a7e14dcfSSatish Balay 	CHKERRQ(ierr);
854*a7e14dcfSSatish Balay       } else {
855*a7e14dcfSSatish Balay 	tao->crtol = PetscMax(0,crtol);
856*a7e14dcfSSatish Balay       }
857*a7e14dcfSSatish Balay     }
858*a7e14dcfSSatish Balay 
859*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
860*a7e14dcfSSatish Balay }
861*a7e14dcfSSatish Balay 
862*a7e14dcfSSatish Balay #undef __FUNCT__
863*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFunctionLowerBound"
864*a7e14dcfSSatish Balay /*@
865*a7e14dcfSSatish Balay    TaoSetFunctionLowerBound - Sets a bound on the solution objective value.
866*a7e14dcfSSatish Balay    When an approximate solution with an objective value below this number
867*a7e14dcfSSatish Balay    has been found, the solver will terminate.
868*a7e14dcfSSatish Balay 
869*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
870*a7e14dcfSSatish Balay 
871*a7e14dcfSSatish Balay    Input Parameters:
872*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
873*a7e14dcfSSatish Balay -  fmin - the tolerance
874*a7e14dcfSSatish Balay 
875*a7e14dcfSSatish Balay    Options Database Keys:
876*a7e14dcfSSatish Balay .    -tao_fmin <fmin> - sets the minimum function value
877*a7e14dcfSSatish Balay 
878*a7e14dcfSSatish Balay    Level: intermediate
879*a7e14dcfSSatish Balay 
880*a7e14dcfSSatish Balay .seealso: TaoSetTolerances()
881*a7e14dcfSSatish Balay @*/
882*a7e14dcfSSatish Balay PetscErrorCode TaoSetFunctionLowerBound(TaoSolver tao,PetscReal fmin)
883*a7e14dcfSSatish Balay {
884*a7e14dcfSSatish Balay   PetscFunctionBegin;
885*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
886*a7e14dcfSSatish Balay   tao->fmin = fmin;
887*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
888*a7e14dcfSSatish Balay }
889*a7e14dcfSSatish Balay 
890*a7e14dcfSSatish Balay #undef __FUNCT__
891*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetFunctionLowerBound"
892*a7e14dcfSSatish Balay /*@
893*a7e14dcfSSatish Balay    TaoGetFunctionLowerBound - Sets a bound on the solution objective value.
894*a7e14dcfSSatish Balay    When an approximate solution with an objective value below this number
895*a7e14dcfSSatish Balay    has been found, the solver will terminate.
896*a7e14dcfSSatish Balay 
897*a7e14dcfSSatish Balay    Not collective on TaoSolver
898*a7e14dcfSSatish Balay 
899*a7e14dcfSSatish Balay    Input Parameters:
900*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
901*a7e14dcfSSatish Balay 
902*a7e14dcfSSatish Balay    OutputParameters:
903*a7e14dcfSSatish Balay .  fmin - the minimum function value
904*a7e14dcfSSatish Balay 
905*a7e14dcfSSatish Balay    Level: intermediate
906*a7e14dcfSSatish Balay 
907*a7e14dcfSSatish Balay .seealso: TaoSetFunctionLowerBound()
908*a7e14dcfSSatish Balay @*/
909*a7e14dcfSSatish Balay PetscErrorCode TaoGetFunctionLowerBound(TaoSolver tao,PetscReal *fmin)
910*a7e14dcfSSatish Balay {
911*a7e14dcfSSatish Balay   PetscFunctionBegin;
912*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
913*a7e14dcfSSatish Balay   *fmin = tao->fmin;
914*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
915*a7e14dcfSSatish Balay }
916*a7e14dcfSSatish Balay 
917*a7e14dcfSSatish Balay 
918*a7e14dcfSSatish Balay 
919*a7e14dcfSSatish Balay #undef __FUNCT__
920*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMaximumFunctionEvaluations"
921*a7e14dcfSSatish Balay /*@
922*a7e14dcfSSatish Balay    TaoSetMaximumFunctionEvaluations - Sets a maximum number of
923*a7e14dcfSSatish Balay    function evaluations.
924*a7e14dcfSSatish Balay 
925*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
926*a7e14dcfSSatish Balay 
927*a7e14dcfSSatish Balay    Input Parameters:
928*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
929*a7e14dcfSSatish Balay -  nfcn - the maximum number of function evaluations (>=0)
930*a7e14dcfSSatish Balay 
931*a7e14dcfSSatish Balay    Options Database Keys:
932*a7e14dcfSSatish Balay .    -tao_max_funcs <nfcn> - sets the maximum number of function evaluations
933*a7e14dcfSSatish Balay 
934*a7e14dcfSSatish Balay    Level: intermediate
935*a7e14dcfSSatish Balay 
936*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(), TaoSetMaximumIterations()
937*a7e14dcfSSatish Balay @*/
938*a7e14dcfSSatish Balay 
939*a7e14dcfSSatish Balay PetscErrorCode TaoSetMaximumFunctionEvaluations(TaoSolver tao,PetscInt nfcn)
940*a7e14dcfSSatish Balay {
941*a7e14dcfSSatish Balay   PetscInt zero=0;
942*a7e14dcfSSatish Balay   PetscFunctionBegin;
943*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
944*a7e14dcfSSatish Balay   tao->max_funcs = PetscMax(zero,nfcn);
945*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
946*a7e14dcfSSatish Balay }
947*a7e14dcfSSatish Balay 
948*a7e14dcfSSatish Balay #undef __FUNCT__
949*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetMaximumFunctionEvaluations"
950*a7e14dcfSSatish Balay /*@
951*a7e14dcfSSatish Balay    TaoGetMaximumFunctionEvaluations - Sets a maximum number of
952*a7e14dcfSSatish Balay    function evaluations.
953*a7e14dcfSSatish Balay 
954*a7e14dcfSSatish Balay    Not Collective
955*a7e14dcfSSatish Balay 
956*a7e14dcfSSatish Balay    Input Parameters:
957*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
958*a7e14dcfSSatish Balay 
959*a7e14dcfSSatish Balay    Output Parameters:
960*a7e14dcfSSatish Balay .  nfcn - the maximum number of function evaluations
961*a7e14dcfSSatish Balay 
962*a7e14dcfSSatish Balay    Level: intermediate
963*a7e14dcfSSatish Balay 
964*a7e14dcfSSatish Balay .seealso: TaoSetMaximumFunctionEvaluations(), TaoGetMaximumIterations()
965*a7e14dcfSSatish Balay @*/
966*a7e14dcfSSatish Balay 
967*a7e14dcfSSatish Balay PetscErrorCode TaoGetMaximumFunctionEvaluations(TaoSolver tao,PetscInt *nfcn)
968*a7e14dcfSSatish Balay {
969*a7e14dcfSSatish Balay   PetscFunctionBegin;
970*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
971*a7e14dcfSSatish Balay   *nfcn = tao->max_funcs;
972*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
973*a7e14dcfSSatish Balay }
974*a7e14dcfSSatish Balay 
975*a7e14dcfSSatish Balay 
976*a7e14dcfSSatish Balay #undef __FUNCT__
977*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMaximumIterations"
978*a7e14dcfSSatish Balay /*@
979*a7e14dcfSSatish Balay    TaoSetMaximumIterations - Sets a maximum number of iterates.
980*a7e14dcfSSatish Balay 
981*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
982*a7e14dcfSSatish Balay 
983*a7e14dcfSSatish Balay    Input Parameters:
984*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
985*a7e14dcfSSatish Balay -  maxits - the maximum number of iterates (>=0)
986*a7e14dcfSSatish Balay 
987*a7e14dcfSSatish Balay    Options Database Keys:
988*a7e14dcfSSatish Balay .    -tao_max_it <its> - sets the maximum number of iterations
989*a7e14dcfSSatish Balay 
990*a7e14dcfSSatish Balay    Level: intermediate
991*a7e14dcfSSatish Balay 
992*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(), TaoSetMaximumFunctionEvaluations()
993*a7e14dcfSSatish Balay @*/
994*a7e14dcfSSatish Balay PetscErrorCode TaoSetMaximumIterations(TaoSolver tao,PetscInt maxits)
995*a7e14dcfSSatish Balay {
996*a7e14dcfSSatish Balay   PetscInt zero=0;
997*a7e14dcfSSatish Balay   PetscFunctionBegin;
998*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
999*a7e14dcfSSatish Balay   tao->max_it = PetscMax(zero,maxits);
1000*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1001*a7e14dcfSSatish Balay }
1002*a7e14dcfSSatish Balay 
1003*a7e14dcfSSatish Balay 
1004*a7e14dcfSSatish Balay #undef __FUNCT__
1005*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetMaximumIterations"
1006*a7e14dcfSSatish Balay /*@
1007*a7e14dcfSSatish Balay    TaoGetMaximumIterations - Sets a maximum number of iterates.
1008*a7e14dcfSSatish Balay 
1009*a7e14dcfSSatish Balay    Not Collective
1010*a7e14dcfSSatish Balay 
1011*a7e14dcfSSatish Balay    Input Parameters:
1012*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
1013*a7e14dcfSSatish Balay 
1014*a7e14dcfSSatish Balay    Output Parameters:
1015*a7e14dcfSSatish Balay .  maxits - the maximum number of iterates
1016*a7e14dcfSSatish Balay 
1017*a7e14dcfSSatish Balay    Level: intermediate
1018*a7e14dcfSSatish Balay 
1019*a7e14dcfSSatish Balay .seealso: TaoSetMaximumIterations(), TaoGetMaximumFunctionEvaluations()
1020*a7e14dcfSSatish Balay @*/
1021*a7e14dcfSSatish Balay PetscErrorCode TaoGetMaximumIterations(TaoSolver tao,PetscInt *maxits)
1022*a7e14dcfSSatish Balay {
1023*a7e14dcfSSatish Balay   PetscFunctionBegin;
1024*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1025*a7e14dcfSSatish Balay   *maxits = tao->max_it;
1026*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1027*a7e14dcfSSatish Balay }
1028*a7e14dcfSSatish Balay 
1029*a7e14dcfSSatish Balay #undef __FUNCT__
1030*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInitialTrustRegionRadius"
1031*a7e14dcfSSatish Balay /*@
1032*a7e14dcfSSatish Balay    TaoSetInitialTrustRegionRadius - Sets the initial trust region radius.
1033*a7e14dcfSSatish Balay 
1034*a7e14dcfSSatish Balay    Logically collective on TaoSolver
1035*a7e14dcfSSatish Balay 
1036*a7e14dcfSSatish Balay    Input Parameter:
1037*a7e14dcfSSatish Balay +  tao - a TAO optimization solver
1038*a7e14dcfSSatish Balay -  radius - the trust region radius
1039*a7e14dcfSSatish Balay 
1040*a7e14dcfSSatish Balay    Level: intermediate
1041*a7e14dcfSSatish Balay 
1042*a7e14dcfSSatish Balay    Options Database Key:
1043*a7e14dcfSSatish Balay .  -tao_trust0 <t0> - sets initial trust region radius
1044*a7e14dcfSSatish Balay 
1045*a7e14dcfSSatish Balay 
1046*a7e14dcfSSatish Balay .seealso: TaoGetTrustRegionRadius(), TaoSetTrustRegionTolerance()
1047*a7e14dcfSSatish Balay @*/
1048*a7e14dcfSSatish Balay PetscErrorCode TaoSetInitialTrustRegionRadius(TaoSolver tao, PetscReal radius)
1049*a7e14dcfSSatish Balay {
1050*a7e14dcfSSatish Balay   PetscFunctionBegin;
1051*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1052*a7e14dcfSSatish Balay   tao->trust0 = PetscMax(0.0,radius);
1053*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1054*a7e14dcfSSatish Balay }
1055*a7e14dcfSSatish Balay 
1056*a7e14dcfSSatish Balay 
1057*a7e14dcfSSatish Balay #undef __FUNCT__
1058*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetInitialTrustRegionRadius"
1059*a7e14dcfSSatish Balay /*@
1060*a7e14dcfSSatish Balay    TaoGetInitialTrustRegionRadius - Sets the initial trust region radius.
1061*a7e14dcfSSatish Balay 
1062*a7e14dcfSSatish Balay    Not Collective
1063*a7e14dcfSSatish Balay 
1064*a7e14dcfSSatish Balay    Input Parameter:
1065*a7e14dcfSSatish Balay .  tao - a TAO optimization solver
1066*a7e14dcfSSatish Balay 
1067*a7e14dcfSSatish Balay    Output Parameter:
1068*a7e14dcfSSatish Balay .  radius - the trust region radius
1069*a7e14dcfSSatish Balay 
1070*a7e14dcfSSatish Balay    Level: intermediate
1071*a7e14dcfSSatish Balay 
1072*a7e14dcfSSatish Balay .seealso: TaoSetInitialTrustRegionRadius(), TaoGetCurrentTrustRegionRadius()
1073*a7e14dcfSSatish Balay @*/
1074*a7e14dcfSSatish Balay PetscErrorCode TaoGetInitialTrustRegionRadius(TaoSolver tao, PetscReal *radius)
1075*a7e14dcfSSatish Balay {
1076*a7e14dcfSSatish Balay   PetscFunctionBegin;
1077*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1078*a7e14dcfSSatish Balay   *radius = tao->trust0;
1079*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1080*a7e14dcfSSatish Balay }
1081*a7e14dcfSSatish Balay 
1082*a7e14dcfSSatish Balay #undef __FUNCT__
1083*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetCurrentTrustRegionRadius"
1084*a7e14dcfSSatish Balay /*@
1085*a7e14dcfSSatish Balay    TaoGetCurrentTrustRegionRadius - Gets the current trust region radius.
1086*a7e14dcfSSatish Balay 
1087*a7e14dcfSSatish Balay    Not Collective
1088*a7e14dcfSSatish Balay 
1089*a7e14dcfSSatish Balay    Input Parameter:
1090*a7e14dcfSSatish Balay .  tao - a TAO optimization solver
1091*a7e14dcfSSatish Balay 
1092*a7e14dcfSSatish Balay    Output Parameter:
1093*a7e14dcfSSatish Balay .  radius - the trust region radius
1094*a7e14dcfSSatish Balay 
1095*a7e14dcfSSatish Balay    Level: intermediate
1096*a7e14dcfSSatish Balay 
1097*a7e14dcfSSatish Balay .seealso: TaoSetInitialTrustRegionRadius(), TaoGetInitialTrustRegionRadius()
1098*a7e14dcfSSatish Balay @*/
1099*a7e14dcfSSatish Balay PetscErrorCode TaoGetCurrentTrustRegionRadius(TaoSolver tao, PetscReal *radius)
1100*a7e14dcfSSatish Balay {
1101*a7e14dcfSSatish Balay   PetscFunctionBegin;
1102*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1103*a7e14dcfSSatish Balay   *radius = tao->trust;
1104*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1105*a7e14dcfSSatish Balay }
1106*a7e14dcfSSatish Balay 
1107*a7e14dcfSSatish Balay 
1108*a7e14dcfSSatish Balay #undef __FUNCT__
1109*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetTolerances"
1110*a7e14dcfSSatish Balay /*@
1111*a7e14dcfSSatish Balay   TaoGetTolerances - gets the current values of tolerances
1112*a7e14dcfSSatish Balay 
1113*a7e14dcfSSatish Balay   Not Collective
1114*a7e14dcfSSatish Balay 
1115*a7e14dcfSSatish Balay   Input Parameters:
1116*a7e14dcfSSatish Balay . tao - the TaoSolver context
1117*a7e14dcfSSatish Balay 
1118*a7e14dcfSSatish Balay   Output Parameters:
1119*a7e14dcfSSatish Balay + fatol - absolute convergence tolerance
1120*a7e14dcfSSatish Balay . frtol - relative convergence tolerance
1121*a7e14dcfSSatish Balay . gatol - stop if norm of gradient is less than this
1122*a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this
1123*a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by a this factor
1124*a7e14dcfSSatish Balay 
1125*a7e14dcfSSatish Balay   Note:
1126*a7e14dcfSSatish Balay   PETSC_NULL can be used as an argument if not all tolerances values are needed
1127*a7e14dcfSSatish Balay 
1128*a7e14dcfSSatish Balay .seealso TaoSetTolerances()
1129*a7e14dcfSSatish Balay 
1130*a7e14dcfSSatish Balay   Level: intermediate
1131*a7e14dcfSSatish Balay @*/
1132*a7e14dcfSSatish Balay PetscErrorCode TaoGetTolerances(TaoSolver tao, PetscReal *fatol, PetscReal *frtol, PetscReal *gatol, PetscReal *grtol, PetscReal *gttol)
1133*a7e14dcfSSatish Balay {
1134*a7e14dcfSSatish Balay   PetscFunctionBegin;
1135*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1136*a7e14dcfSSatish Balay   if (fatol) *fatol=tao->fatol;
1137*a7e14dcfSSatish Balay   if (frtol) *frtol=tao->frtol;
1138*a7e14dcfSSatish Balay   if (gatol) *gatol=tao->gatol;
1139*a7e14dcfSSatish Balay   if (grtol) *grtol=tao->grtol;
1140*a7e14dcfSSatish Balay   if (gttol) *gttol=tao->gttol;
1141*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1142*a7e14dcfSSatish Balay }
1143*a7e14dcfSSatish Balay 
1144*a7e14dcfSSatish Balay 
1145*a7e14dcfSSatish Balay #undef __FUNCT__
1146*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetKSP"
1147*a7e14dcfSSatish Balay /*@
1148*a7e14dcfSSatish Balay   TaoGetKSP - Gets the linear solver used by the optimization solver.
1149*a7e14dcfSSatish Balay   Application writers should use TaoGetKSP if they need direct access
1150*a7e14dcfSSatish Balay   to the PETSc KSP object.
1151*a7e14dcfSSatish Balay 
1152*a7e14dcfSSatish Balay   Not Collective
1153*a7e14dcfSSatish Balay 
1154*a7e14dcfSSatish Balay    Input Parameters:
1155*a7e14dcfSSatish Balay .  tao - the TAO solver
1156*a7e14dcfSSatish Balay 
1157*a7e14dcfSSatish Balay    Output Parameters:
1158*a7e14dcfSSatish Balay .  ksp - the KSP linear solver used in the optimization solver
1159*a7e14dcfSSatish Balay 
1160*a7e14dcfSSatish Balay    Level: intermediate
1161*a7e14dcfSSatish Balay 
1162*a7e14dcfSSatish Balay @*/
1163*a7e14dcfSSatish Balay PetscErrorCode TaoGetKSP(TaoSolver tao, KSP *ksp) {
1164*a7e14dcfSSatish Balay   PetscFunctionBegin;
1165*a7e14dcfSSatish Balay   *ksp = tao->ksp;
1166*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1167*a7e14dcfSSatish Balay }
1168*a7e14dcfSSatish Balay 
1169*a7e14dcfSSatish Balay #undef __FUNCT__
1170*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetLineSearch"
1171*a7e14dcfSSatish Balay /*@
1172*a7e14dcfSSatish Balay   TaoGetLineSearch - Gets the line search used by the optimization solver.
1173*a7e14dcfSSatish Balay   Application writers should use TaoGetLineSearch if they need direct access
1174*a7e14dcfSSatish Balay   to the TaoLineSearch object.
1175*a7e14dcfSSatish Balay 
1176*a7e14dcfSSatish Balay   Not Collective
1177*a7e14dcfSSatish Balay 
1178*a7e14dcfSSatish Balay    Input Parameters:
1179*a7e14dcfSSatish Balay .  tao - the TAO solver
1180*a7e14dcfSSatish Balay 
1181*a7e14dcfSSatish Balay    Output Parameters:
1182*a7e14dcfSSatish Balay .  ls - the line search used in the optimization solver
1183*a7e14dcfSSatish Balay 
1184*a7e14dcfSSatish Balay    Level: intermediate
1185*a7e14dcfSSatish Balay 
1186*a7e14dcfSSatish Balay @*/
1187*a7e14dcfSSatish Balay PetscErrorCode TaoGetLineSearch(TaoSolver tao, TaoLineSearch *ls) {
1188*a7e14dcfSSatish Balay   PetscFunctionBegin;
1189*a7e14dcfSSatish Balay   *ls = tao->linesearch;
1190*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1191*a7e14dcfSSatish Balay }
1192*a7e14dcfSSatish Balay 
1193*a7e14dcfSSatish Balay #undef __FUNCT__
1194*a7e14dcfSSatish Balay #define __FUNCT__ "TaoAddLineSearchCounts"
1195*a7e14dcfSSatish Balay /*@
1196*a7e14dcfSSatish Balay   TaoAddLineSearchCounts - Adds the number of function evaluations spent
1197*a7e14dcfSSatish Balay   in the line search to the running total.
1198*a7e14dcfSSatish Balay 
1199*a7e14dcfSSatish Balay    Input Parameters:
1200*a7e14dcfSSatish Balay +  tao - the TAO solver
1201*a7e14dcfSSatish Balay -  ls - the line search used in the optimization solver
1202*a7e14dcfSSatish Balay 
1203*a7e14dcfSSatish Balay    Level: developer
1204*a7e14dcfSSatish Balay 
1205*a7e14dcfSSatish Balay .seealso: TaoLineSearchApply()
1206*a7e14dcfSSatish Balay @*/
1207*a7e14dcfSSatish Balay PetscErrorCode TaoAddLineSearchCounts(TaoSolver tao) {
1208*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1209*a7e14dcfSSatish Balay   PetscBool      flg;
1210*a7e14dcfSSatish Balay   PetscInt       nfeval,ngeval,nfgeval;
1211*a7e14dcfSSatish Balay   PetscFunctionBegin;
1212*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1213*a7e14dcfSSatish Balay   if (tao->linesearch) {
1214*a7e14dcfSSatish Balay     ierr = TaoLineSearchIsUsingTaoSolverRoutines(tao->linesearch,&flg);
1215*a7e14dcfSSatish Balay     if (flg == PETSC_FALSE) {
1216*a7e14dcfSSatish Balay       ierr = TaoLineSearchGetNumberFunctionEvaluations(tao->linesearch,&nfeval,
1217*a7e14dcfSSatish Balay 						       &ngeval,&nfgeval); CHKERRQ(ierr);
1218*a7e14dcfSSatish Balay       tao->nfuncs+=nfeval;
1219*a7e14dcfSSatish Balay       tao->ngrads+=ngeval;
1220*a7e14dcfSSatish Balay       tao->nfuncgrads+=nfgeval;
1221*a7e14dcfSSatish Balay     }
1222*a7e14dcfSSatish Balay   }
1223*a7e14dcfSSatish Balay 
1224*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1225*a7e14dcfSSatish Balay }
1226*a7e14dcfSSatish Balay 
1227*a7e14dcfSSatish Balay 
1228*a7e14dcfSSatish Balay #undef __FUNCT__
1229*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetSolutionVector"
1230*a7e14dcfSSatish Balay /*@
1231*a7e14dcfSSatish Balay   TaoGetSolutionVector - Returns the vector with the current TAO solution
1232*a7e14dcfSSatish Balay 
1233*a7e14dcfSSatish Balay   Not Collective
1234*a7e14dcfSSatish Balay 
1235*a7e14dcfSSatish Balay   Input Parameter:
1236*a7e14dcfSSatish Balay . tao - the TaoSolver context
1237*a7e14dcfSSatish Balay 
1238*a7e14dcfSSatish Balay   Output Parameter:
1239*a7e14dcfSSatish Balay . X - the current solution
1240*a7e14dcfSSatish Balay 
1241*a7e14dcfSSatish Balay   Level: intermediate
1242*a7e14dcfSSatish Balay 
1243*a7e14dcfSSatish Balay   Note:  The returned vector will be the same object that was passed into TaoSetInitialVector()
1244*a7e14dcfSSatish Balay @*/
1245*a7e14dcfSSatish Balay PetscErrorCode TaoGetSolutionVector(TaoSolver tao, Vec *X)
1246*a7e14dcfSSatish Balay {
1247*a7e14dcfSSatish Balay     PetscFunctionBegin;
1248*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1249*a7e14dcfSSatish Balay     *X = tao->solution;
1250*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
1251*a7e14dcfSSatish Balay }
1252*a7e14dcfSSatish Balay 
1253*a7e14dcfSSatish Balay 
1254*a7e14dcfSSatish Balay #undef __FUNCT__
1255*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetGradientVector"
1256*a7e14dcfSSatish Balay /*@
1257*a7e14dcfSSatish Balay   TaoGetGradientVector - Returns the vector with the current TAO gradient
1258*a7e14dcfSSatish Balay 
1259*a7e14dcfSSatish Balay   Not Collective
1260*a7e14dcfSSatish Balay 
1261*a7e14dcfSSatish Balay   Input Parameter:
1262*a7e14dcfSSatish Balay . tao - the TaoSolver context
1263*a7e14dcfSSatish Balay 
1264*a7e14dcfSSatish Balay   Output Parameter:
1265*a7e14dcfSSatish Balay . G - the current solution
1266*a7e14dcfSSatish Balay 
1267*a7e14dcfSSatish Balay   Level: intermediate
1268*a7e14dcfSSatish Balay @*/
1269*a7e14dcfSSatish Balay PetscErrorCode TaoGetGradientVector(TaoSolver tao, Vec *G)
1270*a7e14dcfSSatish Balay {
1271*a7e14dcfSSatish Balay     PetscFunctionBegin;
1272*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1273*a7e14dcfSSatish Balay     *G = tao->gradient;
1274*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
1275*a7e14dcfSSatish Balay }
1276*a7e14dcfSSatish Balay 
1277*a7e14dcfSSatish Balay 
1278*a7e14dcfSSatish Balay #undef __FUNCT__
1279*a7e14dcfSSatish Balay #define __FUNCT__ "TaoResetStatistics"
1280*a7e14dcfSSatish Balay /*@
1281*a7e14dcfSSatish Balay    TaoResetStatistics - Initialize the statistics used by TAO for all of the solvers.
1282*a7e14dcfSSatish Balay    These statistics include the iteration number, residual norms, and convergence status.
1283*a7e14dcfSSatish Balay    This routine gets called before solving each optimization problem.
1284*a7e14dcfSSatish Balay 
1285*a7e14dcfSSatish Balay    Collective on TaoSolver
1286*a7e14dcfSSatish Balay 
1287*a7e14dcfSSatish Balay    Input Parameters:
1288*a7e14dcfSSatish Balay .  solver - the TaoSolver context
1289*a7e14dcfSSatish Balay 
1290*a7e14dcfSSatish Balay    Level: developer
1291*a7e14dcfSSatish Balay 
1292*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve()
1293*a7e14dcfSSatish Balay @*/
1294*a7e14dcfSSatish Balay PetscErrorCode TaoResetStatistics(TaoSolver tao)
1295*a7e14dcfSSatish Balay {
1296*a7e14dcfSSatish Balay     PetscFunctionBegin;
1297*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1298*a7e14dcfSSatish Balay     tao->niter        = 0;
1299*a7e14dcfSSatish Balay     tao->nfuncs       = 0;
1300*a7e14dcfSSatish Balay     tao->nfuncgrads   = 0;
1301*a7e14dcfSSatish Balay     tao->ngrads       = 0;
1302*a7e14dcfSSatish Balay     tao->nhess        = 0;
1303*a7e14dcfSSatish Balay     tao->njac         = 0;
1304*a7e14dcfSSatish Balay     tao->nconstraints = 0;
1305*a7e14dcfSSatish Balay     tao->ksp_its      = 0;
1306*a7e14dcfSSatish Balay     tao->reason       = TAO_CONTINUE_ITERATING;
1307*a7e14dcfSSatish Balay     tao->residual     = 0.0;
1308*a7e14dcfSSatish Balay     tao->cnorm        = 0.0;
1309*a7e14dcfSSatish Balay     tao->step         = 0.0;
1310*a7e14dcfSSatish Balay     tao->lsflag       = PETSC_FALSE;
1311*a7e14dcfSSatish Balay     if (tao->hist_reset) tao->hist_len=0;
1312*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
1313*a7e14dcfSSatish Balay }
1314*a7e14dcfSSatish Balay 
1315*a7e14dcfSSatish Balay 
1316*a7e14dcfSSatish Balay #undef __FUNCT__
1317*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConvergenceTest"
1318*a7e14dcfSSatish Balay /*@C
1319*a7e14dcfSSatish Balay   TaoSetConvergenceTest - Sets the function that is to be used to test
1320*a7e14dcfSSatish Balay   for convergence o fthe iterative minimization solution.  The new convergence
1321*a7e14dcfSSatish Balay   testing routine will replace TAO's default convergence test.
1322*a7e14dcfSSatish Balay 
1323*a7e14dcfSSatish Balay   Logically Collective on TaoSolver
1324*a7e14dcfSSatish Balay 
1325*a7e14dcfSSatish Balay   Input Parameters:
1326*a7e14dcfSSatish Balay + tao - the TaoSolver object
1327*a7e14dcfSSatish Balay . conv - the routine to test for convergence
1328*a7e14dcfSSatish Balay - ctx - [optional] context for private data for the convergence routine
1329*a7e14dcfSSatish Balay         (may be PETSC_NULL)
1330*a7e14dcfSSatish Balay 
1331*a7e14dcfSSatish Balay   Calling sequence of conv:
1332*a7e14dcfSSatish Balay $   PetscErrorCode conv(TaoSolver tao, void *ctx)
1333*a7e14dcfSSatish Balay 
1334*a7e14dcfSSatish Balay + tao - the TaoSolver object
1335*a7e14dcfSSatish Balay - ctx - [optional] convergence context
1336*a7e14dcfSSatish Balay 
1337*a7e14dcfSSatish Balay   Note: The new convergence testing routine should call TaoSetTerminationReason().
1338*a7e14dcfSSatish Balay 
1339*a7e14dcfSSatish Balay   Level: advanced
1340*a7e14dcfSSatish Balay 
1341*a7e14dcfSSatish Balay .seealso: TaoSetTerminationReason(), TaoGetSolutionStatus(), TaoGetTolerances(), TaoSetMonitor
1342*a7e14dcfSSatish Balay 
1343*a7e14dcfSSatish Balay @*/
1344*a7e14dcfSSatish Balay PetscErrorCode TaoSetConvergenceTest(TaoSolver tao, PetscErrorCode (*conv)(TaoSolver,void*), void *ctx)
1345*a7e14dcfSSatish Balay {
1346*a7e14dcfSSatish Balay   PetscFunctionBegin;
1347*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1348*a7e14dcfSSatish Balay   (tao)->ops->convergencetest = conv;
1349*a7e14dcfSSatish Balay   (tao)->cnvP = ctx;
1350*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1351*a7e14dcfSSatish Balay }
1352*a7e14dcfSSatish Balay 
1353*a7e14dcfSSatish Balay #undef __FUNCT__
1354*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMonitor"
1355*a7e14dcfSSatish Balay /*@C
1356*a7e14dcfSSatish Balay    TaoSetMonitor - Sets an ADDITIONAL function that is to be used at every
1357*a7e14dcfSSatish Balay    iteration of the solver to display the iteration's
1358*a7e14dcfSSatish Balay    progress.
1359*a7e14dcfSSatish Balay 
1360*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
1361*a7e14dcfSSatish Balay 
1362*a7e14dcfSSatish Balay    Input Parameters:
1363*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
1364*a7e14dcfSSatish Balay .  mymonitor - monitoring routine
1365*a7e14dcfSSatish Balay -  mctx - [optional] user-defined context for private data for the
1366*a7e14dcfSSatish Balay           monitor routine (may be PETSC_NULL)
1367*a7e14dcfSSatish Balay 
1368*a7e14dcfSSatish Balay    Calling sequence of mymonitor:
1369*a7e14dcfSSatish Balay $     int mymonitor(TaoSolver tao,void *mctx)
1370*a7e14dcfSSatish Balay 
1371*a7e14dcfSSatish Balay +    tao - the TaoSolver solver context
1372*a7e14dcfSSatish Balay -    mctx - [optional] monitoring context
1373*a7e14dcfSSatish Balay 
1374*a7e14dcfSSatish Balay 
1375*a7e14dcfSSatish Balay    Options Database Keys:
1376*a7e14dcfSSatish Balay +    -tao_monitor        - sets TaoDefaultMonitor()
1377*a7e14dcfSSatish Balay .    -tao_smonitor       - sets short monitor
1378*a7e14dcfSSatish Balay .    -tao_cmonitor       - same as smonitor plus constraint norm
1379*a7e14dcfSSatish Balay .    -tao_view_solution   - view solution at each iteration
1380*a7e14dcfSSatish Balay .    -tao_view_gradient   - view gradient at each iteration
1381*a7e14dcfSSatish Balay .    -tao_view_separableobjective - view separable objective function at each iteration
1382*a7e14dcfSSatish Balay -    -tao_cancelmonitors - cancels all monitors that have been hardwired into a code by calls to TaoSetMonitor(), but does not cancel those set via the options database.
1383*a7e14dcfSSatish Balay 
1384*a7e14dcfSSatish Balay 
1385*a7e14dcfSSatish Balay    Notes:
1386*a7e14dcfSSatish Balay    Several different monitoring routines may be set by calling
1387*a7e14dcfSSatish Balay    TaoSetMonitor() multiple times; all will be called in the
1388*a7e14dcfSSatish Balay    order in which they were set.
1389*a7e14dcfSSatish Balay 
1390*a7e14dcfSSatish Balay    Fortran Notes: Only one monitor function may be set
1391*a7e14dcfSSatish Balay 
1392*a7e14dcfSSatish Balay    Level: intermediate
1393*a7e14dcfSSatish Balay 
1394*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoCancelMonitors(),  TaoSetDestroyRoutine()
1395*a7e14dcfSSatish Balay @*/
1396*a7e14dcfSSatish Balay PetscErrorCode TaoSetMonitor(TaoSolver tao, PetscErrorCode (*func)(TaoSolver, void*), void *ctx,PetscErrorCode (*dest)(void**))
1397*a7e14dcfSSatish Balay {
1398*a7e14dcfSSatish Balay   PetscFunctionBegin;
1399*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1400*a7e14dcfSSatish Balay   if (tao->numbermonitors >= MAXTAOMONITORS) {
1401*a7e14dcfSSatish Balay       SETERRQ1(PETSC_COMM_SELF,1,"Cannot attach another monitor -- max=",MAXTAOMONITORS);
1402*a7e14dcfSSatish Balay   }
1403*a7e14dcfSSatish Balay   tao->monitor[tao->numbermonitors] = func;
1404*a7e14dcfSSatish Balay   tao->monitorcontext[tao->numbermonitors] = ctx;
1405*a7e14dcfSSatish Balay   tao->monitordestroy[tao->numbermonitors] = dest;
1406*a7e14dcfSSatish Balay   ++tao->numbermonitors;
1407*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1408*a7e14dcfSSatish Balay }
1409*a7e14dcfSSatish Balay 
1410*a7e14dcfSSatish Balay #undef __FUNCT__
1411*a7e14dcfSSatish Balay #define __FUNCT__ "TaoCancelMonitors"
1412*a7e14dcfSSatish Balay /*@
1413*a7e14dcfSSatish Balay    TaoCancelMonitors - Clears all the monitor functions for a TaoSolver object.
1414*a7e14dcfSSatish Balay 
1415*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
1416*a7e14dcfSSatish Balay 
1417*a7e14dcfSSatish Balay    Input Parameters:
1418*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
1419*a7e14dcfSSatish Balay 
1420*a7e14dcfSSatish Balay    Options Database:
1421*a7e14dcfSSatish Balay .  -tao_cancelmonitors - cancels all monitors that have been hardwired
1422*a7e14dcfSSatish Balay     into a code by calls to TaoSetMonitor(), but does not cancel those
1423*a7e14dcfSSatish Balay     set via the options database
1424*a7e14dcfSSatish Balay 
1425*a7e14dcfSSatish Balay    Notes:
1426*a7e14dcfSSatish Balay    There is no way to clear one specific monitor from a TaoSolver object.
1427*a7e14dcfSSatish Balay 
1428*a7e14dcfSSatish Balay    Level: advanced
1429*a7e14dcfSSatish Balay 
1430*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor()
1431*a7e14dcfSSatish Balay @*/
1432*a7e14dcfSSatish Balay PetscErrorCode TaoCancelMonitors(TaoSolver tao)
1433*a7e14dcfSSatish Balay {
1434*a7e14dcfSSatish Balay   PetscInt i;
1435*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1436*a7e14dcfSSatish Balay   PetscFunctionBegin;
1437*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
1438*a7e14dcfSSatish Balay   for (i=0;i<tao->numbermonitors;i++) {
1439*a7e14dcfSSatish Balay     if (tao->monitordestroy[i]) {
1440*a7e14dcfSSatish Balay       ierr = (*tao->monitordestroy[i])(&tao->monitorcontext[i]); CHKERRQ(ierr);
1441*a7e14dcfSSatish Balay     }
1442*a7e14dcfSSatish Balay   }
1443*a7e14dcfSSatish Balay   tao->numbermonitors=0;
1444*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1445*a7e14dcfSSatish Balay }
1446*a7e14dcfSSatish Balay 
1447*a7e14dcfSSatish Balay 
1448*a7e14dcfSSatish Balay 
1449*a7e14dcfSSatish Balay #undef __FUNCT__
1450*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultMonitor"
1451*a7e14dcfSSatish Balay /*@C
1452*a7e14dcfSSatish Balay    TaoDefaultMonitor - Default routine for monitoring progress of the
1453*a7e14dcfSSatish Balay    TaoSolver solvers (default).  This monitor prints the function value and gradient
1454*a7e14dcfSSatish Balay    norm at each iteration.  It can be turned on from the command line using the
1455*a7e14dcfSSatish Balay    -tao_monitor option
1456*a7e14dcfSSatish Balay 
1457*a7e14dcfSSatish Balay    Collective on TaoSolver
1458*a7e14dcfSSatish Balay 
1459*a7e14dcfSSatish Balay    Input Parameters:
1460*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1461*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1462*a7e14dcfSSatish Balay 
1463*a7e14dcfSSatish Balay    Options Database Keys:
1464*a7e14dcfSSatish Balay .  -tao_monitor
1465*a7e14dcfSSatish Balay 
1466*a7e14dcfSSatish Balay    Level: advanced
1467*a7e14dcfSSatish Balay 
1468*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor()
1469*a7e14dcfSSatish Balay @*/
1470*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultMonitor(TaoSolver tao, void *ctx)
1471*a7e14dcfSSatish Balay {
1472*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1473*a7e14dcfSSatish Balay   PetscInt its;
1474*a7e14dcfSSatish Balay   PetscReal fct,gnorm;
1475*a7e14dcfSSatish Balay   PetscViewer viewer;
1476*a7e14dcfSSatish Balay   PetscFunctionBegin;
1477*a7e14dcfSSatish Balay   if (ctx) {
1478*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1479*a7e14dcfSSatish Balay   } else {
1480*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1481*a7e14dcfSSatish Balay   }
1482*a7e14dcfSSatish Balay   its=tao->niter;
1483*a7e14dcfSSatish Balay   fct=tao->fc;
1484*a7e14dcfSSatish Balay   gnorm=tao->residual;
1485*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer,"iter = %3D,",its); CHKERRQ(ierr);
1486*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer," Function value: %G,",fct); CHKERRQ(ierr);
1487*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer,"  Residual: %G \n",gnorm);CHKERRQ(ierr);
1488*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1489*a7e14dcfSSatish Balay }
1490*a7e14dcfSSatish Balay 
1491*a7e14dcfSSatish Balay 
1492*a7e14dcfSSatish Balay 
1493*a7e14dcfSSatish Balay #undef __FUNCT__
1494*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultSMonitor"
1495*a7e14dcfSSatish Balay /*@C
1496*a7e14dcfSSatish Balay    TaoDefaultSMonitor - Default routine for monitoring progress of the
1497*a7e14dcfSSatish Balay    solver. Same as TaoDefaultMonitor() except
1498*a7e14dcfSSatish Balay    it prints fewer digits of the residual as the residual gets smaller.
1499*a7e14dcfSSatish Balay    This is because the later digits are meaningless and are often
1500*a7e14dcfSSatish Balay    different on different machines; by using this routine different
1501*a7e14dcfSSatish Balay    machines will usually generate the same output. It can be turned on
1502*a7e14dcfSSatish Balay    by using the -tao_smonitor option
1503*a7e14dcfSSatish Balay 
1504*a7e14dcfSSatish Balay    Collective on TaoSolver
1505*a7e14dcfSSatish Balay 
1506*a7e14dcfSSatish Balay    Input Parameters:
1507*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1508*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1509*a7e14dcfSSatish Balay 
1510*a7e14dcfSSatish Balay    Options Database Keys:
1511*a7e14dcfSSatish Balay .  -tao_smonitor
1512*a7e14dcfSSatish Balay 
1513*a7e14dcfSSatish Balay    Level: advanced
1514*a7e14dcfSSatish Balay 
1515*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor()
1516*a7e14dcfSSatish Balay @*/
1517*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultSMonitor(TaoSolver tao, void *ctx)
1518*a7e14dcfSSatish Balay {
1519*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1520*a7e14dcfSSatish Balay   PetscInt its;
1521*a7e14dcfSSatish Balay   PetscReal fct,gnorm;
1522*a7e14dcfSSatish Balay   PetscViewer viewer;
1523*a7e14dcfSSatish Balay   PetscFunctionBegin;
1524*a7e14dcfSSatish Balay   if (ctx) {
1525*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1526*a7e14dcfSSatish Balay   } else {
1527*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1528*a7e14dcfSSatish Balay   }
1529*a7e14dcfSSatish Balay   its=tao->niter;
1530*a7e14dcfSSatish Balay   fct=tao->fc;
1531*a7e14dcfSSatish Balay   gnorm=tao->residual;
1532*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer,"iter = %3D,",its); CHKERRQ(ierr);
1533*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer," Function value %G,",fct); CHKERRQ(ierr);
1534*a7e14dcfSSatish Balay   if (gnorm > 1.e-6) {
1535*a7e14dcfSSatish Balay     ierr=PetscViewerASCIIPrintf(viewer," Residual: %G \n",gnorm);CHKERRQ(ierr);
1536*a7e14dcfSSatish Balay   } else if (gnorm > 1.e-11) {
1537*a7e14dcfSSatish Balay     ierr=PetscViewerASCIIPrintf(viewer," Residual: < 1.0e-6 \n"); CHKERRQ(ierr);
1538*a7e14dcfSSatish Balay   } else {
1539*a7e14dcfSSatish Balay     ierr=PetscViewerASCIIPrintf(viewer," Residual: < 1.0e-11 \n");CHKERRQ(ierr);
1540*a7e14dcfSSatish Balay   }
1541*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1542*a7e14dcfSSatish Balay }
1543*a7e14dcfSSatish Balay 
1544*a7e14dcfSSatish Balay 
1545*a7e14dcfSSatish Balay #undef __FUNCT__
1546*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultCMonitor"
1547*a7e14dcfSSatish Balay /*@C
1548*a7e14dcfSSatish Balay    TaoDefaultCMonitor - same as TaoDefaultMonitor() except
1549*a7e14dcfSSatish Balay    it prints the norm of the constraints function. It can be turned on
1550*a7e14dcfSSatish Balay    from the command line using the -tao_cmonitor option
1551*a7e14dcfSSatish Balay 
1552*a7e14dcfSSatish Balay    Collective on TaoSolver
1553*a7e14dcfSSatish Balay 
1554*a7e14dcfSSatish Balay    Input Parameters:
1555*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1556*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1557*a7e14dcfSSatish Balay 
1558*a7e14dcfSSatish Balay    Options Database Keys:
1559*a7e14dcfSSatish Balay .  -tao_cmonitor
1560*a7e14dcfSSatish Balay 
1561*a7e14dcfSSatish Balay    Level: advanced
1562*a7e14dcfSSatish Balay 
1563*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor()
1564*a7e14dcfSSatish Balay @*/
1565*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultCMonitor(TaoSolver tao, void *ctx)
1566*a7e14dcfSSatish Balay {
1567*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1568*a7e14dcfSSatish Balay   PetscInt its;
1569*a7e14dcfSSatish Balay   PetscReal fct,gnorm;
1570*a7e14dcfSSatish Balay   PetscViewer viewer;
1571*a7e14dcfSSatish Balay 
1572*a7e14dcfSSatish Balay   PetscFunctionBegin;
1573*a7e14dcfSSatish Balay   if (ctx) {
1574*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1575*a7e14dcfSSatish Balay   } else {
1576*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1577*a7e14dcfSSatish Balay   }
1578*a7e14dcfSSatish Balay   its=tao->niter;
1579*a7e14dcfSSatish Balay   fct=tao->fc;
1580*a7e14dcfSSatish Balay   gnorm=tao->residual;
1581*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer,"iter = %D,",its); CHKERRQ(ierr);
1582*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer," Function value: %G,",fct); CHKERRQ(ierr);
1583*a7e14dcfSSatish Balay   ierr=PetscViewerASCIIPrintf(viewer,"  Residual: %G ",gnorm);CHKERRQ(ierr);
1584*a7e14dcfSSatish Balay   ierr = PetscViewerASCIIPrintf(viewer,"  Constraint: %G \n",tao->cnorm); CHKERRQ(ierr);
1585*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1586*a7e14dcfSSatish Balay }
1587*a7e14dcfSSatish Balay 
1588*a7e14dcfSSatish Balay 
1589*a7e14dcfSSatish Balay 
1590*a7e14dcfSSatish Balay 
1591*a7e14dcfSSatish Balay 
1592*a7e14dcfSSatish Balay #undef __FUNCT__
1593*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolutionMonitor"
1594*a7e14dcfSSatish Balay /*@C
1595*a7e14dcfSSatish Balay    TaoSolutionMonitor - Views the solution at each iteration
1596*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1597*a7e14dcfSSatish Balay    -tao_view_solution option
1598*a7e14dcfSSatish Balay 
1599*a7e14dcfSSatish Balay    Collective on TaoSolver
1600*a7e14dcfSSatish Balay 
1601*a7e14dcfSSatish Balay    Input Parameters:
1602*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1603*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1604*a7e14dcfSSatish Balay 
1605*a7e14dcfSSatish Balay    Options Database Keys:
1606*a7e14dcfSSatish Balay .  -tao_view_solution
1607*a7e14dcfSSatish Balay 
1608*a7e14dcfSSatish Balay    Level: advanced
1609*a7e14dcfSSatish Balay 
1610*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor()
1611*a7e14dcfSSatish Balay @*/
1612*a7e14dcfSSatish Balay PetscErrorCode TaoSolutionMonitor(TaoSolver tao, void *ctx)
1613*a7e14dcfSSatish Balay {
1614*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1615*a7e14dcfSSatish Balay   PetscViewer viewer;
1616*a7e14dcfSSatish Balay   PetscFunctionBegin;
1617*a7e14dcfSSatish Balay   if (ctx) {
1618*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1619*a7e14dcfSSatish Balay   } else {
1620*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1621*a7e14dcfSSatish Balay   }
1622*a7e14dcfSSatish Balay   ierr = VecView(tao->solution, viewer); CHKERRQ(ierr);
1623*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1624*a7e14dcfSSatish Balay }
1625*a7e14dcfSSatish Balay 
1626*a7e14dcfSSatish Balay #undef __FUNCT__
1627*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGradientMonitor"
1628*a7e14dcfSSatish Balay /*@C
1629*a7e14dcfSSatish Balay    TaoGradientMonitor - Views the gradient at each iteration
1630*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1631*a7e14dcfSSatish Balay    -tao_view_gradient option
1632*a7e14dcfSSatish Balay 
1633*a7e14dcfSSatish Balay    Collective on TaoSolver
1634*a7e14dcfSSatish Balay 
1635*a7e14dcfSSatish Balay    Input Parameters:
1636*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1637*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1638*a7e14dcfSSatish Balay 
1639*a7e14dcfSSatish Balay    Options Database Keys:
1640*a7e14dcfSSatish Balay .  -tao_view_gradient
1641*a7e14dcfSSatish Balay 
1642*a7e14dcfSSatish Balay    Level: advanced
1643*a7e14dcfSSatish Balay 
1644*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor()
1645*a7e14dcfSSatish Balay @*/
1646*a7e14dcfSSatish Balay PetscErrorCode TaoGradientMonitor(TaoSolver tao, void *ctx)
1647*a7e14dcfSSatish Balay {
1648*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1649*a7e14dcfSSatish Balay   PetscViewer viewer;
1650*a7e14dcfSSatish Balay   PetscFunctionBegin;
1651*a7e14dcfSSatish Balay   if (ctx) {
1652*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1653*a7e14dcfSSatish Balay   } else {
1654*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1655*a7e14dcfSSatish Balay   }
1656*a7e14dcfSSatish Balay   ierr = VecView(tao->gradient, viewer); CHKERRQ(ierr);
1657*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1658*a7e14dcfSSatish Balay }
1659*a7e14dcfSSatish Balay 
1660*a7e14dcfSSatish Balay #undef __FUNCT__
1661*a7e14dcfSSatish Balay #define __FUNCT__ "TaoStepDirectionMonitor"
1662*a7e14dcfSSatish Balay /*@C
1663*a7e14dcfSSatish Balay    TaoStepDirectionMonitor - Views the gradient at each iteration
1664*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1665*a7e14dcfSSatish Balay    -tao_view_gradient option
1666*a7e14dcfSSatish Balay 
1667*a7e14dcfSSatish Balay    Collective on TaoSolver
1668*a7e14dcfSSatish Balay 
1669*a7e14dcfSSatish Balay    Input Parameters:
1670*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1671*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1672*a7e14dcfSSatish Balay 
1673*a7e14dcfSSatish Balay    Options Database Keys:
1674*a7e14dcfSSatish Balay .  -tao_view_gradient
1675*a7e14dcfSSatish Balay 
1676*a7e14dcfSSatish Balay    Level: advanced
1677*a7e14dcfSSatish Balay 
1678*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor()
1679*a7e14dcfSSatish Balay @*/
1680*a7e14dcfSSatish Balay PetscErrorCode TaoStepDirectionMonitor(TaoSolver tao, void *ctx)
1681*a7e14dcfSSatish Balay {
1682*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1683*a7e14dcfSSatish Balay   PetscViewer viewer;
1684*a7e14dcfSSatish Balay   PetscFunctionBegin;
1685*a7e14dcfSSatish Balay   if (ctx) {
1686*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1687*a7e14dcfSSatish Balay   } else {
1688*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1689*a7e14dcfSSatish Balay   }
1690*a7e14dcfSSatish Balay   ierr = VecView(tao->stepdirection, viewer); CHKERRQ(ierr);
1691*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1692*a7e14dcfSSatish Balay }
1693*a7e14dcfSSatish Balay 
1694*a7e14dcfSSatish Balay 
1695*a7e14dcfSSatish Balay #undef __FUNCT__
1696*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawSolutionMonitor"
1697*a7e14dcfSSatish Balay /*@C
1698*a7e14dcfSSatish Balay    TaoDrawSolutionMonitor - Plots the solution at each iteration
1699*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1700*a7e14dcfSSatish Balay    -tao_draw_solution option
1701*a7e14dcfSSatish Balay 
1702*a7e14dcfSSatish Balay    Collective on TaoSolver
1703*a7e14dcfSSatish Balay 
1704*a7e14dcfSSatish Balay    Input Parameters:
1705*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1706*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1707*a7e14dcfSSatish Balay 
1708*a7e14dcfSSatish Balay    Options Database Keys:
1709*a7e14dcfSSatish Balay .  -tao_draw_solution
1710*a7e14dcfSSatish Balay 
1711*a7e14dcfSSatish Balay    Level: advanced
1712*a7e14dcfSSatish Balay 
1713*a7e14dcfSSatish Balay .seealso: TaoSolutionMonitor(), TaoSetMonitor(), TaoDrawGradientMonitor
1714*a7e14dcfSSatish Balay @*/
1715*a7e14dcfSSatish Balay PetscErrorCode TaoDrawSolutionMonitor(TaoSolver tao, void *ctx)
1716*a7e14dcfSSatish Balay {
1717*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1718*a7e14dcfSSatish Balay   PetscViewer viewer = (PetscViewer) ctx;
1719*a7e14dcfSSatish Balay   MPI_Comm comm;
1720*a7e14dcfSSatish Balay   PetscFunctionBegin;
1721*a7e14dcfSSatish Balay   if (!viewer) {
1722*a7e14dcfSSatish Balay     ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr);
1723*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_DRAW_(comm);
1724*a7e14dcfSSatish Balay   }
1725*a7e14dcfSSatish Balay   ierr = VecView(tao->solution, viewer); CHKERRQ(ierr);
1726*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1727*a7e14dcfSSatish Balay }
1728*a7e14dcfSSatish Balay 
1729*a7e14dcfSSatish Balay #undef __FUNCT__
1730*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawGradientMonitor"
1731*a7e14dcfSSatish Balay /*@C
1732*a7e14dcfSSatish Balay    TaoDrawGradientMonitor - Plots the gradient at each iteration
1733*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1734*a7e14dcfSSatish Balay    -tao_draw_gradient option
1735*a7e14dcfSSatish Balay 
1736*a7e14dcfSSatish Balay    Collective on TaoSolver
1737*a7e14dcfSSatish Balay 
1738*a7e14dcfSSatish Balay    Input Parameters:
1739*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1740*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1741*a7e14dcfSSatish Balay 
1742*a7e14dcfSSatish Balay    Options Database Keys:
1743*a7e14dcfSSatish Balay .  -tao_draw_gradient
1744*a7e14dcfSSatish Balay 
1745*a7e14dcfSSatish Balay    Level: advanced
1746*a7e14dcfSSatish Balay 
1747*a7e14dcfSSatish Balay .seealso: TaoGradientMonitor(), TaoSetMonitor(), TaoDrawSolutionMonitor
1748*a7e14dcfSSatish Balay @*/
1749*a7e14dcfSSatish Balay PetscErrorCode TaoDrawGradientMonitor(TaoSolver tao, void *ctx)
1750*a7e14dcfSSatish Balay {
1751*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1752*a7e14dcfSSatish Balay   PetscViewer viewer = (PetscViewer)ctx;
1753*a7e14dcfSSatish Balay   MPI_Comm comm;
1754*a7e14dcfSSatish Balay   PetscFunctionBegin;
1755*a7e14dcfSSatish Balay   if (!viewer) {
1756*a7e14dcfSSatish Balay     ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr);
1757*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_DRAW_(comm);
1758*a7e14dcfSSatish Balay   }
1759*a7e14dcfSSatish Balay   ierr = VecView(tao->gradient, viewer); CHKERRQ(ierr);
1760*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1761*a7e14dcfSSatish Balay }
1762*a7e14dcfSSatish Balay 
1763*a7e14dcfSSatish Balay #undef __FUNCT__
1764*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawStepMonitor"
1765*a7e14dcfSSatish Balay /*@C
1766*a7e14dcfSSatish Balay    TaoDrawStepMonitor - Plots the step direction at each iteration
1767*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1768*a7e14dcfSSatish Balay    -tao_draw_step option
1769*a7e14dcfSSatish Balay 
1770*a7e14dcfSSatish Balay    Collective on TaoSolver
1771*a7e14dcfSSatish Balay 
1772*a7e14dcfSSatish Balay    Input Parameters:
1773*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1774*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1775*a7e14dcfSSatish Balay 
1776*a7e14dcfSSatish Balay    Options Database Keys:
1777*a7e14dcfSSatish Balay .  -tao_draw_step
1778*a7e14dcfSSatish Balay 
1779*a7e14dcfSSatish Balay    Level: advanced
1780*a7e14dcfSSatish Balay 
1781*a7e14dcfSSatish Balay .seealso: TaoSetMonitor(), TaoDrawSolutionMonitor
1782*a7e14dcfSSatish Balay @*/
1783*a7e14dcfSSatish Balay PetscErrorCode TaoDrawStepMonitor(TaoSolver tao, void *ctx)
1784*a7e14dcfSSatish Balay {
1785*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1786*a7e14dcfSSatish Balay   PetscViewer viewer = (PetscViewer)(ctx);
1787*a7e14dcfSSatish Balay   MPI_Comm comm;
1788*a7e14dcfSSatish Balay   PetscFunctionBegin;
1789*a7e14dcfSSatish Balay   if (!viewer) {
1790*a7e14dcfSSatish Balay     ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr);
1791*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_DRAW_(comm);
1792*a7e14dcfSSatish Balay   }
1793*a7e14dcfSSatish Balay   ierr = VecView(tao->stepdirection, viewer); CHKERRQ(ierr);
1794*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1795*a7e14dcfSSatish Balay }
1796*a7e14dcfSSatish Balay 
1797*a7e14dcfSSatish Balay 
1798*a7e14dcfSSatish Balay #undef __FUNCT__
1799*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSeparableObjectiveMonitor"
1800*a7e14dcfSSatish Balay /*@C
1801*a7e14dcfSSatish Balay    TaoSeparableObjectiveMonitor - Views the separable objective function at each iteration
1802*a7e14dcfSSatish Balay    It can be turned on from the command line using the
1803*a7e14dcfSSatish Balay    -tao_view_separableobjective option
1804*a7e14dcfSSatish Balay 
1805*a7e14dcfSSatish Balay    Collective on TaoSolver
1806*a7e14dcfSSatish Balay 
1807*a7e14dcfSSatish Balay    Input Parameters:
1808*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1809*a7e14dcfSSatish Balay -  ctx - PetscViewer context or PETSC_NULL
1810*a7e14dcfSSatish Balay 
1811*a7e14dcfSSatish Balay    Options Database Keys:
1812*a7e14dcfSSatish Balay .  -tao_view_separableobjective
1813*a7e14dcfSSatish Balay 
1814*a7e14dcfSSatish Balay    Level: advanced
1815*a7e14dcfSSatish Balay 
1816*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor()
1817*a7e14dcfSSatish Balay @*/
1818*a7e14dcfSSatish Balay PetscErrorCode TaoSeparableObjectiveMonitor(TaoSolver tao, void *ctx)
1819*a7e14dcfSSatish Balay {
1820*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1821*a7e14dcfSSatish Balay   PetscViewer viewer;
1822*a7e14dcfSSatish Balay   PetscFunctionBegin;
1823*a7e14dcfSSatish Balay   if (ctx) {
1824*a7e14dcfSSatish Balay     viewer = (PetscViewer)ctx;
1825*a7e14dcfSSatish Balay   } else {
1826*a7e14dcfSSatish Balay     viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
1827*a7e14dcfSSatish Balay   }
1828*a7e14dcfSSatish Balay   ierr = VecView(tao->sep_objective,viewer); CHKERRQ(ierr);
1829*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1830*a7e14dcfSSatish Balay }
1831*a7e14dcfSSatish Balay 
1832*a7e14dcfSSatish Balay #undef __FUNCT__
1833*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultConvergenceTest"
1834*a7e14dcfSSatish Balay /*@C
1835*a7e14dcfSSatish Balay    TaoDefaultConvergenceTest - Determines whether the solver should continue iterating
1836*a7e14dcfSSatish Balay    or terminate.
1837*a7e14dcfSSatish Balay 
1838*a7e14dcfSSatish Balay    Collective on TaoSolver
1839*a7e14dcfSSatish Balay 
1840*a7e14dcfSSatish Balay    Input Parameters:
1841*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1842*a7e14dcfSSatish Balay -  dummy - unused dummy context
1843*a7e14dcfSSatish Balay 
1844*a7e14dcfSSatish Balay    Output Parameter:
1845*a7e14dcfSSatish Balay .  reason - for terminating
1846*a7e14dcfSSatish Balay 
1847*a7e14dcfSSatish Balay    Notes:
1848*a7e14dcfSSatish Balay    This routine checks the residual in the optimality conditions, the
1849*a7e14dcfSSatish Balay    relative residual in the optimity conditions, the number of function
1850*a7e14dcfSSatish Balay    evaluations, and the function value to test convergence.  Some
1851*a7e14dcfSSatish Balay    solvers may use different convergence routines.
1852*a7e14dcfSSatish Balay 
1853*a7e14dcfSSatish Balay    Level: developer
1854*a7e14dcfSSatish Balay 
1855*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(),TaoGetTerminationReason(),TaoSetTerminationReason()
1856*a7e14dcfSSatish Balay @*/
1857*a7e14dcfSSatish Balay 
1858*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultConvergenceTest(TaoSolver tao,void *dummy)
1859*a7e14dcfSSatish Balay {
1860*a7e14dcfSSatish Balay   PetscInt niter=tao->niter, nfuncs=PetscMax(tao->nfuncs,tao->nfuncgrads);
1861*a7e14dcfSSatish Balay   PetscInt max_funcs=tao->max_funcs;
1862*a7e14dcfSSatish Balay   PetscReal gnorm=tao->residual, gnorm0=tao->gnorm0;
1863*a7e14dcfSSatish Balay   PetscReal f=tao->fc, steptol=tao->steptol,trradius=tao->step;
1864*a7e14dcfSSatish Balay   PetscReal gatol=tao->gatol,grtol=tao->grtol,gttol=tao->gttol;
1865*a7e14dcfSSatish Balay   PetscReal fatol=tao->fatol,frtol=tao->frtol,catol=tao->catol,crtol=tao->crtol;
1866*a7e14dcfSSatish Balay   PetscReal fmin=tao->fmin, cnorm=tao->cnorm, cnorm0=tao->cnorm0;
1867*a7e14dcfSSatish Balay   PetscReal gnorm2;
1868*a7e14dcfSSatish Balay   TaoSolverTerminationReason reason=tao->reason;
1869*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1870*a7e14dcfSSatish Balay 
1871*a7e14dcfSSatish Balay   PetscFunctionBegin;
1872*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao, TAOSOLVER_CLASSID,1);
1873*a7e14dcfSSatish Balay 
1874*a7e14dcfSSatish Balay   if (reason != TAO_CONTINUE_ITERATING) {
1875*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
1876*a7e14dcfSSatish Balay   }
1877*a7e14dcfSSatish Balay   gnorm2=gnorm*gnorm;
1878*a7e14dcfSSatish Balay 
1879*a7e14dcfSSatish Balay   if (PetscIsInfOrNanReal(f)) {
1880*a7e14dcfSSatish Balay     ierr = PetscInfo(tao,"Failed to converged, function value is Inf or NaN\n"); CHKERRQ(ierr);
1881*a7e14dcfSSatish Balay     reason = TAO_DIVERGED_NAN;
1882*a7e14dcfSSatish Balay   } else if (f <= fmin && cnorm <=catol) {
1883*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to function value %G < minimum function value %G\n", f,fmin); CHKERRQ(ierr);
1884*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_MINF;
1885*a7e14dcfSSatish Balay   } else if (gnorm2 <= fatol && cnorm <=catol) {
1886*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to estimated f(X) - f(X*) = %G < %G\n",gnorm2,fatol); CHKERRQ(ierr);
1887*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_FATOL;
1888*a7e14dcfSSatish Balay   } else if (f != 0 && gnorm2 / PetscAbsReal(f)<= frtol && cnorm/PetscMax(cnorm0,1.0) <= crtol) {
1889*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to estimated |f(X)-f(X*)|/f(X) = %G < %G\n",gnorm2/PetscAbsReal(f),frtol); CHKERRQ(ierr);
1890*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_FRTOL;
1891*a7e14dcfSSatish Balay   } else if (gnorm<= gatol && cnorm <=catol) {
1892*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to residual norm ||g(X)||=%G < %G\n",gnorm,gatol); CHKERRQ(ierr);
1893*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_GATOL;
1894*a7e14dcfSSatish Balay   } else if ( f!=0 && PetscAbsReal(gnorm/f) <= grtol && cnorm <= crtol) {
1895*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to residual ||g(X)||/|f(X)| =%G < %G\n",gnorm/f,grtol); CHKERRQ(ierr);
1896*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_GRTOL;
1897*a7e14dcfSSatish Balay   } else if (gnorm0 != 0 && gnorm/gnorm0 <= gttol && cnorm <= crtol) {
1898*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Converged due to relative residual norm ||g(X)||/||g(X0)|| = %G < %G\n",gnorm/gnorm0,gttol); CHKERRQ(ierr);
1899*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_GTTOL;
1900*a7e14dcfSSatish Balay   } else if (nfuncs > max_funcs){
1901*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Exceeded maximum number of function evaluations: %D > %D\n", nfuncs,max_funcs); CHKERRQ(ierr);
1902*a7e14dcfSSatish Balay     reason = TAO_DIVERGED_MAXFCN;
1903*a7e14dcfSSatish Balay   } else if ( tao->lsflag != 0 ){
1904*a7e14dcfSSatish Balay     ierr = PetscInfo(tao,"Tao Line Search failure.\n"); CHKERRQ(ierr);
1905*a7e14dcfSSatish Balay     reason = TAO_DIVERGED_LS_FAILURE;
1906*a7e14dcfSSatish Balay   } else if (trradius < steptol && niter > 0){
1907*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Trust region/step size too small: %G < %G\n", trradius,steptol); CHKERRQ(ierr);
1908*a7e14dcfSSatish Balay     reason = TAO_CONVERGED_STEPTOL;
1909*a7e14dcfSSatish Balay   } else if (niter > tao->max_it) {
1910*a7e14dcfSSatish Balay     ierr = PetscInfo2(tao,"Exceeded maximum number of iterations: %D > %D\n",niter,tao->max_it); CHKERRQ(ierr);
1911*a7e14dcfSSatish Balay     reason = TAO_DIVERGED_MAXITS;
1912*a7e14dcfSSatish Balay   } else {
1913*a7e14dcfSSatish Balay     reason = TAO_CONTINUE_ITERATING;
1914*a7e14dcfSSatish Balay   }
1915*a7e14dcfSSatish Balay   tao->reason = reason;
1916*a7e14dcfSSatish Balay 
1917*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1918*a7e14dcfSSatish Balay }
1919*a7e14dcfSSatish Balay 
1920*a7e14dcfSSatish Balay #undef __FUNCT__
1921*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetOptionsPrefix"
1922*a7e14dcfSSatish Balay /*@C
1923*a7e14dcfSSatish Balay    TaoSetOptionsPrefix - Sets the prefix used for searching for all
1924*a7e14dcfSSatish Balay    TAO options in the database.
1925*a7e14dcfSSatish Balay 
1926*a7e14dcfSSatish Balay 
1927*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
1928*a7e14dcfSSatish Balay 
1929*a7e14dcfSSatish Balay    Input Parameters:
1930*a7e14dcfSSatish Balay +  tao - the TaoSolver context
1931*a7e14dcfSSatish Balay -  prefix - the prefix string to prepend to all TAO option requests
1932*a7e14dcfSSatish Balay 
1933*a7e14dcfSSatish Balay    Notes:
1934*a7e14dcfSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
1935*a7e14dcfSSatish Balay    The first character of all runtime options is AUTOMATICALLY the hyphen.
1936*a7e14dcfSSatish Balay 
1937*a7e14dcfSSatish Balay    For example, to distinguish between the runtime options for two
1938*a7e14dcfSSatish Balay    different TAO solvers, one could call
1939*a7e14dcfSSatish Balay .vb
1940*a7e14dcfSSatish Balay       TaoSetOptionsPrefix(tao1,"sys1_")
1941*a7e14dcfSSatish Balay       TaoSetOptionsPrefix(tao2,"sys2_")
1942*a7e14dcfSSatish Balay .ve
1943*a7e14dcfSSatish Balay 
1944*a7e14dcfSSatish Balay    This would enable use of different options for each system, such as
1945*a7e14dcfSSatish Balay .vb
1946*a7e14dcfSSatish Balay       -sys1_tao_method blmvm -sys1_tao_gtol 1.e-3
1947*a7e14dcfSSatish Balay       -sys2_tao_method lmvm  -sys2_tao_gtol 1.e-4
1948*a7e14dcfSSatish Balay .ve
1949*a7e14dcfSSatish Balay 
1950*a7e14dcfSSatish Balay 
1951*a7e14dcfSSatish Balay    Level: advanced
1952*a7e14dcfSSatish Balay 
1953*a7e14dcfSSatish Balay .seealso: TaoAppendOptionsPrefix(), TaoGetOptionsPrefix()
1954*a7e14dcfSSatish Balay @*/
1955*a7e14dcfSSatish Balay 
1956*a7e14dcfSSatish Balay PetscErrorCode TaoSetOptionsPrefix(TaoSolver tao, const char p[])
1957*a7e14dcfSSatish Balay {
1958*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1959*a7e14dcfSSatish Balay   PetscFunctionBegin;
1960*a7e14dcfSSatish Balay   ierr = PetscObjectSetOptionsPrefix((PetscObject)tao,p); CHKERRQ(ierr);
1961*a7e14dcfSSatish Balay   if (tao->linesearch) {
1962*a7e14dcfSSatish Balay     ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,p); CHKERRQ(ierr);
1963*a7e14dcfSSatish Balay   }
1964*a7e14dcfSSatish Balay   if (tao->ksp) {
1965*a7e14dcfSSatish Balay     ierr = KSPSetOptionsPrefix(tao->ksp,p); CHKERRQ(ierr);
1966*a7e14dcfSSatish Balay   }
1967*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
1968*a7e14dcfSSatish Balay }
1969*a7e14dcfSSatish Balay 
1970*a7e14dcfSSatish Balay #undef __FUNCT__
1971*a7e14dcfSSatish Balay #define __FUNCT__ "TaoAppendOptionsPrefix"
1972*a7e14dcfSSatish Balay /*@C
1973*a7e14dcfSSatish Balay    TaoAppendOptionsPrefix - Appends to the prefix used for searching for all
1974*a7e14dcfSSatish Balay    TAO options in the database.
1975*a7e14dcfSSatish Balay 
1976*a7e14dcfSSatish Balay 
1977*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
1978*a7e14dcfSSatish Balay 
1979*a7e14dcfSSatish Balay    Input Parameters:
1980*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
1981*a7e14dcfSSatish Balay -  prefix - the prefix string to prepend to all TAO option requests
1982*a7e14dcfSSatish Balay 
1983*a7e14dcfSSatish Balay    Notes:
1984*a7e14dcfSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
1985*a7e14dcfSSatish Balay    The first character of all runtime options is AUTOMATICALLY the hyphen.
1986*a7e14dcfSSatish Balay 
1987*a7e14dcfSSatish Balay 
1988*a7e14dcfSSatish Balay    Level: advanced
1989*a7e14dcfSSatish Balay 
1990*a7e14dcfSSatish Balay .seealso: TaoSetOptionsPrefix(), TaoGetOptionsPrefix()
1991*a7e14dcfSSatish Balay @*/
1992*a7e14dcfSSatish Balay PetscErrorCode TaoAppendOptionsPrefix(TaoSolver tao, const char p[])
1993*a7e14dcfSSatish Balay {
1994*a7e14dcfSSatish Balay   PetscErrorCode ierr;
1995*a7e14dcfSSatish Balay   PetscFunctionBegin;
1996*a7e14dcfSSatish Balay   ierr = PetscObjectAppendOptionsPrefix((PetscObject)tao,p); CHKERRQ(ierr);
1997*a7e14dcfSSatish Balay   if (tao->linesearch) {
1998*a7e14dcfSSatish Balay     ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,p); CHKERRQ(ierr);
1999*a7e14dcfSSatish Balay   }
2000*a7e14dcfSSatish Balay   if (tao->ksp) {
2001*a7e14dcfSSatish Balay     ierr = KSPSetOptionsPrefix(tao->ksp,p); CHKERRQ(ierr);
2002*a7e14dcfSSatish Balay   }
2003*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2004*a7e14dcfSSatish Balay }
2005*a7e14dcfSSatish Balay 
2006*a7e14dcfSSatish Balay #undef __FUNCT__
2007*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetOptionsPrefix"
2008*a7e14dcfSSatish Balay /*@C
2009*a7e14dcfSSatish Balay   TaoGetOptionsPrefix - Gets the prefix used for searching for all
2010*a7e14dcfSSatish Balay   TAO options in the database
2011*a7e14dcfSSatish Balay 
2012*a7e14dcfSSatish Balay   Not Collective
2013*a7e14dcfSSatish Balay 
2014*a7e14dcfSSatish Balay   Input Parameters:
2015*a7e14dcfSSatish Balay . tao - the TaoSolver context
2016*a7e14dcfSSatish Balay 
2017*a7e14dcfSSatish Balay   Output Parameters:
2018*a7e14dcfSSatish Balay . prefix - pointer to the prefix string used is returned
2019*a7e14dcfSSatish Balay 
2020*a7e14dcfSSatish Balay   Notes: On the fortran side, the user should pass in a string 'prefix' of
2021*a7e14dcfSSatish Balay   sufficient length to hold the prefix.
2022*a7e14dcfSSatish Balay 
2023*a7e14dcfSSatish Balay   Level: advanced
2024*a7e14dcfSSatish Balay 
2025*a7e14dcfSSatish Balay .seealso: TaoSetOptionsPrefix(), TaoAppendOptionsPrefix()
2026*a7e14dcfSSatish Balay @*/
2027*a7e14dcfSSatish Balay PetscErrorCode TaoGetOptionsPrefix(TaoSolver tao, const char *p[])
2028*a7e14dcfSSatish Balay {
2029*a7e14dcfSSatish Balay    PetscObjectGetOptionsPrefix((PetscObject)tao,p);
2030*a7e14dcfSSatish Balay    return 0;
2031*a7e14dcfSSatish Balay }
2032*a7e14dcfSSatish Balay 
2033*a7e14dcfSSatish Balay #undef __FUNCT__
2034*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaultKSPType"
2035*a7e14dcfSSatish Balay /*@
2036*a7e14dcfSSatish Balay   TaoSetDefaultKSPType - Sets the default KSP type if a KSP object
2037*a7e14dcfSSatish Balay   is created.
2038*a7e14dcfSSatish Balay 
2039*a7e14dcfSSatish Balay   Logically Collective on TaoSolver
2040*a7e14dcfSSatish Balay 
2041*a7e14dcfSSatish Balay   InputParameters:
2042*a7e14dcfSSatish Balay + tao - the TaoSolver context
2043*a7e14dcfSSatish Balay - ktype - the KSP type TAO will use by default
2044*a7e14dcfSSatish Balay 
2045*a7e14dcfSSatish Balay   Note: Some solvers may require a particular KSP type and will not work
2046*a7e14dcfSSatish Balay   correctly if the default value is changed
2047*a7e14dcfSSatish Balay 
2048*a7e14dcfSSatish Balay   Options Database Key:
2049*a7e14dcfSSatish Balay - tao_ksp_type
2050*a7e14dcfSSatish Balay 
2051*a7e14dcfSSatish Balay   Level: advanced
2052*a7e14dcfSSatish Balay @*/
2053*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultKSPType(TaoSolver tao, KSPType ktype)
2054*a7e14dcfSSatish Balay {
2055*a7e14dcfSSatish Balay   const char *prefix=0;
2056*a7e14dcfSSatish Balay   char *option=0;
2057*a7e14dcfSSatish Balay   size_t n1,n2;
2058*a7e14dcfSSatish Balay   PetscErrorCode ierr;
2059*a7e14dcfSSatish Balay   PetscFunctionBegin;
2060*a7e14dcfSSatish Balay 
2061*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2062*a7e14dcfSSatish Balay   ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr);
2063*a7e14dcfSSatish Balay   ierr = PetscStrlen(prefix,&n1);
2064*a7e14dcfSSatish Balay   ierr = PetscStrlen("_ksp_type",&n2);
2065*a7e14dcfSSatish Balay   ierr = PetscMalloc(n1+n2+1,&option);
2066*a7e14dcfSSatish Balay   ierr = PetscStrncpy(option,prefix,n1+1);
2067*a7e14dcfSSatish Balay   ierr = PetscStrncat(option,"_ksp_type",n2+1);
2068*a7e14dcfSSatish Balay   ierr = PetscOptionsSetValue(option,ktype); CHKERRQ(ierr);
2069*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2070*a7e14dcfSSatish Balay }
2071*a7e14dcfSSatish Balay 
2072*a7e14dcfSSatish Balay #undef __FUNCT__
2073*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaulLineSearchType"
2074*a7e14dcfSSatish Balay /*@
2075*a7e14dcfSSatish Balay   TaoSetDefaultLineSearchType - Sets the default LineSearch type if a LineSearch object
2076*a7e14dcfSSatish Balay   is created.
2077*a7e14dcfSSatish Balay 
2078*a7e14dcfSSatish Balay   Logically Collective on TaoSolver
2079*a7e14dcfSSatish Balay 
2080*a7e14dcfSSatish Balay   InputParameters:
2081*a7e14dcfSSatish Balay + tao - the TaoSolver context
2082*a7e14dcfSSatish Balay - lstype - the line search type TAO will use by default
2083*a7e14dcfSSatish Balay 
2084*a7e14dcfSSatish Balay   Note: Some solvers may require a particular line search type and will not work
2085*a7e14dcfSSatish Balay   correctly if the default value is changed
2086*a7e14dcfSSatish Balay 
2087*a7e14dcfSSatish Balay   Options Database Key:
2088*a7e14dcfSSatish Balay - tao_ls_type
2089*a7e14dcfSSatish Balay 
2090*a7e14dcfSSatish Balay   Level: advanced
2091*a7e14dcfSSatish Balay @*/
2092*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultLineSearchType(TaoSolver tao, TaoLineSearchType lstype)
2093*a7e14dcfSSatish Balay {
2094*a7e14dcfSSatish Balay   const char *prefix=0;
2095*a7e14dcfSSatish Balay   char *option=0;
2096*a7e14dcfSSatish Balay   size_t n1,n2;
2097*a7e14dcfSSatish Balay   PetscErrorCode ierr;
2098*a7e14dcfSSatish Balay   PetscFunctionBegin;
2099*a7e14dcfSSatish Balay 
2100*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2101*a7e14dcfSSatish Balay   ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr);
2102*a7e14dcfSSatish Balay   ierr = PetscStrlen(prefix,&n1);
2103*a7e14dcfSSatish Balay   ierr = PetscStrlen("_ls_type",&n2);
2104*a7e14dcfSSatish Balay   ierr = PetscMalloc(n1+n2+1,&option);
2105*a7e14dcfSSatish Balay   ierr = PetscStrncpy(option,prefix,n1+1);
2106*a7e14dcfSSatish Balay   ierr = PetscStrncat(option,"_ls_type",n2+1);
2107*a7e14dcfSSatish Balay   ierr = PetscOptionsSetValue(option,lstype); CHKERRQ(ierr);
2108*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2109*a7e14dcfSSatish Balay }
2110*a7e14dcfSSatish Balay 
2111*a7e14dcfSSatish Balay #undef __FUNCT__
2112*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaultPCType"
2113*a7e14dcfSSatish Balay /*@
2114*a7e14dcfSSatish Balay   TaoSetDefaultPCType - Sets the default PC type if a PC object
2115*a7e14dcfSSatish Balay   is created.
2116*a7e14dcfSSatish Balay 
2117*a7e14dcfSSatish Balay   Logically Collective on TaoSolver
2118*a7e14dcfSSatish Balay 
2119*a7e14dcfSSatish Balay   InputParameters:
2120*a7e14dcfSSatish Balay + tao - the TaoSolver context
2121*a7e14dcfSSatish Balay - pctype - the preconditioner type TAO will use by default
2122*a7e14dcfSSatish Balay 
2123*a7e14dcfSSatish Balay   Note: Some solvers may require a particular PC type and will not work
2124*a7e14dcfSSatish Balay   correctly if the default value is changed
2125*a7e14dcfSSatish Balay 
2126*a7e14dcfSSatish Balay   Options Database Key:
2127*a7e14dcfSSatish Balay - tao_pc_type
2128*a7e14dcfSSatish Balay 
2129*a7e14dcfSSatish Balay   Level: advanced
2130*a7e14dcfSSatish Balay @*/
2131*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultPCType(TaoSolver tao, PCType pctype)
2132*a7e14dcfSSatish Balay {
2133*a7e14dcfSSatish Balay 
2134*a7e14dcfSSatish Balay   const char *prefix=0;
2135*a7e14dcfSSatish Balay   char *option=0;
2136*a7e14dcfSSatish Balay   size_t n1,n2;
2137*a7e14dcfSSatish Balay   PetscErrorCode ierr;
2138*a7e14dcfSSatish Balay   PetscFunctionBegin;
2139*a7e14dcfSSatish Balay 
2140*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2141*a7e14dcfSSatish Balay   ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr);
2142*a7e14dcfSSatish Balay   ierr = PetscStrlen(prefix,&n1);
2143*a7e14dcfSSatish Balay   ierr = PetscStrlen("_pc_type",&n2);
2144*a7e14dcfSSatish Balay   ierr = PetscMalloc(n1+n2+1,&option);
2145*a7e14dcfSSatish Balay   ierr = PetscStrncpy(option,prefix,n1+1);
2146*a7e14dcfSSatish Balay   ierr = PetscStrncat(option,"_pc_type",n2+1);
2147*a7e14dcfSSatish Balay   ierr = PetscOptionsSetValue(option,pctype); CHKERRQ(ierr);
2148*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2149*a7e14dcfSSatish Balay }
2150*a7e14dcfSSatish Balay 
2151*a7e14dcfSSatish Balay #undef __FUNCT__
2152*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetType"
2153*a7e14dcfSSatish Balay /*@C
2154*a7e14dcfSSatish Balay    TaoSetType - Sets the method for the unconstrained minimization solver.
2155*a7e14dcfSSatish Balay 
2156*a7e14dcfSSatish Balay    Collective on TaoSolver
2157*a7e14dcfSSatish Balay 
2158*a7e14dcfSSatish Balay    Input Parameters:
2159*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
2160*a7e14dcfSSatish Balay -  type - a known method
2161*a7e14dcfSSatish Balay 
2162*a7e14dcfSSatish Balay    Options Database Key:
2163*a7e14dcfSSatish Balay +  -tao_method <type> - Sets the method; use -help for a list
2164*a7e14dcfSSatish Balay    of available methods (for instance, "-tao_method tao_lmvm" or
2165*a7e14dcfSSatish Balay    "-tao_method tao_tron")
2166*a7e14dcfSSatish Balay -  -tao_type <type> - identical to -tao_method
2167*a7e14dcfSSatish Balay 
2168*a7e14dcfSSatish Balay    Available methods include:
2169*a7e14dcfSSatish Balay +    tao_nls - Newton's method with line search for unconstrained minimization
2170*a7e14dcfSSatish Balay .    tao_ntr - Newton's method with trust region for unconstrained minimization
2171*a7e14dcfSSatish Balay .    tao_ntl - Newton's method with trust region, line search for unconstrained minimization
2172*a7e14dcfSSatish Balay .    tao_lmvm - Limited memory variable metric method for unconstrained minimization
2173*a7e14dcfSSatish Balay .    tao_cg - Nonlinear conjugate gradient method for unconstrained minimization
2174*a7e14dcfSSatish Balay .    tao_nm - Nelder-Mead algorithm for derivate-free unconstrained minimization
2175*a7e14dcfSSatish Balay .    tao_tron - Newton Trust Region method for bound constrained minimization
2176*a7e14dcfSSatish Balay .    tao_gpcg - Newton Trust Region method for quadratic bound constrained minimization
2177*a7e14dcfSSatish Balay .    tao_blmvm - Limited memory variable metric method for bound constrained minimization
2178*a7e14dcfSSatish Balay +    tao_pounders - Model-based algorithm pounder extended for nonlinear least squares
2179*a7e14dcfSSatish Balay 
2180*a7e14dcfSSatish Balay   Level: intermediate
2181*a7e14dcfSSatish Balay 
2182*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoGetType()
2183*a7e14dcfSSatish Balay 
2184*a7e14dcfSSatish Balay @*/
2185*a7e14dcfSSatish Balay PetscErrorCode TaoSetType(TaoSolver tao, const TaoSolverType type)
2186*a7e14dcfSSatish Balay {
2187*a7e14dcfSSatish Balay     PetscErrorCode ierr;
2188*a7e14dcfSSatish Balay     PetscErrorCode (*create_xxx)(TaoSolver);
2189*a7e14dcfSSatish Balay     PetscBool  issame;
2190*a7e14dcfSSatish Balay 
2191*a7e14dcfSSatish Balay     PetscFunctionBegin;
2192*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2193*a7e14dcfSSatish Balay 
2194*a7e14dcfSSatish Balay     ierr = PetscObjectTypeCompare((PetscObject)tao,type,&issame); CHKERRQ(ierr);
2195*a7e14dcfSSatish Balay     if (issame) PetscFunctionReturn(0);
2196*a7e14dcfSSatish Balay 
2197*a7e14dcfSSatish Balay     ierr = PetscFunctionListFind(TaoSolverList, type, (void(**)(void))&create_xxx); CHKERRQ(ierr);
2198*a7e14dcfSSatish Balay     if (!create_xxx) {
2199*a7e14dcfSSatish Balay 	SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested TaoSolver type %s",type);
2200*a7e14dcfSSatish Balay     }
2201*a7e14dcfSSatish Balay 
2202*a7e14dcfSSatish Balay 
2203*a7e14dcfSSatish Balay     /* Destroy the existing solver information */
2204*a7e14dcfSSatish Balay     if (tao->ops->destroy) {
2205*a7e14dcfSSatish Balay 	ierr = (*tao->ops->destroy)(tao); CHKERRQ(ierr);
2206*a7e14dcfSSatish Balay     }
2207*a7e14dcfSSatish Balay     ierr = KSPDestroy(&tao->ksp); CHKERRQ(ierr);
2208*a7e14dcfSSatish Balay     ierr = TaoLineSearchDestroy(&tao->linesearch); CHKERRQ(ierr);
2209*a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->gradient); CHKERRQ(ierr);
2210*a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->stepdirection); CHKERRQ(ierr);
2211*a7e14dcfSSatish Balay 
2212*a7e14dcfSSatish Balay     tao->ops->setup = 0;
2213*a7e14dcfSSatish Balay     tao->ops->solve = 0;
2214*a7e14dcfSSatish Balay     tao->ops->view  = 0;
2215*a7e14dcfSSatish Balay     tao->ops->setfromoptions = 0;
2216*a7e14dcfSSatish Balay     tao->ops->destroy = 0;
2217*a7e14dcfSSatish Balay 
2218*a7e14dcfSSatish Balay     tao->setupcalled = PETSC_FALSE;
2219*a7e14dcfSSatish Balay 
2220*a7e14dcfSSatish Balay     ierr = (*create_xxx)(tao); CHKERRQ(ierr);
2221*a7e14dcfSSatish Balay     ierr = PetscObjectChangeTypeName((PetscObject)tao,type); CHKERRQ(ierr);
2222*a7e14dcfSSatish Balay 
2223*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2224*a7e14dcfSSatish Balay 
2225*a7e14dcfSSatish Balay }
2226*a7e14dcfSSatish Balay #undef __FUNCT__
2227*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolverRegister"
2228*a7e14dcfSSatish Balay /*MC
2229*a7e14dcfSSatish Balay    TaoSolverRegister - Adds a method to the TAO package for unconstrained minimization.
2230*a7e14dcfSSatish Balay 
2231*a7e14dcfSSatish Balay    Synopsis:
2232*a7e14dcfSSatish Balay    TaoSolverRegister(char *name_solver,char *path,char *name_Create,int (*routine_Create)(TaoSolver))
2233*a7e14dcfSSatish Balay 
2234*a7e14dcfSSatish Balay    Not collective
2235*a7e14dcfSSatish Balay 
2236*a7e14dcfSSatish Balay    Input Parameters:
2237*a7e14dcfSSatish Balay +  sname - name of a new user-defined solver
2238*a7e14dcfSSatish Balay -  func - routine to Create method context
2239*a7e14dcfSSatish Balay 
2240*a7e14dcfSSatish Balay    Notes:
2241*a7e14dcfSSatish Balay    TaoSolverRegister() may be called multiple times to add several user-defined solvers.
2242*a7e14dcfSSatish Balay 
2243*a7e14dcfSSatish Balay    Sample usage:
2244*a7e14dcfSSatish Balay .vb
2245*a7e14dcfSSatish Balay    TaoSolverRegister("my_solver",MySolverCreate);
2246*a7e14dcfSSatish Balay .ve
2247*a7e14dcfSSatish Balay 
2248*a7e14dcfSSatish Balay    Then, your solver can be chosen with the procedural interface via
2249*a7e14dcfSSatish Balay $     TaoSetType(tao,"my_solver")
2250*a7e14dcfSSatish Balay    or at runtime via the option
2251*a7e14dcfSSatish Balay $     -tao_method my_solver
2252*a7e14dcfSSatish Balay 
2253*a7e14dcfSSatish Balay    Level: advanced
2254*a7e14dcfSSatish Balay 
2255*a7e14dcfSSatish Balay .seealso: TaoSolverRegisterAll(), TaoSolverRegisterDestroy()
2256*a7e14dcfSSatish Balay M*/
2257*a7e14dcfSSatish Balay PetscErrorCode TaoSolverRegister(const char sname[], PetscErrorCode (*func)(TaoSolver))
2258*a7e14dcfSSatish Balay {
2259*a7e14dcfSSatish Balay     PetscErrorCode ierr;
2260*a7e14dcfSSatish Balay 
2261*a7e14dcfSSatish Balay     PetscFunctionBegin;
2262*a7e14dcfSSatish Balay     ierr = PetscFunctionListAdd(&TaoSolverList,sname, (void (*)(void))func); CHKERRQ(ierr);
2263*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2264*a7e14dcfSSatish Balay }
2265*a7e14dcfSSatish Balay 
2266*a7e14dcfSSatish Balay #undef __FUNCT__
2267*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolverRegisterDestroy"
2268*a7e14dcfSSatish Balay /*@C
2269*a7e14dcfSSatish Balay    TaoSolverRegisterDestroy - Frees the list of minimization solvers that were
2270*a7e14dcfSSatish Balay    registered by TaoSolverRegisterDynamic().
2271*a7e14dcfSSatish Balay 
2272*a7e14dcfSSatish Balay    Not Collective
2273*a7e14dcfSSatish Balay 
2274*a7e14dcfSSatish Balay    Level: advanced
2275*a7e14dcfSSatish Balay 
2276*a7e14dcfSSatish Balay .seealso: TaoSolverRegisterAll(), TaoSolverRegister()
2277*a7e14dcfSSatish Balay @*/
2278*a7e14dcfSSatish Balay PetscErrorCode TaoSolverRegisterDestroy(void)
2279*a7e14dcfSSatish Balay {
2280*a7e14dcfSSatish Balay     PetscErrorCode ierr;
2281*a7e14dcfSSatish Balay     PetscFunctionBegin;
2282*a7e14dcfSSatish Balay     ierr = PetscFunctionListDestroy(&TaoSolverList); CHKERRQ(ierr);
2283*a7e14dcfSSatish Balay     TaoSolverRegisterAllCalled = PETSC_FALSE;
2284*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2285*a7e14dcfSSatish Balay }
2286*a7e14dcfSSatish Balay #undef __FUNCT__
2287*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetTerminationReason"
2288*a7e14dcfSSatish Balay /*@
2289*a7e14dcfSSatish Balay   TaoSetTerminationReason - Sets the termination flag on a TaoSolver object
2290*a7e14dcfSSatish Balay 
2291*a7e14dcfSSatish Balay   Logically Collective on TaoSolver
2292*a7e14dcfSSatish Balay 
2293*a7e14dcfSSatish Balay   Input Parameters:
2294*a7e14dcfSSatish Balay + tao - the TaoSolver context
2295*a7e14dcfSSatish Balay - reason - one of
2296*a7e14dcfSSatish Balay $     TAO_CONVERGED_ATOL (2),
2297*a7e14dcfSSatish Balay $     TAO_CONVERGED_RTOL (3),
2298*a7e14dcfSSatish Balay $     TAO_CONVERGED_STEPTOL (4),
2299*a7e14dcfSSatish Balay $     TAO_CONVERGED_MINF (5),
2300*a7e14dcfSSatish Balay $     TAO_CONVERGED_USER (6),
2301*a7e14dcfSSatish Balay $     TAO_DIVERGED_MAXITS (-2),
2302*a7e14dcfSSatish Balay $     TAO_DIVERGED_NAN (-4),
2303*a7e14dcfSSatish Balay $     TAO_DIVERGED_MAXFCN (-5),
2304*a7e14dcfSSatish Balay $     TAO_DIVERGED_LS_FAILURE (-6),
2305*a7e14dcfSSatish Balay $     TAO_DIVERGED_TR_REDUCTION (-7),
2306*a7e14dcfSSatish Balay $     TAO_DIVERGED_USER (-8),
2307*a7e14dcfSSatish Balay $     TAO_CONTINUE_ITERATING (0)
2308*a7e14dcfSSatish Balay 
2309*a7e14dcfSSatish Balay    Level: intermediate
2310*a7e14dcfSSatish Balay 
2311*a7e14dcfSSatish Balay @*/
2312*a7e14dcfSSatish Balay PetscErrorCode TaoSetTerminationReason(TaoSolver tao, TaoSolverTerminationReason reason)
2313*a7e14dcfSSatish Balay {
2314*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2315*a7e14dcfSSatish Balay   PetscFunctionBegin;
2316*a7e14dcfSSatish Balay   tao->reason = reason;
2317*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2318*a7e14dcfSSatish Balay }
2319*a7e14dcfSSatish Balay 
2320*a7e14dcfSSatish Balay #undef __FUNCT__
2321*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetTerminationReason"
2322*a7e14dcfSSatish Balay /*@
2323*a7e14dcfSSatish Balay    TaoGetTerminationReason - Gets the reason the TaoSolver iteration was stopped.
2324*a7e14dcfSSatish Balay 
2325*a7e14dcfSSatish Balay    Not Collective
2326*a7e14dcfSSatish Balay 
2327*a7e14dcfSSatish Balay    Input Parameter:
2328*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
2329*a7e14dcfSSatish Balay 
2330*a7e14dcfSSatish Balay    Output Parameter:
2331*a7e14dcfSSatish Balay .  reason - one of
2332*a7e14dcfSSatish Balay 
2333*a7e14dcfSSatish Balay 
2334*a7e14dcfSSatish Balay $  TAO_CONVERGED_FATOL (1)           f(X)-f(X*) <= fatol
2335*a7e14dcfSSatish Balay $  TAO_CONVERGED_FRTOL (2)           |f(X) - f(X*)|/|f(X)| < frtol
2336*a7e14dcfSSatish Balay $  TAO_CONVERGED_GATOL (3)           ||g(X)|| < gatol
2337*a7e14dcfSSatish Balay $  TAO_CONVERGED_GRTOL (4)           ||g(X)|| / f(X)  < grtol
2338*a7e14dcfSSatish Balay $  TAO_CONVERGED_GTTOL (5)           ||g(X)|| / ||g(X0)|| < gttol
2339*a7e14dcfSSatish Balay $  TAO_CONVERGED_STEPTOL (6)         step size small
2340*a7e14dcfSSatish Balay $  TAO_CONVERGED_MINF (7)            F < F_min
2341*a7e14dcfSSatish Balay $  TAO_CONVERGED_USER (8)            User defined
2342*a7e14dcfSSatish Balay 
2343*a7e14dcfSSatish Balay $  TAO_DIVERGED_MAXITS (-2)          its > maxits
2344*a7e14dcfSSatish Balay $  TAO_DIVERGED_NAN (-4)             Numerical problems
2345*a7e14dcfSSatish Balay $  TAO_DIVERGED_MAXFCN (-5)          fevals > max_funcsals
2346*a7e14dcfSSatish Balay $  TAO_DIVERGED_LS_FAILURE (-6)      line search failure
2347*a7e14dcfSSatish Balay $  TAO_DIVERGED_TR_REDUCTION (-7)    trust region failure
2348*a7e14dcfSSatish Balay $  TAO_DIVERGED_USER(-8)             (user defined)
2349*a7e14dcfSSatish Balay 
2350*a7e14dcfSSatish Balay $  TAO_CONTINUE_ITERATING (0)
2351*a7e14dcfSSatish Balay 
2352*a7e14dcfSSatish Balay    where
2353*a7e14dcfSSatish Balay +  X - current solution
2354*a7e14dcfSSatish Balay .  X0 - initial guess
2355*a7e14dcfSSatish Balay .  f(X) - current function value
2356*a7e14dcfSSatish Balay .  f(X*) - true solution (estimated)
2357*a7e14dcfSSatish Balay .  g(X) - current gradient
2358*a7e14dcfSSatish Balay .  its - current iterate number
2359*a7e14dcfSSatish Balay .  maxits - maximum number of iterates
2360*a7e14dcfSSatish Balay .  fevals - number of function evaluations
2361*a7e14dcfSSatish Balay -  max_funcsals - maximum number of function evaluations
2362*a7e14dcfSSatish Balay 
2363*a7e14dcfSSatish Balay    Level: intermediate
2364*a7e14dcfSSatish Balay 
2365*a7e14dcfSSatish Balay .seealso: TaoSetConvergenceTest(), TaoSetTolerances()
2366*a7e14dcfSSatish Balay 
2367*a7e14dcfSSatish Balay @*/
2368*a7e14dcfSSatish Balay PetscErrorCode TaoGetTerminationReason(TaoSolver tao, TaoSolverTerminationReason *reason)
2369*a7e14dcfSSatish Balay {
2370*a7e14dcfSSatish Balay     PetscFunctionBegin;
2371*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2372*a7e14dcfSSatish Balay     PetscValidPointer(reason,2);
2373*a7e14dcfSSatish Balay     *reason = tao->reason;
2374*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2375*a7e14dcfSSatish Balay }
2376*a7e14dcfSSatish Balay 
2377*a7e14dcfSSatish Balay #undef __FUNCT__
2378*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetSolutionStatus"
2379*a7e14dcfSSatish Balay /*@
2380*a7e14dcfSSatish Balay   TaoGetSolutionStatus - Get the current iterate, objective value,
2381*a7e14dcfSSatish Balay   residual, infeasibility, and termination
2382*a7e14dcfSSatish Balay 
2383*a7e14dcfSSatish Balay   Not Collective
2384*a7e14dcfSSatish Balay 
2385*a7e14dcfSSatish Balay    Input Parameters:
2386*a7e14dcfSSatish Balay .  tao - the TaoSolver context
2387*a7e14dcfSSatish Balay 
2388*a7e14dcfSSatish Balay    Output Parameters:
2389*a7e14dcfSSatish Balay +  iterate - the current iterate number (>=0)
2390*a7e14dcfSSatish Balay .  f - the current function value
2391*a7e14dcfSSatish Balay .  gnorm - the square of the gradient norm, duality gap, or other measure
2392*a7e14dcfSSatish Balay indicating distance from optimality.
2393*a7e14dcfSSatish Balay .  cnorm - the infeasibility of the current solution with regard to the constraints.
2394*a7e14dcfSSatish Balay .  xdiff - the step length or trust region radius of the most recent iterate.
2395*a7e14dcfSSatish Balay -  reason - The termination reason, which can equal TAO_CONTINUE_ITERATING
2396*a7e14dcfSSatish Balay 
2397*a7e14dcfSSatish Balay    Level: intermediate
2398*a7e14dcfSSatish Balay 
2399*a7e14dcfSSatish Balay    Note:
2400*a7e14dcfSSatish Balay    TAO returns the values set by the solvers in the routine TaoMonitor().
2401*a7e14dcfSSatish Balay 
2402*a7e14dcfSSatish Balay    Note:
2403*a7e14dcfSSatish Balay    If any of the output arguments are set to PETSC_NULL, no corresponding value will be returned.
2404*a7e14dcfSSatish Balay 
2405*a7e14dcfSSatish Balay 
2406*a7e14dcfSSatish Balay .seealso: TaoMonitor(), TaoGetTerminationReason()
2407*a7e14dcfSSatish Balay @*/
2408*a7e14dcfSSatish Balay PetscErrorCode TaoGetSolutionStatus(TaoSolver tao, PetscInt *its, PetscReal *f, PetscReal *gnorm, PetscReal *cnorm, PetscReal *xdiff, TaoSolverTerminationReason *reason)
2409*a7e14dcfSSatish Balay {
2410*a7e14dcfSSatish Balay   PetscFunctionBegin;
2411*a7e14dcfSSatish Balay   if (its) *its=tao->niter;
2412*a7e14dcfSSatish Balay   if (f) *f=tao->fc;
2413*a7e14dcfSSatish Balay   if (gnorm) *gnorm=tao->residual;
2414*a7e14dcfSSatish Balay   if (cnorm) *cnorm=tao->cnorm;
2415*a7e14dcfSSatish Balay   if (reason) *reason=tao->reason;
2416*a7e14dcfSSatish Balay   if (xdiff) *xdiff=tao->step;
2417*a7e14dcfSSatish Balay 
2418*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2419*a7e14dcfSSatish Balay 
2420*a7e14dcfSSatish Balay }
2421*a7e14dcfSSatish Balay 
2422*a7e14dcfSSatish Balay 
2423*a7e14dcfSSatish Balay #undef __FUNCT__
2424*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetType"
2425*a7e14dcfSSatish Balay /*@C
2426*a7e14dcfSSatish Balay    TaoGetType - Gets the current TaoSolver algorithm.
2427*a7e14dcfSSatish Balay 
2428*a7e14dcfSSatish Balay    Not Collective
2429*a7e14dcfSSatish Balay 
2430*a7e14dcfSSatish Balay    Input Parameter:
2431*a7e14dcfSSatish Balay .  tao - the TaoSolver solver context
2432*a7e14dcfSSatish Balay 
2433*a7e14dcfSSatish Balay    Output Parameter:
2434*a7e14dcfSSatish Balay .  type - TaoSolver method
2435*a7e14dcfSSatish Balay 
2436*a7e14dcfSSatish Balay    Level: intermediate
2437*a7e14dcfSSatish Balay 
2438*a7e14dcfSSatish Balay @*/
2439*a7e14dcfSSatish Balay PetscErrorCode TaoGetType(TaoSolver tao, const TaoSolverType *type)
2440*a7e14dcfSSatish Balay {
2441*a7e14dcfSSatish Balay     PetscFunctionBegin;
2442*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2443*a7e14dcfSSatish Balay     PetscValidPointer(type,2);
2444*a7e14dcfSSatish Balay     *type=((PetscObject)tao)->type_name;
2445*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2446*a7e14dcfSSatish Balay }
2447*a7e14dcfSSatish Balay 
2448*a7e14dcfSSatish Balay #undef __FUNCT__
2449*a7e14dcfSSatish Balay #define __FUNCT__ "TaoMonitor"
2450*a7e14dcfSSatish Balay /*@C
2451*a7e14dcfSSatish Balay   TaoMonitor - Monitor the solver and the current solution.  This
2452*a7e14dcfSSatish Balay   routine will record the iteration number and residual statistics,
2453*a7e14dcfSSatish Balay   call any monitors specified by the user, and calls the convergence-check routine.
2454*a7e14dcfSSatish Balay 
2455*a7e14dcfSSatish Balay    Input Parameters:
2456*a7e14dcfSSatish Balay +  tao - the TaoSolver context
2457*a7e14dcfSSatish Balay .  its - the current iterate number (>=0)
2458*a7e14dcfSSatish Balay .  f - the current objective function value
2459*a7e14dcfSSatish Balay .  res - the gradient norm, square root of the duality gap, or other measure
2460*a7e14dcfSSatish Balay indicating distince from optimality.  This measure will be recorded and
2461*a7e14dcfSSatish Balay used for some termination tests.
2462*a7e14dcfSSatish Balay .  cnorm - the infeasibility of the current solution with regard to the constraints.
2463*a7e14dcfSSatish Balay -  steplength - multiple of the step direction added to the previous iterate.
2464*a7e14dcfSSatish Balay 
2465*a7e14dcfSSatish Balay    Output Parameters:
2466*a7e14dcfSSatish Balay .  reason - The termination reason, which can equal TAO_CONTINUE_ITERATING
2467*a7e14dcfSSatish Balay 
2468*a7e14dcfSSatish Balay    Options Database Key:
2469*a7e14dcfSSatish Balay .  -tao_monitor - Use the default monitor, which prints statistics to standard output
2470*a7e14dcfSSatish Balay 
2471*a7e14dcfSSatish Balay .seealso TaoGetTerminationReason(), TaoDefaultMonitor(), TaoSetMonitor()
2472*a7e14dcfSSatish Balay 
2473*a7e14dcfSSatish Balay    Level: developer
2474*a7e14dcfSSatish Balay 
2475*a7e14dcfSSatish Balay @*/
2476*a7e14dcfSSatish Balay PetscErrorCode TaoMonitor(TaoSolver tao, PetscInt its, PetscReal f, PetscReal res, PetscReal cnorm, PetscReal steplength, TaoSolverTerminationReason *reason)
2477*a7e14dcfSSatish Balay {
2478*a7e14dcfSSatish Balay     PetscErrorCode ierr;
2479*a7e14dcfSSatish Balay     int i;
2480*a7e14dcfSSatish Balay     PetscFunctionBegin;
2481*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2482*a7e14dcfSSatish Balay     tao->fc = f;
2483*a7e14dcfSSatish Balay     tao->residual = res;
2484*a7e14dcfSSatish Balay     tao->cnorm = cnorm;
2485*a7e14dcfSSatish Balay     tao->step = steplength;
2486*a7e14dcfSSatish Balay     tao->niter=its;
2487*a7e14dcfSSatish Balay     if (its == 0) {
2488*a7e14dcfSSatish Balay       tao->cnorm0 = cnorm; tao->gnorm0 = res;
2489*a7e14dcfSSatish Balay     }
2490*a7e14dcfSSatish Balay     TaoLogHistory(tao,f,res,cnorm);
2491*a7e14dcfSSatish Balay     if (PetscIsInfOrNanReal(f) || PetscIsInfOrNanReal(res)) {
2492*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,1, "User provided compute function generated Inf or NaN");
2493*a7e14dcfSSatish Balay     }
2494*a7e14dcfSSatish Balay     if (tao->ops->convergencetest) {
2495*a7e14dcfSSatish Balay       ierr = (*tao->ops->convergencetest)(tao,tao->cnvP); CHKERRQ(ierr);
2496*a7e14dcfSSatish Balay     }
2497*a7e14dcfSSatish Balay     for (i=0;i<tao->numbermonitors;i++) {
2498*a7e14dcfSSatish Balay       ierr = (*tao->monitor[i])(tao,tao->monitorcontext[i]); CHKERRQ(ierr);
2499*a7e14dcfSSatish Balay     }
2500*a7e14dcfSSatish Balay     *reason = tao->reason;
2501*a7e14dcfSSatish Balay 
2502*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
2503*a7e14dcfSSatish Balay 
2504*a7e14dcfSSatish Balay }
2505*a7e14dcfSSatish Balay 
2506*a7e14dcfSSatish Balay #undef __FUNCT__
2507*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHistory"
2508*a7e14dcfSSatish Balay /*@
2509*a7e14dcfSSatish Balay    TaoSetHistory - Sets the array used to hold the convergence history.
2510*a7e14dcfSSatish Balay 
2511*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
2512*a7e14dcfSSatish Balay 
2513*a7e14dcfSSatish Balay    Input Parameters:
2514*a7e14dcfSSatish Balay +  tao - the TaoSolver solver context
2515*a7e14dcfSSatish Balay .  obj   - array to hold objective value history
2516*a7e14dcfSSatish Balay .  resid - array to hold residual history
2517*a7e14dcfSSatish Balay .  cnorm - array to hold constraint violation history
2518*a7e14dcfSSatish Balay .  na  - size of obj, resid, and cnorm
2519*a7e14dcfSSatish Balay -  reset - PetscTrue indicates each new minimization resets the history counter to zero,
2520*a7e14dcfSSatish Balay            else it continues storing new values for new minimizations after the old ones
2521*a7e14dcfSSatish Balay 
2522*a7e14dcfSSatish Balay    Notes:
2523*a7e14dcfSSatish Balay    If set, TAO will fill the given arrays with the indicated
2524*a7e14dcfSSatish Balay    information at each iteration.  If no information is desired
2525*a7e14dcfSSatish Balay    for a given array, then PETSC_NULL may be used.
2526*a7e14dcfSSatish Balay 
2527*a7e14dcfSSatish Balay    This routine is useful, e.g., when running a code for purposes
2528*a7e14dcfSSatish Balay    of accurate performance monitoring, when no I/O should be done
2529*a7e14dcfSSatish Balay    during the section of code that is being timed.
2530*a7e14dcfSSatish Balay 
2531*a7e14dcfSSatish Balay    Level: intermediate
2532*a7e14dcfSSatish Balay 
2533*a7e14dcfSSatish Balay .seealso: TaoGetHistory()
2534*a7e14dcfSSatish Balay 
2535*a7e14dcfSSatish Balay @*/
2536*a7e14dcfSSatish Balay PetscErrorCode TaoSetHistory(TaoSolver tao, PetscReal *obj, PetscReal *resid, PetscReal *cnorm, PetscInt na,PetscBool reset)
2537*a7e14dcfSSatish Balay {
2538*a7e14dcfSSatish Balay   PetscFunctionBegin;
2539*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2540*a7e14dcfSSatish Balay   tao->hist_obj = obj;
2541*a7e14dcfSSatish Balay   tao->hist_resid = resid;
2542*a7e14dcfSSatish Balay   tao->hist_cnorm = cnorm;
2543*a7e14dcfSSatish Balay   tao->hist_max   = na;
2544*a7e14dcfSSatish Balay   tao->hist_reset = reset;
2545*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2546*a7e14dcfSSatish Balay }
2547*a7e14dcfSSatish Balay 
2548*a7e14dcfSSatish Balay #undef __FUNCT__
2549*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetHistory"
2550*a7e14dcfSSatish Balay /*@C
2551*a7e14dcfSSatish Balay    TaoGetHistory - Gets the array used to hold the convergence history.
2552*a7e14dcfSSatish Balay 
2553*a7e14dcfSSatish Balay    Collective on TaoSolver
2554*a7e14dcfSSatish Balay 
2555*a7e14dcfSSatish Balay    Input Parameter:
2556*a7e14dcfSSatish Balay .  tao - the TaoSolver context
2557*a7e14dcfSSatish Balay 
2558*a7e14dcfSSatish Balay    Output Parameters:
2559*a7e14dcfSSatish Balay +  obj   - array used to hold objective value history
2560*a7e14dcfSSatish Balay .  resid - array used to hold residual history
2561*a7e14dcfSSatish Balay .  cnorm - array used to hold constraint violation history
2562*a7e14dcfSSatish Balay -  nhist  - size of obj, resid, and cnorm (will be less than or equal to na given in TaoSetHistory)
2563*a7e14dcfSSatish Balay 
2564*a7e14dcfSSatish Balay 
2565*a7e14dcfSSatish Balay    Notes:
2566*a7e14dcfSSatish Balay     The calling sequence for this routine in Fortran is
2567*a7e14dcfSSatish Balay $   call TaoGetHistory(TaoSolver tao, integer nhist, integer info)
2568*a7e14dcfSSatish Balay 
2569*a7e14dcfSSatish Balay    This routine is useful, e.g., when running a code for purposes
2570*a7e14dcfSSatish Balay    of accurate performance monitoring, when no I/O should be done
2571*a7e14dcfSSatish Balay    during the section of code that is being timed.
2572*a7e14dcfSSatish Balay 
2573*a7e14dcfSSatish Balay    Level: advanced
2574*a7e14dcfSSatish Balay 
2575*a7e14dcfSSatish Balay .seealso: TaoSetHistory()
2576*a7e14dcfSSatish Balay 
2577*a7e14dcfSSatish Balay @*/
2578*a7e14dcfSSatish Balay PetscErrorCode TaoGetHistory(TaoSolver tao, PetscReal **obj, PetscReal **resid, PetscReal **cnorm, PetscInt *nhist)
2579*a7e14dcfSSatish Balay {
2580*a7e14dcfSSatish Balay   PetscFunctionBegin;
2581*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2582*a7e14dcfSSatish Balay   if (obj)   *obj   = tao->hist_obj;
2583*a7e14dcfSSatish Balay   if (cnorm) *cnorm = tao->hist_cnorm;
2584*a7e14dcfSSatish Balay   if (resid) *resid = tao->hist_resid;
2585*a7e14dcfSSatish Balay   if (nhist) *nhist   = tao->hist_len;
2586*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2587*a7e14dcfSSatish Balay }
2588*a7e14dcfSSatish Balay 
2589*a7e14dcfSSatish Balay 
2590*a7e14dcfSSatish Balay #undef __FUNCT__
2591*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetApplicationContext"
2592*a7e14dcfSSatish Balay /*@
2593*a7e14dcfSSatish Balay    TaoSetApplicationContext - Sets the optional user-defined context for
2594*a7e14dcfSSatish Balay    a solver.
2595*a7e14dcfSSatish Balay 
2596*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
2597*a7e14dcfSSatish Balay 
2598*a7e14dcfSSatish Balay    Input Parameters:
2599*a7e14dcfSSatish Balay +  tao  - the TaoSolver context
2600*a7e14dcfSSatish Balay -  usrP - optional user context
2601*a7e14dcfSSatish Balay 
2602*a7e14dcfSSatish Balay    Level: intermediate
2603*a7e14dcfSSatish Balay 
2604*a7e14dcfSSatish Balay .seealso: TaoGetApplicationContext(), TaoSetApplicationContext()
2605*a7e14dcfSSatish Balay @*/
2606*a7e14dcfSSatish Balay PetscErrorCode  TaoSetApplicationContext(TaoSolver tao,void *usrP)
2607*a7e14dcfSSatish Balay {
2608*a7e14dcfSSatish Balay 
2609*a7e14dcfSSatish Balay   PetscFunctionBegin;
2610*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2611*a7e14dcfSSatish Balay   tao->user = usrP;
2612*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2613*a7e14dcfSSatish Balay }
2614*a7e14dcfSSatish Balay 
2615*a7e14dcfSSatish Balay #undef __FUNCT__
2616*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetApplicationContext"
2617*a7e14dcfSSatish Balay /*@
2618*a7e14dcfSSatish Balay    TaoGetApplicationContext - Gets the user-defined context for a
2619*a7e14dcfSSatish Balay    TAO solvers.
2620*a7e14dcfSSatish Balay 
2621*a7e14dcfSSatish Balay    Not Collective
2622*a7e14dcfSSatish Balay 
2623*a7e14dcfSSatish Balay    Input Parameter:
2624*a7e14dcfSSatish Balay .  tao  - TaoSolver context
2625*a7e14dcfSSatish Balay 
2626*a7e14dcfSSatish Balay    Output Parameter:
2627*a7e14dcfSSatish Balay .  usrP - user context
2628*a7e14dcfSSatish Balay 
2629*a7e14dcfSSatish Balay    Level: intermediate
2630*a7e14dcfSSatish Balay 
2631*a7e14dcfSSatish Balay .seealso: TaoSetApplicationContext()
2632*a7e14dcfSSatish Balay @*/
2633*a7e14dcfSSatish Balay PetscErrorCode  TaoGetApplicationContext(TaoSolver tao,void *usrP)
2634*a7e14dcfSSatish Balay {
2635*a7e14dcfSSatish Balay   PetscFunctionBegin;
2636*a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
2637*a7e14dcfSSatish Balay   *(void**)usrP = tao->user;
2638*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
2639*a7e14dcfSSatish Balay }
2640