xref: /petsc/src/tao/interface/taosolver_hj.c (revision ffad99011bdf8bdff5e8540ef3c49b4fd8d6e6bb)
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:
19*ffad9901SBarry 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    structure (see below)
26a7e14dcfSSatish Balay -  ctx - [optional] user-defined Hessian context
27a7e14dcfSSatish Balay 
28a7e14dcfSSatish Balay 
29a7e14dcfSSatish Balay    Notes:
30a7e14dcfSSatish Balay 
31a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
32a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
33a7e14dcfSSatish Balay    available options are
34a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
35a7e14dcfSSatish Balay $      Hpre is identical during successive linear solves.
36a7e14dcfSSatish Balay $      This option is intended for folks who are using
37a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
38a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
39a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
40a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
41a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
42a7e14dcfSSatish Balay $      Hpre has the same nonzero structure during
43a7e14dcfSSatish Balay $      successive linear solves.
44a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
45a7e14dcfSSatish Balay $      Hpre does not have the same nonzero structure.
46a7e14dcfSSatish Balay 
47a7e14dcfSSatish Balay    Caution:
48a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
49a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
50a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
51a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
52a7e14dcfSSatish Balay    feature carefully!
53a7e14dcfSSatish Balay 
54a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
55a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
56a7e14dcfSSatish Balay 
57a7e14dcfSSatish Balay    Level: beginner
58a7e14dcfSSatish Balay 
59a7e14dcfSSatish Balay @*/
60*ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
61a7e14dcfSSatish Balay {
62a7e14dcfSSatish Balay   PetscErrorCode ierr;
6345cf516eSBarry Smith 
64a7e14dcfSSatish Balay   PetscFunctionBegin;
65441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
66a7e14dcfSSatish Balay   if (H) {
67a7e14dcfSSatish Balay     PetscValidHeaderSpecific(H,MAT_CLASSID,2);
68a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,H,2);
69a7e14dcfSSatish Balay   }
70a7e14dcfSSatish Balay   if (Hpre) {
71a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
72a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Hpre,3);
73a7e14dcfSSatish Balay   }
74a7e14dcfSSatish Balay   if (ctx) {
75a7e14dcfSSatish Balay     tao->user_hessP = ctx;
76a7e14dcfSSatish Balay   }
77a7e14dcfSSatish Balay   if (func) {
78a7e14dcfSSatish Balay     tao->ops->computehessian = func;
79a7e14dcfSSatish Balay   }
80a7e14dcfSSatish Balay   if (H) {
81a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr);
8245cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr);
83a7e14dcfSSatish Balay     tao->hessian = H;
84a7e14dcfSSatish Balay   }
85a7e14dcfSSatish Balay   if (Hpre) {
86a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr);
8745cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr);
88a7e14dcfSSatish Balay     tao->hessian_pre = Hpre;
89a7e14dcfSSatish Balay   }
90a7e14dcfSSatish Balay   PetscFunctionReturn(0);
91a7e14dcfSSatish Balay }
92a7e14dcfSSatish Balay 
93a7e14dcfSSatish Balay #undef __FUNCT__
94a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian"
95a7e14dcfSSatish Balay /*@C
96a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
97a7e14dcfSSatish Balay    set with TaoSetHessianRoutine().
98a7e14dcfSSatish Balay 
99441846f8SBarry Smith    Collective on Tao
100a7e14dcfSSatish Balay 
101a7e14dcfSSatish Balay    Input Parameters:
102441846f8SBarry Smith +  solver - the Tao solver context
103a7e14dcfSSatish Balay -  xx - input vector
104a7e14dcfSSatish Balay 
105a7e14dcfSSatish Balay    Output Parameters:
106a7e14dcfSSatish Balay +  H - Hessian matrix
107a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
108a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
109a7e14dcfSSatish Balay 
110a7e14dcfSSatish Balay    Notes:
111a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
112a7e14dcfSSatish Balay    is used internally within the minimization solvers.
113a7e14dcfSSatish Balay 
114a7e14dcfSSatish Balay    TaoComputeHessian() is typically used within minimization
115a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
116a7e14dcfSSatish Balay    themselves.
117a7e14dcfSSatish Balay 
118a7e14dcfSSatish Balay    Level: developer
119a7e14dcfSSatish Balay 
120a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian()
121a7e14dcfSSatish Balay 
122a7e14dcfSSatish Balay @*/
123*ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre)
124a7e14dcfSSatish Balay {
125a7e14dcfSSatish Balay   PetscErrorCode ierr;
12687f595a5SBarry Smith 
127a7e14dcfSSatish Balay   PetscFunctionBegin;
128441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
129a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
130a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
131a7e14dcfSSatish Balay 
13287f595a5SBarry Smith   if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first");
133a7e14dcfSSatish Balay   ++tao->nhess;
13494ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
135441846f8SBarry Smith   PetscStackPush("Tao user Hessian function");
136*ffad9901SBarry Smith   ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr);
137a7e14dcfSSatish Balay   PetscStackPop;
13894ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
139a7e14dcfSSatish Balay   PetscFunctionReturn(0);
140a7e14dcfSSatish Balay }
141a7e14dcfSSatish Balay 
142a7e14dcfSSatish Balay #undef __FUNCT__
143a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian"
144a7e14dcfSSatish Balay /*@C
145a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
146a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
147a7e14dcfSSatish Balay 
148441846f8SBarry Smith    Collective on Tao
149a7e14dcfSSatish Balay 
150a7e14dcfSSatish Balay    Input Parameters:
151441846f8SBarry Smith +  solver - the Tao solver context
152a7e14dcfSSatish Balay -  xx - input vector
153a7e14dcfSSatish Balay 
154a7e14dcfSSatish Balay    Output Parameters:
155a7e14dcfSSatish Balay +  H - Jacobian matrix
156*ffad9901SBarry Smith -  Hpre - Preconditioning matrix
157a7e14dcfSSatish Balay 
158a7e14dcfSSatish Balay    Notes:
159a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
160a7e14dcfSSatish Balay    is used internally within the minimization solvers.
161a7e14dcfSSatish Balay 
162a7e14dcfSSatish Balay    TaoComputeJacobian() is typically used within minimization
163a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
164a7e14dcfSSatish Balay    themselves.
165a7e14dcfSSatish Balay 
166a7e14dcfSSatish Balay    Level: developer
167a7e14dcfSSatish Balay 
168a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian()
169a7e14dcfSSatish Balay 
170a7e14dcfSSatish Balay @*/
171*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre)
172a7e14dcfSSatish Balay {
173a7e14dcfSSatish Balay   PetscErrorCode ierr;
17487f595a5SBarry Smith 
175a7e14dcfSSatish Balay   PetscFunctionBegin;
176441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
177a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
178a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
179a7e14dcfSSatish Balay 
18087f595a5SBarry Smith   if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
181a7e14dcfSSatish Balay   ++tao->njac;
18294ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
183441846f8SBarry Smith   PetscStackPush("Tao user Jacobian function");
184*ffad9901SBarry Smith   ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr);
185a7e14dcfSSatish Balay   PetscStackPop;
18694ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
187a7e14dcfSSatish Balay   PetscFunctionReturn(0);
188a7e14dcfSSatish Balay }
189a7e14dcfSSatish Balay 
190a7e14dcfSSatish Balay #undef __FUNCT__
191a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState"
192a7e14dcfSSatish Balay /*@C
193a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
194a7e14dcfSSatish Balay    set with TaoSetJacobianStateRoutine().
195a7e14dcfSSatish Balay 
196441846f8SBarry Smith    Collective on Tao
197a7e14dcfSSatish Balay 
198a7e14dcfSSatish Balay    Input Parameters:
199441846f8SBarry Smith +  solver - the Tao solver context
200a7e14dcfSSatish Balay -  xx - input vector
201a7e14dcfSSatish Balay 
202a7e14dcfSSatish Balay    Output Parameters:
203a7e14dcfSSatish Balay +  H - Jacobian matrix
204*ffad9901SBarry Smith -  Hpre - Preconditioning matrix
205a7e14dcfSSatish Balay 
206a7e14dcfSSatish Balay    Notes:
207a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
208a7e14dcfSSatish Balay    is used internally within the minimization solvers.
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay    TaoComputeJacobianState() is typically used within minimization
211a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
212a7e14dcfSSatish Balay    themselves.
213a7e14dcfSSatish Balay 
214a7e14dcfSSatish Balay    Level: developer
215a7e14dcfSSatish Balay 
216a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
217a7e14dcfSSatish Balay 
218a7e14dcfSSatish Balay @*/
219*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv)
220a7e14dcfSSatish Balay {
221a7e14dcfSSatish Balay   PetscErrorCode ierr;
22245cf516eSBarry Smith 
223a7e14dcfSSatish Balay   PetscFunctionBegin;
224441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
225a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
226a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
227a7e14dcfSSatish Balay 
22887f595a5SBarry Smith   if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
229a7e14dcfSSatish Balay   ++tao->njac_state;
23094ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
231441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(state) function");
232*ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr);
233a7e14dcfSSatish Balay   PetscStackPop;
23494ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
235a7e14dcfSSatish Balay   PetscFunctionReturn(0);
236a7e14dcfSSatish Balay }
237a7e14dcfSSatish Balay 
238a7e14dcfSSatish Balay #undef __FUNCT__
239a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign"
240a7e14dcfSSatish Balay /*@C
241a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
242a7e14dcfSSatish Balay    set with TaoSetJacobianDesignRoutine().
243a7e14dcfSSatish Balay 
244441846f8SBarry Smith    Collective on Tao
245a7e14dcfSSatish Balay 
246a7e14dcfSSatish Balay    Input Parameters:
247441846f8SBarry Smith +  solver - the Tao solver context
248a7e14dcfSSatish Balay -  xx - input vector
249a7e14dcfSSatish Balay 
250a7e14dcfSSatish Balay    Output Parameters:
251a7e14dcfSSatish Balay .  H - Jacobian matrix
252a7e14dcfSSatish Balay 
253a7e14dcfSSatish Balay    Notes:
254a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
255a7e14dcfSSatish Balay    is used internally within the minimization solvers.
256a7e14dcfSSatish Balay 
257a7e14dcfSSatish Balay    TaoComputeJacobianDesign() is typically used within minimization
258a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
259a7e14dcfSSatish Balay    themselves.
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay    Level: developer
262a7e14dcfSSatish Balay 
263a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
264a7e14dcfSSatish Balay 
265a7e14dcfSSatish Balay @*/
26694ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J)
267a7e14dcfSSatish Balay {
268a7e14dcfSSatish Balay   PetscErrorCode ierr;
26987f595a5SBarry Smith 
270a7e14dcfSSatish Balay   PetscFunctionBegin;
271441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
272a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
273a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
274a7e14dcfSSatish Balay 
27587f595a5SBarry Smith   if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
276a7e14dcfSSatish Balay   ++tao->njac_design;
27794ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
278441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(design) function");
279a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr);
280a7e14dcfSSatish Balay   PetscStackPop;
28194ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
282a7e14dcfSSatish Balay   PetscFunctionReturn(0);
283a7e14dcfSSatish Balay }
284a7e14dcfSSatish Balay 
285a7e14dcfSSatish Balay #undef __FUNCT__
286a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine"
287a7e14dcfSSatish Balay /*@C
288a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
289a7e14dcfSSatish Balay 
290441846f8SBarry Smith    Logically collective on Tao
291a7e14dcfSSatish Balay 
292a7e14dcfSSatish Balay    Input Parameters:
293441846f8SBarry Smith +  tao - the Tao context
294a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
295a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
296a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
297a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
2986c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
299a7e14dcfSSatish Balay 
300a7e14dcfSSatish Balay    Calling sequence of jac:
301*ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
302a7e14dcfSSatish Balay 
303441846f8SBarry Smith +  tao - the Tao  context
304a7e14dcfSSatish Balay .  x - input vector
305a7e14dcfSSatish Balay .  J - Jacobian matrix
306a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
307a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
308a7e14dcfSSatish Balay    structure (see below)
309a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
310a7e14dcfSSatish Balay 
311a7e14dcfSSatish Balay    Notes:
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
314a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
315a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
316a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
317a7e14dcfSSatish Balay    throughout the global iterations.
318a7e14dcfSSatish Balay 
319a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
320a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
321a7e14dcfSSatish Balay    available options are
322a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
323a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
324a7e14dcfSSatish Balay $      This option is intended for folks who are using
325a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
326a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
327a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
328a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
329a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
330a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
331a7e14dcfSSatish Balay $      successive linear solves.
332a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
333a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
334a7e14dcfSSatish Balay 
335a7e14dcfSSatish Balay    Caution:
336a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
337a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
338a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
339a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
340a7e14dcfSSatish Balay    feature carefully!
341a7e14dcfSSatish Balay 
342a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
343a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
344a7e14dcfSSatish Balay 
345a7e14dcfSSatish Balay    Level: intermediate
346a7e14dcfSSatish Balay 
347a7e14dcfSSatish Balay @*/
348*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
349a7e14dcfSSatish Balay {
350a7e14dcfSSatish Balay   PetscErrorCode ierr;
351a7e14dcfSSatish Balay   PetscFunctionBegin;
352441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
353a7e14dcfSSatish Balay   if (J) {
354a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
355a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
356a7e14dcfSSatish Balay   }
357a7e14dcfSSatish Balay   if (Jpre) {
358a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
359a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
360a7e14dcfSSatish Balay   }
361a7e14dcfSSatish Balay   if (ctx) {
362a7e14dcfSSatish Balay     tao->user_jacP = ctx;
363a7e14dcfSSatish Balay   }
364a7e14dcfSSatish Balay   if (func) {
365a7e14dcfSSatish Balay     tao->ops->computejacobian = func;
366a7e14dcfSSatish Balay   }
367a7e14dcfSSatish Balay   if (J) {
368a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
36945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr);
370a7e14dcfSSatish Balay     tao->jacobian = J;
371a7e14dcfSSatish Balay   }
372a7e14dcfSSatish Balay   if (Jpre) {
373a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
37445cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr);
375a7e14dcfSSatish Balay     tao->jacobian_pre=Jpre;
376a7e14dcfSSatish Balay   }
377a7e14dcfSSatish Balay   PetscFunctionReturn(0);
378a7e14dcfSSatish Balay }
379a7e14dcfSSatish Balay 
380a7e14dcfSSatish Balay #undef __FUNCT__
381a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine"
382a7e14dcfSSatish Balay /*@C
383a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
384a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
385a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
386a7e14dcfSSatish Balay 
387441846f8SBarry Smith    Logically collective on Tao
388a7e14dcfSSatish Balay 
389a7e14dcfSSatish Balay    Input Parameters:
390441846f8SBarry Smith +  tao - the Tao context
391a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
3926c23d075SBarry Smith .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is NULL
3936c23d075SBarry 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.
394a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
395a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
3966c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
397a7e14dcfSSatish Balay 
398a7e14dcfSSatish Balay    Calling sequence of jac:
399*ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
400a7e14dcfSSatish Balay 
401441846f8SBarry Smith +  tao - the Tao  context
402a7e14dcfSSatish Balay .  x - input vector
403a7e14dcfSSatish Balay .  J - Jacobian matrix
404a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
405a7e14dcfSSatish Balay .  Jinv - inverse of J
406a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
407a7e14dcfSSatish Balay    structure (see below)
408a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay 
411a7e14dcfSSatish Balay    Notes:
412a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
413a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
414a7e14dcfSSatish Balay    its own Jinv matrix.
415a7e14dcfSSatish Balay 
416a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
417a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
418a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
419a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
420a7e14dcfSSatish Balay    throughout the global iterations.
421a7e14dcfSSatish Balay 
422a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
423a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
424a7e14dcfSSatish Balay    available options are
425a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
426a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
427a7e14dcfSSatish Balay $      This option is intended for folks who are using
428a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
429a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
430a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
431a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
432a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
433a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
434a7e14dcfSSatish Balay $      successive linear solves.
435a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
436a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
437a7e14dcfSSatish Balay 
438a7e14dcfSSatish Balay    Caution:
439a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
440a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
441a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
442a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
443a7e14dcfSSatish Balay    feature carefully!
444a7e14dcfSSatish Balay 
445a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
446a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
447a7e14dcfSSatish Balay 
448a7e14dcfSSatish Balay    Level: intermediate
449a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS()
450a7e14dcfSSatish Balay @*/
451*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat,void*), void *ctx)
452a7e14dcfSSatish Balay {
453a7e14dcfSSatish Balay   PetscErrorCode ierr;
454a7e14dcfSSatish Balay   PetscFunctionBegin;
455441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
456a7e14dcfSSatish Balay   if (J) {
457a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
458a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
459a7e14dcfSSatish Balay   }
460a7e14dcfSSatish Balay   if (Jpre) {
461a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
462a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
463a7e14dcfSSatish Balay   }
464a7e14dcfSSatish Balay   if (Jinv) {
465a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
466a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jinv,4);
467a7e14dcfSSatish Balay   }
468a7e14dcfSSatish Balay   if (ctx) {
469a7e14dcfSSatish Balay     tao->user_jac_stateP = ctx;
470a7e14dcfSSatish Balay   }
471a7e14dcfSSatish Balay   if (func) {
472a7e14dcfSSatish Balay     tao->ops->computejacobianstate = func;
473a7e14dcfSSatish Balay   }
474a7e14dcfSSatish Balay   if (J) {
475a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
47645cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr);
477a7e14dcfSSatish Balay     tao->jacobian_state = J;
478a7e14dcfSSatish Balay   }
479a7e14dcfSSatish Balay   if (Jpre) {
480a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
48145cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr);
482a7e14dcfSSatish Balay     tao->jacobian_state_pre=Jpre;
483a7e14dcfSSatish Balay   }
484a7e14dcfSSatish Balay   if (Jinv) {
485a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr);
48645cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr);
487a7e14dcfSSatish Balay     tao->jacobian_state_inv=Jinv;
488a7e14dcfSSatish Balay   }
489a7e14dcfSSatish Balay   PetscFunctionReturn(0);
490a7e14dcfSSatish Balay }
491a7e14dcfSSatish Balay 
492a7e14dcfSSatish Balay #undef __FUNCT__
493a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine"
494a7e14dcfSSatish Balay /*@C
495a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
496a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
497a7e14dcfSSatish Balay    pde-constrained optimization.
498a7e14dcfSSatish Balay 
499441846f8SBarry Smith    Logically collective on Tao
500a7e14dcfSSatish Balay 
501a7e14dcfSSatish Balay    Input Parameters:
502441846f8SBarry Smith +  tao - the Tao context
503a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
504a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
505a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
5066c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
507a7e14dcfSSatish Balay 
508a7e14dcfSSatish Balay    Calling sequence of jac:
509441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,void *ctx);
510a7e14dcfSSatish Balay 
511441846f8SBarry Smith +  tao - the Tao  context
512a7e14dcfSSatish Balay .  x - input vector
513a7e14dcfSSatish Balay .  J - Jacobian matrix
514a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
515a7e14dcfSSatish Balay 
516a7e14dcfSSatish Balay 
517a7e14dcfSSatish Balay    Notes:
518a7e14dcfSSatish Balay 
519a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
520a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
521a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
522a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
523a7e14dcfSSatish Balay    throughout the global iterations.
524a7e14dcfSSatish Balay 
525a7e14dcfSSatish Balay    Level: intermediate
526a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS()
527a7e14dcfSSatish Balay @*/
52894ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx)
529a7e14dcfSSatish Balay {
530a7e14dcfSSatish Balay   PetscErrorCode ierr;
53145cf516eSBarry Smith 
532a7e14dcfSSatish Balay   PetscFunctionBegin;
533441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
534a7e14dcfSSatish Balay   if (J) {
535a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
536a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
537a7e14dcfSSatish Balay   }
538a7e14dcfSSatish Balay   if (ctx) {
539a7e14dcfSSatish Balay     tao->user_jac_designP = ctx;
540a7e14dcfSSatish Balay   }
541a7e14dcfSSatish Balay   if (func) {
542a7e14dcfSSatish Balay     tao->ops->computejacobiandesign = func;
543a7e14dcfSSatish Balay   }
544a7e14dcfSSatish Balay   if (J) {
545a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
54645cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr);
547a7e14dcfSSatish Balay     tao->jacobian_design = J;
548a7e14dcfSSatish Balay   }
549a7e14dcfSSatish Balay   PetscFunctionReturn(0);
550a7e14dcfSSatish Balay }
551a7e14dcfSSatish Balay 
552a7e14dcfSSatish Balay #undef __FUNCT__
553a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS"
554a7e14dcfSSatish Balay /*@
555441846f8SBarry Smith    TaoSetStateDesignIS - Indicate to the Tao which variables in the
556a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
557a7e14dcfSSatish Balay    pde-constrained optimization.
558a7e14dcfSSatish Balay 
559441846f8SBarry Smith    Logically Collective on Tao
560a7e14dcfSSatish Balay 
561a7e14dcfSSatish Balay    Input Parameters:
562441846f8SBarry Smith +  tao - The Tao context
563a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
564a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
565a7e14dcfSSatish Balay 
566a7e14dcfSSatish Balay    Level: intermediate
567a7e14dcfSSatish Balay 
568a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine()
569a7e14dcfSSatish Balay @*/
570441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is)
571a7e14dcfSSatish Balay {
572a7e14dcfSSatish Balay   PetscErrorCode ierr;
57345cf516eSBarry Smith 
57445cf516eSBarry Smith   PetscFunctionBegin;
57545cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr);
57645cf516eSBarry Smith   ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr);
577a7e14dcfSSatish Balay   tao->state_is = s_is;
57845cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr);
57945cf516eSBarry Smith   ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr);
580a7e14dcfSSatish Balay   tao->design_is = d_is;
581a7e14dcfSSatish Balay   PetscFunctionReturn(0);
582a7e14dcfSSatish Balay }
583a7e14dcfSSatish Balay 
584a7e14dcfSSatish Balay #undef __FUNCT__
585a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality"
586a7e14dcfSSatish Balay /*@C
587a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
588a7e14dcfSSatish Balay    set with TaoSetJacobianEqualityRoutine().
589a7e14dcfSSatish Balay 
590441846f8SBarry Smith    Collective on Tao
591a7e14dcfSSatish Balay 
592a7e14dcfSSatish Balay    Input Parameters:
593441846f8SBarry Smith +  solver - the Tao solver context
594a7e14dcfSSatish Balay -  xx - input vector
595a7e14dcfSSatish Balay 
596a7e14dcfSSatish Balay    Output Parameters:
597a7e14dcfSSatish Balay +  H - Jacobian matrix
598a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
599a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
600a7e14dcfSSatish Balay 
601a7e14dcfSSatish Balay    Notes:
602a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
603a7e14dcfSSatish Balay    is used internally within the minimization solvers.
604a7e14dcfSSatish Balay 
605a7e14dcfSSatish Balay    Level: developer
606a7e14dcfSSatish Balay 
607a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
608a7e14dcfSSatish Balay 
609a7e14dcfSSatish Balay @*/
610*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre)
611a7e14dcfSSatish Balay {
612a7e14dcfSSatish Balay   PetscErrorCode ierr;
61345cf516eSBarry Smith 
614a7e14dcfSSatish Balay   PetscFunctionBegin;
615441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
616a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
617a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
618a7e14dcfSSatish Balay 
61987f595a5SBarry Smith   if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
620a7e14dcfSSatish Balay   ++tao->njac_equality;
62194ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
622441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(equality) function");
623*ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr);
624a7e14dcfSSatish Balay   PetscStackPop;
62594ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
626a7e14dcfSSatish Balay   PetscFunctionReturn(0);
627a7e14dcfSSatish Balay }
628a7e14dcfSSatish Balay 
629a7e14dcfSSatish Balay #undef __FUNCT__
630a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality"
631a7e14dcfSSatish Balay /*@C
632a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
633a7e14dcfSSatish Balay    set with TaoSetJacobianInequalityRoutine().
634a7e14dcfSSatish Balay 
635441846f8SBarry Smith    Collective on Tao
636a7e14dcfSSatish Balay 
637a7e14dcfSSatish Balay    Input Parameters:
638441846f8SBarry Smith +  solver - the Tao solver context
639a7e14dcfSSatish Balay -  xx - input vector
640a7e14dcfSSatish Balay 
641a7e14dcfSSatish Balay    Output Parameters:
642a7e14dcfSSatish Balay +  H - Jacobian matrix
643a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
644a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
645a7e14dcfSSatish Balay 
646a7e14dcfSSatish Balay    Notes:
647a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
648a7e14dcfSSatish Balay    is used internally within the minimization solvers.
649a7e14dcfSSatish Balay 
650a7e14dcfSSatish Balay    Level: developer
651a7e14dcfSSatish Balay 
652a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
653a7e14dcfSSatish Balay 
654a7e14dcfSSatish Balay @*/
655*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre)
656a7e14dcfSSatish Balay {
657a7e14dcfSSatish Balay   PetscErrorCode ierr;
65887f595a5SBarry Smith 
659a7e14dcfSSatish Balay   PetscFunctionBegin;
660441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
661a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
662a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
663a7e14dcfSSatish Balay 
66487f595a5SBarry Smith   if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
665a7e14dcfSSatish Balay   ++tao->njac_inequality;
66694ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
667441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(inequality) function");
668*ffad9901SBarry Smith   ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr);
669a7e14dcfSSatish Balay   PetscStackPop;
67094ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
671a7e14dcfSSatish Balay   PetscFunctionReturn(0);
672a7e14dcfSSatish Balay }
673a7e14dcfSSatish Balay 
674a7e14dcfSSatish Balay #undef __FUNCT__
675a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine"
676a7e14dcfSSatish Balay /*@C
677a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
678a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
679a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
680a7e14dcfSSatish Balay 
681441846f8SBarry Smith    Logically collective on Tao
682a7e14dcfSSatish Balay 
683a7e14dcfSSatish Balay    Input Parameters:
684441846f8SBarry Smith +  tao - the Tao context
685a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
686a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
687a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
688a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
6896c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
690a7e14dcfSSatish Balay 
691a7e14dcfSSatish Balay    Calling sequence of jac:
692*ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
693a7e14dcfSSatish Balay 
694441846f8SBarry Smith +  tao - the Tao  context
695a7e14dcfSSatish Balay .  x - input vector
696a7e14dcfSSatish Balay .  J - Jacobian matrix
697a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
698a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
699a7e14dcfSSatish Balay    structure (see below)
700a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
701a7e14dcfSSatish Balay 
702a7e14dcfSSatish Balay    Notes:
703a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
704a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
705a7e14dcfSSatish Balay    its own Jinv matrix.
706a7e14dcfSSatish Balay 
707a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
708a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
709a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
710a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
711a7e14dcfSSatish Balay    throughout the global iterations.
712a7e14dcfSSatish Balay 
713a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
714a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
715a7e14dcfSSatish Balay    available options are
716a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
717a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
718a7e14dcfSSatish Balay $      This option is intended for folks who are using
719a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
720a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
721a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
722a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
723a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
724a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
725a7e14dcfSSatish Balay $      successive linear solves.
726a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
727a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
728a7e14dcfSSatish Balay 
729a7e14dcfSSatish Balay    Caution:
730a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
731a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
732a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
733a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
734a7e14dcfSSatish Balay    feature carefully!
735a7e14dcfSSatish Balay 
736a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
737a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
738a7e14dcfSSatish Balay 
739a7e14dcfSSatish Balay    Level: intermediate
740a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS()
741a7e14dcfSSatish Balay @*/
742*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
743a7e14dcfSSatish Balay {
744a7e14dcfSSatish Balay   PetscErrorCode ierr;
74545cf516eSBarry Smith 
746a7e14dcfSSatish Balay   PetscFunctionBegin;
747441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
748a7e14dcfSSatish Balay   if (J) {
749a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
750a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
751a7e14dcfSSatish Balay   }
752a7e14dcfSSatish Balay   if (Jpre) {
753a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
754a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
755a7e14dcfSSatish Balay   }
756a7e14dcfSSatish Balay   if (ctx) {
757a7e14dcfSSatish Balay     tao->user_jac_equalityP = ctx;
758a7e14dcfSSatish Balay   }
759a7e14dcfSSatish Balay   if (func) {
760a7e14dcfSSatish Balay     tao->ops->computejacobianequality = func;
761a7e14dcfSSatish Balay   }
762a7e14dcfSSatish Balay   if (J) {
763a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
76445cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr);
765a7e14dcfSSatish Balay     tao->jacobian_equality = J;
766a7e14dcfSSatish Balay   }
767a7e14dcfSSatish Balay   if (Jpre) {
768a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
76945cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr);
770a7e14dcfSSatish Balay     tao->jacobian_equality_pre=Jpre;
771a7e14dcfSSatish Balay   }
772a7e14dcfSSatish Balay   PetscFunctionReturn(0);
773a7e14dcfSSatish Balay }
774a7e14dcfSSatish Balay 
775a7e14dcfSSatish Balay #undef __FUNCT__
776a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine"
777a7e14dcfSSatish Balay /*@C
778a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
779a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
780a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
781a7e14dcfSSatish Balay 
782441846f8SBarry Smith    Logically collective on Tao
783a7e14dcfSSatish Balay 
784a7e14dcfSSatish Balay    Input Parameters:
785441846f8SBarry Smith +  tao - the Tao context
786a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
787a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
788a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
789a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
7906c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
791a7e14dcfSSatish Balay 
792a7e14dcfSSatish Balay    Calling sequence of jac:
793*ffad9901SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx);
794a7e14dcfSSatish Balay 
795441846f8SBarry Smith +  tao - the Tao  context
796a7e14dcfSSatish Balay .  x - input vector
797a7e14dcfSSatish Balay .  J - Jacobian matrix
798a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
799a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
800a7e14dcfSSatish Balay    structure (see below)
801a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
802a7e14dcfSSatish Balay 
803a7e14dcfSSatish Balay 
804a7e14dcfSSatish Balay    Notes:
805a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
806a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
807a7e14dcfSSatish Balay    its own Jinv matrix.
808a7e14dcfSSatish Balay 
809a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
810a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
811a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
812a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
813a7e14dcfSSatish Balay    throughout the global iterations.
814a7e14dcfSSatish Balay 
815a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
816a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
817a7e14dcfSSatish Balay    available options are
818a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
819a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
820a7e14dcfSSatish Balay $      This option is intended for folks who are using
821a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
822a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
823a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
824a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
825a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
826a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
827a7e14dcfSSatish Balay $      successive linear solves.
828a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
829a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
830a7e14dcfSSatish Balay 
831a7e14dcfSSatish Balay    Caution:
832a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
833a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
834a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
835a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
836a7e14dcfSSatish Balay    feature carefully!
837a7e14dcfSSatish Balay 
838a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
839a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
840a7e14dcfSSatish Balay 
841a7e14dcfSSatish Balay    Level: intermediate
842a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS()
843a7e14dcfSSatish Balay @*/
844*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
845a7e14dcfSSatish Balay {
846a7e14dcfSSatish Balay   PetscErrorCode ierr;
847a7e14dcfSSatish Balay   PetscFunctionBegin;
848441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
849a7e14dcfSSatish Balay   if (J) {
850a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
851a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
852a7e14dcfSSatish Balay   }
853a7e14dcfSSatish Balay   if (Jpre) {
854a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
855a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
856a7e14dcfSSatish Balay   }
857a7e14dcfSSatish Balay   if (ctx) {
858a7e14dcfSSatish Balay     tao->user_jac_inequalityP = ctx;
859a7e14dcfSSatish Balay   }
860a7e14dcfSSatish Balay   if (func) {
861a7e14dcfSSatish Balay     tao->ops->computejacobianinequality = func;
862a7e14dcfSSatish Balay   }
863a7e14dcfSSatish Balay   if (J) {
864a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
86545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr);
866a7e14dcfSSatish Balay     tao->jacobian_inequality = J;
867a7e14dcfSSatish Balay   }
868a7e14dcfSSatish Balay   if (Jpre) {
869a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
87045cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr);
871a7e14dcfSSatish Balay     tao->jacobian_inequality_pre=Jpre;
872a7e14dcfSSatish Balay   }
873a7e14dcfSSatish Balay   PetscFunctionReturn(0);
874a7e14dcfSSatish Balay }
875