xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 661095bbfddda9a1493a32ea0d2305a96eb189ff)
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;
36cd929ea3SAlp 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;
72cd929ea3SAlp 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) {
111691b26d3SBarry Smith     if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),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;
157*661095bbSAlp Dener   tao->ineq_doublesided = PETSC_TRUE;
158a7e14dcfSSatish Balay   PetscFunctionReturn(0);
159a7e14dcfSSatish Balay }
160a7e14dcfSSatish Balay 
161a7e14dcfSSatish Balay 
162441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
163a7e14dcfSSatish Balay {
164a7e14dcfSSatish Balay   PetscFunctionBegin;
165441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
166a7e14dcfSSatish Balay   if (IL) {
167a7e14dcfSSatish Balay     *IL=tao->IL;
168a7e14dcfSSatish Balay   }
169a7e14dcfSSatish Balay   if (IU) {
170a7e14dcfSSatish Balay     *IU=tao->IU;
171a7e14dcfSSatish Balay   }
172a7e14dcfSSatish Balay   PetscFunctionReturn(0);
173a7e14dcfSSatish Balay }
174a7e14dcfSSatish Balay 
175a7e14dcfSSatish Balay /*@C
176a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
177a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
178a7e14dcfSSatish Balay 
179441846f8SBarry Smith    Collective on Tao
180a7e14dcfSSatish Balay 
181a7e14dcfSSatish Balay    Input Parameters:
182441846f8SBarry Smith .  tao - the Tao context
183a7e14dcfSSatish Balay 
184a7e14dcfSSatish Balay    Level: developer
185a7e14dcfSSatish Balay 
186a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
187a7e14dcfSSatish Balay @*/
188a7e14dcfSSatish Balay 
189441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
190a7e14dcfSSatish Balay {
191a7e14dcfSSatish Balay   PetscErrorCode ierr;
192a7e14dcfSSatish Balay 
193a7e14dcfSSatish Balay   PetscFunctionBegin;
194441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
195a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
196a7e14dcfSSatish Balay   PetscValidHeaderSpecific(C,VEC_CLASSID,2);
197a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
198a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
199a7e14dcfSSatish Balay 
200691b26d3SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
201691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
2020ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
203441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
20453506e15SBarry Smith   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr);
205a7e14dcfSSatish Balay   PetscStackPop;
2060ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
207a7e14dcfSSatish Balay   tao->nconstraints++;
208a7e14dcfSSatish Balay   PetscFunctionReturn(0);
209a7e14dcfSSatish Balay }
210a7e14dcfSSatish Balay 
211a7e14dcfSSatish Balay /*@C
212a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
213a7e14dcfSSatish Balay 
214441846f8SBarry Smith   Logically collective on Tao
215a7e14dcfSSatish Balay 
216a7e14dcfSSatish Balay   Input Parameters:
217441846f8SBarry Smith + tao - the Tao context
218a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
219a7e14dcfSSatish Balay . func - the bounds computation routine
2206c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
221a7e14dcfSSatish Balay 
222a7e14dcfSSatish Balay   Calling sequence of func:
223441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
224a7e14dcfSSatish Balay 
225441846f8SBarry Smith + tao - the Tao
226a7e14dcfSSatish Balay . x   - point to evaluate constraints
227a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
228a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
229a7e14dcfSSatish Balay 
230a7e14dcfSSatish Balay   Level: intermediate
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
233a7e14dcfSSatish Balay 
234a7e14dcfSSatish Balay @*/
235441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
236a7e14dcfSSatish Balay {
237a7e14dcfSSatish Balay     PetscFunctionBegin;
238441846f8SBarry Smith     PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2396246e8cdSAlp Dener     tao->constrained = PETSC_TRUE;
240a7e14dcfSSatish Balay     tao->constraints = c;
241a7e14dcfSSatish Balay     tao->user_conP = ctx;
242a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
243a7e14dcfSSatish Balay     PetscFunctionReturn(0);
244a7e14dcfSSatish Balay }
245a7e14dcfSSatish Balay 
246a7e14dcfSSatish Balay /*@
247a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
248a7e14dcfSSatish Balay   of the variables
249a7e14dcfSSatish Balay 
250441846f8SBarry Smith   Collective on Tao
251a7e14dcfSSatish Balay 
252a7e14dcfSSatish Balay   Input Parameters:
253441846f8SBarry Smith . tao - the Tao context
254a7e14dcfSSatish Balay 
255a7e14dcfSSatish Balay   Output Parameter:
256a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
257a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
258a7e14dcfSSatish Balay 
259a7e14dcfSSatish Balay   Level: advanced
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay   Note:
262a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
263a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
264a7e14dcfSSatish Balay   zeros.
265a7e14dcfSSatish Balay 
266a7e14dcfSSatish Balay   Level: advanced
267a7e14dcfSSatish Balay 
268a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
269a7e14dcfSSatish Balay @*/
270441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
271a7e14dcfSSatish Balay {
272a7e14dcfSSatish Balay   PetscErrorCode ierr;
273a7e14dcfSSatish Balay   PetscFunctionBegin;
274441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
275a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
276a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
277a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
278a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
279a7e14dcfSSatish Balay   if (tao->ops->computedual) {
280a7e14dcfSSatish Balay     ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr);
281a7e14dcfSSatish Balay   }  else {
282a7e14dcfSSatish Balay     ierr = VecSet(DL,0.0);CHKERRQ(ierr);
283a7e14dcfSSatish Balay     ierr = VecSet(DU,0.0);CHKERRQ(ierr);
284a7e14dcfSSatish Balay   }
285a7e14dcfSSatish Balay   PetscFunctionReturn(0);
286a7e14dcfSSatish Balay }
287a7e14dcfSSatish Balay 
288a7e14dcfSSatish Balay /*@
289a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
290a7e14dcfSSatish Balay 
291441846f8SBarry Smith   Collective on Tao
292a7e14dcfSSatish Balay 
293a7e14dcfSSatish Balay   Input Parameters:
294441846f8SBarry Smith . tao - the Tao context
295a7e14dcfSSatish Balay 
296a7e14dcfSSatish Balay   Output Parameter:
297a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
298a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
299a7e14dcfSSatish Balay 
300a7e14dcfSSatish Balay   Level: advanced
301a7e14dcfSSatish Balay 
302a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
303a7e14dcfSSatish Balay @*/
304441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
305a7e14dcfSSatish Balay {
306a7e14dcfSSatish Balay   PetscFunctionBegin;
307441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
308a7e14dcfSSatish Balay   if (DE) {
309a7e14dcfSSatish Balay     *DE = tao->DE;
310a7e14dcfSSatish Balay   }
311a7e14dcfSSatish Balay   if (DI) {
312a7e14dcfSSatish Balay     *DI = tao->DI;
313a7e14dcfSSatish Balay   }
314a7e14dcfSSatish Balay   PetscFunctionReturn(0);
315a7e14dcfSSatish Balay }
316a7e14dcfSSatish Balay 
317a7e14dcfSSatish Balay /*@C
318a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
319a7e14dcfSSatish Balay 
320441846f8SBarry Smith   Logically collective on Tao
321a7e14dcfSSatish Balay 
322a7e14dcfSSatish Balay   Input Parameters:
323441846f8SBarry Smith + tao - the Tao context
324a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
325a7e14dcfSSatish Balay . func - the bounds computation routine
3266c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
327a7e14dcfSSatish Balay 
328a7e14dcfSSatish Balay   Calling sequence of func:
329441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
330a7e14dcfSSatish Balay 
331441846f8SBarry Smith + tao - the Tao
332a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
333a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
334a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
335a7e14dcfSSatish Balay 
336a7e14dcfSSatish Balay   Level: intermediate
337a7e14dcfSSatish Balay 
338a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
339a7e14dcfSSatish Balay 
340a7e14dcfSSatish Balay @*/
341441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
342a7e14dcfSSatish Balay {
343a7e14dcfSSatish Balay   PetscErrorCode ierr;
344a7e14dcfSSatish Balay 
345a7e14dcfSSatish Balay   PetscFunctionBegin;
346441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
347a7e14dcfSSatish Balay   if (ce) {
348a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
349a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ce);
350a7e14dcfSSatish Balay   }
351a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr);
352*661095bbSAlp Dener   tao->eq_constrained = PETSC_TRUE;
353a7e14dcfSSatish Balay   tao->constraints_equality = ce;
354a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
355a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
356a7e14dcfSSatish Balay   PetscFunctionReturn(0);
357a7e14dcfSSatish Balay }
358a7e14dcfSSatish Balay 
359a7e14dcfSSatish Balay 
360a7e14dcfSSatish Balay /*@C
361a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
362a7e14dcfSSatish Balay 
363441846f8SBarry Smith   Logically collective on Tao
364a7e14dcfSSatish Balay 
365a7e14dcfSSatish Balay   Input Parameters:
366441846f8SBarry Smith + tao - the Tao context
367a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
368a7e14dcfSSatish Balay . func - the bounds computation routine
3696c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
370a7e14dcfSSatish Balay 
371a7e14dcfSSatish Balay   Calling sequence of func:
372441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
373a7e14dcfSSatish Balay 
374441846f8SBarry Smith + tao - the Tao
375a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
376a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
377a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay   Level: intermediate
380a7e14dcfSSatish Balay 
381a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
382a7e14dcfSSatish Balay 
383a7e14dcfSSatish Balay @*/
384441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
385a7e14dcfSSatish Balay {
386a7e14dcfSSatish Balay   PetscErrorCode ierr;
387a7e14dcfSSatish Balay 
388a7e14dcfSSatish Balay   PetscFunctionBegin;
389441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
390a7e14dcfSSatish Balay   if (ci) {
391a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
392a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ci);
393a7e14dcfSSatish Balay   }
394a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr);
395a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
396*661095bbSAlp Dener   tao->ineq_constrained = PETSC_TRUE;
397a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
398a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
399a7e14dcfSSatish Balay   PetscFunctionReturn(0);
400a7e14dcfSSatish Balay }
401a7e14dcfSSatish Balay 
402a7e14dcfSSatish Balay 
403a7e14dcfSSatish Balay /*@C
404a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
405a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
406a7e14dcfSSatish Balay 
407441846f8SBarry Smith    Collective on Tao
408a7e14dcfSSatish Balay 
409a7e14dcfSSatish Balay    Input Parameters:
410441846f8SBarry Smith .  tao - the Tao context
411a7e14dcfSSatish Balay 
412a7e14dcfSSatish Balay    Level: developer
413a7e14dcfSSatish Balay 
414a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
415a7e14dcfSSatish Balay @*/
416a7e14dcfSSatish Balay 
417441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
418a7e14dcfSSatish Balay {
419a7e14dcfSSatish Balay   PetscErrorCode ierr;
420a7e14dcfSSatish Balay 
421a7e14dcfSSatish Balay   PetscFunctionBegin;
422441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
423a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
424a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
425a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
426a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
427a7e14dcfSSatish Balay 
428691b26d3SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
429691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
4300ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
431441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
43253506e15SBarry Smith   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr);
433a7e14dcfSSatish Balay   PetscStackPop;
4340ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
435a7e14dcfSSatish Balay   tao->nconstraints++;
436a7e14dcfSSatish Balay   PetscFunctionReturn(0);
437a7e14dcfSSatish Balay }
438a7e14dcfSSatish Balay 
439a7e14dcfSSatish Balay 
440a7e14dcfSSatish Balay /*@C
441a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
442a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
443a7e14dcfSSatish Balay 
444441846f8SBarry Smith    Collective on Tao
445a7e14dcfSSatish Balay 
446a7e14dcfSSatish Balay    Input Parameters:
447441846f8SBarry Smith .  tao - the Tao context
448a7e14dcfSSatish Balay 
449a7e14dcfSSatish Balay    Level: developer
450a7e14dcfSSatish Balay 
451a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
452a7e14dcfSSatish Balay @*/
453a7e14dcfSSatish Balay 
454441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
455a7e14dcfSSatish Balay {
456a7e14dcfSSatish Balay   PetscErrorCode ierr;
457a7e14dcfSSatish Balay 
458a7e14dcfSSatish Balay   PetscFunctionBegin;
459441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
460a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
461a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
462a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
463a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
464a7e14dcfSSatish Balay 
465691b26d3SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
466691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
4670ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
468441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
46987f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
470a7e14dcfSSatish Balay   PetscStackPop;
4710ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
472a7e14dcfSSatish Balay   tao->nconstraints++;
473a7e14dcfSSatish Balay   PetscFunctionReturn(0);
474a7e14dcfSSatish Balay }
475