xref: /petsc/src/tao/interface/taosolver_bounds.c (revision aaa7dc30da3270cff6cb10b1db605b2ca746f216)
1*aaa7dc30SBarry Smith #include <petsc-private/taosolverimpl.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);
11987f595a5SBarry Smith   if (!tao->ops->computebounds) PetscFunctionReturn(0);
12087f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
12187f595a5SBarry 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   }
12787f595a5SBarry 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 
21887f595a5SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
21987f595a5SBarry 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;
22353506e15SBarry Smith   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr);
224a7e14dcfSSatish Balay   CHKMEMQ;
225a7e14dcfSSatish Balay   PetscStackPop;
2266c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
227a7e14dcfSSatish Balay   tao->nconstraints++;
228a7e14dcfSSatish Balay   PetscFunctionReturn(0);
229a7e14dcfSSatish Balay }
230a7e14dcfSSatish Balay 
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay #undef __FUNCT__
233a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintsRoutine"
234a7e14dcfSSatish Balay /*@C
235a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
236a7e14dcfSSatish Balay 
237a7e14dcfSSatish Balay   Logically collective on TaoSolver
238a7e14dcfSSatish Balay 
239a7e14dcfSSatish Balay   Input Parameters:
240a7e14dcfSSatish Balay + tao - the TaoSolver context
241a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
242a7e14dcfSSatish Balay . func - the bounds computation routine
2436c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
244a7e14dcfSSatish Balay 
245a7e14dcfSSatish Balay   Calling sequence of func:
246a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec c, void *ctx);
247a7e14dcfSSatish Balay 
248a7e14dcfSSatish Balay + tao - the TaoSolver
249a7e14dcfSSatish Balay . x   - point to evaluate constraints
250a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
251a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
252a7e14dcfSSatish Balay 
253a7e14dcfSSatish Balay   Level: intermediate
254a7e14dcfSSatish Balay 
255a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
256a7e14dcfSSatish Balay 
257a7e14dcfSSatish Balay @*/
258a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintsRoutine(TaoSolver tao, Vec c, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
259a7e14dcfSSatish Balay {
260a7e14dcfSSatish Balay     PetscFunctionBegin;
261a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
262a7e14dcfSSatish Balay     tao->constraints = c;
263a7e14dcfSSatish Balay     tao->user_conP = ctx;
264a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
265a7e14dcfSSatish Balay     PetscFunctionReturn(0);
266a7e14dcfSSatish Balay }
267a7e14dcfSSatish Balay 
268a7e14dcfSSatish Balay #undef __FUNCT__
269a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeDualVariables"
270a7e14dcfSSatish Balay /*@
271a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
272a7e14dcfSSatish Balay   of the variables
273a7e14dcfSSatish Balay 
274a7e14dcfSSatish Balay   Collective on TaoSolver
275a7e14dcfSSatish Balay 
276a7e14dcfSSatish Balay   Input Parameters:
277a7e14dcfSSatish Balay . tao - the TaoSolver context
278a7e14dcfSSatish Balay 
279a7e14dcfSSatish Balay   Output Parameter:
280a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
281a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
282a7e14dcfSSatish Balay 
283a7e14dcfSSatish Balay   Level: advanced
284a7e14dcfSSatish Balay 
285a7e14dcfSSatish Balay   Note:
286a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
287a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
288a7e14dcfSSatish Balay   zeros.
289a7e14dcfSSatish Balay 
290a7e14dcfSSatish Balay   Level: advanced
291a7e14dcfSSatish Balay 
292a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
293a7e14dcfSSatish Balay @*/
294a7e14dcfSSatish Balay PetscErrorCode TaoComputeDualVariables(TaoSolver tao, Vec DL, Vec DU)
295a7e14dcfSSatish Balay {
296a7e14dcfSSatish Balay     PetscErrorCode ierr;
297a7e14dcfSSatish Balay     PetscFunctionBegin;
298a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
299a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
300a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
301a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DL,2);
302a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DU,3);
303a7e14dcfSSatish Balay     if (tao->ops->computedual) {
304a7e14dcfSSatish Balay       ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr);
305a7e14dcfSSatish Balay     }  else {
306a7e14dcfSSatish Balay       ierr = VecSet(DL,0.0);CHKERRQ(ierr);
307a7e14dcfSSatish Balay       ierr = VecSet(DU,0.0);CHKERRQ(ierr);
308a7e14dcfSSatish Balay     }
309a7e14dcfSSatish Balay     PetscFunctionReturn(0);
310a7e14dcfSSatish Balay }
311a7e14dcfSSatish Balay 
312a7e14dcfSSatish Balay #undef __FUNCT__
313a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetDualVariables"
314a7e14dcfSSatish Balay /*@
315a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
316a7e14dcfSSatish Balay 
317a7e14dcfSSatish Balay   Collective on TaoSolver
318a7e14dcfSSatish Balay 
319a7e14dcfSSatish Balay   Input Parameters:
320a7e14dcfSSatish Balay . tao - the TaoSolver context
321a7e14dcfSSatish Balay 
322a7e14dcfSSatish Balay   Output Parameter:
323a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
324a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
325a7e14dcfSSatish Balay 
326a7e14dcfSSatish Balay   Level: advanced
327a7e14dcfSSatish Balay 
328a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
329a7e14dcfSSatish Balay @*/
330a7e14dcfSSatish Balay PetscErrorCode TaoGetDualVariables(TaoSolver tao, Vec *DE, Vec *DI)
331a7e14dcfSSatish Balay {
332a7e14dcfSSatish Balay     PetscFunctionBegin;
333a7e14dcfSSatish Balay      PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
334a7e14dcfSSatish Balay     if (DE) {
335a7e14dcfSSatish Balay       *DE = tao->DE;
336a7e14dcfSSatish Balay     }
337a7e14dcfSSatish Balay     if (DI) {
338a7e14dcfSSatish Balay       *DI = tao->DI;
339a7e14dcfSSatish Balay     }
340a7e14dcfSSatish Balay     PetscFunctionReturn(0);
341a7e14dcfSSatish Balay }
342a7e14dcfSSatish Balay 
343a7e14dcfSSatish Balay #undef __FUNCT__
344a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetEqualityConstraintsRoutine"
345a7e14dcfSSatish Balay /*@C
346a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
347a7e14dcfSSatish Balay 
348a7e14dcfSSatish Balay   Logically collective on TaoSolver
349a7e14dcfSSatish Balay 
350a7e14dcfSSatish Balay   Input Parameters:
351a7e14dcfSSatish Balay + tao - the TaoSolver context
352a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
353a7e14dcfSSatish Balay . func - the bounds computation routine
3546c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay   Calling sequence of func:
357a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ce, void *ctx);
358a7e14dcfSSatish Balay 
359a7e14dcfSSatish Balay + tao - the TaoSolver
360a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
361a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
362a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
363a7e14dcfSSatish Balay 
364a7e14dcfSSatish Balay   Level: intermediate
365a7e14dcfSSatish Balay 
366a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
367a7e14dcfSSatish Balay 
368a7e14dcfSSatish Balay @*/
369a7e14dcfSSatish Balay PetscErrorCode TaoSetEqualityConstraintsRoutine(TaoSolver tao, Vec ce, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
370a7e14dcfSSatish Balay {
371a7e14dcfSSatish Balay     PetscErrorCode ierr;
372a7e14dcfSSatish Balay 
373a7e14dcfSSatish Balay     PetscFunctionBegin;
374a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
375a7e14dcfSSatish Balay     if (ce) {
376a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
377a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ce);
378a7e14dcfSSatish Balay     }
379a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr);
380a7e14dcfSSatish Balay 
381a7e14dcfSSatish Balay     tao->constraints_equality = ce;
382a7e14dcfSSatish Balay     tao->user_con_equalityP = ctx;
383a7e14dcfSSatish Balay     tao->ops->computeequalityconstraints = func;
384a7e14dcfSSatish Balay     PetscFunctionReturn(0);
385a7e14dcfSSatish Balay }
386a7e14dcfSSatish Balay 
387a7e14dcfSSatish Balay 
388a7e14dcfSSatish Balay #undef __FUNCT__
389a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityConstraintsRoutine"
390a7e14dcfSSatish Balay /*@C
391a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
392a7e14dcfSSatish Balay 
393a7e14dcfSSatish Balay   Logically collective on TaoSolver
394a7e14dcfSSatish Balay 
395a7e14dcfSSatish Balay   Input Parameters:
396a7e14dcfSSatish Balay + tao - the TaoSolver context
397a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
398a7e14dcfSSatish Balay . func - the bounds computation routine
3996c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
400a7e14dcfSSatish Balay 
401a7e14dcfSSatish Balay   Calling sequence of func:
402a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ci, void *ctx);
403a7e14dcfSSatish Balay 
404a7e14dcfSSatish Balay + tao - the TaoSolver
405a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
406a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
407a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
408a7e14dcfSSatish Balay 
409a7e14dcfSSatish Balay   Level: intermediate
410a7e14dcfSSatish Balay 
411a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
412a7e14dcfSSatish Balay 
413a7e14dcfSSatish Balay @*/
414a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityConstraintsRoutine(TaoSolver tao, Vec ci, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
415a7e14dcfSSatish Balay {
416a7e14dcfSSatish Balay     PetscErrorCode ierr;
417a7e14dcfSSatish Balay 
418a7e14dcfSSatish Balay     PetscFunctionBegin;
419a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
420a7e14dcfSSatish Balay     if (ci) {
421a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
422a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ci);
423a7e14dcfSSatish Balay     }
424a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr);
425a7e14dcfSSatish Balay     tao->constraints_inequality = ci;
426a7e14dcfSSatish Balay 
427a7e14dcfSSatish Balay     tao->user_con_inequalityP = ctx;
428a7e14dcfSSatish Balay     tao->ops->computeinequalityconstraints = func;
429a7e14dcfSSatish Balay     PetscFunctionReturn(0);
430a7e14dcfSSatish Balay }
431a7e14dcfSSatish Balay 
432a7e14dcfSSatish Balay 
433a7e14dcfSSatish Balay #undef __FUNCT__
434a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeEqualityConstraints"
435a7e14dcfSSatish Balay /*@C
436a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
437a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
438a7e14dcfSSatish Balay 
439a7e14dcfSSatish Balay    Collective on TaoSolver
440a7e14dcfSSatish Balay 
441a7e14dcfSSatish Balay    Input Parameters:
442a7e14dcfSSatish Balay .  tao - the TaoSolver context
443a7e14dcfSSatish Balay 
444a7e14dcfSSatish Balay    Level: developer
445a7e14dcfSSatish Balay 
446a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
447a7e14dcfSSatish Balay @*/
448a7e14dcfSSatish Balay 
449a7e14dcfSSatish Balay PetscErrorCode TaoComputeEqualityConstraints(TaoSolver tao, Vec X, Vec CE)
450a7e14dcfSSatish Balay {
451a7e14dcfSSatish Balay   PetscErrorCode ierr;
452a7e14dcfSSatish Balay 
453a7e14dcfSSatish Balay   PetscFunctionBegin;
454a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
455a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
456a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
457a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
458a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
459a7e14dcfSSatish Balay 
46087f595a5SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
46187f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
4626c23d075SBarry Smith   ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
463a7e14dcfSSatish Balay   PetscStackPush("TaoSolver equality constraints evaluation routine");
464a7e14dcfSSatish Balay   CHKMEMQ;
46553506e15SBarry Smith   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr);
466a7e14dcfSSatish Balay   CHKMEMQ;
467a7e14dcfSSatish Balay   PetscStackPop;
4686c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
469a7e14dcfSSatish Balay   tao->nconstraints++;
470a7e14dcfSSatish Balay   PetscFunctionReturn(0);
471a7e14dcfSSatish Balay }
472a7e14dcfSSatish Balay 
473a7e14dcfSSatish Balay 
474a7e14dcfSSatish Balay #undef __FUNCT__
475a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeInequalityConstraints"
476a7e14dcfSSatish Balay /*@C
477a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
478a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
479a7e14dcfSSatish Balay 
480a7e14dcfSSatish Balay    Collective on TaoSolver
481a7e14dcfSSatish Balay 
482a7e14dcfSSatish Balay    Input Parameters:
483a7e14dcfSSatish Balay .  tao - the TaoSolver context
484a7e14dcfSSatish Balay 
485a7e14dcfSSatish Balay    Level: developer
486a7e14dcfSSatish Balay 
487a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
488a7e14dcfSSatish Balay @*/
489a7e14dcfSSatish Balay 
490a7e14dcfSSatish Balay PetscErrorCode TaoComputeInequalityConstraints(TaoSolver tao, Vec X, Vec CI)
491a7e14dcfSSatish Balay {
492a7e14dcfSSatish Balay   PetscErrorCode ierr;
493a7e14dcfSSatish Balay 
494a7e14dcfSSatish Balay   PetscFunctionBegin;
495a7e14dcfSSatish Balay   PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
496a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
497a7e14dcfSSatish Balay   PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
498a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
499a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
500a7e14dcfSSatish Balay 
50187f595a5SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
50287f595a5SBarry Smith   if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
5036c23d075SBarry Smith   ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
504a7e14dcfSSatish Balay   PetscStackPush("TaoSolver inequality constraints evaluation routine");
505a7e14dcfSSatish Balay   CHKMEMQ;
50687f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
507a7e14dcfSSatish Balay   CHKMEMQ;
508a7e14dcfSSatish Balay   PetscStackPop;
5096c23d075SBarry Smith   ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
510a7e14dcfSSatish Balay   tao->nconstraints++;
511a7e14dcfSSatish Balay   PetscFunctionReturn(0);
512a7e14dcfSSatish Balay }
513