xref: /petsc/src/tao/interface/taosolver_hj.c (revision 94ab13aa5a241d09deaff0170a61a1239553c040)
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*94ab13aaSBarry Smith $    hess (Tao tao,Vec x,Mat H,Mat Hpre,MatStructure *flag,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 .  flag - flag indicating information about the preconditioner matrix
26a7e14dcfSSatish Balay    structure (see below)
27a7e14dcfSSatish Balay -  ctx - [optional] user-defined Hessian context
28a7e14dcfSSatish Balay 
29a7e14dcfSSatish Balay 
30a7e14dcfSSatish Balay    Notes:
31a7e14dcfSSatish Balay 
32a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
33a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
34a7e14dcfSSatish Balay    available options are
35a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
36a7e14dcfSSatish Balay $      Hpre is identical during successive linear solves.
37a7e14dcfSSatish Balay $      This option is intended for folks who are using
38a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
39a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
40a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
41a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
42a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
43a7e14dcfSSatish Balay $      Hpre has the same nonzero structure during
44a7e14dcfSSatish Balay $      successive linear solves.
45a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
46a7e14dcfSSatish Balay $      Hpre does not have the same nonzero structure.
47a7e14dcfSSatish Balay 
48a7e14dcfSSatish Balay    Caution:
49a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
50a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
51a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
52a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
53a7e14dcfSSatish Balay    feature carefully!
54a7e14dcfSSatish Balay 
55a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
56a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
57a7e14dcfSSatish Balay 
58a7e14dcfSSatish Balay    Level: beginner
59a7e14dcfSSatish Balay 
60a7e14dcfSSatish Balay @*/
61*94ab13aaSBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat , MatStructure *, void*), void *ctx)
62a7e14dcfSSatish Balay {
63a7e14dcfSSatish Balay   PetscErrorCode ierr;
6445cf516eSBarry Smith 
65a7e14dcfSSatish Balay   PetscFunctionBegin;
66441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
67a7e14dcfSSatish Balay   if (H) {
68a7e14dcfSSatish Balay     PetscValidHeaderSpecific(H,MAT_CLASSID,2);
69a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,H,2);
70a7e14dcfSSatish Balay   }
71a7e14dcfSSatish Balay   if (Hpre) {
72a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
73a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Hpre,3);
74a7e14dcfSSatish Balay   }
75a7e14dcfSSatish Balay   if (ctx) {
76a7e14dcfSSatish Balay     tao->user_hessP = ctx;
77a7e14dcfSSatish Balay   }
78a7e14dcfSSatish Balay   if (func) {
79a7e14dcfSSatish Balay     tao->ops->computehessian = func;
80a7e14dcfSSatish Balay   }
81a7e14dcfSSatish Balay   if (H) {
82a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr);
8345cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr);
84a7e14dcfSSatish Balay     tao->hessian = H;
85a7e14dcfSSatish Balay   }
86a7e14dcfSSatish Balay   if (Hpre) {
87a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr);
8845cf516eSBarry Smith     ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr);
89a7e14dcfSSatish Balay     tao->hessian_pre = Hpre;
90a7e14dcfSSatish Balay   }
91a7e14dcfSSatish Balay   PetscFunctionReturn(0);
92a7e14dcfSSatish Balay }
93a7e14dcfSSatish Balay 
94a7e14dcfSSatish Balay #undef __FUNCT__
95a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian"
96a7e14dcfSSatish Balay /*@C
97a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
98a7e14dcfSSatish Balay    set with TaoSetHessianRoutine().
99a7e14dcfSSatish Balay 
100441846f8SBarry Smith    Collective on Tao
101a7e14dcfSSatish Balay 
102a7e14dcfSSatish Balay    Input Parameters:
103441846f8SBarry Smith +  solver - the Tao solver context
104a7e14dcfSSatish Balay -  xx - input vector
105a7e14dcfSSatish Balay 
106a7e14dcfSSatish Balay    Output Parameters:
107a7e14dcfSSatish Balay +  H - Hessian matrix
108a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
109a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
110a7e14dcfSSatish Balay 
111a7e14dcfSSatish Balay    Notes:
112a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
113a7e14dcfSSatish Balay    is used internally within the minimization solvers.
114a7e14dcfSSatish Balay 
115a7e14dcfSSatish Balay    TaoComputeHessian() is typically used within minimization
116a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
117a7e14dcfSSatish Balay    themselves.
118a7e14dcfSSatish Balay 
119a7e14dcfSSatish Balay    Level: developer
120a7e14dcfSSatish Balay 
121a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian()
122a7e14dcfSSatish Balay 
123a7e14dcfSSatish Balay @*/
124*94ab13aaSBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre, MatStructure *flg)
125a7e14dcfSSatish Balay {
126a7e14dcfSSatish Balay   PetscErrorCode ierr;
12787f595a5SBarry Smith 
128a7e14dcfSSatish Balay   PetscFunctionBegin;
129441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
130a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
131a7e14dcfSSatish Balay   PetscValidPointer(flg,5);
132a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
133a7e14dcfSSatish Balay 
13487f595a5SBarry Smith   if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first");
135a7e14dcfSSatish Balay   *flg = DIFFERENT_NONZERO_PATTERN;
136a7e14dcfSSatish Balay   ++tao->nhess;
137*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
138441846f8SBarry Smith   PetscStackPush("Tao user Hessian function");
139a7e14dcfSSatish Balay   ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,flg,tao->user_hessP);CHKERRQ(ierr);
140a7e14dcfSSatish Balay   PetscStackPop;
141*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr);
142a7e14dcfSSatish Balay   PetscFunctionReturn(0);
143a7e14dcfSSatish Balay }
144a7e14dcfSSatish Balay 
145a7e14dcfSSatish Balay #undef __FUNCT__
146a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian"
147a7e14dcfSSatish Balay /*@C
148a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
149a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
150a7e14dcfSSatish Balay 
151441846f8SBarry Smith    Collective on Tao
152a7e14dcfSSatish Balay 
153a7e14dcfSSatish Balay    Input Parameters:
154441846f8SBarry Smith +  solver - the Tao solver context
155a7e14dcfSSatish Balay -  xx - input vector
156a7e14dcfSSatish Balay 
157a7e14dcfSSatish Balay    Output Parameters:
158a7e14dcfSSatish Balay +  H - Jacobian matrix
159a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
160a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
161a7e14dcfSSatish Balay 
162a7e14dcfSSatish Balay    Notes:
163a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
164a7e14dcfSSatish Balay    is used internally within the minimization solvers.
165a7e14dcfSSatish Balay 
166a7e14dcfSSatish Balay    TaoComputeJacobian() is typically used within minimization
167a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
168a7e14dcfSSatish Balay    themselves.
169a7e14dcfSSatish Balay 
170a7e14dcfSSatish Balay    Level: developer
171a7e14dcfSSatish Balay 
172a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian()
173a7e14dcfSSatish Balay 
174a7e14dcfSSatish Balay @*/
175*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg)
176a7e14dcfSSatish Balay {
177a7e14dcfSSatish Balay   PetscErrorCode ierr;
17887f595a5SBarry Smith 
179a7e14dcfSSatish Balay   PetscFunctionBegin;
180441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
181a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
182a7e14dcfSSatish Balay   PetscValidPointer(flg,5);
183a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
184a7e14dcfSSatish Balay 
18587f595a5SBarry Smith   if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
186a7e14dcfSSatish Balay   *flg = DIFFERENT_NONZERO_PATTERN;
187a7e14dcfSSatish Balay   ++tao->njac;
188*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
189441846f8SBarry Smith   PetscStackPush("Tao user Jacobian function");
190a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,flg,tao->user_jacP);CHKERRQ(ierr);
191a7e14dcfSSatish Balay   PetscStackPop;
192*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
193a7e14dcfSSatish Balay   PetscFunctionReturn(0);
194a7e14dcfSSatish Balay }
195a7e14dcfSSatish Balay 
196a7e14dcfSSatish Balay #undef __FUNCT__
197a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState"
198a7e14dcfSSatish Balay /*@C
199a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
200a7e14dcfSSatish Balay    set with TaoSetJacobianStateRoutine().
201a7e14dcfSSatish Balay 
202441846f8SBarry Smith    Collective on Tao
203a7e14dcfSSatish Balay 
204a7e14dcfSSatish Balay    Input Parameters:
205441846f8SBarry Smith +  solver - the Tao solver context
206a7e14dcfSSatish Balay -  xx - input vector
207a7e14dcfSSatish Balay 
208a7e14dcfSSatish Balay    Output Parameters:
209a7e14dcfSSatish Balay +  H - Jacobian matrix
210a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
211a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
212a7e14dcfSSatish Balay 
213a7e14dcfSSatish Balay    Notes:
214a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
215a7e14dcfSSatish Balay    is used internally within the minimization solvers.
216a7e14dcfSSatish Balay 
217a7e14dcfSSatish Balay    TaoComputeJacobianState() is typically used within minimization
218a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
219a7e14dcfSSatish Balay    themselves.
220a7e14dcfSSatish Balay 
221a7e14dcfSSatish Balay    Level: developer
222a7e14dcfSSatish Balay 
223a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
224a7e14dcfSSatish Balay 
225a7e14dcfSSatish Balay @*/
226*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv, MatStructure *flg)
227a7e14dcfSSatish Balay {
228a7e14dcfSSatish Balay   PetscErrorCode ierr;
22945cf516eSBarry Smith 
230a7e14dcfSSatish Balay   PetscFunctionBegin;
231441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
232a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
233a7e14dcfSSatish Balay   PetscValidPointer(flg,5);
234a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
235a7e14dcfSSatish Balay 
23687f595a5SBarry Smith   if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
237a7e14dcfSSatish Balay   *flg = DIFFERENT_NONZERO_PATTERN;
238a7e14dcfSSatish Balay   ++tao->njac_state;
239*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
240441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(state) function");
241a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,flg,tao->user_jac_stateP);CHKERRQ(ierr);
242a7e14dcfSSatish Balay   PetscStackPop;
243*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
244a7e14dcfSSatish Balay   PetscFunctionReturn(0);
245a7e14dcfSSatish Balay }
246a7e14dcfSSatish Balay 
247a7e14dcfSSatish Balay #undef __FUNCT__
248a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign"
249a7e14dcfSSatish Balay /*@C
250a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
251a7e14dcfSSatish Balay    set with TaoSetJacobianDesignRoutine().
252a7e14dcfSSatish Balay 
253441846f8SBarry Smith    Collective on Tao
254a7e14dcfSSatish Balay 
255a7e14dcfSSatish Balay    Input Parameters:
256441846f8SBarry Smith +  solver - the Tao solver context
257a7e14dcfSSatish Balay -  xx - input vector
258a7e14dcfSSatish Balay 
259a7e14dcfSSatish Balay    Output Parameters:
260a7e14dcfSSatish Balay .  H - Jacobian matrix
261a7e14dcfSSatish Balay 
262a7e14dcfSSatish Balay    Notes:
263a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
264a7e14dcfSSatish Balay    is used internally within the minimization solvers.
265a7e14dcfSSatish Balay 
266a7e14dcfSSatish Balay    TaoComputeJacobianDesign() is typically used within minimization
267a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
268a7e14dcfSSatish Balay    themselves.
269a7e14dcfSSatish Balay 
270a7e14dcfSSatish Balay    Level: developer
271a7e14dcfSSatish Balay 
272a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
273a7e14dcfSSatish Balay 
274a7e14dcfSSatish Balay @*/
275*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J)
276a7e14dcfSSatish Balay {
277a7e14dcfSSatish Balay   PetscErrorCode ierr;
27887f595a5SBarry Smith 
279a7e14dcfSSatish Balay   PetscFunctionBegin;
280441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
281a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
282a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
283a7e14dcfSSatish Balay 
28487f595a5SBarry Smith   if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
285a7e14dcfSSatish Balay   ++tao->njac_design;
286*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
287441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(design) function");
288a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr);
289a7e14dcfSSatish Balay   PetscStackPop;
290*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr);
291a7e14dcfSSatish Balay   PetscFunctionReturn(0);
292a7e14dcfSSatish Balay }
293a7e14dcfSSatish Balay 
294a7e14dcfSSatish Balay #undef __FUNCT__
295a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine"
296a7e14dcfSSatish Balay /*@C
297a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
298a7e14dcfSSatish Balay 
299441846f8SBarry Smith    Logically collective on Tao
300a7e14dcfSSatish Balay 
301a7e14dcfSSatish Balay    Input Parameters:
302441846f8SBarry Smith +  tao - the Tao context
303a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
304a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
305a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
306a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
3076c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
308a7e14dcfSSatish Balay 
309a7e14dcfSSatish Balay    Calling sequence of jac:
310441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
311a7e14dcfSSatish Balay 
312441846f8SBarry Smith +  tao - the Tao  context
313a7e14dcfSSatish Balay .  x - input vector
314a7e14dcfSSatish Balay .  J - Jacobian matrix
315a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
316a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
317a7e14dcfSSatish Balay    structure (see below)
318a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
319a7e14dcfSSatish Balay 
320a7e14dcfSSatish Balay    Notes:
321a7e14dcfSSatish Balay 
322a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
323a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
324a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
325a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
326a7e14dcfSSatish Balay    throughout the global iterations.
327a7e14dcfSSatish Balay 
328a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
329a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
330a7e14dcfSSatish Balay    available options are
331a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
332a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
333a7e14dcfSSatish Balay $      This option is intended for folks who are using
334a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
335a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
336a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
337a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
338a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
339a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
340a7e14dcfSSatish Balay $      successive linear solves.
341a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
342a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
343a7e14dcfSSatish Balay 
344a7e14dcfSSatish Balay    Caution:
345a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
346a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
347a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
348a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
349a7e14dcfSSatish Balay    feature carefully!
350a7e14dcfSSatish Balay 
351a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
352a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
353a7e14dcfSSatish Balay 
354a7e14dcfSSatish Balay    Level: intermediate
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay @*/
357*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx)
358a7e14dcfSSatish Balay {
359a7e14dcfSSatish Balay   PetscErrorCode ierr;
360a7e14dcfSSatish Balay   PetscFunctionBegin;
361441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
362a7e14dcfSSatish Balay   if (J) {
363a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
364a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
365a7e14dcfSSatish Balay   }
366a7e14dcfSSatish Balay   if (Jpre) {
367a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
368a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
369a7e14dcfSSatish Balay   }
370a7e14dcfSSatish Balay   if (ctx) {
371a7e14dcfSSatish Balay     tao->user_jacP = ctx;
372a7e14dcfSSatish Balay   }
373a7e14dcfSSatish Balay   if (func) {
374a7e14dcfSSatish Balay     tao->ops->computejacobian = func;
375a7e14dcfSSatish Balay   }
376a7e14dcfSSatish Balay   if (J) {
377a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
37845cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr);
379a7e14dcfSSatish Balay     tao->jacobian = J;
380a7e14dcfSSatish Balay   }
381a7e14dcfSSatish Balay   if (Jpre) {
382a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
38345cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr);
384a7e14dcfSSatish Balay     tao->jacobian_pre=Jpre;
385a7e14dcfSSatish Balay   }
386a7e14dcfSSatish Balay   PetscFunctionReturn(0);
387a7e14dcfSSatish Balay }
388a7e14dcfSSatish Balay 
389a7e14dcfSSatish Balay #undef __FUNCT__
390a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine"
391a7e14dcfSSatish Balay /*@C
392a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
393a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
394a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
395a7e14dcfSSatish Balay 
396441846f8SBarry Smith    Logically collective on Tao
397a7e14dcfSSatish Balay 
398a7e14dcfSSatish Balay    Input Parameters:
399441846f8SBarry Smith +  tao - the Tao context
400a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
4016c23d075SBarry Smith .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is NULL
4026c23d075SBarry 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.
403a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
404a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
4056c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
406a7e14dcfSSatish Balay 
407a7e14dcfSSatish Balay    Calling sequence of jac:
408441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
409a7e14dcfSSatish Balay 
410441846f8SBarry Smith +  tao - the Tao  context
411a7e14dcfSSatish Balay .  x - input vector
412a7e14dcfSSatish Balay .  J - Jacobian matrix
413a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
414a7e14dcfSSatish Balay .  Jinv - inverse of J
415a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
416a7e14dcfSSatish Balay    structure (see below)
417a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
418a7e14dcfSSatish Balay 
419a7e14dcfSSatish Balay 
420a7e14dcfSSatish Balay    Notes:
421a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
422a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
423a7e14dcfSSatish Balay    its own Jinv matrix.
424a7e14dcfSSatish Balay 
425a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
426a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
427a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
428a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
429a7e14dcfSSatish Balay    throughout the global iterations.
430a7e14dcfSSatish Balay 
431a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
432a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
433a7e14dcfSSatish Balay    available options are
434a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
435a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
436a7e14dcfSSatish Balay $      This option is intended for folks who are using
437a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
438a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
439a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
440a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
441a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
442a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
443a7e14dcfSSatish Balay $      successive linear solves.
444a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
445a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
446a7e14dcfSSatish Balay 
447a7e14dcfSSatish Balay    Caution:
448a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
449a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
450a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
451a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
452a7e14dcfSSatish Balay    feature carefully!
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
455a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
456a7e14dcfSSatish Balay 
457a7e14dcfSSatish Balay    Level: intermediate
458a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS()
459a7e14dcfSSatish Balay @*/
460*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, MatStructure *, void*), void *ctx)
461a7e14dcfSSatish Balay {
462a7e14dcfSSatish Balay   PetscErrorCode ierr;
463a7e14dcfSSatish Balay   PetscFunctionBegin;
464441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
465a7e14dcfSSatish Balay   if (J) {
466a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
467a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
468a7e14dcfSSatish Balay   }
469a7e14dcfSSatish Balay   if (Jpre) {
470a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
471a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
472a7e14dcfSSatish Balay   }
473a7e14dcfSSatish Balay   if (Jinv) {
474a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
475a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jinv,4);
476a7e14dcfSSatish Balay   }
477a7e14dcfSSatish Balay   if (ctx) {
478a7e14dcfSSatish Balay     tao->user_jac_stateP = ctx;
479a7e14dcfSSatish Balay   }
480a7e14dcfSSatish Balay   if (func) {
481a7e14dcfSSatish Balay     tao->ops->computejacobianstate = func;
482a7e14dcfSSatish Balay   }
483a7e14dcfSSatish Balay   if (J) {
484a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
48545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr);
486a7e14dcfSSatish Balay     tao->jacobian_state = J;
487a7e14dcfSSatish Balay   }
488a7e14dcfSSatish Balay   if (Jpre) {
489a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
49045cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr);
491a7e14dcfSSatish Balay     tao->jacobian_state_pre=Jpre;
492a7e14dcfSSatish Balay   }
493a7e14dcfSSatish Balay   if (Jinv) {
494a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr);
49545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr);
496a7e14dcfSSatish Balay     tao->jacobian_state_inv=Jinv;
497a7e14dcfSSatish Balay   }
498a7e14dcfSSatish Balay   PetscFunctionReturn(0);
499a7e14dcfSSatish Balay }
500a7e14dcfSSatish Balay 
501a7e14dcfSSatish Balay #undef __FUNCT__
502a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine"
503a7e14dcfSSatish Balay /*@C
504a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
505a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
506a7e14dcfSSatish Balay    pde-constrained optimization.
507a7e14dcfSSatish Balay 
508441846f8SBarry Smith    Logically collective on Tao
509a7e14dcfSSatish Balay 
510a7e14dcfSSatish Balay    Input Parameters:
511441846f8SBarry Smith +  tao - the Tao context
512a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
513a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
514a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
5156c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
516a7e14dcfSSatish Balay 
517a7e14dcfSSatish Balay    Calling sequence of jac:
518441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,void *ctx);
519a7e14dcfSSatish Balay 
520441846f8SBarry Smith +  tao - the Tao  context
521a7e14dcfSSatish Balay .  x - input vector
522a7e14dcfSSatish Balay .  J - Jacobian matrix
523a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
524a7e14dcfSSatish Balay 
525a7e14dcfSSatish Balay 
526a7e14dcfSSatish Balay    Notes:
527a7e14dcfSSatish Balay 
528a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
529a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
530a7e14dcfSSatish Balay    completely new new matrix structure (not just different matrix elements)
531a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
532a7e14dcfSSatish Balay    throughout the global iterations.
533a7e14dcfSSatish Balay 
534a7e14dcfSSatish Balay    Level: intermediate
535a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS()
536a7e14dcfSSatish Balay @*/
537*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx)
538a7e14dcfSSatish Balay {
539a7e14dcfSSatish Balay   PetscErrorCode ierr;
54045cf516eSBarry Smith 
541a7e14dcfSSatish Balay   PetscFunctionBegin;
542441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
543a7e14dcfSSatish Balay   if (J) {
544a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
545a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
546a7e14dcfSSatish Balay   }
547a7e14dcfSSatish Balay   if (ctx) {
548a7e14dcfSSatish Balay     tao->user_jac_designP = ctx;
549a7e14dcfSSatish Balay   }
550a7e14dcfSSatish Balay   if (func) {
551a7e14dcfSSatish Balay     tao->ops->computejacobiandesign = func;
552a7e14dcfSSatish Balay   }
553a7e14dcfSSatish Balay   if (J) {
554a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
55545cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr);
556a7e14dcfSSatish Balay     tao->jacobian_design = J;
557a7e14dcfSSatish Balay   }
558a7e14dcfSSatish Balay   PetscFunctionReturn(0);
559a7e14dcfSSatish Balay }
560a7e14dcfSSatish Balay 
561a7e14dcfSSatish Balay #undef __FUNCT__
562a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS"
563a7e14dcfSSatish Balay /*@
564441846f8SBarry Smith    TaoSetStateDesignIS - Indicate to the Tao which variables in the
565a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
566a7e14dcfSSatish Balay    pde-constrained optimization.
567a7e14dcfSSatish Balay 
568441846f8SBarry Smith    Logically Collective on Tao
569a7e14dcfSSatish Balay 
570a7e14dcfSSatish Balay    Input Parameters:
571441846f8SBarry Smith +  tao - The Tao context
572a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
573a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
574a7e14dcfSSatish Balay 
575a7e14dcfSSatish Balay    Level: intermediate
576a7e14dcfSSatish Balay 
577a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine()
578a7e14dcfSSatish Balay @*/
579441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is)
580a7e14dcfSSatish Balay {
581a7e14dcfSSatish Balay   PetscErrorCode ierr;
58245cf516eSBarry Smith 
58345cf516eSBarry Smith   PetscFunctionBegin;
58445cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr);
58545cf516eSBarry Smith   ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr);
586a7e14dcfSSatish Balay   tao->state_is = s_is;
58745cf516eSBarry Smith   ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr);
58845cf516eSBarry Smith   ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr);
589a7e14dcfSSatish Balay   tao->design_is = d_is;
590a7e14dcfSSatish Balay   PetscFunctionReturn(0);
591a7e14dcfSSatish Balay }
592a7e14dcfSSatish Balay 
593a7e14dcfSSatish Balay #undef __FUNCT__
594a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality"
595a7e14dcfSSatish Balay /*@C
596a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
597a7e14dcfSSatish Balay    set with TaoSetJacobianEqualityRoutine().
598a7e14dcfSSatish Balay 
599441846f8SBarry Smith    Collective on Tao
600a7e14dcfSSatish Balay 
601a7e14dcfSSatish Balay    Input Parameters:
602441846f8SBarry Smith +  solver - the Tao solver context
603a7e14dcfSSatish Balay -  xx - input vector
604a7e14dcfSSatish Balay 
605a7e14dcfSSatish Balay    Output Parameters:
606a7e14dcfSSatish Balay +  H - Jacobian matrix
607a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
608a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
609a7e14dcfSSatish Balay 
610a7e14dcfSSatish Balay    Notes:
611a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
612a7e14dcfSSatish Balay    is used internally within the minimization solvers.
613a7e14dcfSSatish Balay 
614a7e14dcfSSatish Balay    Level: developer
615a7e14dcfSSatish Balay 
616a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
617a7e14dcfSSatish Balay 
618a7e14dcfSSatish Balay @*/
619*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg)
620a7e14dcfSSatish Balay {
621a7e14dcfSSatish Balay   PetscErrorCode ierr;
62245cf516eSBarry Smith 
623a7e14dcfSSatish Balay   PetscFunctionBegin;
624441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
625a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
626a7e14dcfSSatish Balay   PetscValidPointer(flg,5);
627a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
628a7e14dcfSSatish Balay 
62987f595a5SBarry Smith   if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
630a7e14dcfSSatish Balay   *flg = DIFFERENT_NONZERO_PATTERN;
631a7e14dcfSSatish Balay   ++tao->njac_equality;
632*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
633441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(equality) function");
634a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,flg,tao->user_jac_equalityP);CHKERRQ(ierr);
635a7e14dcfSSatish Balay   PetscStackPop;
636*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
637a7e14dcfSSatish Balay   PetscFunctionReturn(0);
638a7e14dcfSSatish Balay }
639a7e14dcfSSatish Balay 
640a7e14dcfSSatish Balay #undef __FUNCT__
641a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality"
642a7e14dcfSSatish Balay /*@C
643a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
644a7e14dcfSSatish Balay    set with TaoSetJacobianInequalityRoutine().
645a7e14dcfSSatish Balay 
646441846f8SBarry Smith    Collective on Tao
647a7e14dcfSSatish Balay 
648a7e14dcfSSatish Balay    Input Parameters:
649441846f8SBarry Smith +  solver - the Tao solver context
650a7e14dcfSSatish Balay -  xx - input vector
651a7e14dcfSSatish Balay 
652a7e14dcfSSatish Balay    Output Parameters:
653a7e14dcfSSatish Balay +  H - Jacobian matrix
654a7e14dcfSSatish Balay .  Hpre - Preconditioning matrix
655a7e14dcfSSatish Balay -  flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER)
656a7e14dcfSSatish Balay 
657a7e14dcfSSatish Balay    Notes:
658a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
659a7e14dcfSSatish Balay    is used internally within the minimization solvers.
660a7e14dcfSSatish Balay 
661a7e14dcfSSatish Balay    Level: developer
662a7e14dcfSSatish Balay 
663a7e14dcfSSatish Balay .seealso:  TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS()
664a7e14dcfSSatish Balay 
665a7e14dcfSSatish Balay @*/
666*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg)
667a7e14dcfSSatish Balay {
668a7e14dcfSSatish Balay   PetscErrorCode ierr;
66987f595a5SBarry Smith 
670a7e14dcfSSatish Balay   PetscFunctionBegin;
671441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
672a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
673a7e14dcfSSatish Balay   PetscValidPointer(flg,5);
674a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
675a7e14dcfSSatish Balay 
67687f595a5SBarry Smith   if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
677a7e14dcfSSatish Balay   *flg = DIFFERENT_NONZERO_PATTERN;
678a7e14dcfSSatish Balay   ++tao->njac_inequality;
679*94ab13aaSBarry Smith   ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
680441846f8SBarry Smith   PetscStackPush("Tao user Jacobian(inequality) function");
681a7e14dcfSSatish Balay   ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,flg,tao->user_jac_inequalityP);CHKERRQ(ierr);
682a7e14dcfSSatish Balay   PetscStackPop;
683*94ab13aaSBarry Smith   ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr);
684a7e14dcfSSatish Balay   PetscFunctionReturn(0);
685a7e14dcfSSatish Balay }
686a7e14dcfSSatish Balay 
687a7e14dcfSSatish Balay #undef __FUNCT__
688a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine"
689a7e14dcfSSatish Balay /*@C
690a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
691a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
692a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
693a7e14dcfSSatish Balay 
694441846f8SBarry Smith    Logically collective on Tao
695a7e14dcfSSatish Balay 
696a7e14dcfSSatish Balay    Input Parameters:
697441846f8SBarry Smith +  tao - the Tao context
698a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
699a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
700a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
701a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
7026c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
703a7e14dcfSSatish Balay 
704a7e14dcfSSatish Balay    Calling sequence of jac:
705441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
706a7e14dcfSSatish Balay 
707441846f8SBarry Smith +  tao - the Tao  context
708a7e14dcfSSatish Balay .  x - input vector
709a7e14dcfSSatish Balay .  J - Jacobian matrix
710a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
711a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
712a7e14dcfSSatish Balay    structure (see below)
713a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
714a7e14dcfSSatish Balay 
715a7e14dcfSSatish Balay    Notes:
716a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
717a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
718a7e14dcfSSatish Balay    its own Jinv matrix.
719a7e14dcfSSatish Balay 
720a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
721a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
722a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
723a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
724a7e14dcfSSatish Balay    throughout the global iterations.
725a7e14dcfSSatish Balay 
726a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
727a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
728a7e14dcfSSatish Balay    available options are
729a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
730a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
731a7e14dcfSSatish Balay $      This option is intended for folks who are using
732a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
733a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
734a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
735a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
736a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
737a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
738a7e14dcfSSatish Balay $      successive linear solves.
739a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
740a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
741a7e14dcfSSatish Balay 
742a7e14dcfSSatish Balay    Caution:
743a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
744a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
745a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
746a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
747a7e14dcfSSatish Balay    feature carefully!
748a7e14dcfSSatish Balay 
749a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
750a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
751a7e14dcfSSatish Balay 
752a7e14dcfSSatish Balay    Level: intermediate
753a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS()
754a7e14dcfSSatish Balay @*/
755*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx)
756a7e14dcfSSatish Balay {
757a7e14dcfSSatish Balay   PetscErrorCode ierr;
75845cf516eSBarry Smith 
759a7e14dcfSSatish Balay   PetscFunctionBegin;
760441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
761a7e14dcfSSatish Balay   if (J) {
762a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
763a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
764a7e14dcfSSatish Balay   }
765a7e14dcfSSatish Balay   if (Jpre) {
766a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
767a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
768a7e14dcfSSatish Balay   }
769a7e14dcfSSatish Balay   if (ctx) {
770a7e14dcfSSatish Balay     tao->user_jac_equalityP = ctx;
771a7e14dcfSSatish Balay   }
772a7e14dcfSSatish Balay   if (func) {
773a7e14dcfSSatish Balay     tao->ops->computejacobianequality = func;
774a7e14dcfSSatish Balay   }
775a7e14dcfSSatish Balay   if (J) {
776a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
77745cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr);
778a7e14dcfSSatish Balay     tao->jacobian_equality = J;
779a7e14dcfSSatish Balay   }
780a7e14dcfSSatish Balay   if (Jpre) {
781a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
78245cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr);
783a7e14dcfSSatish Balay     tao->jacobian_equality_pre=Jpre;
784a7e14dcfSSatish Balay   }
785a7e14dcfSSatish Balay   PetscFunctionReturn(0);
786a7e14dcfSSatish Balay }
787a7e14dcfSSatish Balay 
788a7e14dcfSSatish Balay #undef __FUNCT__
789a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine"
790a7e14dcfSSatish Balay /*@C
791a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
792a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
793a7e14dcfSSatish Balay    Used only for pde-constrained optimization.
794a7e14dcfSSatish Balay 
795441846f8SBarry Smith    Logically collective on Tao
796a7e14dcfSSatish Balay 
797a7e14dcfSSatish Balay    Input Parameters:
798441846f8SBarry Smith +  tao - the Tao context
799a7e14dcfSSatish Balay .  J - Matrix used for the jacobian
800a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
801a7e14dcfSSatish Balay .  jac - Jacobian evaluation routine
802a7e14dcfSSatish Balay -  ctx - [optional] user-defined context for private data for the
8036c23d075SBarry Smith          Jacobian evaluation routine (may be NULL)
804a7e14dcfSSatish Balay 
805a7e14dcfSSatish Balay    Calling sequence of jac:
806441846f8SBarry Smith $    jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx);
807a7e14dcfSSatish Balay 
808441846f8SBarry Smith +  tao - the Tao  context
809a7e14dcfSSatish Balay .  x - input vector
810a7e14dcfSSatish Balay .  J - Jacobian matrix
811a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
812a7e14dcfSSatish Balay .  flag - flag indicating information about the preconditioner matrix
813a7e14dcfSSatish Balay    structure (see below)
814a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
815a7e14dcfSSatish Balay 
816a7e14dcfSSatish Balay 
817a7e14dcfSSatish Balay    Notes:
818a7e14dcfSSatish Balay    Because of the structure of the jacobian matrix,
819a7e14dcfSSatish Balay    It may be more efficient for a pde-constrained application to provide
820a7e14dcfSSatish Balay    its own Jinv matrix.
821a7e14dcfSSatish Balay 
822a7e14dcfSSatish Balay    The function jac() takes Mat * as the matrix arguments rather than Mat.
823a7e14dcfSSatish Balay    This allows the Jacobian evaluation routine to replace A and/or B with a
824a7e14dcfSSatish Balay    completely new new maitrix structure (not just different matrix elements)
825a7e14dcfSSatish Balay    when appropriate, for instance, if the nonzero structure is changing
826a7e14dcfSSatish Balay    throughout the global iterations.
827a7e14dcfSSatish Balay 
828a7e14dcfSSatish Balay    The flag can be used to eliminate unnecessary work in the preconditioner
829a7e14dcfSSatish Balay    during the repeated solution of linear systems of the same size.  The
830a7e14dcfSSatish Balay    available options are
831a7e14dcfSSatish Balay $    SAME_PRECONDITIONER -
832a7e14dcfSSatish Balay $      Jpre is identical during successive linear solves.
833a7e14dcfSSatish Balay $      This option is intended for folks who are using
834a7e14dcfSSatish Balay $      different Amat and Pmat matrices and want to reuse the
835a7e14dcfSSatish Balay $      same preconditioner matrix.  For example, this option
836a7e14dcfSSatish Balay $      saves work by not recomputing incomplete factorization
837a7e14dcfSSatish Balay $      for ILU/ICC preconditioners.
838a7e14dcfSSatish Balay $    SAME_NONZERO_PATTERN -
839a7e14dcfSSatish Balay $      Jpre has the same nonzero structure during
840a7e14dcfSSatish Balay $      successive linear solves.
841a7e14dcfSSatish Balay $    DIFFERENT_NONZERO_PATTERN -
842a7e14dcfSSatish Balay $      Jpre does not have the same nonzero structure.
843a7e14dcfSSatish Balay 
844a7e14dcfSSatish Balay    Caution:
845a7e14dcfSSatish Balay    If you specify SAME_NONZERO_PATTERN, the software believes your assertion
846a7e14dcfSSatish Balay    and does not check the structure of the matrix.  If you erroneously
847a7e14dcfSSatish Balay    claim that the structure is the same when it actually is not, the new
848a7e14dcfSSatish Balay    preconditioner will not function correctly.  Thus, use this optimization
849a7e14dcfSSatish Balay    feature carefully!
850a7e14dcfSSatish Balay 
851a7e14dcfSSatish Balay    If in doubt about whether your preconditioner matrix has changed
852a7e14dcfSSatish Balay    structure or not, use the flag DIFFERENT_NONZERO_PATTERN.
853a7e14dcfSSatish Balay 
854a7e14dcfSSatish Balay    Level: intermediate
855a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS()
856a7e14dcfSSatish Balay @*/
857*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx)
858a7e14dcfSSatish Balay {
859a7e14dcfSSatish Balay   PetscErrorCode ierr;
860a7e14dcfSSatish Balay   PetscFunctionBegin;
861441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
862a7e14dcfSSatish Balay   if (J) {
863a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
864a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
865a7e14dcfSSatish Balay   }
866a7e14dcfSSatish Balay   if (Jpre) {
867a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
868a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
869a7e14dcfSSatish Balay   }
870a7e14dcfSSatish Balay   if (ctx) {
871a7e14dcfSSatish Balay     tao->user_jac_inequalityP = ctx;
872a7e14dcfSSatish Balay   }
873a7e14dcfSSatish Balay   if (func) {
874a7e14dcfSSatish Balay     tao->ops->computejacobianinequality = func;
875a7e14dcfSSatish Balay   }
876a7e14dcfSSatish Balay   if (J) {
877a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr);
87845cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr);
879a7e14dcfSSatish Balay     tao->jacobian_inequality = J;
880a7e14dcfSSatish Balay   }
881a7e14dcfSSatish Balay   if (Jpre) {
882a7e14dcfSSatish Balay     ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr);
88345cf516eSBarry Smith     ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr);
884a7e14dcfSSatish Balay     tao->jacobian_inequality_pre=Jpre;
885a7e14dcfSSatish Balay   }
886a7e14dcfSSatish Balay   PetscFunctionReturn(0);
887a7e14dcfSSatish Balay }
888