xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 87f595a510d358797c1cc8101e6f6c6930cb072f)
1a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay #undef __FUNCT__
4a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetVariableBounds"
5a7e14dcfSSatish Balay /*@
6a7e14dcfSSatish Balay   TaoSetVariableBounds - Sets the upper and lower bounds
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Logically collective on TaoSolver
9a7e14dcfSSatish Balay 
10a7e14dcfSSatish Balay   Input Parameters:
11a7e14dcfSSatish Balay + tao - the TaoSolver context
12a7e14dcfSSatish Balay . XL  - vector of lower bounds
13a7e14dcfSSatish Balay - XU  - vector of upper bounds
14a7e14dcfSSatish Balay 
15a7e14dcfSSatish Balay   Level: beginner
16a7e14dcfSSatish Balay 
17a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
18a7e14dcfSSatish Balay @*/
19a7e14dcfSSatish Balay 
20a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBounds(TaoSolver tao, Vec XL, Vec XU)
21a7e14dcfSSatish Balay {
22a7e14dcfSSatish Balay     PetscErrorCode ierr;
23a7e14dcfSSatish Balay     PetscFunctionBegin;
24a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
25a7e14dcfSSatish Balay     if (XL) {
26a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(XL,VEC_CLASSID,2);
27a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)XL);
28a7e14dcfSSatish Balay     }
29a7e14dcfSSatish Balay     if (XU) {
30a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(XU,VEC_CLASSID,3);
31a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)XU);
32a7e14dcfSSatish Balay     }
33a7e14dcfSSatish Balay     if (tao->XL) {
34a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->XL); CHKERRQ(ierr);
35a7e14dcfSSatish Balay     }
36a7e14dcfSSatish Balay     if (tao->XU) {
37a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->XU); CHKERRQ(ierr);
38a7e14dcfSSatish Balay     }
39a7e14dcfSSatish Balay 
40a7e14dcfSSatish Balay     tao->XL = XL;
41a7e14dcfSSatish Balay     tao->XU = XU;
42a7e14dcfSSatish Balay 
43a7e14dcfSSatish Balay     PetscFunctionReturn(0);
44a7e14dcfSSatish Balay }
45a7e14dcfSSatish Balay #undef __FUNCT__
46a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetVariableBoundsRoutine"
47a7e14dcfSSatish Balay /*@C
48a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
49a7e14dcfSSatish Balay 
50a7e14dcfSSatish Balay   Logically collective on TaoSolver
51a7e14dcfSSatish Balay 
52a7e14dcfSSatish Balay   Input Parameters:
53a7e14dcfSSatish Balay + tao - the TaoSolver context
54a7e14dcfSSatish Balay . func - the bounds computation routine
556c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL)
56a7e14dcfSSatish Balay 
57a7e14dcfSSatish Balay   Calling sequence of func:
58a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec xl, Vec xu);
59a7e14dcfSSatish Balay 
60a7e14dcfSSatish Balay + tao - the TaoSolver
61a7e14dcfSSatish Balay . xl  - vector of lower bounds
62a7e14dcfSSatish Balay . xu  - vector of upper bounds
63a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
64a7e14dcfSSatish Balay 
65a7e14dcfSSatish Balay   Level: beginner
66a7e14dcfSSatish Balay 
67a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
68a7e14dcfSSatish Balay 
69a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
70a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds().
71a7e14dcfSSatish Balay 
72a7e14dcfSSatish Balay @*/
73a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBoundsRoutine(TaoSolver tao, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
74a7e14dcfSSatish Balay {
75a7e14dcfSSatish Balay     PetscFunctionBegin;
76a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
77a7e14dcfSSatish Balay     tao->user_boundsP = ctx;
78a7e14dcfSSatish Balay     tao->ops->computebounds = func;
79a7e14dcfSSatish Balay     PetscFunctionReturn(0);
80a7e14dcfSSatish Balay }
81a7e14dcfSSatish Balay 
82a7e14dcfSSatish Balay #undef __FUNCT__
83a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetVariableBounds"
84a7e14dcfSSatish Balay PetscErrorCode TaoGetVariableBounds(TaoSolver tao, Vec *XL, Vec *XU)
85a7e14dcfSSatish Balay {
86a7e14dcfSSatish Balay     PetscFunctionBegin;
87a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
88a7e14dcfSSatish Balay     if (XL) {
89a7e14dcfSSatish Balay 	*XL=tao->XL;
90a7e14dcfSSatish Balay     }
91a7e14dcfSSatish Balay     if (XU) {
92a7e14dcfSSatish Balay 	*XU=tao->XU;
93a7e14dcfSSatish Balay     }
94a7e14dcfSSatish Balay     PetscFunctionReturn(0);
95a7e14dcfSSatish Balay }
96a7e14dcfSSatish Balay 
97a7e14dcfSSatish Balay #undef __FUNCT__
98a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeVariableBounds"
99a7e14dcfSSatish Balay /*@C
100a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
101a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
102a7e14dcfSSatish Balay 
103a7e14dcfSSatish Balay    Collective on TaoSolver
104a7e14dcfSSatish Balay 
105a7e14dcfSSatish Balay    Input Parameters:
106a7e14dcfSSatish Balay .  tao - the TaoSolver context
107a7e14dcfSSatish Balay 
108a7e14dcfSSatish Balay    Level: developer
109a7e14dcfSSatish Balay 
110a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds()
111a7e14dcfSSatish Balay @*/
112a7e14dcfSSatish Balay 
113a7e14dcfSSatish Balay PetscErrorCode TaoComputeVariableBounds(TaoSolver tao)
114a7e14dcfSSatish Balay {
115a7e14dcfSSatish Balay   PetscErrorCode ierr;
116a7e14dcfSSatish Balay 
117a7e14dcfSSatish Balay   PetscFunctionBegin;
118a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
119*87f595a5SBarry Smith   if (!tao->ops->computebounds) PetscFunctionReturn(0);
120*87f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
121*87f595a5SBarry Smith     if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeVariableBounds");
122a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XL); CHKERRQ(ierr);
123a7e14dcfSSatish Balay     ierr = VecSet(tao->XL, TAO_NINFINITY); CHKERRQ(ierr);
124a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XU); CHKERRQ(ierr);
125a7e14dcfSSatish Balay     ierr = VecSet(tao->XU, TAO_INFINITY); CHKERRQ(ierr);
126a7e14dcfSSatish Balay   }
127*87f595a5SBarry Smith   ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr);
128a7e14dcfSSatish Balay   CHKMEMQ;
129a7e14dcfSSatish Balay   PetscFunctionReturn(0);
130a7e14dcfSSatish Balay }
131a7e14dcfSSatish Balay 
132a7e14dcfSSatish Balay #undef __FUNCT__
133a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityBounds"
134a7e14dcfSSatish Balay /*@
135a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
136a7e14dcfSSatish Balay 
137a7e14dcfSSatish Balay   Logically collective on TaoSolver
138a7e14dcfSSatish Balay 
139a7e14dcfSSatish Balay   Input Parameters:
140a7e14dcfSSatish Balay + tao - the TaoSolver context
141a7e14dcfSSatish Balay . IL  - vector of lower bounds
142a7e14dcfSSatish Balay - IU  - vector of upper bounds
143a7e14dcfSSatish Balay 
144a7e14dcfSSatish Balay   Level: beginner
145a7e14dcfSSatish Balay 
146a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
147a7e14dcfSSatish Balay @*/
148a7e14dcfSSatish Balay 
149a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityBounds(TaoSolver tao, Vec IL, Vec IU)
150a7e14dcfSSatish Balay {
151a7e14dcfSSatish Balay     PetscErrorCode ierr;
152a7e14dcfSSatish Balay     PetscFunctionBegin;
153a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
154a7e14dcfSSatish Balay     if (IL) {
155a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
156a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)IL);
157a7e14dcfSSatish Balay     }
158a7e14dcfSSatish Balay     if (IU) {
159a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
160a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)IU);
161a7e14dcfSSatish Balay     }
162a7e14dcfSSatish Balay     if (tao->IL) {
163a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->IL); CHKERRQ(ierr);
164a7e14dcfSSatish Balay     }
165a7e14dcfSSatish Balay     if (tao->IU) {
166a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->IU); CHKERRQ(ierr);
167a7e14dcfSSatish Balay     }
168a7e14dcfSSatish Balay 
169a7e14dcfSSatish Balay     tao->IL = IL;
170a7e14dcfSSatish Balay     tao->IU = IU;
171a7e14dcfSSatish Balay 
172a7e14dcfSSatish Balay     PetscFunctionReturn(0);
173a7e14dcfSSatish Balay }
174a7e14dcfSSatish Balay 
175a7e14dcfSSatish Balay 
176a7e14dcfSSatish Balay #undef __FUNCT__
177a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetInequalityBounds"
178a7e14dcfSSatish Balay PetscErrorCode TaoGetInequalityBounds(TaoSolver tao, Vec *IL, Vec *IU)
179a7e14dcfSSatish Balay {
180a7e14dcfSSatish Balay     PetscFunctionBegin;
181a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
182a7e14dcfSSatish Balay     if (IL) {
183a7e14dcfSSatish Balay 	*IL=tao->IL;
184a7e14dcfSSatish Balay     }
185a7e14dcfSSatish Balay     if (IU) {
186a7e14dcfSSatish Balay 	*IU=tao->IU;
187a7e14dcfSSatish Balay     }
188a7e14dcfSSatish Balay     PetscFunctionReturn(0);
189a7e14dcfSSatish Balay }
190a7e14dcfSSatish Balay 
191a7e14dcfSSatish Balay #undef __FUNCT__
192a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeConstraints"
193a7e14dcfSSatish Balay /*@C
194a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
195a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
196a7e14dcfSSatish Balay 
197a7e14dcfSSatish Balay    Collective on TaoSolver
198a7e14dcfSSatish Balay 
199a7e14dcfSSatish Balay    Input Parameters:
200a7e14dcfSSatish Balay .  tao - the TaoSolver context
201a7e14dcfSSatish Balay 
202a7e14dcfSSatish Balay    Level: developer
203a7e14dcfSSatish Balay 
204a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
205a7e14dcfSSatish Balay @*/
206a7e14dcfSSatish Balay 
207a7e14dcfSSatish Balay PetscErrorCode TaoComputeConstraints(TaoSolver tao, Vec X, Vec C)
208a7e14dcfSSatish Balay {
209a7e14dcfSSatish Balay   PetscErrorCode ierr;
210a7e14dcfSSatish Balay 
211a7e14dcfSSatish Balay   PetscFunctionBegin;
212a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
213a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
214a7e14dcfSSatish Balay   PetscValidHeaderSpecific(C,VEC_CLASSID,2);
215a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
216a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
217a7e14dcfSSatish Balay 
218*87f595a5SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
219*87f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
2206c23d075SBarry Smith   ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,C,NULL); CHKERRQ(ierr);
221a7e14dcfSSatish Balay   PetscStackPush("TaoSolver constraints evaluation routine");
222a7e14dcfSSatish Balay   CHKMEMQ;
223a7e14dcfSSatish Balay   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);
224a7e14dcfSSatish Balay   CHKERRQ(ierr);
225a7e14dcfSSatish Balay   CHKMEMQ;
226a7e14dcfSSatish Balay   PetscStackPop;
2276c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,C,NULL); CHKERRQ(ierr);
228a7e14dcfSSatish Balay   tao->nconstraints++;
229a7e14dcfSSatish Balay   PetscFunctionReturn(0);
230a7e14dcfSSatish Balay }
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay 
233a7e14dcfSSatish Balay #undef __FUNCT__
234a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintsRoutine"
235a7e14dcfSSatish Balay /*@C
236a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
237a7e14dcfSSatish Balay 
238a7e14dcfSSatish Balay   Logically collective on TaoSolver
239a7e14dcfSSatish Balay 
240a7e14dcfSSatish Balay   Input Parameters:
241a7e14dcfSSatish Balay + tao - the TaoSolver context
242a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
243a7e14dcfSSatish Balay . func - the bounds computation routine
2446c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
245a7e14dcfSSatish Balay 
246a7e14dcfSSatish Balay   Calling sequence of func:
247a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec c, void *ctx);
248a7e14dcfSSatish Balay 
249a7e14dcfSSatish Balay + tao - the TaoSolver
250a7e14dcfSSatish Balay . x   - point to evaluate constraints
251a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
252a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
253a7e14dcfSSatish Balay 
254a7e14dcfSSatish Balay   Level: intermediate
255a7e14dcfSSatish Balay 
256a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
257a7e14dcfSSatish Balay 
258a7e14dcfSSatish Balay @*/
259a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintsRoutine(TaoSolver tao, Vec c, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
260a7e14dcfSSatish Balay {
261a7e14dcfSSatish Balay     PetscFunctionBegin;
262a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
263a7e14dcfSSatish Balay     tao->constraints = c;
264a7e14dcfSSatish Balay     tao->user_conP = ctx;
265a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
266a7e14dcfSSatish Balay     PetscFunctionReturn(0);
267a7e14dcfSSatish Balay }
268a7e14dcfSSatish Balay 
269a7e14dcfSSatish Balay #undef __FUNCT__
270a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeDualVariables"
271a7e14dcfSSatish Balay /*@
272a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
273a7e14dcfSSatish Balay   of the variables
274a7e14dcfSSatish Balay 
275a7e14dcfSSatish Balay   Collective on TaoSolver
276a7e14dcfSSatish Balay 
277a7e14dcfSSatish Balay   Input Parameters:
278a7e14dcfSSatish Balay . tao - the TaoSolver context
279a7e14dcfSSatish Balay 
280a7e14dcfSSatish Balay   Output Parameter:
281a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
282a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
283a7e14dcfSSatish Balay 
284a7e14dcfSSatish Balay   Level: advanced
285a7e14dcfSSatish Balay 
286a7e14dcfSSatish Balay   Note:
287a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
288a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
289a7e14dcfSSatish Balay   zeros.
290a7e14dcfSSatish Balay 
291a7e14dcfSSatish Balay   Level: advanced
292a7e14dcfSSatish Balay 
293a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
294a7e14dcfSSatish Balay @*/
295a7e14dcfSSatish Balay PetscErrorCode TaoComputeDualVariables(TaoSolver tao, Vec DL, Vec DU)
296a7e14dcfSSatish Balay {
297a7e14dcfSSatish Balay     PetscErrorCode ierr;
298a7e14dcfSSatish Balay     PetscFunctionBegin;
299a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
300a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
301a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
302a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DL,2);
303a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DU,3);
304a7e14dcfSSatish Balay     if (tao->ops->computedual) {
305a7e14dcfSSatish Balay       ierr = (*tao->ops->computedual)(tao,DL,DU); CHKERRQ(ierr);
306a7e14dcfSSatish Balay     }  else {
307a7e14dcfSSatish Balay       ierr = VecSet(DL,0.0); CHKERRQ(ierr);
308a7e14dcfSSatish Balay       ierr = VecSet(DU,0.0); CHKERRQ(ierr);
309a7e14dcfSSatish Balay     }
310a7e14dcfSSatish Balay     PetscFunctionReturn(0);
311a7e14dcfSSatish Balay }
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay #undef __FUNCT__
314a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetDualVariables"
315a7e14dcfSSatish Balay /*@
316a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
317a7e14dcfSSatish Balay 
318a7e14dcfSSatish Balay   Collective on TaoSolver
319a7e14dcfSSatish Balay 
320a7e14dcfSSatish Balay   Input Parameters:
321a7e14dcfSSatish Balay . tao - the TaoSolver context
322a7e14dcfSSatish Balay 
323a7e14dcfSSatish Balay   Output Parameter:
324a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
325a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
326a7e14dcfSSatish Balay 
327a7e14dcfSSatish Balay   Level: advanced
328a7e14dcfSSatish Balay 
329a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
330a7e14dcfSSatish Balay @*/
331a7e14dcfSSatish Balay PetscErrorCode TaoGetDualVariables(TaoSolver tao, Vec *DE, Vec *DI)
332a7e14dcfSSatish Balay {
333a7e14dcfSSatish Balay     PetscFunctionBegin;
334a7e14dcfSSatish Balay      PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
335a7e14dcfSSatish Balay     if (DE) {
336a7e14dcfSSatish Balay       *DE = tao->DE;
337a7e14dcfSSatish Balay     }
338a7e14dcfSSatish Balay     if (DI) {
339a7e14dcfSSatish Balay       *DI = tao->DI;
340a7e14dcfSSatish Balay     }
341a7e14dcfSSatish Balay     PetscFunctionReturn(0);
342a7e14dcfSSatish Balay }
343a7e14dcfSSatish Balay 
344a7e14dcfSSatish Balay #undef __FUNCT__
345a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetEqualityConstraintsRoutine"
346a7e14dcfSSatish Balay /*@C
347a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
348a7e14dcfSSatish Balay 
349a7e14dcfSSatish Balay   Logically collective on TaoSolver
350a7e14dcfSSatish Balay 
351a7e14dcfSSatish Balay   Input Parameters:
352a7e14dcfSSatish Balay + tao - the TaoSolver context
353a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
354a7e14dcfSSatish Balay . func - the bounds computation routine
3556c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay   Calling sequence of func:
358a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ce, void *ctx);
359a7e14dcfSSatish Balay 
360a7e14dcfSSatish Balay + tao - the TaoSolver
361a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
362a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
363a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
364a7e14dcfSSatish Balay 
365a7e14dcfSSatish Balay   Level: intermediate
366a7e14dcfSSatish Balay 
367a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
368a7e14dcfSSatish Balay 
369a7e14dcfSSatish Balay @*/
370a7e14dcfSSatish Balay PetscErrorCode TaoSetEqualityConstraintsRoutine(TaoSolver tao, Vec ce, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
371a7e14dcfSSatish Balay {
372a7e14dcfSSatish Balay     PetscErrorCode ierr;
373a7e14dcfSSatish Balay 
374a7e14dcfSSatish Balay     PetscFunctionBegin;
375a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
376a7e14dcfSSatish Balay     if (ce) {
377a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
378a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ce);
379a7e14dcfSSatish Balay     }
380a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_equality); CHKERRQ(ierr);
381a7e14dcfSSatish Balay 
382a7e14dcfSSatish Balay     tao->constraints_equality = ce;
383a7e14dcfSSatish Balay     tao->user_con_equalityP = ctx;
384a7e14dcfSSatish Balay     tao->ops->computeequalityconstraints = func;
385a7e14dcfSSatish Balay     PetscFunctionReturn(0);
386a7e14dcfSSatish Balay }
387a7e14dcfSSatish Balay 
388a7e14dcfSSatish Balay 
389a7e14dcfSSatish Balay #undef __FUNCT__
390a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityConstraintsRoutine"
391a7e14dcfSSatish Balay /*@C
392a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
393a7e14dcfSSatish Balay 
394a7e14dcfSSatish Balay   Logically collective on TaoSolver
395a7e14dcfSSatish Balay 
396a7e14dcfSSatish Balay   Input Parameters:
397a7e14dcfSSatish Balay + tao - the TaoSolver context
398a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
399a7e14dcfSSatish Balay . func - the bounds computation routine
4006c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
401a7e14dcfSSatish Balay 
402a7e14dcfSSatish Balay   Calling sequence of func:
403a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ci, void *ctx);
404a7e14dcfSSatish Balay 
405a7e14dcfSSatish Balay + tao - the TaoSolver
406a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
407a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
408a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay   Level: intermediate
411a7e14dcfSSatish Balay 
412a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
413a7e14dcfSSatish Balay 
414a7e14dcfSSatish Balay @*/
415a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityConstraintsRoutine(TaoSolver tao, Vec ci, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
416a7e14dcfSSatish Balay {
417a7e14dcfSSatish Balay     PetscErrorCode ierr;
418a7e14dcfSSatish Balay 
419a7e14dcfSSatish Balay     PetscFunctionBegin;
420a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
421a7e14dcfSSatish Balay     if (ci) {
422a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
423a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ci);
424a7e14dcfSSatish Balay     }
425a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_inequality); CHKERRQ(ierr);
426a7e14dcfSSatish Balay     tao->constraints_inequality = ci;
427a7e14dcfSSatish Balay 
428a7e14dcfSSatish Balay     tao->user_con_inequalityP = ctx;
429a7e14dcfSSatish Balay     tao->ops->computeinequalityconstraints = func;
430a7e14dcfSSatish Balay     PetscFunctionReturn(0);
431a7e14dcfSSatish Balay }
432a7e14dcfSSatish Balay 
433a7e14dcfSSatish Balay 
434a7e14dcfSSatish Balay #undef __FUNCT__
435a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeEqualityConstraints"
436a7e14dcfSSatish Balay /*@C
437a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
438a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
439a7e14dcfSSatish Balay 
440a7e14dcfSSatish Balay    Collective on TaoSolver
441a7e14dcfSSatish Balay 
442a7e14dcfSSatish Balay    Input Parameters:
443a7e14dcfSSatish Balay .  tao - the TaoSolver context
444a7e14dcfSSatish Balay 
445a7e14dcfSSatish Balay    Level: developer
446a7e14dcfSSatish Balay 
447a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
448a7e14dcfSSatish Balay @*/
449a7e14dcfSSatish Balay 
450a7e14dcfSSatish Balay PetscErrorCode TaoComputeEqualityConstraints(TaoSolver tao, Vec X, Vec CE)
451a7e14dcfSSatish Balay {
452a7e14dcfSSatish Balay   PetscErrorCode ierr;
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay   PetscFunctionBegin;
455a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
456a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
457a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
458a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
459a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
460a7e14dcfSSatish Balay 
461*87f595a5SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
462*87f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
4636c23d075SBarry Smith   ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CE,NULL); CHKERRQ(ierr);
464a7e14dcfSSatish Balay   PetscStackPush("TaoSolver equality constraints evaluation routine");
465a7e14dcfSSatish Balay   CHKMEMQ;
466a7e14dcfSSatish Balay   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);
467a7e14dcfSSatish Balay   CHKERRQ(ierr);
468a7e14dcfSSatish Balay   CHKMEMQ;
469a7e14dcfSSatish Balay   PetscStackPop;
4706c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CE,NULL); CHKERRQ(ierr);
471a7e14dcfSSatish Balay   tao->nconstraints++;
472a7e14dcfSSatish Balay   PetscFunctionReturn(0);
473a7e14dcfSSatish Balay }
474a7e14dcfSSatish Balay 
475a7e14dcfSSatish Balay 
476a7e14dcfSSatish Balay #undef __FUNCT__
477a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeInequalityConstraints"
478a7e14dcfSSatish Balay /*@C
479a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
480a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
481a7e14dcfSSatish Balay 
482a7e14dcfSSatish Balay    Collective on TaoSolver
483a7e14dcfSSatish Balay 
484a7e14dcfSSatish Balay    Input Parameters:
485a7e14dcfSSatish Balay .  tao - the TaoSolver context
486a7e14dcfSSatish Balay 
487a7e14dcfSSatish Balay    Level: developer
488a7e14dcfSSatish Balay 
489a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
490a7e14dcfSSatish Balay @*/
491a7e14dcfSSatish Balay 
492a7e14dcfSSatish Balay PetscErrorCode TaoComputeInequalityConstraints(TaoSolver tao, Vec X, Vec CI)
493a7e14dcfSSatish Balay {
494a7e14dcfSSatish Balay   PetscErrorCode ierr;
495a7e14dcfSSatish Balay 
496a7e14dcfSSatish Balay   PetscFunctionBegin;
497a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
498a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
499a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
500a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
501a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
502a7e14dcfSSatish Balay 
503*87f595a5SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
504*87f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
5056c23d075SBarry Smith   ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CI,NULL); CHKERRQ(ierr);
506a7e14dcfSSatish Balay   PetscStackPush("TaoSolver inequality constraints evaluation routine");
507a7e14dcfSSatish Balay   CHKMEMQ;
508*87f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
509a7e14dcfSSatish Balay   CHKMEMQ;
510a7e14dcfSSatish Balay   PetscStackPop;
5116c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CI,NULL); CHKERRQ(ierr);
512a7e14dcfSSatish Balay   tao->nconstraints++;
513a7e14dcfSSatish Balay   PetscFunctionReturn(0);
514a7e14dcfSSatish Balay }
515