xref: /petsc/src/tao/interface/taosolver_hj.c (revision aa6c7ce3b3ede9cc2f00f8ce4adba428e92e0fa2)
1ba92ff59SBarry Smith #include <petsc-private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay #undef __FUNCT__
4a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHessianRoutine"
5a7e14dcfSSatish Balay /*@C
6a7e14dcfSSatish Balay    TaoSetHessianRoutine - Sets the function to compute the Hessian as well as the location to store the matrix.
7a7e14dcfSSatish Balay 
8441846f8SBarry Smith    Logically collective on Tao
9a7e14dcfSSatish Balay 
10a7e14dcfSSatish Balay    Input Parameters:
11441846f8SBarry Smith +  tao - the Tao context
12a7e14dcfSSatish Balay .  H - Matrix used for the hessian
13a7e14dcfSSatish Balay .  Hpre - Matrix that will be used operated on by preconditioner, can be same as H
14a7e14dcfSSatish Balay .  hess - Hessian evaluation routine
15a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
166c23d075SBarry Smith          Hessian evaluation routine (may be NULL)
17a7e14dcfSSatish Balay 
18a7e14dcfSSatish Balay    Calling sequence of hess:
19ffad9901SBarry Smith $    hess (Tao tao,Vec x,Mat H,Mat Hpre,void *ctx);
20a7e14dcfSSatish Balay 
21441846f8SBarry Smith +  tao - the Tao  context
22a7e14dcfSSatish Balay .  x - input vector
23a7e14dcfSSatish Balay .  H - Hessian matrix
24a7e14dcfSSatish Balay .  Hpre - preconditioner matrix, usually the same as H
25a7e14dcfSSatish Balay -  ctx - [optional] user-defined Hessian context
26a7e14dcfSSatish Balay 
27a7e14dcfSSatish Balay    Level: beginner
28a7e14dcfSSatish Balay 
29a7e14dcfSSatish Balay @*/
30ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
31a7e14dcfSSatish Balay {
32a7e14dcfSSatish Balay   PetscErrorCode ierr;
3345cf516eSBarry Smith 
34a7e14dcfSSatish Balay   PetscFunctionBegin;
35441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
36a7e14dcfSSatish Balay   if (H) {
37a7e14dcfSSatish Balay     PetscValidHeaderSpecific(H,MAT_CLASSID,2);
38a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,H,2);
39a7e14dcfSSatish Balay   }
40a7e14dcfSSatish Balay   if (Hpre) {
41a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
42a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Hpre,3);
43a7e14dcfSSatish Balay   }
44a7e14dcfSSatish Balay   if (ctx) {
45a7e14dcfSSatish Balay     tao->user_hessP = ctx;
46a7e14dcfSSatish Balay   }
47a7e14dcfSSatish Balay   if (func) {
48a7e14dcfSSatish Balay     tao->ops->computehessian = func;
49a7e14dcfSSatish Balay   }
50a7e14dcfSSatish Balay   if (H) {
51a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr);
5245cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr);
53a7e14dcfSSatish Balay     tao->hessian = H;
54a7e14dcfSSatish Balay   }
55a7e14dcfSSatish Balay   if (Hpre) {
56a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr);
5745cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr);
58a7e14dcfSSatish Balay     tao->hessian_pre = Hpre;
59a7e14dcfSSatish Balay   }
60a7e14dcfSSatish Balay   PetscFunctionReturn(0);
61a7e14dcfSSatish Balay }
62a7e14dcfSSatish Balay 
63a7e14dcfSSatish Balay #undef __FUNCT__
64a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian"
65a7e14dcfSSatish Balay /*@C
66a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
67a7e14dcfSSatish Balay    set with TaoSetHessianRoutine().
68a7e14dcfSSatish Balay 
69441846f8SBarry Smith    Collective on Tao
70a7e14dcfSSatish Balay 
71a7e14dcfSSatish Balay    Input Parameters:
72441846f8SBarry Smith +  solver - the Tao solver context
73a7e14dcfSSatish Balay -  xx - input vector
74a7e14dcfSSatish Balay 
75a7e14dcfSSatish Balay    Output Parameters:
76a7e14dcfSSatish Balay +  H - Hessian matrix
77*aa6c7ce3SBarry Smith -  Hpre - Preconditioning matrix
78a7e14dcfSSatish Balay 
79a7e14dcfSSatish Balay    Notes:
80a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
81a7e14dcfSSatish Balay    is used internally within the minimization solvers.
82a7e14dcfSSatish Balay 
83a7e14dcfSSatish Balay    TaoComputeHessian() is typically used within minimization
84a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
85a7e14dcfSSatish Balay    themselves.
86a7e14dcfSSatish Balay 
87a7e14dcfSSatish Balay    Level: developer
88a7e14dcfSSatish Balay 
89a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian()
90a7e14dcfSSatish Balay 
91a7e14dcfSSatish Balay @*/
92ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre)
93a7e14dcfSSatish Balay {
94a7e14dcfSSatish Balay   PetscErrorCode ierr;
9587f595a5SBarry Smith 
96a7e14dcfSSatish Balay   PetscFunctionBegin;
97441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
98a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
99a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
100a7e14dcfSSatish Balay 
10187f595a5SBarry Smith   if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first");
102a7e14dcfSSatish Balay   ++tao->nhess;
10394ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
104441846f8SBarry Smith   PetscStackPush("Tao user Hessian function");
105ffad9901SBarry Smith   ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr);
106a7e14dcfSSatish Balay   PetscStackPop;
10794ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
108a7e14dcfSSatish Balay   PetscFunctionReturn(0);
109a7e14dcfSSatish Balay }
110a7e14dcfSSatish Balay 
111a7e14dcfSSatish Balay #undef __FUNCT__
112a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian"
113a7e14dcfSSatish Balay /*@C
114a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
115a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
116a7e14dcfSSatish Balay 
117441846f8SBarry Smith    Collective on Tao
118a7e14dcfSSatish Balay 
119a7e14dcfSSatish Balay    Input Parameters:
120441846f8SBarry Smith +  solver - the Tao solver context
121a7e14dcfSSatish Balay -  xx - input vector
122a7e14dcfSSatish Balay 
123a7e14dcfSSatish Balay    Output Parameters:
124a7e14dcfSSatish Balay +  H - Jacobian matrix
125ffad9901SBarry Smith -  Hpre - Preconditioning matrix
126a7e14dcfSSatish Balay 
127a7e14dcfSSatish Balay    Notes:
128a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
129a7e14dcfSSatish Balay    is used internally within the minimization solvers.
130a7e14dcfSSatish Balay 
131a7e14dcfSSatish Balay    TaoComputeJacobian() is typically used within minimization
132a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
133a7e14dcfSSatish Balay    themselves.
134a7e14dcfSSatish Balay 
135a7e14dcfSSatish Balay    Level: developer
136a7e14dcfSSatish Balay 
137a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian()
138a7e14dcfSSatish Balay 
139a7e14dcfSSatish Balay @*/
140ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre)
141a7e14dcfSSatish Balay {
142a7e14dcfSSatish Balay   PetscErrorCode ierr;
14387f595a5SBarry Smith 
144a7e14dcfSSatish Balay   PetscFunctionBegin;
145441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
146a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
147a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
148a7e14dcfSSatish Balay 
14987f595a5SBarry Smith   if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
150a7e14dcfSSatish Balay   ++tao->njac;
15194ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
152441846f8SBarry Smith   PetscStackPush("Tao user Jacobian function");
153ffad9901SBarry Smith   ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr);
154a7e14dcfSSatish Balay   PetscStackPop;
15594ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
156a7e14dcfSSatish Balay   PetscFunctionReturn(0);
157a7e14dcfSSatish Balay }
158a7e14dcfSSatish Balay 
159a7e14dcfSSatish Balay #undef __FUNCT__
160a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState"
161a7e14dcfSSatish Balay /*@C
162a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
163a7e14dcfSSatish Balay    set with TaoSetJacobianStateRoutine().
164a7e14dcfSSatish Balay 
165441846f8SBarry Smith    Collective on Tao
166a7e14dcfSSatish Balay 
167a7e14dcfSSatish Balay    Input Parameters:
168441846f8SBarry Smith +  solver - the Tao solver context
169a7e14dcfSSatish Balay -  xx - input vector
170a7e14dcfSSatish Balay 
171a7e14dcfSSatish Balay    Output Parameters:
172a7e14dcfSSatish Balay +  H - Jacobian matrix
173ffad9901SBarry Smith -  Hpre - Preconditioning matrix
174a7e14dcfSSatish Balay 
175a7e14dcfSSatish Balay    Notes:
176a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
177a7e14dcfSSatish Balay    is used internally within the minimization solvers.
178a7e14dcfSSatish Balay 
179a7e14dcfSSatish Balay    TaoComputeJacobianState() is typically used within minimization
180a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
181a7e14dcfSSatish Balay    themselves.
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay    Level: developer
184a7e14dcfSSatish Balay 
185a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
186a7e14dcfSSatish Balay 
187a7e14dcfSSatish Balay @*/
188ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv)
189a7e14dcfSSatish Balay {
190a7e14dcfSSatish Balay   PetscErrorCode ierr;
19145cf516eSBarry Smith 
192a7e14dcfSSatish Balay   PetscFunctionBegin;
193441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
194a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
195a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
196a7e14dcfSSatish Balay 
19787f595a5SBarry Smith   if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
198a7e14dcfSSatish Balay   ++tao->njac_state;
19994ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
200441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(state) function");
201ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr);
202a7e14dcfSSatish Balay   PetscStackPop;
20394ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
204a7e14dcfSSatish Balay   PetscFunctionReturn(0);
205a7e14dcfSSatish Balay }
206a7e14dcfSSatish Balay 
207a7e14dcfSSatish Balay #undef __FUNCT__
208a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign"
209a7e14dcfSSatish Balay /*@C
210a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
211a7e14dcfSSatish Balay    set with TaoSetJacobianDesignRoutine().
212a7e14dcfSSatish Balay 
213441846f8SBarry Smith    Collective on Tao
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay    Input Parameters:
216441846f8SBarry Smith +  solver - the Tao solver context
217a7e14dcfSSatish Balay -  xx - input vector
218a7e14dcfSSatish Balay 
219a7e14dcfSSatish Balay    Output Parameters:
220a7e14dcfSSatish Balay .  H - Jacobian matrix
221a7e14dcfSSatish Balay 
222a7e14dcfSSatish Balay    Notes:
223a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
224a7e14dcfSSatish Balay    is used internally within the minimization solvers.
225a7e14dcfSSatish Balay 
226a7e14dcfSSatish Balay    TaoComputeJacobianDesign() is typically used within minimization
227a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
228a7e14dcfSSatish Balay    themselves.
229a7e14dcfSSatish Balay 
230a7e14dcfSSatish Balay    Level: developer
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
233a7e14dcfSSatish Balay 
234a7e14dcfSSatish Balay @*/
23594ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J)
236a7e14dcfSSatish Balay {
237a7e14dcfSSatish Balay   PetscErrorCode ierr;
23887f595a5SBarry Smith 
239a7e14dcfSSatish Balay   PetscFunctionBegin;
240441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
241a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
242a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
243a7e14dcfSSatish Balay 
24487f595a5SBarry Smith   if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
245a7e14dcfSSatish Balay   ++tao->njac_design;
24694ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
247441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(design) function");
248a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr);
249a7e14dcfSSatish Balay   PetscStackPop;
25094ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
251a7e14dcfSSatish Balay   PetscFunctionReturn(0);
252a7e14dcfSSatish Balay }
253a7e14dcfSSatish Balay 
254a7e14dcfSSatish Balay #undef __FUNCT__
255a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine"
256a7e14dcfSSatish Balay /*@C
257a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
258a7e14dcfSSatish Balay 
259441846f8SBarry Smith    Logically collective on Tao
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay    Input Parameters:
262441846f8SBarry Smith +  tao - the Tao context
263a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
264a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
265a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
266a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
2676c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
268a7e14dcfSSatish Balay 
269a7e14dcfSSatish Balay    Calling sequence of jac:
270ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
271a7e14dcfSSatish Balay 
272441846f8SBarry Smith +  tao - the Tao  context
273a7e14dcfSSatish Balay .  x - input vector
274a7e14dcfSSatish Balay .  J - Jacobian matrix
275a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
276a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
277a7e14dcfSSatish Balay 
278a7e14dcfSSatish Balay    Level: intermediate
279a7e14dcfSSatish Balay 
280a7e14dcfSSatish Balay @*/
281ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
282a7e14dcfSSatish Balay {
283a7e14dcfSSatish Balay   PetscErrorCode ierr;
284a7e14dcfSSatish Balay   PetscFunctionBegin;
285441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
286a7e14dcfSSatish Balay   if (J) {
287a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
288a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
289a7e14dcfSSatish Balay   }
290a7e14dcfSSatish Balay   if (Jpre) {
291a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
292a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
293a7e14dcfSSatish Balay   }
294a7e14dcfSSatish Balay   if (ctx) {
295a7e14dcfSSatish Balay     tao->user_jacP = ctx;
296a7e14dcfSSatish Balay   }
297a7e14dcfSSatish Balay   if (func) {
298a7e14dcfSSatish Balay     tao->ops->computejacobian = func;
299a7e14dcfSSatish Balay   }
300a7e14dcfSSatish Balay   if (J) {
301a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
30245cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr);
303a7e14dcfSSatish Balay     tao->jacobian = J;
304a7e14dcfSSatish Balay   }
305a7e14dcfSSatish Balay   if (Jpre) {
306a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
30745cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr);
308a7e14dcfSSatish Balay     tao->jacobian_pre=Jpre;
309a7e14dcfSSatish Balay   }
310a7e14dcfSSatish Balay   PetscFunctionReturn(0);
311a7e14dcfSSatish Balay }
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay #undef __FUNCT__
314a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine"
315a7e14dcfSSatish Balay /*@C
316a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
317a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
318a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
319a7e14dcfSSatish Balay 
320441846f8SBarry Smith    Logically collective on Tao
321a7e14dcfSSatish Balay 
322a7e14dcfSSatish Balay    Input Parameters:
323441846f8SBarry Smith +  tao - the Tao context
324a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
3256c23d075SBarry Smith .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is NULL
3266c23d075SBarry 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.
327a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
328a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
3296c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
330a7e14dcfSSatish Balay 
331a7e14dcfSSatish Balay    Calling sequence of jac:
332ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
333a7e14dcfSSatish Balay 
334441846f8SBarry Smith +  tao - the Tao  context
335a7e14dcfSSatish Balay .  x - input vector
336a7e14dcfSSatish Balay .  J - Jacobian matrix
337a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
338a7e14dcfSSatish Balay .  Jinv - inverse of J
339a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
340a7e14dcfSSatish Balay 
341a7e14dcfSSatish Balay    Level: intermediate
342a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS()
343a7e14dcfSSatish Balay @*/
344ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat,void*), void *ctx)
345a7e14dcfSSatish Balay {
346a7e14dcfSSatish Balay   PetscErrorCode ierr;
347a7e14dcfSSatish Balay   PetscFunctionBegin;
348441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
349a7e14dcfSSatish Balay   if (J) {
350a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
351a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
352a7e14dcfSSatish Balay   }
353a7e14dcfSSatish Balay   if (Jpre) {
354a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
355a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
356a7e14dcfSSatish Balay   }
357a7e14dcfSSatish Balay   if (Jinv) {
358a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
359a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jinv,4);
360a7e14dcfSSatish Balay   }
361a7e14dcfSSatish Balay   if (ctx) {
362a7e14dcfSSatish Balay     tao->user_jac_stateP = ctx;
363a7e14dcfSSatish Balay   }
364a7e14dcfSSatish Balay   if (func) {
365a7e14dcfSSatish Balay     tao->ops->computejacobianstate = func;
366a7e14dcfSSatish Balay   }
367a7e14dcfSSatish Balay   if (J) {
368a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
36945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr);
370a7e14dcfSSatish Balay     tao->jacobian_state = J;
371a7e14dcfSSatish Balay   }
372a7e14dcfSSatish Balay   if (Jpre) {
373a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
37445cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr);
375a7e14dcfSSatish Balay     tao->jacobian_state_pre=Jpre;
376a7e14dcfSSatish Balay   }
377a7e14dcfSSatish Balay   if (Jinv) {
378a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr);
37945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr);
380a7e14dcfSSatish Balay     tao->jacobian_state_inv=Jinv;
381a7e14dcfSSatish Balay   }
382a7e14dcfSSatish Balay   PetscFunctionReturn(0);
383a7e14dcfSSatish Balay }
384a7e14dcfSSatish Balay 
385a7e14dcfSSatish Balay #undef __FUNCT__
386a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine"
387a7e14dcfSSatish Balay /*@C
388a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
389a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
390a7e14dcfSSatish Balay    pde-constrained optimization.
391a7e14dcfSSatish Balay 
392441846f8SBarry Smith    Logically collective on Tao
393a7e14dcfSSatish Balay 
394a7e14dcfSSatish Balay    Input Parameters:
395441846f8SBarry Smith +  tao - the Tao context
396a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
397a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
398a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
3996c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
400a7e14dcfSSatish Balay 
401a7e14dcfSSatish Balay    Calling sequence of jac:
402441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,void *ctx);
403a7e14dcfSSatish Balay 
404441846f8SBarry Smith +  tao - the Tao  context
405a7e14dcfSSatish Balay .  x - input vector
406a7e14dcfSSatish Balay .  J - Jacobian matrix
407a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
408a7e14dcfSSatish Balay 
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay    Notes:
411a7e14dcfSSatish Balay 
412a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
413a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
414a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
415a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
416a7e14dcfSSatish Balay    throughout the global iterations.
417a7e14dcfSSatish Balay 
418a7e14dcfSSatish Balay    Level: intermediate
419a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS()
420a7e14dcfSSatish Balay @*/
42194ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx)
422a7e14dcfSSatish Balay {
423a7e14dcfSSatish Balay   PetscErrorCode ierr;
42445cf516eSBarry Smith 
425a7e14dcfSSatish Balay   PetscFunctionBegin;
426441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
427a7e14dcfSSatish Balay   if (J) {
428a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
429a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
430a7e14dcfSSatish Balay   }
431a7e14dcfSSatish Balay   if (ctx) {
432a7e14dcfSSatish Balay     tao->user_jac_designP = ctx;
433a7e14dcfSSatish Balay   }
434a7e14dcfSSatish Balay   if (func) {
435a7e14dcfSSatish Balay     tao->ops->computejacobiandesign = func;
436a7e14dcfSSatish Balay   }
437a7e14dcfSSatish Balay   if (J) {
438a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
43945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr);
440a7e14dcfSSatish Balay     tao->jacobian_design = J;
441a7e14dcfSSatish Balay   }
442a7e14dcfSSatish Balay   PetscFunctionReturn(0);
443a7e14dcfSSatish Balay }
444a7e14dcfSSatish Balay 
445a7e14dcfSSatish Balay #undef __FUNCT__
446a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS"
447a7e14dcfSSatish Balay /*@
448441846f8SBarry Smith    TaoSetStateDesignIS - Indicate to the Tao which variables in the
449a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
450a7e14dcfSSatish Balay    pde-constrained optimization.
451a7e14dcfSSatish Balay 
452441846f8SBarry Smith    Logically Collective on Tao
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay    Input Parameters:
455441846f8SBarry Smith +  tao - The Tao context
456a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
457a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
458a7e14dcfSSatish Balay 
459a7e14dcfSSatish Balay    Level: intermediate
460a7e14dcfSSatish Balay 
461a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine()
462a7e14dcfSSatish Balay @*/
463441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is)
464a7e14dcfSSatish Balay {
465a7e14dcfSSatish Balay   PetscErrorCode ierr;
46645cf516eSBarry Smith 
46745cf516eSBarry Smith   PetscFunctionBegin;
46845cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr);
46945cf516eSBarry Smith   ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr);
470a7e14dcfSSatish Balay   tao->state_is = s_is;
47145cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr);
47245cf516eSBarry Smith   ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr);
473a7e14dcfSSatish Balay   tao->design_is = d_is;
474a7e14dcfSSatish Balay   PetscFunctionReturn(0);
475a7e14dcfSSatish Balay }
476a7e14dcfSSatish Balay 
477a7e14dcfSSatish Balay #undef __FUNCT__
478a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality"
479a7e14dcfSSatish Balay /*@C
480a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
481a7e14dcfSSatish Balay    set with TaoSetJacobianEqualityRoutine().
482a7e14dcfSSatish Balay 
483441846f8SBarry Smith    Collective on Tao
484a7e14dcfSSatish Balay 
485a7e14dcfSSatish Balay    Input Parameters:
486441846f8SBarry Smith +  solver - the Tao solver context
487a7e14dcfSSatish Balay -  xx - input vector
488a7e14dcfSSatish Balay 
489a7e14dcfSSatish Balay    Output Parameters:
490a7e14dcfSSatish Balay +  H - Jacobian matrix
491*aa6c7ce3SBarry Smith -  Hpre - Preconditioning matrix
492a7e14dcfSSatish Balay 
493a7e14dcfSSatish Balay    Notes:
494a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
495a7e14dcfSSatish Balay    is used internally within the minimization solvers.
496a7e14dcfSSatish Balay 
497a7e14dcfSSatish Balay    Level: developer
498a7e14dcfSSatish Balay 
499a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
500a7e14dcfSSatish Balay 
501a7e14dcfSSatish Balay @*/
502ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre)
503a7e14dcfSSatish Balay {
504a7e14dcfSSatish Balay   PetscErrorCode ierr;
50545cf516eSBarry Smith 
506a7e14dcfSSatish Balay   PetscFunctionBegin;
507441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
508a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
509a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
510a7e14dcfSSatish Balay 
51187f595a5SBarry Smith   if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
512a7e14dcfSSatish Balay   ++tao->njac_equality;
51394ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
514441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(equality) function");
515ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr);
516a7e14dcfSSatish Balay   PetscStackPop;
51794ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
518a7e14dcfSSatish Balay   PetscFunctionReturn(0);
519a7e14dcfSSatish Balay }
520a7e14dcfSSatish Balay 
521a7e14dcfSSatish Balay #undef __FUNCT__
522a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality"
523a7e14dcfSSatish Balay /*@C
524a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
525a7e14dcfSSatish Balay    set with TaoSetJacobianInequalityRoutine().
526a7e14dcfSSatish Balay 
527441846f8SBarry Smith    Collective on Tao
528a7e14dcfSSatish Balay 
529a7e14dcfSSatish Balay    Input Parameters:
530441846f8SBarry Smith +  solver - the Tao solver context
531a7e14dcfSSatish Balay -  xx - input vector
532a7e14dcfSSatish Balay 
533a7e14dcfSSatish Balay    Output Parameters:
534a7e14dcfSSatish Balay +  H - Jacobian matrix
535*aa6c7ce3SBarry Smith -  Hpre - Preconditioning matrix
536a7e14dcfSSatish Balay 
537a7e14dcfSSatish Balay    Notes:
538a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
539a7e14dcfSSatish Balay    is used internally within the minimization solvers.
540a7e14dcfSSatish Balay 
541a7e14dcfSSatish Balay    Level: developer
542a7e14dcfSSatish Balay 
543a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
544a7e14dcfSSatish Balay 
545a7e14dcfSSatish Balay @*/
546ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre)
547a7e14dcfSSatish Balay {
548a7e14dcfSSatish Balay   PetscErrorCode ierr;
54987f595a5SBarry Smith 
550a7e14dcfSSatish Balay   PetscFunctionBegin;
551441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
552a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
553a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
554a7e14dcfSSatish Balay 
55587f595a5SBarry Smith   if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
556a7e14dcfSSatish Balay   ++tao->njac_inequality;
55794ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
558441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(inequality) function");
559ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr);
560a7e14dcfSSatish Balay   PetscStackPop;
56194ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
562a7e14dcfSSatish Balay   PetscFunctionReturn(0);
563a7e14dcfSSatish Balay }
564a7e14dcfSSatish Balay 
565a7e14dcfSSatish Balay #undef __FUNCT__
566a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine"
567a7e14dcfSSatish Balay /*@C
568a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
569a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
570a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
571a7e14dcfSSatish Balay 
572441846f8SBarry Smith    Logically collective on Tao
573a7e14dcfSSatish Balay 
574a7e14dcfSSatish Balay    Input Parameters:
575441846f8SBarry Smith +  tao - the Tao context
576a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
577a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
578a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
579a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
5806c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
581a7e14dcfSSatish Balay 
582a7e14dcfSSatish Balay    Calling sequence of jac:
583ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
584a7e14dcfSSatish Balay 
585441846f8SBarry Smith +  tao - the Tao  context
586a7e14dcfSSatish Balay .  x - input vector
587a7e14dcfSSatish Balay .  J - Jacobian matrix
588a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
589a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
590a7e14dcfSSatish Balay 
591a7e14dcfSSatish Balay    Level: intermediate
592a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS()
593a7e14dcfSSatish Balay @*/
594ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
595a7e14dcfSSatish Balay {
596a7e14dcfSSatish Balay   PetscErrorCode ierr;
59745cf516eSBarry Smith 
598a7e14dcfSSatish Balay   PetscFunctionBegin;
599441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
600a7e14dcfSSatish Balay   if (J) {
601a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
602a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
603a7e14dcfSSatish Balay   }
604a7e14dcfSSatish Balay   if (Jpre) {
605a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
606a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
607a7e14dcfSSatish Balay   }
608a7e14dcfSSatish Balay   if (ctx) {
609a7e14dcfSSatish Balay     tao->user_jac_equalityP = ctx;
610a7e14dcfSSatish Balay   }
611a7e14dcfSSatish Balay   if (func) {
612a7e14dcfSSatish Balay     tao->ops->computejacobianequality = func;
613a7e14dcfSSatish Balay   }
614a7e14dcfSSatish Balay   if (J) {
615a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
61645cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr);
617a7e14dcfSSatish Balay     tao->jacobian_equality = J;
618a7e14dcfSSatish Balay   }
619a7e14dcfSSatish Balay   if (Jpre) {
620a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
62145cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr);
622a7e14dcfSSatish Balay     tao->jacobian_equality_pre=Jpre;
623a7e14dcfSSatish Balay   }
624a7e14dcfSSatish Balay   PetscFunctionReturn(0);
625a7e14dcfSSatish Balay }
626a7e14dcfSSatish Balay 
627a7e14dcfSSatish Balay #undef __FUNCT__
628a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine"
629a7e14dcfSSatish Balay /*@C
630a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
631a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
632a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
633a7e14dcfSSatish Balay 
634441846f8SBarry Smith    Logically collective on Tao
635a7e14dcfSSatish Balay 
636a7e14dcfSSatish Balay    Input Parameters:
637441846f8SBarry Smith +  tao - the Tao context
638a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
639a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
640a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
641a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
6426c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
643a7e14dcfSSatish Balay 
644a7e14dcfSSatish Balay    Calling sequence of jac:
645ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
646a7e14dcfSSatish Balay 
647441846f8SBarry Smith +  tao - the Tao  context
648a7e14dcfSSatish Balay .  x - input vector
649a7e14dcfSSatish Balay .  J - Jacobian matrix
650a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
651a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
652a7e14dcfSSatish Balay 
653a7e14dcfSSatish Balay    Level: intermediate
654a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS()
655a7e14dcfSSatish Balay @*/
656ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
657a7e14dcfSSatish Balay {
658a7e14dcfSSatish Balay   PetscErrorCode ierr;
659a7e14dcfSSatish Balay   PetscFunctionBegin;
660441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
661a7e14dcfSSatish Balay   if (J) {
662a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
663a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
664a7e14dcfSSatish Balay   }
665a7e14dcfSSatish Balay   if (Jpre) {
666a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
667a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
668a7e14dcfSSatish Balay   }
669a7e14dcfSSatish Balay   if (ctx) {
670a7e14dcfSSatish Balay     tao->user_jac_inequalityP = ctx;
671a7e14dcfSSatish Balay   }
672a7e14dcfSSatish Balay   if (func) {
673a7e14dcfSSatish Balay     tao->ops->computejacobianinequality = func;
674a7e14dcfSSatish Balay   }
675a7e14dcfSSatish Balay   if (J) {
676a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
67745cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr);
678a7e14dcfSSatish Balay     tao->jacobian_inequality = J;
679a7e14dcfSSatish Balay   }
680a7e14dcfSSatish Balay   if (Jpre) {
681a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
68245cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr);
683a7e14dcfSSatish Balay     tao->jacobian_inequality_pre=Jpre;
684a7e14dcfSSatish Balay   }
685a7e14dcfSSatish Balay   PetscFunctionReturn(0);
686a7e14dcfSSatish Balay }
687