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