xref: /petsc/src/tao/interface/taosolver_bounds.c (revision cd929ea3f739fd9f7b6394f772cb40b9d4e6d97c)
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;
36*cd929ea3SAlp Dener   tao->bounded = PETSC_TRUE;
37a7e14dcfSSatish Balay   PetscFunctionReturn(0);
38a7e14dcfSSatish Balay }
3945cf516eSBarry Smith 
40a7e14dcfSSatish Balay /*@C
41a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
42a7e14dcfSSatish Balay 
43441846f8SBarry Smith   Logically collective on Tao
44a7e14dcfSSatish Balay 
45a7e14dcfSSatish Balay   Input Parameters:
46441846f8SBarry Smith + tao - the Tao context
47a7e14dcfSSatish Balay . func - the bounds computation routine
486c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL)
49a7e14dcfSSatish Balay 
50a7e14dcfSSatish Balay   Calling sequence of func:
51441846f8SBarry Smith $      func (Tao tao, Vec xl, Vec xu);
52a7e14dcfSSatish Balay 
53441846f8SBarry Smith + tao - the Tao
54a7e14dcfSSatish Balay . xl  - vector of lower bounds
55a7e14dcfSSatish Balay . xu  - vector of upper bounds
56a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
57a7e14dcfSSatish Balay 
58a7e14dcfSSatish Balay   Level: beginner
59a7e14dcfSSatish Balay 
60a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
61a7e14dcfSSatish Balay 
62a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
63a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds().
64a7e14dcfSSatish Balay 
65a7e14dcfSSatish Balay @*/
66441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
67a7e14dcfSSatish Balay {
68a7e14dcfSSatish Balay   PetscFunctionBegin;
69441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
70a7e14dcfSSatish Balay   tao->user_boundsP = ctx;
71a7e14dcfSSatish Balay   tao->ops->computebounds = func;
72*cd929ea3SAlp Dener   tao->bounded = PETSC_TRUE;
73a7e14dcfSSatish Balay   PetscFunctionReturn(0);
74a7e14dcfSSatish Balay }
75a7e14dcfSSatish Balay 
76441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
77a7e14dcfSSatish Balay {
78a7e14dcfSSatish Balay   PetscFunctionBegin;
79441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
80a7e14dcfSSatish Balay   if (XL) {
81a7e14dcfSSatish Balay     *XL=tao->XL;
82a7e14dcfSSatish Balay   }
83a7e14dcfSSatish Balay   if (XU) {
84a7e14dcfSSatish Balay     *XU=tao->XU;
85a7e14dcfSSatish Balay   }
86a7e14dcfSSatish Balay   PetscFunctionReturn(0);
87a7e14dcfSSatish Balay }
88a7e14dcfSSatish Balay 
89a7e14dcfSSatish Balay /*@C
90a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
91a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
92a7e14dcfSSatish Balay 
93441846f8SBarry Smith    Collective on Tao
94a7e14dcfSSatish Balay 
95a7e14dcfSSatish Balay    Input Parameters:
96441846f8SBarry Smith .  tao - the Tao context
97a7e14dcfSSatish Balay 
98a7e14dcfSSatish Balay    Level: developer
99a7e14dcfSSatish Balay 
100a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds()
101a7e14dcfSSatish Balay @*/
102a7e14dcfSSatish Balay 
103441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao)
104a7e14dcfSSatish Balay {
105a7e14dcfSSatish Balay   PetscErrorCode ierr;
106a7e14dcfSSatish Balay 
107a7e14dcfSSatish Balay   PetscFunctionBegin;
108441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1092b97c8d8SAlp Dener   PetscStackPush("Tao compute variable bounds");
11087f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
111a6d3728eSAlp Dener     if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"TaoSetInitialVector must be called before TaoComputeVariableBounds");
112a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr);
113e270355aSBarry Smith     ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr);
114a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr);
115e270355aSBarry Smith     ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr);
116a7e14dcfSSatish Balay   }
1172b97c8d8SAlp Dener   if (tao->ops->computebounds) {
11887f595a5SBarry Smith     ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr);
1192b97c8d8SAlp Dener   }
1200cbffdbaSBarry Smith   PetscStackPop;
121a7e14dcfSSatish Balay   PetscFunctionReturn(0);
122a7e14dcfSSatish Balay }
123a7e14dcfSSatish Balay 
124a7e14dcfSSatish Balay /*@
125a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
126a7e14dcfSSatish Balay 
127441846f8SBarry Smith   Logically collective on Tao
128a7e14dcfSSatish Balay 
129a7e14dcfSSatish Balay   Input Parameters:
130441846f8SBarry Smith + tao - the Tao context
131a7e14dcfSSatish Balay . IL  - vector of lower bounds
132a7e14dcfSSatish Balay - IU  - vector of upper bounds
133a7e14dcfSSatish Balay 
134a7e14dcfSSatish Balay   Level: beginner
135a7e14dcfSSatish Balay 
136a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
137a7e14dcfSSatish Balay @*/
138a7e14dcfSSatish Balay 
139441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
140a7e14dcfSSatish Balay {
141a7e14dcfSSatish Balay   PetscErrorCode ierr;
1425ca45b2bSBarry Smith 
143a7e14dcfSSatish Balay   PetscFunctionBegin;
144441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
145a7e14dcfSSatish Balay   if (IL) {
146a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
147a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IL);
148a7e14dcfSSatish Balay   }
149a7e14dcfSSatish Balay   if (IU) {
150a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
151a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IU);
152a7e14dcfSSatish Balay   }
153a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IL);CHKERRQ(ierr);
154a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IU);CHKERRQ(ierr);
155a7e14dcfSSatish Balay   tao->IL = IL;
156a7e14dcfSSatish Balay   tao->IU = IU;
157a7e14dcfSSatish Balay   PetscFunctionReturn(0);
158a7e14dcfSSatish Balay }
159a7e14dcfSSatish Balay 
160a7e14dcfSSatish Balay 
161441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
162a7e14dcfSSatish Balay {
163a7e14dcfSSatish Balay   PetscFunctionBegin;
164441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
165a7e14dcfSSatish Balay   if (IL) {
166a7e14dcfSSatish Balay     *IL=tao->IL;
167a7e14dcfSSatish Balay   }
168a7e14dcfSSatish Balay   if (IU) {
169a7e14dcfSSatish Balay     *IU=tao->IU;
170a7e14dcfSSatish Balay   }
171a7e14dcfSSatish Balay   PetscFunctionReturn(0);
172a7e14dcfSSatish Balay }
173a7e14dcfSSatish Balay 
174a7e14dcfSSatish Balay /*@C
175a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
176a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
177a7e14dcfSSatish Balay 
178441846f8SBarry Smith    Collective on Tao
179a7e14dcfSSatish Balay 
180a7e14dcfSSatish Balay    Input Parameters:
181441846f8SBarry Smith .  tao - the Tao context
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay    Level: developer
184a7e14dcfSSatish Balay 
185a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
186a7e14dcfSSatish Balay @*/
187a7e14dcfSSatish Balay 
188441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
189a7e14dcfSSatish Balay {
190a7e14dcfSSatish Balay   PetscErrorCode ierr;
191a7e14dcfSSatish Balay 
192a7e14dcfSSatish Balay   PetscFunctionBegin;
193441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
194a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
195a7e14dcfSSatish Balay   PetscValidHeaderSpecific(C,VEC_CLASSID,2);
196a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
197a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
198a7e14dcfSSatish Balay 
19987f595a5SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
20087f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
201441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
202441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
20353506e15SBarry Smith   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr);
204a7e14dcfSSatish Balay   PetscStackPop;
205441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
206a7e14dcfSSatish Balay   tao->nconstraints++;
207a7e14dcfSSatish Balay   PetscFunctionReturn(0);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay /*@C
211a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
212a7e14dcfSSatish Balay 
213441846f8SBarry Smith   Logically collective on Tao
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay   Input Parameters:
216441846f8SBarry Smith + tao - the Tao context
217a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
218a7e14dcfSSatish Balay . func - the bounds computation routine
2196c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
220a7e14dcfSSatish Balay 
221a7e14dcfSSatish Balay   Calling sequence of func:
222441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
223a7e14dcfSSatish Balay 
224441846f8SBarry Smith + tao - the Tao
225a7e14dcfSSatish Balay . x   - point to evaluate constraints
226a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
227a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
228a7e14dcfSSatish Balay 
229a7e14dcfSSatish Balay   Level: intermediate
230a7e14dcfSSatish Balay 
231a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
232a7e14dcfSSatish Balay 
233a7e14dcfSSatish Balay @*/
234441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
235a7e14dcfSSatish Balay {
236a7e14dcfSSatish Balay     PetscFunctionBegin;
237441846f8SBarry Smith     PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
238a7e14dcfSSatish Balay     tao->constraints = c;
239a7e14dcfSSatish Balay     tao->user_conP = ctx;
240a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
241a7e14dcfSSatish Balay     PetscFunctionReturn(0);
242a7e14dcfSSatish Balay }
243a7e14dcfSSatish Balay 
244a7e14dcfSSatish Balay /*@
245a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
246a7e14dcfSSatish Balay   of the variables
247a7e14dcfSSatish Balay 
248441846f8SBarry Smith   Collective on Tao
249a7e14dcfSSatish Balay 
250a7e14dcfSSatish Balay   Input Parameters:
251441846f8SBarry Smith . tao - the Tao context
252a7e14dcfSSatish Balay 
253a7e14dcfSSatish Balay   Output Parameter:
254a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
255a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
256a7e14dcfSSatish Balay 
257a7e14dcfSSatish Balay   Level: advanced
258a7e14dcfSSatish Balay 
259a7e14dcfSSatish Balay   Note:
260a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
261a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
262a7e14dcfSSatish Balay   zeros.
263a7e14dcfSSatish Balay 
264a7e14dcfSSatish Balay   Level: advanced
265a7e14dcfSSatish Balay 
266a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
267a7e14dcfSSatish Balay @*/
268441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
269a7e14dcfSSatish Balay {
270a7e14dcfSSatish Balay   PetscErrorCode ierr;
271a7e14dcfSSatish Balay   PetscFunctionBegin;
272441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
273a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
274a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
275a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
276a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
277a7e14dcfSSatish Balay   if (tao->ops->computedual) {
278a7e14dcfSSatish Balay     ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr);
279a7e14dcfSSatish Balay   }  else {
280a7e14dcfSSatish Balay     ierr = VecSet(DL,0.0);CHKERRQ(ierr);
281a7e14dcfSSatish Balay     ierr = VecSet(DU,0.0);CHKERRQ(ierr);
282a7e14dcfSSatish Balay   }
283a7e14dcfSSatish Balay   PetscFunctionReturn(0);
284a7e14dcfSSatish Balay }
285a7e14dcfSSatish Balay 
286a7e14dcfSSatish Balay /*@
287a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
288a7e14dcfSSatish Balay 
289441846f8SBarry Smith   Collective on Tao
290a7e14dcfSSatish Balay 
291a7e14dcfSSatish Balay   Input Parameters:
292441846f8SBarry Smith . tao - the Tao context
293a7e14dcfSSatish Balay 
294a7e14dcfSSatish Balay   Output Parameter:
295a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
296a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
297a7e14dcfSSatish Balay 
298a7e14dcfSSatish Balay   Level: advanced
299a7e14dcfSSatish Balay 
300a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
301a7e14dcfSSatish Balay @*/
302441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
303a7e14dcfSSatish Balay {
304a7e14dcfSSatish Balay   PetscFunctionBegin;
305441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
306a7e14dcfSSatish Balay   if (DE) {
307a7e14dcfSSatish Balay     *DE = tao->DE;
308a7e14dcfSSatish Balay   }
309a7e14dcfSSatish Balay   if (DI) {
310a7e14dcfSSatish Balay     *DI = tao->DI;
311a7e14dcfSSatish Balay   }
312a7e14dcfSSatish Balay   PetscFunctionReturn(0);
313a7e14dcfSSatish Balay }
314a7e14dcfSSatish Balay 
315a7e14dcfSSatish Balay /*@C
316a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
317a7e14dcfSSatish Balay 
318441846f8SBarry Smith   Logically collective on Tao
319a7e14dcfSSatish Balay 
320a7e14dcfSSatish Balay   Input Parameters:
321441846f8SBarry Smith + tao - the Tao context
322a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
323a7e14dcfSSatish Balay . func - the bounds computation routine
3246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
325a7e14dcfSSatish Balay 
326a7e14dcfSSatish Balay   Calling sequence of func:
327441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
328a7e14dcfSSatish Balay 
329441846f8SBarry Smith + tao - the Tao
330a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
331a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
332a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
333a7e14dcfSSatish Balay 
334a7e14dcfSSatish Balay   Level: intermediate
335a7e14dcfSSatish Balay 
336a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
337a7e14dcfSSatish Balay 
338a7e14dcfSSatish Balay @*/
339441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
340a7e14dcfSSatish Balay {
341a7e14dcfSSatish Balay   PetscErrorCode ierr;
342a7e14dcfSSatish Balay 
343a7e14dcfSSatish Balay   PetscFunctionBegin;
344441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
345a7e14dcfSSatish Balay   if (ce) {
346a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
347a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ce);
348a7e14dcfSSatish Balay   }
349a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr);
350a7e14dcfSSatish Balay 
351a7e14dcfSSatish Balay   tao->constraints_equality = ce;
352a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
353a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
354a7e14dcfSSatish Balay   PetscFunctionReturn(0);
355a7e14dcfSSatish Balay }
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay 
358a7e14dcfSSatish Balay /*@C
359a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
360a7e14dcfSSatish Balay 
361441846f8SBarry Smith   Logically collective on Tao
362a7e14dcfSSatish Balay 
363a7e14dcfSSatish Balay   Input Parameters:
364441846f8SBarry Smith + tao - the Tao context
365a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
366a7e14dcfSSatish Balay . func - the bounds computation routine
3676c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
368a7e14dcfSSatish Balay 
369a7e14dcfSSatish Balay   Calling sequence of func:
370441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
371a7e14dcfSSatish Balay 
372441846f8SBarry Smith + tao - the Tao
373a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
374a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
375a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
376a7e14dcfSSatish Balay 
377a7e14dcfSSatish Balay   Level: intermediate
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
380a7e14dcfSSatish Balay 
381a7e14dcfSSatish Balay @*/
382441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
383a7e14dcfSSatish Balay {
384a7e14dcfSSatish Balay   PetscErrorCode ierr;
385a7e14dcfSSatish Balay 
386a7e14dcfSSatish Balay   PetscFunctionBegin;
387441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
388a7e14dcfSSatish Balay   if (ci) {
389a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
390a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ci);
391a7e14dcfSSatish Balay   }
392a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr);
393a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
394a7e14dcfSSatish Balay 
395a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
396a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
397a7e14dcfSSatish Balay   PetscFunctionReturn(0);
398a7e14dcfSSatish Balay }
399a7e14dcfSSatish Balay 
400a7e14dcfSSatish Balay 
401a7e14dcfSSatish Balay /*@C
402a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
403a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
404a7e14dcfSSatish Balay 
405441846f8SBarry Smith    Collective on Tao
406a7e14dcfSSatish Balay 
407a7e14dcfSSatish Balay    Input Parameters:
408441846f8SBarry Smith .  tao - the Tao context
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay    Level: developer
411a7e14dcfSSatish Balay 
412a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
413a7e14dcfSSatish Balay @*/
414a7e14dcfSSatish Balay 
415441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
416a7e14dcfSSatish Balay {
417a7e14dcfSSatish Balay   PetscErrorCode ierr;
418a7e14dcfSSatish Balay 
419a7e14dcfSSatish Balay   PetscFunctionBegin;
420441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
421a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
422a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
423a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
424a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
425a7e14dcfSSatish Balay 
42687f595a5SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
42787f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
428441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
429441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
43053506e15SBarry Smith   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr);
431a7e14dcfSSatish Balay   PetscStackPop;
432441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
433a7e14dcfSSatish Balay   tao->nconstraints++;
434a7e14dcfSSatish Balay   PetscFunctionReturn(0);
435a7e14dcfSSatish Balay }
436a7e14dcfSSatish Balay 
437a7e14dcfSSatish Balay 
438a7e14dcfSSatish Balay /*@C
439a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
440a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
441a7e14dcfSSatish Balay 
442441846f8SBarry Smith    Collective on Tao
443a7e14dcfSSatish Balay 
444a7e14dcfSSatish Balay    Input Parameters:
445441846f8SBarry Smith .  tao - the Tao context
446a7e14dcfSSatish Balay 
447a7e14dcfSSatish Balay    Level: developer
448a7e14dcfSSatish Balay 
449a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
450a7e14dcfSSatish Balay @*/
451a7e14dcfSSatish Balay 
452441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
453a7e14dcfSSatish Balay {
454a7e14dcfSSatish Balay   PetscErrorCode ierr;
455a7e14dcfSSatish Balay 
456a7e14dcfSSatish Balay   PetscFunctionBegin;
457441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
458a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
459a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
460a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
461a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
462a7e14dcfSSatish Balay 
46387f595a5SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
46487f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
465441846f8SBarry Smith   ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
466441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
46787f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
468a7e14dcfSSatish Balay   PetscStackPop;
469441846f8SBarry Smith   ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
470a7e14dcfSSatish Balay   tao->nconstraints++;
471a7e14dcfSSatish Balay   PetscFunctionReturn(0);
472a7e14dcfSSatish Balay }
473