xref: /petsc/src/tao/interface/taosolver_hj.c (revision a7e14dcfba0d07adf6226a919460249440ec94c7)
1*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/
2*a7e14dcfSSatish Balay 
3*a7e14dcfSSatish Balay #undef __FUNCT__
4*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHessianRoutine"
5*a7e14dcfSSatish Balay /*@C
6*a7e14dcfSSatish Balay    TaoSetHessianRoutine - Sets the function to compute the Hessian as well as the location to store the matrix.
7*a7e14dcfSSatish Balay 
8*a7e14dcfSSatish Balay    Logically collective on TaoSolver
9*a7e14dcfSSatish Balay 
10*a7e14dcfSSatish Balay    Input Parameters:
11*a7e14dcfSSatish Balay +  tao - the TaoSolver context
12*a7e14dcfSSatish Balay .  H - Matrix used for the hessian
13*a7e14dcfSSatish Balay .  Hpre - Matrix that will be used operated on by preconditioner, can be same as H
14*a7e14dcfSSatish Balay .  hess - Hessian evaluation routine
15*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
16*a7e14dcfSSatish Balay          Hessian evaluation routine (may be PETSC_NULL)
17*a7e14dcfSSatish Balay 
18*a7e14dcfSSatish Balay    Calling sequence of hess:
19*a7e14dcfSSatish Balay $    hess (TaoSolver tao,Vec x,Mat *H,Mat *Hpre,MatStructure *flag,void *ctx);
20*a7e14dcfSSatish Balay 
21*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
22*a7e14dcfSSatish Balay .  x - input vector
23*a7e14dcfSSatish Balay .  H - Hessian matrix
24*a7e14dcfSSatish Balay .  Hpre - preconditioner matrix, usually the same as H
25*a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
26*a7e14dcfSSatish Balay    structure (see below)
27*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Hessian context
28*a7e14dcfSSatish Balay 
29*a7e14dcfSSatish Balay 
30*a7e14dcfSSatish Balay    Notes:
31*a7e14dcfSSatish Balay 
32*a7e14dcfSSatish Balay    The function hess() takes Mat * as the matrix arguments rather than Mat.
33*a7e14dcfSSatish Balay    This allows the Hessian evaluation routine to replace A and/or B with a
34*a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
35*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
36*a7e14dcfSSatish Balay    throughout the global iterations.
37*a7e14dcfSSatish Balay 
38*a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
39*a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
40*a7e14dcfSSatish Balay    available options are
41*a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
42*a7e14dcfSSatish Balay $      Hpre is identical during successive linear solves.
43*a7e14dcfSSatish Balay $      This option is intended for folks who are using
44*a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
45*a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
46*a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
47*a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
48*a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
49*a7e14dcfSSatish Balay $      Hpre has the same nonzero structure during
50*a7e14dcfSSatish Balay $      successive linear solves.
51*a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
52*a7e14dcfSSatish Balay $      Hpre does not have the same nonzero structure.
53*a7e14dcfSSatish Balay 
54*a7e14dcfSSatish Balay    Caution:
55*a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
56*a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
57*a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
58*a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
59*a7e14dcfSSatish Balay    feature carefully!
60*a7e14dcfSSatish Balay 
61*a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
62*a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
63*a7e14dcfSSatish Balay 
64*a7e14dcfSSatish Balay    Level: beginner
65*a7e14dcfSSatish Balay 
66*a7e14dcfSSatish Balay @*/
67*a7e14dcfSSatish Balay PetscErrorCode TaoSetHessianRoutine(TaoSolver tao, Mat H, Mat Hpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx)
68*a7e14dcfSSatish Balay {
69*a7e14dcfSSatish Balay     PetscErrorCode ierr;
70*a7e14dcfSSatish Balay     PetscFunctionBegin;
71*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
72*a7e14dcfSSatish Balay     if (H) {
73*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(H,MAT_CLASSID,2);
74*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,H,2);
75*a7e14dcfSSatish Balay     }
76*a7e14dcfSSatish Balay     if (Hpre) {
77*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
78*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,Hpre,3);
79*a7e14dcfSSatish Balay     }
80*a7e14dcfSSatish Balay     if (ctx) {
81*a7e14dcfSSatish Balay 	tao->user_hessP = ctx;
82*a7e14dcfSSatish Balay     }
83*a7e14dcfSSatish Balay     if (func) {
84*a7e14dcfSSatish Balay 	tao->ops->computehessian = func;
85*a7e14dcfSSatish Balay     }
86*a7e14dcfSSatish Balay 
87*a7e14dcfSSatish Balay 
88*a7e14dcfSSatish Balay     if (H) {
89*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)H); CHKERRQ(ierr);
90*a7e14dcfSSatish Balay 	if (tao->hessian) {   ierr = MatDestroy(&tao->hessian); CHKERRQ(ierr);}
91*a7e14dcfSSatish Balay 	tao->hessian = H;
92*a7e14dcfSSatish Balay     }
93*a7e14dcfSSatish Balay     if (Hpre) {
94*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)Hpre); CHKERRQ(ierr);
95*a7e14dcfSSatish Balay 	if (tao->hessian_pre) { ierr = MatDestroy(&tao->hessian_pre); CHKERRQ(ierr);}
96*a7e14dcfSSatish Balay 	tao->hessian_pre=Hpre;
97*a7e14dcfSSatish Balay     }
98*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
99*a7e14dcfSSatish Balay }
100*a7e14dcfSSatish Balay 
101*a7e14dcfSSatish Balay #undef __FUNCT__
102*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian"
103*a7e14dcfSSatish Balay /*@C
104*a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
105*a7e14dcfSSatish Balay    set with TaoSetHessianRoutine().
106*a7e14dcfSSatish Balay 
107*a7e14dcfSSatish Balay    Collective on TaoSolver
108*a7e14dcfSSatish Balay 
109*a7e14dcfSSatish Balay    Input Parameters:
110*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
111*a7e14dcfSSatish Balay -  xx - input vector
112*a7e14dcfSSatish Balay 
113*a7e14dcfSSatish Balay    Output Parameters:
114*a7e14dcfSSatish Balay +  H - Hessian matrix
115*a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
116*a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
117*a7e14dcfSSatish Balay 
118*a7e14dcfSSatish Balay    Notes:
119*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
120*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
121*a7e14dcfSSatish Balay 
122*a7e14dcfSSatish Balay    TaoComputeHessian() is typically used within minimization
123*a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
124*a7e14dcfSSatish Balay    themselves.
125*a7e14dcfSSatish Balay 
126*a7e14dcfSSatish Balay    Level: developer
127*a7e14dcfSSatish Balay 
128*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian()
129*a7e14dcfSSatish Balay 
130*a7e14dcfSSatish Balay @*/
131*a7e14dcfSSatish Balay PetscErrorCode TaoComputeHessian(TaoSolver tao, Vec X, Mat *H, Mat *Hpre, MatStructure *flg)
132*a7e14dcfSSatish Balay {
133*a7e14dcfSSatish Balay     PetscErrorCode ierr;
134*a7e14dcfSSatish Balay     PetscFunctionBegin;
135*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
136*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
137*a7e14dcfSSatish Balay     PetscValidPointer(flg,5);
138*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
139*a7e14dcfSSatish Balay 
140*a7e14dcfSSatish Balay     if (!tao->ops->computehessian) {
141*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first");
142*a7e14dcfSSatish Balay     }
143*a7e14dcfSSatish Balay     *flg = DIFFERENT_NONZERO_PATTERN;
144*a7e14dcfSSatish Balay     ++tao->nhess;
145*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_HessianEval,tao,X,*H,*Hpre); CHKERRQ(ierr);
146*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Hessian function");
147*a7e14dcfSSatish Balay     CHKMEMQ;
148*a7e14dcfSSatish Balay     ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,flg,tao->user_hessP); CHKERRQ(ierr);
149*a7e14dcfSSatish Balay     CHKMEMQ;
150*a7e14dcfSSatish Balay     PetscStackPop;
151*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_HessianEval,tao,X,*H,*Hpre); CHKERRQ(ierr);
152*a7e14dcfSSatish Balay 
153*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
154*a7e14dcfSSatish Balay }
155*a7e14dcfSSatish Balay 
156*a7e14dcfSSatish Balay #undef __FUNCT__
157*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian"
158*a7e14dcfSSatish Balay /*@C
159*a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
160*a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
161*a7e14dcfSSatish Balay 
162*a7e14dcfSSatish Balay    Collective on TaoSolver
163*a7e14dcfSSatish Balay 
164*a7e14dcfSSatish Balay    Input Parameters:
165*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
166*a7e14dcfSSatish Balay -  xx - input vector
167*a7e14dcfSSatish Balay 
168*a7e14dcfSSatish Balay    Output Parameters:
169*a7e14dcfSSatish Balay +  H - Jacobian matrix
170*a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
171*a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
172*a7e14dcfSSatish Balay 
173*a7e14dcfSSatish Balay    Notes:
174*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
175*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
176*a7e14dcfSSatish Balay 
177*a7e14dcfSSatish Balay    TaoComputeJacobian() is typically used within minimization
178*a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
179*a7e14dcfSSatish Balay    themselves.
180*a7e14dcfSSatish Balay 
181*a7e14dcfSSatish Balay    Level: developer
182*a7e14dcfSSatish Balay 
183*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian()
184*a7e14dcfSSatish Balay 
185*a7e14dcfSSatish Balay @*/
186*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobian(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg)
187*a7e14dcfSSatish Balay {
188*a7e14dcfSSatish Balay     PetscErrorCode ierr;
189*a7e14dcfSSatish Balay     PetscFunctionBegin;
190*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
191*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
192*a7e14dcfSSatish Balay     PetscValidPointer(flg,5);
193*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
194*a7e14dcfSSatish Balay 
195*a7e14dcfSSatish Balay     if (!tao->ops->computejacobian) {
196*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
197*a7e14dcfSSatish Balay     }
198*a7e14dcfSSatish Balay     *flg = DIFFERENT_NONZERO_PATTERN;
199*a7e14dcfSSatish Balay     ++tao->njac;
200*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
201*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Jacobian function");
202*a7e14dcfSSatish Balay     CHKMEMQ;
203*a7e14dcfSSatish Balay     ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,flg,tao->user_jacP); CHKERRQ(ierr);
204*a7e14dcfSSatish Balay     CHKMEMQ;
205*a7e14dcfSSatish Balay     PetscStackPop;
206*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
207*a7e14dcfSSatish Balay 
208*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
209*a7e14dcfSSatish Balay }
210*a7e14dcfSSatish Balay 
211*a7e14dcfSSatish Balay #undef __FUNCT__
212*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState"
213*a7e14dcfSSatish Balay /*@C
214*a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
215*a7e14dcfSSatish Balay    set with TaoSetJacobianStateRoutine().
216*a7e14dcfSSatish Balay 
217*a7e14dcfSSatish Balay    Collective on TaoSolver
218*a7e14dcfSSatish Balay 
219*a7e14dcfSSatish Balay    Input Parameters:
220*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
221*a7e14dcfSSatish Balay -  xx - input vector
222*a7e14dcfSSatish Balay 
223*a7e14dcfSSatish Balay    Output Parameters:
224*a7e14dcfSSatish Balay +  H - Jacobian matrix
225*a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
226*a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
227*a7e14dcfSSatish Balay 
228*a7e14dcfSSatish Balay    Notes:
229*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
230*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
231*a7e14dcfSSatish Balay 
232*a7e14dcfSSatish Balay    TaoComputeJacobianState() is typically used within minimization
233*a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
234*a7e14dcfSSatish Balay    themselves.
235*a7e14dcfSSatish Balay 
236*a7e14dcfSSatish Balay    Level: developer
237*a7e14dcfSSatish Balay 
238*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
239*a7e14dcfSSatish Balay 
240*a7e14dcfSSatish Balay @*/
241*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianState(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, Mat *Jinv, MatStructure *flg)
242*a7e14dcfSSatish Balay {
243*a7e14dcfSSatish Balay     PetscErrorCode ierr;
244*a7e14dcfSSatish Balay     PetscFunctionBegin;
245*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
246*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
247*a7e14dcfSSatish Balay     PetscValidPointer(flg,5);
248*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
249*a7e14dcfSSatish Balay 
250*a7e14dcfSSatish Balay     if (!tao->ops->computejacobianstate) {
251*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
252*a7e14dcfSSatish Balay     }
253*a7e14dcfSSatish Balay     *flg = DIFFERENT_NONZERO_PATTERN;
254*a7e14dcfSSatish Balay     ++tao->njac_state;
255*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
256*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Jacobian(state) function");
257*a7e14dcfSSatish Balay     CHKMEMQ;
258*a7e14dcfSSatish Balay     ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,flg,tao->user_jac_stateP); CHKERRQ(ierr);
259*a7e14dcfSSatish Balay     CHKMEMQ;
260*a7e14dcfSSatish Balay     PetscStackPop;
261*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
262*a7e14dcfSSatish Balay 
263*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
264*a7e14dcfSSatish Balay }
265*a7e14dcfSSatish Balay 
266*a7e14dcfSSatish Balay 
267*a7e14dcfSSatish Balay #undef __FUNCT__
268*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign"
269*a7e14dcfSSatish Balay /*@C
270*a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
271*a7e14dcfSSatish Balay    set with TaoSetJacobianDesignRoutine().
272*a7e14dcfSSatish Balay 
273*a7e14dcfSSatish Balay    Collective on TaoSolver
274*a7e14dcfSSatish Balay 
275*a7e14dcfSSatish Balay    Input Parameters:
276*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
277*a7e14dcfSSatish Balay -  xx - input vector
278*a7e14dcfSSatish Balay 
279*a7e14dcfSSatish Balay    Output Parameters:
280*a7e14dcfSSatish Balay .  H - Jacobian matrix
281*a7e14dcfSSatish Balay 
282*a7e14dcfSSatish Balay    Notes:
283*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
284*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
285*a7e14dcfSSatish Balay 
286*a7e14dcfSSatish Balay    TaoComputeJacobianDesign() is typically used within minimization
287*a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
288*a7e14dcfSSatish Balay    themselves.
289*a7e14dcfSSatish Balay 
290*a7e14dcfSSatish Balay    Level: developer
291*a7e14dcfSSatish Balay 
292*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
293*a7e14dcfSSatish Balay 
294*a7e14dcfSSatish Balay @*/
295*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianDesign(TaoSolver tao, Vec X, Mat *J)
296*a7e14dcfSSatish Balay {
297*a7e14dcfSSatish Balay     PetscErrorCode ierr;
298*a7e14dcfSSatish Balay     PetscFunctionBegin;
299*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
300*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
301*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
302*a7e14dcfSSatish Balay 
303*a7e14dcfSSatish Balay     if (!tao->ops->computejacobiandesign) {
304*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
305*a7e14dcfSSatish Balay     }
306*a7e14dcfSSatish Balay     ++tao->njac_design;
307*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,PETSC_NULL); CHKERRQ(ierr);
308*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Jacobian(design) function");
309*a7e14dcfSSatish Balay     CHKMEMQ;
310*a7e14dcfSSatish Balay     ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP); CHKERRQ(ierr);
311*a7e14dcfSSatish Balay     CHKMEMQ;
312*a7e14dcfSSatish Balay     PetscStackPop;
313*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,PETSC_NULL); CHKERRQ(ierr);
314*a7e14dcfSSatish Balay 
315*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
316*a7e14dcfSSatish Balay }
317*a7e14dcfSSatish Balay 
318*a7e14dcfSSatish Balay 
319*a7e14dcfSSatish Balay 
320*a7e14dcfSSatish Balay #undef __FUNCT__
321*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine"
322*a7e14dcfSSatish Balay /*@C
323*a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
324*a7e14dcfSSatish Balay 
325*a7e14dcfSSatish Balay    Logically collective on TaoSolver
326*a7e14dcfSSatish Balay 
327*a7e14dcfSSatish Balay    Input Parameters:
328*a7e14dcfSSatish Balay +  tao - the TaoSolver context
329*a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
330*a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
331*a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
332*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
333*a7e14dcfSSatish Balay          Jacobian evaluation routine (may be PETSC_NULL)
334*a7e14dcfSSatish Balay 
335*a7e14dcfSSatish Balay    Calling sequence of jac:
336*a7e14dcfSSatish Balay $    jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
337*a7e14dcfSSatish Balay 
338*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
339*a7e14dcfSSatish Balay .  x - input vector
340*a7e14dcfSSatish Balay .  J - Jacobian matrix
341*a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
342*a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
343*a7e14dcfSSatish Balay    structure (see below)
344*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
345*a7e14dcfSSatish Balay 
346*a7e14dcfSSatish Balay 
347*a7e14dcfSSatish Balay    Notes:
348*a7e14dcfSSatish Balay 
349*a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
350*a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
351*a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
352*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
353*a7e14dcfSSatish Balay    throughout the global iterations.
354*a7e14dcfSSatish Balay 
355*a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
356*a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
357*a7e14dcfSSatish Balay    available options are
358*a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
359*a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
360*a7e14dcfSSatish Balay $      This option is intended for folks who are using
361*a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
362*a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
363*a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
364*a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
365*a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
366*a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
367*a7e14dcfSSatish Balay $      successive linear solves.
368*a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
369*a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
370*a7e14dcfSSatish Balay 
371*a7e14dcfSSatish Balay    Caution:
372*a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
373*a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
374*a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
375*a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
376*a7e14dcfSSatish Balay    feature carefully!
377*a7e14dcfSSatish Balay 
378*a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
379*a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
380*a7e14dcfSSatish Balay 
381*a7e14dcfSSatish Balay    Level: intermediate
382*a7e14dcfSSatish Balay 
383*a7e14dcfSSatish Balay @*/
384*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx)
385*a7e14dcfSSatish Balay {
386*a7e14dcfSSatish Balay     PetscErrorCode ierr;
387*a7e14dcfSSatish Balay     PetscFunctionBegin;
388*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
389*a7e14dcfSSatish Balay     if (J) {
390*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(J,MAT_CLASSID,2);
391*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,J,2);
392*a7e14dcfSSatish Balay     }
393*a7e14dcfSSatish Balay     if (Jpre) {
394*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
395*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,Jpre,3);
396*a7e14dcfSSatish Balay     }
397*a7e14dcfSSatish Balay     if (ctx) {
398*a7e14dcfSSatish Balay 	tao->user_jacP = ctx;
399*a7e14dcfSSatish Balay     }
400*a7e14dcfSSatish Balay     if (func) {
401*a7e14dcfSSatish Balay 	tao->ops->computejacobian = func;
402*a7e14dcfSSatish Balay     }
403*a7e14dcfSSatish Balay 
404*a7e14dcfSSatish Balay 
405*a7e14dcfSSatish Balay     if (J) {
406*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr);
407*a7e14dcfSSatish Balay 	if (tao->jacobian) {   ierr = MatDestroy(&tao->jacobian); CHKERRQ(ierr);}
408*a7e14dcfSSatish Balay 	tao->jacobian = J;
409*a7e14dcfSSatish Balay     }
410*a7e14dcfSSatish Balay     if (Jpre) {
411*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr);
412*a7e14dcfSSatish Balay 	if (tao->jacobian_pre) { ierr = MatDestroy(&tao->jacobian_pre); CHKERRQ(ierr);}
413*a7e14dcfSSatish Balay 	tao->jacobian_pre=Jpre;
414*a7e14dcfSSatish Balay     }
415*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
416*a7e14dcfSSatish Balay }
417*a7e14dcfSSatish Balay 
418*a7e14dcfSSatish Balay 
419*a7e14dcfSSatish Balay #undef __FUNCT__
420*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine"
421*a7e14dcfSSatish Balay /*@C
422*a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
423*a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
424*a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
425*a7e14dcfSSatish Balay 
426*a7e14dcfSSatish Balay    Logically collective on TaoSolver
427*a7e14dcfSSatish Balay 
428*a7e14dcfSSatish Balay    Input Parameters:
429*a7e14dcfSSatish Balay +  tao - the TaoSolver context
430*a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
431*a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is PETSC_NULL
432*a7e14dcfSSatish Balay .  Jinv - [optional] Matrix used to apply the inverse of the state jacobian. Use PETSC_NULL to default to PETSc KSP solvers to apply the inverse.
433*a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
434*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
435*a7e14dcfSSatish Balay          Jacobian evaluation routine (may be PETSC_NULL)
436*a7e14dcfSSatish Balay 
437*a7e14dcfSSatish Balay    Calling sequence of jac:
438*a7e14dcfSSatish Balay $    jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
439*a7e14dcfSSatish Balay 
440*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
441*a7e14dcfSSatish Balay .  x - input vector
442*a7e14dcfSSatish Balay .  J - Jacobian matrix
443*a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
444*a7e14dcfSSatish Balay .  Jinv - inverse of J
445*a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
446*a7e14dcfSSatish Balay    structure (see below)
447*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
448*a7e14dcfSSatish Balay 
449*a7e14dcfSSatish Balay 
450*a7e14dcfSSatish Balay    Notes:
451*a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
452*a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
453*a7e14dcfSSatish Balay    its own Jinv matrix.
454*a7e14dcfSSatish Balay 
455*a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
456*a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
457*a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
458*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
459*a7e14dcfSSatish Balay    throughout the global iterations.
460*a7e14dcfSSatish Balay 
461*a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
462*a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
463*a7e14dcfSSatish Balay    available options are
464*a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
465*a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
466*a7e14dcfSSatish Balay $      This option is intended for folks who are using
467*a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
468*a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
469*a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
470*a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
471*a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
472*a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
473*a7e14dcfSSatish Balay $      successive linear solves.
474*a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
475*a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
476*a7e14dcfSSatish Balay 
477*a7e14dcfSSatish Balay    Caution:
478*a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
479*a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
480*a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
481*a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
482*a7e14dcfSSatish Balay    feature carefully!
483*a7e14dcfSSatish Balay 
484*a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
485*a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
486*a7e14dcfSSatish Balay 
487*a7e14dcfSSatish Balay    Level: intermediate
488*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS()
489*a7e14dcfSSatish Balay @*/
490*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianStateRoutine(TaoSolver tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, Mat *, MatStructure *, void*), void *ctx)
491*a7e14dcfSSatish Balay {
492*a7e14dcfSSatish Balay     PetscErrorCode ierr;
493*a7e14dcfSSatish Balay     PetscFunctionBegin;
494*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
495*a7e14dcfSSatish Balay     if (J) {
496*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(J,MAT_CLASSID,2);
497*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,J,2);
498*a7e14dcfSSatish Balay     }
499*a7e14dcfSSatish Balay     if (Jpre) {
500*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
501*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,Jpre,3);
502*a7e14dcfSSatish Balay     }
503*a7e14dcfSSatish Balay     if (Jinv) {
504*a7e14dcfSSatish Balay       PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
505*a7e14dcfSSatish Balay       PetscCheckSameComm(tao,1,Jinv,4);
506*a7e14dcfSSatish Balay     }
507*a7e14dcfSSatish Balay     if (ctx) {
508*a7e14dcfSSatish Balay 	tao->user_jac_stateP = ctx;
509*a7e14dcfSSatish Balay     }
510*a7e14dcfSSatish Balay     if (func) {
511*a7e14dcfSSatish Balay 	tao->ops->computejacobianstate = func;
512*a7e14dcfSSatish Balay     }
513*a7e14dcfSSatish Balay 
514*a7e14dcfSSatish Balay 
515*a7e14dcfSSatish Balay     if (J) {
516*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr);
517*a7e14dcfSSatish Balay 	if (tao->jacobian_state) {   ierr = MatDestroy(&tao->jacobian_state); CHKERRQ(ierr);}
518*a7e14dcfSSatish Balay 	tao->jacobian_state = J;
519*a7e14dcfSSatish Balay     }
520*a7e14dcfSSatish Balay     if (Jpre) {
521*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr);
522*a7e14dcfSSatish Balay 	if (tao->jacobian_state_pre) { ierr = MatDestroy(&tao->jacobian_state_pre); CHKERRQ(ierr);}
523*a7e14dcfSSatish Balay 	tao->jacobian_state_pre=Jpre;
524*a7e14dcfSSatish Balay     }
525*a7e14dcfSSatish Balay     if (Jinv) {
526*a7e14dcfSSatish Balay       ierr = PetscObjectReference((PetscObject)Jinv); CHKERRQ(ierr);
527*a7e14dcfSSatish Balay       if (tao->jacobian_state_inv) {ierr = MatDestroy(&tao->jacobian_state_inv); CHKERRQ(ierr);}
528*a7e14dcfSSatish Balay       tao->jacobian_state_inv=Jinv;
529*a7e14dcfSSatish Balay     }
530*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
531*a7e14dcfSSatish Balay }
532*a7e14dcfSSatish Balay 
533*a7e14dcfSSatish Balay #undef __FUNCT__
534*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine"
535*a7e14dcfSSatish Balay /*@C
536*a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
537*a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
538*a7e14dcfSSatish Balay    pde-constrained optimization.
539*a7e14dcfSSatish Balay 
540*a7e14dcfSSatish Balay    Logically collective on TaoSolver
541*a7e14dcfSSatish Balay 
542*a7e14dcfSSatish Balay    Input Parameters:
543*a7e14dcfSSatish Balay +  tao - the TaoSolver context
544*a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
545*a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
546*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
547*a7e14dcfSSatish Balay          Jacobian evaluation routine (may be PETSC_NULL)
548*a7e14dcfSSatish Balay 
549*a7e14dcfSSatish Balay    Calling sequence of jac:
550*a7e14dcfSSatish Balay $    jac (TaoSolver tao,Vec x,Mat *J,void *ctx);
551*a7e14dcfSSatish Balay 
552*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
553*a7e14dcfSSatish Balay .  x - input vector
554*a7e14dcfSSatish Balay .  J - Jacobian matrix
555*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
556*a7e14dcfSSatish Balay 
557*a7e14dcfSSatish Balay 
558*a7e14dcfSSatish Balay    Notes:
559*a7e14dcfSSatish Balay 
560*a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
561*a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
562*a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
563*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
564*a7e14dcfSSatish Balay    throughout the global iterations.
565*a7e14dcfSSatish Balay 
566*a7e14dcfSSatish Balay    Level: intermediate
567*a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS()
568*a7e14dcfSSatish Balay @*/
569*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianDesignRoutine(TaoSolver tao, Mat J, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, void*), void *ctx)
570*a7e14dcfSSatish Balay {
571*a7e14dcfSSatish Balay     PetscErrorCode ierr;
572*a7e14dcfSSatish Balay     PetscFunctionBegin;
573*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
574*a7e14dcfSSatish Balay     if (J) {
575*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(J,MAT_CLASSID,2);
576*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,J,2);
577*a7e14dcfSSatish Balay     }
578*a7e14dcfSSatish Balay     if (ctx) {
579*a7e14dcfSSatish Balay 	tao->user_jac_designP = ctx;
580*a7e14dcfSSatish Balay     }
581*a7e14dcfSSatish Balay     if (func) {
582*a7e14dcfSSatish Balay 	tao->ops->computejacobiandesign = func;
583*a7e14dcfSSatish Balay     }
584*a7e14dcfSSatish Balay 
585*a7e14dcfSSatish Balay 
586*a7e14dcfSSatish Balay     if (J) {
587*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr);
588*a7e14dcfSSatish Balay 	if (tao->jacobian_design) {   ierr = MatDestroy(&tao->jacobian_design); CHKERRQ(ierr);}
589*a7e14dcfSSatish Balay 	tao->jacobian_design = J;
590*a7e14dcfSSatish Balay     }
591*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
592*a7e14dcfSSatish Balay }
593*a7e14dcfSSatish Balay 
594*a7e14dcfSSatish Balay #undef __FUNCT__
595*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS"
596*a7e14dcfSSatish Balay /*@
597*a7e14dcfSSatish Balay    TaoSetStateDesignIS - Indicate to the TaoSolver which variables in the
598*a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
599*a7e14dcfSSatish Balay    pde-constrained optimization.
600*a7e14dcfSSatish Balay 
601*a7e14dcfSSatish Balay    Logically Collective on TaoSolver
602*a7e14dcfSSatish Balay 
603*a7e14dcfSSatish Balay    Input Parameters:
604*a7e14dcfSSatish Balay +  tao - The TaoSolver context
605*a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
606*a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
607*a7e14dcfSSatish Balay 
608*a7e14dcfSSatish Balay    Level: intermediate
609*a7e14dcfSSatish Balay 
610*a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine()
611*a7e14dcfSSatish Balay @*/
612*a7e14dcfSSatish Balay PetscErrorCode TaoSetStateDesignIS(TaoSolver tao, IS s_is, IS d_is)
613*a7e14dcfSSatish Balay {
614*a7e14dcfSSatish Balay   PetscErrorCode ierr;
615*a7e14dcfSSatish Balay   if (tao->state_is) {
616*a7e14dcfSSatish Balay     ierr = PetscObjectDereference((PetscObject)(tao->state_is)); CHKERRQ(ierr);
617*a7e14dcfSSatish Balay   }
618*a7e14dcfSSatish Balay   if (tao->design_is) {
619*a7e14dcfSSatish Balay     ierr = PetscObjectDereference((PetscObject)(tao->design_is)); CHKERRQ(ierr);
620*a7e14dcfSSatish Balay   }
621*a7e14dcfSSatish Balay   tao->state_is = s_is;
622*a7e14dcfSSatish Balay   tao->design_is = d_is;
623*a7e14dcfSSatish Balay   if (s_is) {
624*a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)(tao->state_is)); CHKERRQ(ierr);
625*a7e14dcfSSatish Balay   }
626*a7e14dcfSSatish Balay   if (d_is) {
627*a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)(tao->design_is)); CHKERRQ(ierr);
628*a7e14dcfSSatish Balay   }
629*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
630*a7e14dcfSSatish Balay }
631*a7e14dcfSSatish Balay 
632*a7e14dcfSSatish Balay 
633*a7e14dcfSSatish Balay #undef __FUNCT__
634*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality"
635*a7e14dcfSSatish Balay /*@C
636*a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
637*a7e14dcfSSatish Balay    set with TaoSetJacobianEqualityRoutine().
638*a7e14dcfSSatish Balay 
639*a7e14dcfSSatish Balay    Collective on TaoSolver
640*a7e14dcfSSatish Balay 
641*a7e14dcfSSatish Balay    Input Parameters:
642*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
643*a7e14dcfSSatish Balay -  xx - input vector
644*a7e14dcfSSatish Balay 
645*a7e14dcfSSatish Balay    Output Parameters:
646*a7e14dcfSSatish Balay +  H - Jacobian matrix
647*a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
648*a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
649*a7e14dcfSSatish Balay 
650*a7e14dcfSSatish Balay    Notes:
651*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
652*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
653*a7e14dcfSSatish Balay 
654*a7e14dcfSSatish Balay    Level: developer
655*a7e14dcfSSatish Balay 
656*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
657*a7e14dcfSSatish Balay 
658*a7e14dcfSSatish Balay @*/
659*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianEquality(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg)
660*a7e14dcfSSatish Balay {
661*a7e14dcfSSatish Balay     PetscErrorCode ierr;
662*a7e14dcfSSatish Balay     PetscFunctionBegin;
663*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
664*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
665*a7e14dcfSSatish Balay     PetscValidPointer(flg,5);
666*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
667*a7e14dcfSSatish Balay 
668*a7e14dcfSSatish Balay     if (!tao->ops->computejacobianequality) {
669*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
670*a7e14dcfSSatish Balay     }
671*a7e14dcfSSatish Balay     *flg = DIFFERENT_NONZERO_PATTERN;
672*a7e14dcfSSatish Balay     ++tao->njac_equality;
673*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
674*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Jacobian(equality) function");
675*a7e14dcfSSatish Balay     CHKMEMQ;
676*a7e14dcfSSatish Balay     ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,flg,tao->user_jac_equalityP); CHKERRQ(ierr);
677*a7e14dcfSSatish Balay     CHKMEMQ;
678*a7e14dcfSSatish Balay     PetscStackPop;
679*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
680*a7e14dcfSSatish Balay 
681*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
682*a7e14dcfSSatish Balay }
683*a7e14dcfSSatish Balay 
684*a7e14dcfSSatish Balay #undef __FUNCT__
685*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality"
686*a7e14dcfSSatish Balay /*@C
687*a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
688*a7e14dcfSSatish Balay    set with TaoSetJacobianInequalityRoutine().
689*a7e14dcfSSatish Balay 
690*a7e14dcfSSatish Balay    Collective on TaoSolver
691*a7e14dcfSSatish Balay 
692*a7e14dcfSSatish Balay    Input Parameters:
693*a7e14dcfSSatish Balay +  solver - the TaoSolver solver context
694*a7e14dcfSSatish Balay -  xx - input vector
695*a7e14dcfSSatish Balay 
696*a7e14dcfSSatish Balay    Output Parameters:
697*a7e14dcfSSatish Balay +  H - Jacobian matrix
698*a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
699*a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
700*a7e14dcfSSatish Balay 
701*a7e14dcfSSatish Balay    Notes:
702*a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
703*a7e14dcfSSatish Balay    is used internally within the minimization solvers.
704*a7e14dcfSSatish Balay 
705*a7e14dcfSSatish Balay    Level: developer
706*a7e14dcfSSatish Balay 
707*a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
708*a7e14dcfSSatish Balay 
709*a7e14dcfSSatish Balay @*/
710*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianInequality(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg)
711*a7e14dcfSSatish Balay {
712*a7e14dcfSSatish Balay     PetscErrorCode ierr;
713*a7e14dcfSSatish Balay     PetscFunctionBegin;
714*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
715*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X, VEC_CLASSID,2);
716*a7e14dcfSSatish Balay     PetscValidPointer(flg,5);
717*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
718*a7e14dcfSSatish Balay 
719*a7e14dcfSSatish Balay     if (!tao->ops->computejacobianinequality) {
720*a7e14dcfSSatish Balay 	SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
721*a7e14dcfSSatish Balay     }
722*a7e14dcfSSatish Balay     *flg = DIFFERENT_NONZERO_PATTERN;
723*a7e14dcfSSatish Balay     ++tao->njac_inequality;
724*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
725*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver user Jacobian(inequality) function");
726*a7e14dcfSSatish Balay     CHKMEMQ;
727*a7e14dcfSSatish Balay     ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,flg,tao->user_jac_inequalityP); CHKERRQ(ierr);
728*a7e14dcfSSatish Balay     CHKMEMQ;
729*a7e14dcfSSatish Balay     PetscStackPop;
730*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr);
731*a7e14dcfSSatish Balay 
732*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
733*a7e14dcfSSatish Balay }
734*a7e14dcfSSatish Balay 
735*a7e14dcfSSatish Balay 
736*a7e14dcfSSatish Balay #undef __FUNCT__
737*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine"
738*a7e14dcfSSatish Balay /*@C
739*a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
740*a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
741*a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
742*a7e14dcfSSatish Balay 
743*a7e14dcfSSatish Balay    Logically collective on TaoSolver
744*a7e14dcfSSatish Balay 
745*a7e14dcfSSatish Balay    Input Parameters:
746*a7e14dcfSSatish Balay +  tao - the TaoSolver context
747*a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
748*a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
749*a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
750*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
751*a7e14dcfSSatish Balay          Jacobian evaluation routine (may be PETSC_NULL)
752*a7e14dcfSSatish Balay 
753*a7e14dcfSSatish Balay    Calling sequence of jac:
754*a7e14dcfSSatish Balay $    jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
755*a7e14dcfSSatish Balay 
756*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
757*a7e14dcfSSatish Balay .  x - input vector
758*a7e14dcfSSatish Balay .  J - Jacobian matrix
759*a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
760*a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
761*a7e14dcfSSatish Balay    structure (see below)
762*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
763*a7e14dcfSSatish Balay 
764*a7e14dcfSSatish Balay 
765*a7e14dcfSSatish Balay    Notes:
766*a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
767*a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
768*a7e14dcfSSatish Balay    its own Jinv matrix.
769*a7e14dcfSSatish Balay 
770*a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
771*a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
772*a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
773*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
774*a7e14dcfSSatish Balay    throughout the global iterations.
775*a7e14dcfSSatish Balay 
776*a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
777*a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
778*a7e14dcfSSatish Balay    available options are
779*a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
780*a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
781*a7e14dcfSSatish Balay $      This option is intended for folks who are using
782*a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
783*a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
784*a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
785*a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
786*a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
787*a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
788*a7e14dcfSSatish Balay $      successive linear solves.
789*a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
790*a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
791*a7e14dcfSSatish Balay 
792*a7e14dcfSSatish Balay    Caution:
793*a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
794*a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
795*a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
796*a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
797*a7e14dcfSSatish Balay    feature carefully!
798*a7e14dcfSSatish Balay 
799*a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
800*a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
801*a7e14dcfSSatish Balay 
802*a7e14dcfSSatish Balay    Level: intermediate
803*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS()
804*a7e14dcfSSatish Balay @*/
805*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianEqualityRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx)
806*a7e14dcfSSatish Balay {
807*a7e14dcfSSatish Balay     PetscErrorCode ierr;
808*a7e14dcfSSatish Balay     PetscFunctionBegin;
809*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
810*a7e14dcfSSatish Balay     if (J) {
811*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(J,MAT_CLASSID,2);
812*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,J,2);
813*a7e14dcfSSatish Balay     }
814*a7e14dcfSSatish Balay     if (Jpre) {
815*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
816*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,Jpre,3);
817*a7e14dcfSSatish Balay     }
818*a7e14dcfSSatish Balay     if (ctx) {
819*a7e14dcfSSatish Balay 	tao->user_jac_equalityP = ctx;
820*a7e14dcfSSatish Balay     }
821*a7e14dcfSSatish Balay     if (func) {
822*a7e14dcfSSatish Balay 	tao->ops->computejacobianequality = func;
823*a7e14dcfSSatish Balay     }
824*a7e14dcfSSatish Balay 
825*a7e14dcfSSatish Balay 
826*a7e14dcfSSatish Balay     if (J) {
827*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr);
828*a7e14dcfSSatish Balay 	if (tao->jacobian_equality) {   ierr = MatDestroy(&tao->jacobian_equality); CHKERRQ(ierr);}
829*a7e14dcfSSatish Balay 	tao->jacobian_equality = J;
830*a7e14dcfSSatish Balay     }
831*a7e14dcfSSatish Balay     if (Jpre) {
832*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr);
833*a7e14dcfSSatish Balay 	if (tao->jacobian_equality_pre) { ierr = MatDestroy(&tao->jacobian_equality_pre); CHKERRQ(ierr);}
834*a7e14dcfSSatish Balay 	tao->jacobian_equality_pre=Jpre;
835*a7e14dcfSSatish Balay     }
836*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
837*a7e14dcfSSatish Balay }
838*a7e14dcfSSatish Balay 
839*a7e14dcfSSatish Balay #undef __FUNCT__
840*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine"
841*a7e14dcfSSatish Balay /*@C
842*a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
843*a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
844*a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
845*a7e14dcfSSatish Balay 
846*a7e14dcfSSatish Balay    Logically collective on TaoSolver
847*a7e14dcfSSatish Balay 
848*a7e14dcfSSatish Balay    Input Parameters:
849*a7e14dcfSSatish Balay +  tao - the TaoSolver context
850*a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
851*a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
852*a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
853*a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
854*a7e14dcfSSatish Balay          Jacobian evaluation routine (may be PETSC_NULL)
855*a7e14dcfSSatish Balay 
856*a7e14dcfSSatish Balay    Calling sequence of jac:
857*a7e14dcfSSatish Balay $    jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
858*a7e14dcfSSatish Balay 
859*a7e14dcfSSatish Balay +  tao - the TaoSolver  context
860*a7e14dcfSSatish Balay .  x - input vector
861*a7e14dcfSSatish Balay .  J - Jacobian matrix
862*a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
863*a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
864*a7e14dcfSSatish Balay    structure (see below)
865*a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
866*a7e14dcfSSatish Balay 
867*a7e14dcfSSatish Balay 
868*a7e14dcfSSatish Balay    Notes:
869*a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
870*a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
871*a7e14dcfSSatish Balay    its own Jinv matrix.
872*a7e14dcfSSatish Balay 
873*a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
874*a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
875*a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
876*a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
877*a7e14dcfSSatish Balay    throughout the global iterations.
878*a7e14dcfSSatish Balay 
879*a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
880*a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
881*a7e14dcfSSatish Balay    available options are
882*a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
883*a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
884*a7e14dcfSSatish Balay $      This option is intended for folks who are using
885*a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
886*a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
887*a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
888*a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
889*a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
890*a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
891*a7e14dcfSSatish Balay $      successive linear solves.
892*a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
893*a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
894*a7e14dcfSSatish Balay 
895*a7e14dcfSSatish Balay    Caution:
896*a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
897*a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
898*a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
899*a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
900*a7e14dcfSSatish Balay    feature carefully!
901*a7e14dcfSSatish Balay 
902*a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
903*a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
904*a7e14dcfSSatish Balay 
905*a7e14dcfSSatish Balay    Level: intermediate
906*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS()
907*a7e14dcfSSatish Balay @*/
908*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianInequalityRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx)
909*a7e14dcfSSatish Balay {
910*a7e14dcfSSatish Balay     PetscErrorCode ierr;
911*a7e14dcfSSatish Balay     PetscFunctionBegin;
912*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
913*a7e14dcfSSatish Balay     if (J) {
914*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(J,MAT_CLASSID,2);
915*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,J,2);
916*a7e14dcfSSatish Balay     }
917*a7e14dcfSSatish Balay     if (Jpre) {
918*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
919*a7e14dcfSSatish Balay 	PetscCheckSameComm(tao,1,Jpre,3);
920*a7e14dcfSSatish Balay     }
921*a7e14dcfSSatish Balay     if (ctx) {
922*a7e14dcfSSatish Balay 	tao->user_jac_inequalityP = ctx;
923*a7e14dcfSSatish Balay     }
924*a7e14dcfSSatish Balay     if (func) {
925*a7e14dcfSSatish Balay 	tao->ops->computejacobianinequality = func;
926*a7e14dcfSSatish Balay     }
927*a7e14dcfSSatish Balay 
928*a7e14dcfSSatish Balay 
929*a7e14dcfSSatish Balay     if (J) {
930*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr);
931*a7e14dcfSSatish Balay 	if (tao->jacobian_inequality) {   ierr = MatDestroy(&tao->jacobian_inequality); CHKERRQ(ierr);}
932*a7e14dcfSSatish Balay 	tao->jacobian_inequality = J;
933*a7e14dcfSSatish Balay     }
934*a7e14dcfSSatish Balay     if (Jpre) {
935*a7e14dcfSSatish Balay 	ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr);
936*a7e14dcfSSatish Balay 	if (tao->jacobian_inequality_pre) { ierr = MatDestroy(&tao->jacobian_inequality_pre); CHKERRQ(ierr);}
937*a7e14dcfSSatish Balay 	tao->jacobian_inequality_pre=Jpre;
938*a7e14dcfSSatish Balay     }
939*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
940*a7e14dcfSSatish Balay }
941