xref: /petsc/src/tao/interface/taosolver_hj.c (revision f4c1ad5c888c40afce6be379558d90e11f343bfb)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@C
4a7e14dcfSSatish Balay    TaoSetHessianRoutine - Sets the function to compute the Hessian as well as the location to store the matrix.
5a7e14dcfSSatish Balay 
6441846f8SBarry Smith    Logically collective on Tao
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay    Input Parameters:
9441846f8SBarry Smith +  tao  - the Tao context
10a7e14dcfSSatish Balay .  H    - Matrix used for the hessian
11a7e14dcfSSatish Balay .  Hpre - Matrix that will be used operated on by preconditioner, can be same as H
12*f4c1ad5cSStefano Zampini .  func - Hessian evaluation routine
13a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
146c23d075SBarry Smith          Hessian evaluation routine (may be NULL)
15a7e14dcfSSatish Balay 
16*f4c1ad5cSStefano Zampini    Calling sequence of func:
17*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat H,Mat Hpre,void *ctx);
18a7e14dcfSSatish Balay 
19441846f8SBarry Smith +  tao  - the Tao  context
20a7e14dcfSSatish Balay .  x    - input vector
21a7e14dcfSSatish Balay .  H    - Hessian matrix
22a7e14dcfSSatish Balay .  Hpre - preconditioner matrix, usually the same as H
23a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Hessian context
24a7e14dcfSSatish Balay 
25a7e14dcfSSatish Balay    Level: beginner
26a7e14dcfSSatish Balay @*/
27ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
28a7e14dcfSSatish Balay {
29a7e14dcfSSatish Balay   PetscErrorCode ierr;
3045cf516eSBarry Smith 
31a7e14dcfSSatish Balay   PetscFunctionBegin;
32441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
33a7e14dcfSSatish Balay   if (H) {
34a7e14dcfSSatish Balay     PetscValidHeaderSpecific(H,MAT_CLASSID,2);
35a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,H,2);
36a7e14dcfSSatish Balay   }
37a7e14dcfSSatish Balay   if (Hpre) {
38a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
39a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Hpre,3);
40a7e14dcfSSatish Balay   }
41a7e14dcfSSatish Balay   if (ctx) {
42a7e14dcfSSatish Balay     tao->user_hessP = ctx;
43a7e14dcfSSatish Balay   }
44a7e14dcfSSatish Balay   if (func) {
45a7e14dcfSSatish Balay     tao->ops->computehessian = func;
46a7e14dcfSSatish Balay   }
47a7e14dcfSSatish Balay   if (H) {
48a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr);
4945cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr);
50a7e14dcfSSatish Balay     tao->hessian = H;
51a7e14dcfSSatish Balay   }
52a7e14dcfSSatish Balay   if (Hpre) {
53a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr);
5445cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr);
55a7e14dcfSSatish Balay     tao->hessian_pre = Hpre;
56a7e14dcfSSatish Balay   }
57a7e14dcfSSatish Balay   PetscFunctionReturn(0);
58a7e14dcfSSatish Balay }
59a7e14dcfSSatish Balay 
60a7e14dcfSSatish Balay /*@C
61a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
62a7e14dcfSSatish Balay    set with TaoSetHessianRoutine().
63a7e14dcfSSatish Balay 
64441846f8SBarry Smith    Collective on Tao
65a7e14dcfSSatish Balay 
66a7e14dcfSSatish Balay    Input Parameters:
67*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
68*f4c1ad5cSStefano Zampini -  X   - input vector
69a7e14dcfSSatish Balay 
70a7e14dcfSSatish Balay    Output Parameters:
71a7e14dcfSSatish Balay +  H    - Hessian matrix
72aa6c7ce3SBarry Smith -  Hpre - Preconditioning matrix
73a7e14dcfSSatish Balay 
74a7e14dcfSSatish Balay    Notes:
75a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
76a7e14dcfSSatish Balay    is used internally within the minimization solvers.
77a7e14dcfSSatish Balay 
78a7e14dcfSSatish Balay    TaoComputeHessian() is typically used within minimization
79a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
80a7e14dcfSSatish Balay    themselves.
81a7e14dcfSSatish Balay 
82a7e14dcfSSatish Balay    Level: developer
83a7e14dcfSSatish Balay 
84*f4c1ad5cSStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessianRoutine()
85a7e14dcfSSatish Balay @*/
86ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre)
87a7e14dcfSSatish Balay {
88a7e14dcfSSatish Balay   PetscErrorCode ierr;
8987f595a5SBarry Smith 
90a7e14dcfSSatish Balay   PetscFunctionBegin;
91441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
92a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
93a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
94*f4c1ad5cSStefano Zampini   if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessianRoutine() first");
95a7e14dcfSSatish Balay   ++tao->nhess;
96*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
9794ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
98441846f8SBarry Smith   PetscStackPush("Tao user Hessian function");
99ffad9901SBarry Smith   ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr);
100a7e14dcfSSatish Balay   PetscStackPop;
10194ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
102*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
103a7e14dcfSSatish Balay   PetscFunctionReturn(0);
104a7e14dcfSSatish Balay }
105a7e14dcfSSatish Balay 
106a7e14dcfSSatish Balay /*@C
107a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
108a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
109a7e14dcfSSatish Balay 
110441846f8SBarry Smith    Collective on Tao
111a7e14dcfSSatish Balay 
112a7e14dcfSSatish Balay    Input Parameters:
113*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
114*f4c1ad5cSStefano Zampini -  X   - input vector
115a7e14dcfSSatish Balay 
116a7e14dcfSSatish Balay    Output Parameters:
117*f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
118*f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
119a7e14dcfSSatish Balay 
120a7e14dcfSSatish Balay    Notes:
121a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
122a7e14dcfSSatish Balay    is used internally within the minimization solvers.
123a7e14dcfSSatish Balay 
124a7e14dcfSSatish Balay    TaoComputeJacobian() is typically used within minimization
125a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
126a7e14dcfSSatish Balay    themselves.
127a7e14dcfSSatish Balay 
128a7e14dcfSSatish Balay    Level: developer
129a7e14dcfSSatish Balay 
130*f4c1ad5cSStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianRoutine()
131a7e14dcfSSatish Balay @*/
132ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre)
133a7e14dcfSSatish Balay {
134a7e14dcfSSatish Balay   PetscErrorCode ierr;
13587f595a5SBarry Smith 
136a7e14dcfSSatish Balay   PetscFunctionBegin;
137441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
138a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
139a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
14087f595a5SBarry Smith   if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
141a7e14dcfSSatish Balay   ++tao->njac;
142*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
14394ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
144441846f8SBarry Smith   PetscStackPush("Tao user Jacobian function");
145ffad9901SBarry Smith   ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr);
146a7e14dcfSSatish Balay   PetscStackPop;
14794ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
148*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
149a7e14dcfSSatish Balay   PetscFunctionReturn(0);
150a7e14dcfSSatish Balay }
151a7e14dcfSSatish Balay 
152a7e14dcfSSatish Balay /*@C
153a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
154a7e14dcfSSatish Balay    set with TaoSetJacobianStateRoutine().
155a7e14dcfSSatish Balay 
156441846f8SBarry Smith    Collective on Tao
157a7e14dcfSSatish Balay 
158a7e14dcfSSatish Balay    Input Parameters:
159*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
160*f4c1ad5cSStefano Zampini -  X   - input vector
161a7e14dcfSSatish Balay 
162a7e14dcfSSatish Balay    Output Parameters:
163*f4c1ad5cSStefano Zampini +  Jpre - Jacobian matrix
164*f4c1ad5cSStefano Zampini -  Jinv - Preconditioning matrix
165a7e14dcfSSatish Balay 
166a7e14dcfSSatish Balay    Notes:
167a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
168a7e14dcfSSatish Balay    is used internally within the minimization solvers.
169a7e14dcfSSatish Balay 
170a7e14dcfSSatish Balay    TaoComputeJacobianState() is typically used within minimization
171a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
172a7e14dcfSSatish Balay    themselves.
173a7e14dcfSSatish Balay 
174a7e14dcfSSatish Balay    Level: developer
175a7e14dcfSSatish Balay 
176a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
177a7e14dcfSSatish Balay @*/
178ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv)
179a7e14dcfSSatish Balay {
180a7e14dcfSSatish Balay   PetscErrorCode ierr;
18145cf516eSBarry Smith 
182a7e14dcfSSatish Balay   PetscFunctionBegin;
183441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
184a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
185a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
18687f595a5SBarry Smith   if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
187a7e14dcfSSatish Balay   ++tao->njac_state;
188*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
18994ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
190441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(state) function");
191ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr);
192a7e14dcfSSatish Balay   PetscStackPop;
19394ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
194*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
195a7e14dcfSSatish Balay   PetscFunctionReturn(0);
196a7e14dcfSSatish Balay }
197a7e14dcfSSatish Balay 
198a7e14dcfSSatish Balay /*@C
199a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
200a7e14dcfSSatish Balay    set with TaoSetJacobianDesignRoutine().
201a7e14dcfSSatish Balay 
202441846f8SBarry Smith    Collective on Tao
203a7e14dcfSSatish Balay 
204a7e14dcfSSatish Balay    Input Parameters:
205*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
206*f4c1ad5cSStefano Zampini -  X   - input vector
207a7e14dcfSSatish Balay 
208a7e14dcfSSatish Balay    Output Parameters:
209*f4c1ad5cSStefano Zampini .  J - Jacobian matrix
210a7e14dcfSSatish Balay 
211a7e14dcfSSatish Balay    Notes:
212a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
213a7e14dcfSSatish Balay    is used internally within the minimization solvers.
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay    TaoComputeJacobianDesign() is typically used within minimization
216a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
217a7e14dcfSSatish Balay    themselves.
218a7e14dcfSSatish Balay 
219a7e14dcfSSatish Balay    Level: developer
220a7e14dcfSSatish Balay 
221a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
222a7e14dcfSSatish Balay @*/
22394ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J)
224a7e14dcfSSatish Balay {
225a7e14dcfSSatish Balay   PetscErrorCode ierr;
22687f595a5SBarry Smith 
227a7e14dcfSSatish Balay   PetscFunctionBegin;
228441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
229a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
230a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
23187f595a5SBarry Smith   if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
232a7e14dcfSSatish Balay   ++tao->njac_design;
233*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
23494ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
235441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(design) function");
236a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr);
237a7e14dcfSSatish Balay   PetscStackPop;
23894ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
239*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
240a7e14dcfSSatish Balay   PetscFunctionReturn(0);
241a7e14dcfSSatish Balay }
242a7e14dcfSSatish Balay 
243a7e14dcfSSatish Balay /*@C
244a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
245a7e14dcfSSatish Balay 
246441846f8SBarry Smith    Logically collective on Tao
247a7e14dcfSSatish Balay 
248a7e14dcfSSatish Balay    Input Parameters:
249441846f8SBarry Smith +  tao  - the Tao context
250a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
251a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
252*f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
253a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
2546c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
255a7e14dcfSSatish Balay 
256*f4c1ad5cSStefano Zampini    Calling sequence of func:
257*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
258a7e14dcfSSatish Balay 
259441846f8SBarry Smith +  tao  - the Tao  context
260a7e14dcfSSatish Balay .  x    - input vector
261a7e14dcfSSatish Balay .  J    - Jacobian matrix
262*f4c1ad5cSStefano Zampini .  Jpre - preconditioning matrix, usually the same as J
263a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
264a7e14dcfSSatish Balay 
265a7e14dcfSSatish Balay    Level: intermediate
266a7e14dcfSSatish Balay @*/
267ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
268a7e14dcfSSatish Balay {
269a7e14dcfSSatish Balay   PetscErrorCode ierr;
270*f4c1ad5cSStefano Zampini 
271a7e14dcfSSatish Balay   PetscFunctionBegin;
272441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
273a7e14dcfSSatish Balay   if (J) {
274a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
275a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
276a7e14dcfSSatish Balay   }
277a7e14dcfSSatish Balay   if (Jpre) {
278a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
279a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
280a7e14dcfSSatish Balay   }
281a7e14dcfSSatish Balay   if (ctx) {
282a7e14dcfSSatish Balay     tao->user_jacP = ctx;
283a7e14dcfSSatish Balay   }
284a7e14dcfSSatish Balay   if (func) {
285a7e14dcfSSatish Balay     tao->ops->computejacobian = func;
286a7e14dcfSSatish Balay   }
287a7e14dcfSSatish Balay   if (J) {
288a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
28945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr);
290a7e14dcfSSatish Balay     tao->jacobian = J;
291a7e14dcfSSatish Balay   }
292a7e14dcfSSatish Balay   if (Jpre) {
293a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
29445cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr);
295a7e14dcfSSatish Balay     tao->jacobian_pre=Jpre;
296a7e14dcfSSatish Balay   }
297a7e14dcfSSatish Balay   PetscFunctionReturn(0);
298a7e14dcfSSatish Balay }
299a7e14dcfSSatish Balay 
300a7e14dcfSSatish Balay /*@C
301a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
302a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
303a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
304a7e14dcfSSatish Balay 
305441846f8SBarry Smith    Logically collective on Tao
306a7e14dcfSSatish Balay 
307a7e14dcfSSatish Balay    Input Parameters:
308441846f8SBarry Smith +  tao  - the Tao context
309a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
3106c23d075SBarry Smith .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is NULL
3116c23d075SBarry Smith .  Jinv - [optional] Matrix used to apply the inverse of the state jacobian. Use NULL to default to PETSc KSP solvers to apply the inverse.
312*f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
313a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
3146c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
315a7e14dcfSSatish Balay 
316*f4c1ad5cSStefano Zampini    Calling sequence of func:
317*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,Mat Jinv,void *ctx);
318a7e14dcfSSatish Balay 
319441846f8SBarry Smith +  tao  - the Tao  context
320a7e14dcfSSatish Balay .  x    - input vector
321a7e14dcfSSatish Balay .  J    - Jacobian matrix
322a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
323a7e14dcfSSatish Balay .  Jinv - inverse of J
324a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
325a7e14dcfSSatish Balay 
326a7e14dcfSSatish Balay    Level: intermediate
327*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS()
328a7e14dcfSSatish Balay @*/
329ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, void*), void *ctx)
330a7e14dcfSSatish Balay {
331a7e14dcfSSatish Balay   PetscErrorCode ierr;
332*f4c1ad5cSStefano Zampini 
333a7e14dcfSSatish Balay   PetscFunctionBegin;
334441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
335a7e14dcfSSatish Balay   if (J) {
336a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
337a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
338a7e14dcfSSatish Balay   }
339a7e14dcfSSatish Balay   if (Jpre) {
340a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
341a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
342a7e14dcfSSatish Balay   }
343a7e14dcfSSatish Balay   if (Jinv) {
344a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
345a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jinv,4);
346a7e14dcfSSatish Balay   }
347a7e14dcfSSatish Balay   if (ctx) {
348a7e14dcfSSatish Balay     tao->user_jac_stateP = ctx;
349a7e14dcfSSatish Balay   }
350a7e14dcfSSatish Balay   if (func) {
351a7e14dcfSSatish Balay     tao->ops->computejacobianstate = func;
352a7e14dcfSSatish Balay   }
353a7e14dcfSSatish Balay   if (J) {
354a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
35545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr);
356a7e14dcfSSatish Balay     tao->jacobian_state = J;
357a7e14dcfSSatish Balay   }
358a7e14dcfSSatish Balay   if (Jpre) {
359a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
36045cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr);
361a7e14dcfSSatish Balay     tao->jacobian_state_pre=Jpre;
362a7e14dcfSSatish Balay   }
363a7e14dcfSSatish Balay   if (Jinv) {
364a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr);
36545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr);
366a7e14dcfSSatish Balay     tao->jacobian_state_inv=Jinv;
367a7e14dcfSSatish Balay   }
368a7e14dcfSSatish Balay   PetscFunctionReturn(0);
369a7e14dcfSSatish Balay }
370a7e14dcfSSatish Balay 
371a7e14dcfSSatish Balay /*@C
372a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
373a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
374a7e14dcfSSatish Balay    pde-constrained optimization.
375a7e14dcfSSatish Balay 
376441846f8SBarry Smith    Logically collective on Tao
377a7e14dcfSSatish Balay 
378a7e14dcfSSatish Balay    Input Parameters:
379441846f8SBarry Smith +  tao  - the Tao context
380a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
381*f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
382a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
3836c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
384a7e14dcfSSatish Balay 
385*f4c1ad5cSStefano Zampini    Calling sequence of func:
386*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,void *ctx);
387a7e14dcfSSatish Balay 
388441846f8SBarry Smith +  tao - the Tao  context
389a7e14dcfSSatish Balay .  x   - input vector
390a7e14dcfSSatish Balay .  J   - Jacobian matrix
391a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
392a7e14dcfSSatish Balay 
393a7e14dcfSSatish Balay    Level: intermediate
394*f4c1ad5cSStefano Zampini 
395a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS()
396a7e14dcfSSatish Balay @*/
39794ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx)
398a7e14dcfSSatish Balay {
399a7e14dcfSSatish Balay   PetscErrorCode ierr;
40045cf516eSBarry Smith 
401a7e14dcfSSatish Balay   PetscFunctionBegin;
402441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
403a7e14dcfSSatish Balay   if (J) {
404a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
405a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
406a7e14dcfSSatish Balay   }
407a7e14dcfSSatish Balay   if (ctx) {
408a7e14dcfSSatish Balay     tao->user_jac_designP = ctx;
409a7e14dcfSSatish Balay   }
410a7e14dcfSSatish Balay   if (func) {
411a7e14dcfSSatish Balay     tao->ops->computejacobiandesign = func;
412a7e14dcfSSatish Balay   }
413a7e14dcfSSatish Balay   if (J) {
414a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
41545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr);
416a7e14dcfSSatish Balay     tao->jacobian_design = J;
417a7e14dcfSSatish Balay   }
418a7e14dcfSSatish Balay   PetscFunctionReturn(0);
419a7e14dcfSSatish Balay }
420a7e14dcfSSatish Balay 
421a7e14dcfSSatish Balay /*@
422441846f8SBarry Smith    TaoSetStateDesignIS - Indicate to the Tao which variables in the
423a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
424a7e14dcfSSatish Balay    pde-constrained optimization.
425a7e14dcfSSatish Balay 
426441846f8SBarry Smith    Logically Collective on Tao
427a7e14dcfSSatish Balay 
428a7e14dcfSSatish Balay    Input Parameters:
429441846f8SBarry Smith +  tao  - The Tao context
430a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
431a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
432a7e14dcfSSatish Balay 
433a7e14dcfSSatish Balay    Level: intermediate
434a7e14dcfSSatish Balay 
435a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine()
436a7e14dcfSSatish Balay @*/
437441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is)
438a7e14dcfSSatish Balay {
439a7e14dcfSSatish Balay   PetscErrorCode ierr;
44045cf516eSBarry Smith 
44145cf516eSBarry Smith   PetscFunctionBegin;
44245cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr);
44345cf516eSBarry Smith   ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr);
444a7e14dcfSSatish Balay   tao->state_is = s_is;
44545cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr);
44645cf516eSBarry Smith   ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr);
447a7e14dcfSSatish Balay   tao->design_is = d_is;
448a7e14dcfSSatish Balay   PetscFunctionReturn(0);
449a7e14dcfSSatish Balay }
450a7e14dcfSSatish Balay 
451a7e14dcfSSatish Balay /*@C
452a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
453a7e14dcfSSatish Balay    set with TaoSetJacobianEqualityRoutine().
454a7e14dcfSSatish Balay 
455441846f8SBarry Smith    Collective on Tao
456a7e14dcfSSatish Balay 
457a7e14dcfSSatish Balay    Input Parameters:
458*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
459*f4c1ad5cSStefano Zampini -  X   - input vector
460a7e14dcfSSatish Balay 
461a7e14dcfSSatish Balay    Output Parameters:
462*f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
463*f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
464a7e14dcfSSatish Balay 
465a7e14dcfSSatish Balay    Notes:
466a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
467a7e14dcfSSatish Balay    is used internally within the minimization solvers.
468a7e14dcfSSatish Balay 
469a7e14dcfSSatish Balay    Level: developer
470a7e14dcfSSatish Balay 
471a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
472a7e14dcfSSatish Balay @*/
473ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre)
474a7e14dcfSSatish Balay {
475a7e14dcfSSatish Balay   PetscErrorCode ierr;
47645cf516eSBarry Smith 
477a7e14dcfSSatish Balay   PetscFunctionBegin;
478441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
479a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
480a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
48187f595a5SBarry Smith   if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
482a7e14dcfSSatish Balay   ++tao->njac_equality;
483*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
48494ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
485441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(equality) function");
486ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr);
487a7e14dcfSSatish Balay   PetscStackPop;
48894ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
489*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
490a7e14dcfSSatish Balay   PetscFunctionReturn(0);
491a7e14dcfSSatish Balay }
492a7e14dcfSSatish Balay 
493a7e14dcfSSatish Balay /*@C
494a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
495a7e14dcfSSatish Balay    set with TaoSetJacobianInequalityRoutine().
496a7e14dcfSSatish Balay 
497441846f8SBarry Smith    Collective on Tao
498a7e14dcfSSatish Balay 
499a7e14dcfSSatish Balay    Input Parameters:
500*f4c1ad5cSStefano Zampini +  tao - the Tao solver context
501*f4c1ad5cSStefano Zampini -  X   - input vector
502a7e14dcfSSatish Balay 
503a7e14dcfSSatish Balay    Output Parameters:
504*f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
505*f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
506a7e14dcfSSatish Balay 
507a7e14dcfSSatish Balay    Notes:
508a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
509a7e14dcfSSatish Balay    is used internally within the minimization solvers.
510a7e14dcfSSatish Balay 
511a7e14dcfSSatish Balay    Level: developer
512a7e14dcfSSatish Balay 
513a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
514a7e14dcfSSatish Balay @*/
515ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre)
516a7e14dcfSSatish Balay {
517a7e14dcfSSatish Balay   PetscErrorCode ierr;
51887f595a5SBarry Smith 
519a7e14dcfSSatish Balay   PetscFunctionBegin;
520441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
521a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
522a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
52387f595a5SBarry Smith   if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
524a7e14dcfSSatish Balay   ++tao->njac_inequality;
525*f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
52694ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
527441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(inequality) function");
528ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr);
529a7e14dcfSSatish Balay   PetscStackPop;
53094ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
531*f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
532a7e14dcfSSatish Balay   PetscFunctionReturn(0);
533a7e14dcfSSatish Balay }
534a7e14dcfSSatish Balay 
535a7e14dcfSSatish Balay /*@C
536a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
537a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
538a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
539a7e14dcfSSatish Balay 
540441846f8SBarry Smith    Logically collective on Tao
541a7e14dcfSSatish Balay 
542a7e14dcfSSatish Balay    Input Parameters:
543441846f8SBarry Smith +  tao  - the Tao context
544a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
545a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
546*f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
547a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
5486c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
549a7e14dcfSSatish Balay 
550*f4c1ad5cSStefano Zampini    Calling sequence of func:
551*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
552a7e14dcfSSatish Balay 
553441846f8SBarry Smith +  tao  - the Tao  context
554a7e14dcfSSatish Balay .  x    - input vector
555a7e14dcfSSatish Balay .  J    - Jacobian matrix
556a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
557a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
558a7e14dcfSSatish Balay 
559a7e14dcfSSatish Balay    Level: intermediate
560*f4c1ad5cSStefano Zampini 
561*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS()
562a7e14dcfSSatish Balay @*/
563ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
564a7e14dcfSSatish Balay {
565a7e14dcfSSatish Balay   PetscErrorCode ierr;
56645cf516eSBarry Smith 
567a7e14dcfSSatish Balay   PetscFunctionBegin;
568441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
569a7e14dcfSSatish Balay   if (J) {
570a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
571a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
572a7e14dcfSSatish Balay   }
573a7e14dcfSSatish Balay   if (Jpre) {
574a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
575a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
576a7e14dcfSSatish Balay   }
577a7e14dcfSSatish Balay   if (ctx) {
578a7e14dcfSSatish Balay     tao->user_jac_equalityP = ctx;
579a7e14dcfSSatish Balay   }
580a7e14dcfSSatish Balay   if (func) {
581a7e14dcfSSatish Balay     tao->ops->computejacobianequality = func;
582a7e14dcfSSatish Balay   }
583a7e14dcfSSatish Balay   if (J) {
584a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
58545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr);
586a7e14dcfSSatish Balay     tao->jacobian_equality = J;
587a7e14dcfSSatish Balay   }
588a7e14dcfSSatish Balay   if (Jpre) {
589a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
59045cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr);
591a7e14dcfSSatish Balay     tao->jacobian_equality_pre=Jpre;
592a7e14dcfSSatish Balay   }
593a7e14dcfSSatish Balay   PetscFunctionReturn(0);
594a7e14dcfSSatish Balay }
595a7e14dcfSSatish Balay 
596a7e14dcfSSatish Balay /*@C
597a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
598a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
599a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
600a7e14dcfSSatish Balay 
601441846f8SBarry Smith    Logically collective on Tao
602a7e14dcfSSatish Balay 
603a7e14dcfSSatish Balay    Input Parameters:
604441846f8SBarry Smith +  tao  - the Tao context
605a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
606a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
607*f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
608a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
6096c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
610a7e14dcfSSatish Balay 
611*f4c1ad5cSStefano Zampini    Calling sequence of func:
612*f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
613a7e14dcfSSatish Balay 
614441846f8SBarry Smith +  tao  - the Tao  context
615a7e14dcfSSatish Balay .  x    - input vector
616a7e14dcfSSatish Balay .  J    - Jacobian matrix
617a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
618a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
619a7e14dcfSSatish Balay 
620a7e14dcfSSatish Balay    Level: intermediate
621*f4c1ad5cSStefano Zampini 
622*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS()
623a7e14dcfSSatish Balay @*/
624ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
625a7e14dcfSSatish Balay {
626a7e14dcfSSatish Balay   PetscErrorCode ierr;
627*f4c1ad5cSStefano Zampini 
628a7e14dcfSSatish Balay   PetscFunctionBegin;
629441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
630a7e14dcfSSatish Balay   if (J) {
631a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
632a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
633a7e14dcfSSatish Balay   }
634a7e14dcfSSatish Balay   if (Jpre) {
635a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
636a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
637a7e14dcfSSatish Balay   }
638a7e14dcfSSatish Balay   if (ctx) {
639a7e14dcfSSatish Balay     tao->user_jac_inequalityP = ctx;
640a7e14dcfSSatish Balay   }
641a7e14dcfSSatish Balay   if (func) {
642a7e14dcfSSatish Balay     tao->ops->computejacobianinequality = func;
643a7e14dcfSSatish Balay   }
644a7e14dcfSSatish Balay   if (J) {
645a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
64645cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr);
647a7e14dcfSSatish Balay     tao->jacobian_inequality = J;
648a7e14dcfSSatish Balay   }
649a7e14dcfSSatish Balay   if (Jpre) {
650a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
65145cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr);
652a7e14dcfSSatish Balay     tao->jacobian_inequality_pre=Jpre;
653a7e14dcfSSatish Balay   }
654a7e14dcfSSatish Balay   PetscFunctionReturn(0);
655a7e14dcfSSatish Balay }
656