xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 2b97c8d877f2e78262217526b037fb1cb8d2b4d6)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@
4a7e14dcfSSatish Balay   TaoSetVariableBounds - Sets the upper and lower bounds
5a7e14dcfSSatish Balay 
6441846f8SBarry Smith   Logically collective on Tao
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Input Parameters:
9441846f8SBarry Smith + tao - the Tao context
10a7e14dcfSSatish Balay . XL  - vector of lower bounds
11a7e14dcfSSatish Balay - XU  - vector of upper bounds
12a7e14dcfSSatish Balay 
13a7e14dcfSSatish Balay   Level: beginner
14a7e14dcfSSatish Balay 
15a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
16a7e14dcfSSatish Balay @*/
17a7e14dcfSSatish Balay 
18441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU)
19a7e14dcfSSatish Balay {
20a7e14dcfSSatish Balay   PetscErrorCode ierr;
215ca45b2bSBarry Smith 
22a7e14dcfSSatish Balay   PetscFunctionBegin;
23441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
24a7e14dcfSSatish Balay   if (XL) {
25a7e14dcfSSatish Balay     PetscValidHeaderSpecific(XL,VEC_CLASSID,2);
26a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)XL);
27a7e14dcfSSatish Balay   }
28a7e14dcfSSatish Balay   if (XU) {
29a7e14dcfSSatish Balay     PetscValidHeaderSpecific(XU,VEC_CLASSID,3);
30a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)XU);
31a7e14dcfSSatish Balay   }
32a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->XL);CHKERRQ(ierr);
33a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->XU);CHKERRQ(ierr);
34a7e14dcfSSatish Balay   tao->XL = XL;
35a7e14dcfSSatish Balay   tao->XU = XU;
36a7e14dcfSSatish Balay   PetscFunctionReturn(0);
37a7e14dcfSSatish Balay }
3845cf516eSBarry Smith 
39a7e14dcfSSatish Balay /*@C
40a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
41a7e14dcfSSatish Balay 
42441846f8SBarry Smith   Logically collective on Tao
43a7e14dcfSSatish Balay 
44a7e14dcfSSatish Balay   Input Parameters:
45441846f8SBarry Smith + tao - the Tao context
46a7e14dcfSSatish Balay . func - the bounds computation routine
476c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL)
48a7e14dcfSSatish Balay 
49a7e14dcfSSatish Balay   Calling sequence of func:
50441846f8SBarry Smith $      func (Tao tao, Vec xl, Vec xu);
51a7e14dcfSSatish Balay 
52441846f8SBarry Smith + tao - the Tao
53a7e14dcfSSatish Balay . xl  - vector of lower bounds
54a7e14dcfSSatish Balay . xu  - vector of upper bounds
55a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
56a7e14dcfSSatish Balay 
57a7e14dcfSSatish Balay   Level: beginner
58a7e14dcfSSatish Balay 
59a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
60a7e14dcfSSatish Balay 
61a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
62a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds().
63a7e14dcfSSatish Balay 
64a7e14dcfSSatish Balay @*/
65441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
66a7e14dcfSSatish Balay {
67a7e14dcfSSatish Balay   PetscFunctionBegin;
68441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
69a7e14dcfSSatish Balay   tao->user_boundsP = ctx;
70a7e14dcfSSatish Balay   tao->ops->computebounds = func;
71a7e14dcfSSatish Balay   PetscFunctionReturn(0);
72a7e14dcfSSatish Balay }
73a7e14dcfSSatish Balay 
74441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
75a7e14dcfSSatish Balay {
76a7e14dcfSSatish Balay   PetscFunctionBegin;
77441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
78a7e14dcfSSatish Balay   if (XL) {
79a7e14dcfSSatish Balay     *XL=tao->XL;
80a7e14dcfSSatish Balay   }
81a7e14dcfSSatish Balay   if (XU) {
82a7e14dcfSSatish Balay     *XU=tao->XU;
83a7e14dcfSSatish Balay   }
84a7e14dcfSSatish Balay   PetscFunctionReturn(0);
85a7e14dcfSSatish Balay }
86a7e14dcfSSatish Balay 
87a7e14dcfSSatish Balay /*@C
88a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
89a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
90a7e14dcfSSatish Balay 
91441846f8SBarry Smith    Collective on Tao
92a7e14dcfSSatish Balay 
93a7e14dcfSSatish Balay    Input Parameters:
94441846f8SBarry Smith .  tao - the Tao context
95a7e14dcfSSatish Balay 
96a7e14dcfSSatish Balay    Level: developer
97a7e14dcfSSatish Balay 
98a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds()
99a7e14dcfSSatish Balay @*/
100a7e14dcfSSatish Balay 
101441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao)
102a7e14dcfSSatish Balay {
103a7e14dcfSSatish Balay   PetscErrorCode ierr;
104a7e14dcfSSatish Balay 
105a7e14dcfSSatish Balay   PetscFunctionBegin;
106441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
107*2b97c8d8SAlp Dener   PetscStackPush("Tao compute variable bounds");
10887f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
10987f595a5SBarry Smith     if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeVariableBounds");
110a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr);
111e270355aSBarry Smith     ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr);
112a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr);
113e270355aSBarry Smith     ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr);
114a7e14dcfSSatish Balay   }
115*2b97c8d8SAlp Dener   if (tao->ops->computebounds) {
11687f595a5SBarry Smith     ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr);
117*2b97c8d8SAlp Dener   }
1180cbffdbaSBarry Smith   PetscStackPop;
119a7e14dcfSSatish Balay   PetscFunctionReturn(0);
120a7e14dcfSSatish Balay }
121a7e14dcfSSatish Balay 
122a7e14dcfSSatish Balay /*@
123a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
124a7e14dcfSSatish Balay 
125441846f8SBarry Smith   Logically collective on Tao
126a7e14dcfSSatish Balay 
127a7e14dcfSSatish Balay   Input Parameters:
128441846f8SBarry Smith + tao - the Tao context
129a7e14dcfSSatish Balay . IL  - vector of lower bounds
130a7e14dcfSSatish Balay - IU  - vector of upper bounds
131a7e14dcfSSatish Balay 
132a7e14dcfSSatish Balay   Level: beginner
133a7e14dcfSSatish Balay 
134a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
135a7e14dcfSSatish Balay @*/
136a7e14dcfSSatish Balay 
137441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
138a7e14dcfSSatish Balay {
139a7e14dcfSSatish Balay   PetscErrorCode ierr;
1405ca45b2bSBarry Smith 
141a7e14dcfSSatish Balay   PetscFunctionBegin;
142441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
143a7e14dcfSSatish Balay   if (IL) {
144a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
145a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IL);
146a7e14dcfSSatish Balay   }
147a7e14dcfSSatish Balay   if (IU) {
148a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
149a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IU);
150a7e14dcfSSatish Balay   }
151a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IL);CHKERRQ(ierr);
152a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IU);CHKERRQ(ierr);
153a7e14dcfSSatish Balay   tao->IL = IL;
154a7e14dcfSSatish Balay   tao->IU = IU;
155a7e14dcfSSatish Balay   PetscFunctionReturn(0);
156a7e14dcfSSatish Balay }
157a7e14dcfSSatish Balay 
158a7e14dcfSSatish Balay 
159441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
160a7e14dcfSSatish Balay {
161a7e14dcfSSatish Balay   PetscFunctionBegin;
162441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
163a7e14dcfSSatish Balay   if (IL) {
164a7e14dcfSSatish Balay     *IL=tao->IL;
165a7e14dcfSSatish Balay   }
166a7e14dcfSSatish Balay   if (IU) {
167a7e14dcfSSatish Balay     *IU=tao->IU;
168a7e14dcfSSatish Balay   }
169a7e14dcfSSatish Balay   PetscFunctionReturn(0);
170a7e14dcfSSatish Balay }
171a7e14dcfSSatish Balay 
172a7e14dcfSSatish Balay /*@C
173a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
174a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
175a7e14dcfSSatish Balay 
176441846f8SBarry Smith    Collective on Tao
177a7e14dcfSSatish Balay 
178a7e14dcfSSatish Balay    Input Parameters:
179441846f8SBarry Smith .  tao - the Tao context
180a7e14dcfSSatish Balay 
181a7e14dcfSSatish Balay    Level: developer
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
184a7e14dcfSSatish Balay @*/
185a7e14dcfSSatish Balay 
186441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
187a7e14dcfSSatish Balay {
188a7e14dcfSSatish Balay   PetscErrorCode ierr;
189a7e14dcfSSatish Balay 
190a7e14dcfSSatish Balay   PetscFunctionBegin;
191441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
192a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
193a7e14dcfSSatish Balay   PetscValidHeaderSpecific(C,VEC_CLASSID,2);
194a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
195a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
196a7e14dcfSSatish Balay 
19787f595a5SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
19887f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
199441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
200441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
20153506e15SBarry Smith   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr);
202a7e14dcfSSatish Balay   PetscStackPop;
203441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
204a7e14dcfSSatish Balay   tao->nconstraints++;
205a7e14dcfSSatish Balay   PetscFunctionReturn(0);
206a7e14dcfSSatish Balay }
207a7e14dcfSSatish Balay 
208a7e14dcfSSatish Balay /*@C
209a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
210a7e14dcfSSatish Balay 
211441846f8SBarry Smith   Logically collective on Tao
212a7e14dcfSSatish Balay 
213a7e14dcfSSatish Balay   Input Parameters:
214441846f8SBarry Smith + tao - the Tao context
215a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
216a7e14dcfSSatish Balay . func - the bounds computation routine
2176c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
218a7e14dcfSSatish Balay 
219a7e14dcfSSatish Balay   Calling sequence of func:
220441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
221a7e14dcfSSatish Balay 
222441846f8SBarry Smith + tao - the Tao
223a7e14dcfSSatish Balay . x   - point to evaluate constraints
224a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
225a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
226a7e14dcfSSatish Balay 
227a7e14dcfSSatish Balay   Level: intermediate
228a7e14dcfSSatish Balay 
229a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
230a7e14dcfSSatish Balay 
231a7e14dcfSSatish Balay @*/
232441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
233a7e14dcfSSatish Balay {
234a7e14dcfSSatish Balay     PetscFunctionBegin;
235441846f8SBarry Smith     PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
236a7e14dcfSSatish Balay     tao->constraints = c;
237a7e14dcfSSatish Balay     tao->user_conP = ctx;
238a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
239a7e14dcfSSatish Balay     PetscFunctionReturn(0);
240a7e14dcfSSatish Balay }
241a7e14dcfSSatish Balay 
242a7e14dcfSSatish Balay /*@
243a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
244a7e14dcfSSatish Balay   of the variables
245a7e14dcfSSatish Balay 
246441846f8SBarry Smith   Collective on Tao
247a7e14dcfSSatish Balay 
248a7e14dcfSSatish Balay   Input Parameters:
249441846f8SBarry Smith . tao - the Tao context
250a7e14dcfSSatish Balay 
251a7e14dcfSSatish Balay   Output Parameter:
252a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
253a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
254a7e14dcfSSatish Balay 
255a7e14dcfSSatish Balay   Level: advanced
256a7e14dcfSSatish Balay 
257a7e14dcfSSatish Balay   Note:
258a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
259a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
260a7e14dcfSSatish Balay   zeros.
261a7e14dcfSSatish Balay 
262a7e14dcfSSatish Balay   Level: advanced
263a7e14dcfSSatish Balay 
264a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
265a7e14dcfSSatish Balay @*/
266441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
267a7e14dcfSSatish Balay {
268a7e14dcfSSatish Balay   PetscErrorCode ierr;
269a7e14dcfSSatish Balay   PetscFunctionBegin;
270441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
271a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
272a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
273a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
274a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
275a7e14dcfSSatish Balay   if (tao->ops->computedual) {
276a7e14dcfSSatish Balay     ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr);
277a7e14dcfSSatish Balay   }  else {
278a7e14dcfSSatish Balay     ierr = VecSet(DL,0.0);CHKERRQ(ierr);
279a7e14dcfSSatish Balay     ierr = VecSet(DU,0.0);CHKERRQ(ierr);
280a7e14dcfSSatish Balay   }
281a7e14dcfSSatish Balay   PetscFunctionReturn(0);
282a7e14dcfSSatish Balay }
283a7e14dcfSSatish Balay 
284a7e14dcfSSatish Balay /*@
285a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
286a7e14dcfSSatish Balay 
287441846f8SBarry Smith   Collective on Tao
288a7e14dcfSSatish Balay 
289a7e14dcfSSatish Balay   Input Parameters:
290441846f8SBarry Smith . tao - the Tao context
291a7e14dcfSSatish Balay 
292a7e14dcfSSatish Balay   Output Parameter:
293a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
294a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
295a7e14dcfSSatish Balay 
296a7e14dcfSSatish Balay   Level: advanced
297a7e14dcfSSatish Balay 
298a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
299a7e14dcfSSatish Balay @*/
300441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
301a7e14dcfSSatish Balay {
302a7e14dcfSSatish Balay   PetscFunctionBegin;
303441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
304a7e14dcfSSatish Balay   if (DE) {
305a7e14dcfSSatish Balay     *DE = tao->DE;
306a7e14dcfSSatish Balay   }
307a7e14dcfSSatish Balay   if (DI) {
308a7e14dcfSSatish Balay     *DI = tao->DI;
309a7e14dcfSSatish Balay   }
310a7e14dcfSSatish Balay   PetscFunctionReturn(0);
311a7e14dcfSSatish Balay }
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay /*@C
314a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
315a7e14dcfSSatish Balay 
316441846f8SBarry Smith   Logically collective on Tao
317a7e14dcfSSatish Balay 
318a7e14dcfSSatish Balay   Input Parameters:
319441846f8SBarry Smith + tao - the Tao context
320a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
321a7e14dcfSSatish Balay . func - the bounds computation routine
3226c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
323a7e14dcfSSatish Balay 
324a7e14dcfSSatish Balay   Calling sequence of func:
325441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
326a7e14dcfSSatish Balay 
327441846f8SBarry Smith + tao - the Tao
328a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
329a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
330a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
331a7e14dcfSSatish Balay 
332a7e14dcfSSatish Balay   Level: intermediate
333a7e14dcfSSatish Balay 
334a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
335a7e14dcfSSatish Balay 
336a7e14dcfSSatish Balay @*/
337441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
338a7e14dcfSSatish Balay {
339a7e14dcfSSatish Balay   PetscErrorCode ierr;
340a7e14dcfSSatish Balay 
341a7e14dcfSSatish Balay   PetscFunctionBegin;
342441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
343a7e14dcfSSatish Balay   if (ce) {
344a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
345a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ce);
346a7e14dcfSSatish Balay   }
347a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr);
348a7e14dcfSSatish Balay 
349a7e14dcfSSatish Balay   tao->constraints_equality = ce;
350a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
351a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
352a7e14dcfSSatish Balay   PetscFunctionReturn(0);
353a7e14dcfSSatish Balay }
354a7e14dcfSSatish Balay 
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay /*@C
357a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
358a7e14dcfSSatish Balay 
359441846f8SBarry Smith   Logically collective on Tao
360a7e14dcfSSatish Balay 
361a7e14dcfSSatish Balay   Input Parameters:
362441846f8SBarry Smith + tao - the Tao context
363a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
364a7e14dcfSSatish Balay . func - the bounds computation routine
3656c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
366a7e14dcfSSatish Balay 
367a7e14dcfSSatish Balay   Calling sequence of func:
368441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
369a7e14dcfSSatish Balay 
370441846f8SBarry Smith + tao - the Tao
371a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
372a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
373a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
374a7e14dcfSSatish Balay 
375a7e14dcfSSatish Balay   Level: intermediate
376a7e14dcfSSatish Balay 
377a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay @*/
380441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
381a7e14dcfSSatish Balay {
382a7e14dcfSSatish Balay   PetscErrorCode ierr;
383a7e14dcfSSatish Balay 
384a7e14dcfSSatish Balay   PetscFunctionBegin;
385441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
386a7e14dcfSSatish Balay   if (ci) {
387a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
388a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ci);
389a7e14dcfSSatish Balay   }
390a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr);
391a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
392a7e14dcfSSatish Balay 
393a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
394a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
395a7e14dcfSSatish Balay   PetscFunctionReturn(0);
396a7e14dcfSSatish Balay }
397a7e14dcfSSatish Balay 
398a7e14dcfSSatish Balay 
399a7e14dcfSSatish Balay /*@C
400a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
401a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
402a7e14dcfSSatish Balay 
403441846f8SBarry Smith    Collective on Tao
404a7e14dcfSSatish Balay 
405a7e14dcfSSatish Balay    Input Parameters:
406441846f8SBarry Smith .  tao - the Tao context
407a7e14dcfSSatish Balay 
408a7e14dcfSSatish Balay    Level: developer
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
411a7e14dcfSSatish Balay @*/
412a7e14dcfSSatish Balay 
413441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
414a7e14dcfSSatish Balay {
415a7e14dcfSSatish Balay   PetscErrorCode ierr;
416a7e14dcfSSatish Balay 
417a7e14dcfSSatish Balay   PetscFunctionBegin;
418441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
419a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
420a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
421a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
422a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
423a7e14dcfSSatish Balay 
42487f595a5SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
42587f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
426441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
427441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
42853506e15SBarry Smith   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr);
429a7e14dcfSSatish Balay   PetscStackPop;
430441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
431a7e14dcfSSatish Balay   tao->nconstraints++;
432a7e14dcfSSatish Balay   PetscFunctionReturn(0);
433a7e14dcfSSatish Balay }
434a7e14dcfSSatish Balay 
435a7e14dcfSSatish Balay 
436a7e14dcfSSatish Balay /*@C
437a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
438a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
439a7e14dcfSSatish Balay 
440441846f8SBarry Smith    Collective on Tao
441a7e14dcfSSatish Balay 
442a7e14dcfSSatish Balay    Input Parameters:
443441846f8SBarry Smith .  tao - the Tao context
444a7e14dcfSSatish Balay 
445a7e14dcfSSatish Balay    Level: developer
446a7e14dcfSSatish Balay 
447a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
448a7e14dcfSSatish Balay @*/
449a7e14dcfSSatish Balay 
450441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
451a7e14dcfSSatish Balay {
452a7e14dcfSSatish Balay   PetscErrorCode ierr;
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay   PetscFunctionBegin;
455441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
456a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
457a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
458a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
459a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
460a7e14dcfSSatish Balay 
46187f595a5SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
46287f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
463441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
464441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
46587f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
466a7e14dcfSSatish Balay   PetscStackPop;
467441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
468a7e14dcfSSatish Balay   tao->nconstraints++;
469a7e14dcfSSatish Balay   PetscFunctionReturn(0);
470a7e14dcfSSatish Balay }
471