xref: /petsc/src/tao/interface/taosolver_hj.c (revision 792fecdfe9134cce4d631112660ddd34f063bc17)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@C
4a82e8c82SStefano Zampini    TaoSetHessian - Sets the function to compute the Hessian as well as the location to store the matrix.
5a7e14dcfSSatish Balay 
665ba42b6SBarry Smith    Logically collective on tao
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay    Input Parameters:
9441846f8SBarry Smith +  tao  - the Tao context
10a7e14dcfSSatish Balay .  H    - Matrix used for the hessian
11a7e14dcfSSatish Balay .  Hpre - Matrix that will be used operated on by preconditioner, can be same as H
12f4c1ad5cSStefano Zampini .  func - Hessian evaluation routine
13a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
146c23d075SBarry Smith          Hessian evaluation routine (may be NULL)
15a7e14dcfSSatish Balay 
16f4c1ad5cSStefano Zampini    Calling sequence of func:
17f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat H,Mat Hpre,void *ctx);
18a7e14dcfSSatish Balay 
19441846f8SBarry Smith +  tao  - the Tao  context
20a7e14dcfSSatish Balay .  x    - input vector
21a7e14dcfSSatish Balay .  H    - Hessian matrix
22a7e14dcfSSatish Balay .  Hpre - preconditioner matrix, usually the same as H
23a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Hessian context
24a7e14dcfSSatish Balay 
25a7e14dcfSSatish Balay    Level: beginner
26a82e8c82SStefano Zampini 
2765ba42b6SBarry Smith .seealso: `Tao`, `TaoTypes`, `TaoSetObjective()`, `TaoSetGradient()`, `TaoSetObjectiveAndGradient()`, `TaoGetHessian()`
28a7e14dcfSSatish Balay @*/
29a82e8c82SStefano Zampini PetscErrorCode TaoSetHessian(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
30a7e14dcfSSatish Balay {
31a7e14dcfSSatish Balay   PetscFunctionBegin;
32441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
33a7e14dcfSSatish Balay   if (H) {
34a7e14dcfSSatish Balay     PetscValidHeaderSpecific(H,MAT_CLASSID,2);
35a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,H,2);
36a7e14dcfSSatish Balay   }
37a7e14dcfSSatish Balay   if (Hpre) {
38a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3);
39a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Hpre,3);
40a7e14dcfSSatish Balay   }
41a82e8c82SStefano Zampini   if (ctx) tao->user_hessP = ctx;
42a82e8c82SStefano Zampini   if (func) tao->ops->computehessian = func;
43a7e14dcfSSatish Balay   if (H) {
449566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)H));
459566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->hessian));
46a7e14dcfSSatish Balay     tao->hessian = H;
47a7e14dcfSSatish Balay   }
48a7e14dcfSSatish Balay   if (Hpre) {
499566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Hpre));
509566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->hessian_pre));
51a7e14dcfSSatish Balay     tao->hessian_pre = Hpre;
52a7e14dcfSSatish Balay   }
53a7e14dcfSSatish Balay   PetscFunctionReturn(0);
54a7e14dcfSSatish Balay }
55a7e14dcfSSatish Balay 
56a82e8c82SStefano Zampini /*@C
57a82e8c82SStefano Zampini    TaoGetHessian - Gets the function to compute the Hessian as well as the location to store the matrix.
58a82e8c82SStefano Zampini 
59a82e8c82SStefano Zampini    Not collective
60a82e8c82SStefano Zampini 
61a82e8c82SStefano Zampini    Input Parameter:
62a82e8c82SStefano Zampini .  tao  - the Tao context
63a82e8c82SStefano Zampini 
64a82e8c82SStefano Zampini    OutputParameters:
65a82e8c82SStefano Zampini +  H    - Matrix used for the hessian
66a82e8c82SStefano Zampini .  Hpre - Matrix that will be used operated on by preconditioner, can be the same as H
67a82e8c82SStefano Zampini .  func - Hessian evaluation routine
68a82e8c82SStefano Zampini -  ctx  - user-defined context for private data for the Hessian evaluation routine
69a82e8c82SStefano Zampini 
70a82e8c82SStefano Zampini    Calling sequence of func:
71a82e8c82SStefano Zampini $    func(Tao tao,Vec x,Mat H,Mat Hpre,void *ctx);
72a82e8c82SStefano Zampini 
73a82e8c82SStefano Zampini +  tao  - the Tao  context
74a82e8c82SStefano Zampini .  x    - input vector
75a82e8c82SStefano Zampini .  H    - Hessian matrix
76a82e8c82SStefano Zampini .  Hpre - preconditioner matrix, usually the same as H
77a82e8c82SStefano Zampini -  ctx  - [optional] user-defined Hessian context
78a82e8c82SStefano Zampini 
79a82e8c82SStefano Zampini    Level: beginner
80a82e8c82SStefano Zampini 
8165ba42b6SBarry Smith .seealso: `Tao`, TaoType`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetObjectiveAndGradient()`, `TaoSetHessian()`
82a82e8c82SStefano Zampini @*/
83a82e8c82SStefano Zampini PetscErrorCode TaoGetHessian(Tao tao, Mat *H, Mat *Hpre, PetscErrorCode (**func)(Tao, Vec, Mat, Mat, void*), void **ctx)
84a82e8c82SStefano Zampini {
85a82e8c82SStefano Zampini   PetscFunctionBegin;
86a82e8c82SStefano Zampini   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
87a82e8c82SStefano Zampini   if (H) *H = tao->hessian;
88a82e8c82SStefano Zampini   if (Hpre) *Hpre = tao->hessian_pre;
89a82e8c82SStefano Zampini   if (ctx) *ctx = tao->user_hessP;
90a82e8c82SStefano Zampini   if (func) *func = tao->ops->computehessian;
91a82e8c82SStefano Zampini   PetscFunctionReturn(0);
92a82e8c82SStefano Zampini }
93a82e8c82SStefano Zampini 
9409baa881SHong Zhang PetscErrorCode TaoTestHessian(Tao tao)
9509baa881SHong Zhang {
9609baa881SHong Zhang   Mat               A,B,C,D,hessian;
9709baa881SHong Zhang   Vec               x = tao->solution;
9809baa881SHong Zhang   PetscReal         nrm,gnorm;
9909baa881SHong Zhang   PetscReal         threshold = 1.e-5;
10009baa881SHong Zhang   PetscInt          m,n,M,N;
10109baa881SHong Zhang   PetscBool         complete_print = PETSC_FALSE,test = PETSC_FALSE,flg;
102f49d1c87SHong Zhang   PetscViewer       viewer,mviewer;
10309baa881SHong Zhang   MPI_Comm          comm;
10409baa881SHong Zhang   PetscInt          tabs;
10509baa881SHong Zhang   static PetscBool  directionsprinted = PETSC_FALSE;
106f49d1c87SHong Zhang   PetscViewerFormat format;
10709baa881SHong Zhang 
10809baa881SHong Zhang   PetscFunctionBegin;
109d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tao);
1109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsName("-tao_test_hessian","Compare hand-coded and finite difference Hessians","None",&test));
1119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_test_hessian", "Threshold for element difference between hand-coded and finite difference being meaningful","None",threshold,&threshold,NULL));
1129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsViewer("-tao_test_hessian_view","View difference between hand-coded and finite difference Hessians element entries","None",&mviewer,&format,&complete_print));
113d0609cedSBarry Smith   PetscOptionsEnd();
11409baa881SHong Zhang   if (!test) PetscFunctionReturn(0);
11509baa881SHong Zhang 
1169566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)tao,&comm));
1179566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIGetStdout(comm,&viewer));
1189566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIGetTab(viewer, &tabs));
1199566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel));
1209566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer,"  ---------- Testing Hessian -------------\n"));
12109baa881SHong Zhang   if (!complete_print && !directionsprinted) {
1229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  Run with -tao_test_hessian_view and optionally -tao_test_hessian <threshold> to show difference\n"));
1239566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"    of hand-coded and finite difference Hessian entries greater than <threshold>.\n"));
12409baa881SHong Zhang   }
12509baa881SHong Zhang   if (!directionsprinted) {
1269566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  Testing hand-coded Hessian, if (for double precision runs) ||J - Jfd||_F/||J||_F is\n"));
1279566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"    O(1.e-8), the hand-coded Hessian is probably correct.\n"));
12809baa881SHong Zhang     directionsprinted = PETSC_TRUE;
12909baa881SHong Zhang   }
1301baa6e33SBarry Smith   if (complete_print) PetscCall(PetscViewerPushFormat(mviewer,format));
13109baa881SHong Zhang 
1329566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tao->hessian,MATMFFD,&flg));
13309baa881SHong Zhang   if (!flg) hessian = tao->hessian;
13409baa881SHong Zhang   else hessian = tao->hessian_pre;
13509baa881SHong Zhang 
13609baa881SHong Zhang   while (hessian) {
1379566063dSJacob Faibussowitsch     PetscCall(PetscObjectBaseTypeCompareAny((PetscObject)hessian,&flg,MATSEQAIJ,MATMPIAIJ,MATSEQDENSE,MATMPIDENSE,MATSEQBAIJ,MATMPIBAIJ,MATSEQSBAIJ,MATMPIBAIJ,""));
13809baa881SHong Zhang     if (flg) {
13909baa881SHong Zhang       A    = hessian;
1409566063dSJacob Faibussowitsch       PetscCall(PetscObjectReference((PetscObject)A));
14109baa881SHong Zhang     } else {
1429566063dSJacob Faibussowitsch       PetscCall(MatComputeOperator(hessian,MATAIJ,&A));
14309baa881SHong Zhang     }
14409baa881SHong Zhang 
1459566063dSJacob Faibussowitsch     PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&B));
1469566063dSJacob Faibussowitsch     PetscCall(MatGetSize(A,&M,&N));
1479566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSize(A,&m,&n));
1489566063dSJacob Faibussowitsch     PetscCall(MatSetSizes(B,m,n,M,N));
1499566063dSJacob Faibussowitsch     PetscCall(MatSetType(B,((PetscObject)A)->type_name));
1509566063dSJacob Faibussowitsch     PetscCall(MatSetUp(B));
1519566063dSJacob Faibussowitsch     PetscCall(MatSetOption(B,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE));
15209baa881SHong Zhang 
1539566063dSJacob Faibussowitsch     PetscCall(TaoDefaultComputeHessian(tao,x,B,B,NULL));
15409baa881SHong Zhang 
1559566063dSJacob Faibussowitsch     PetscCall(MatDuplicate(B,MAT_COPY_VALUES,&D));
1569566063dSJacob Faibussowitsch     PetscCall(MatAYPX(D,-1.0,A,DIFFERENT_NONZERO_PATTERN));
1579566063dSJacob Faibussowitsch     PetscCall(MatNorm(D,NORM_FROBENIUS,&nrm));
1589566063dSJacob Faibussowitsch     PetscCall(MatNorm(A,NORM_FROBENIUS,&gnorm));
1599566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&D));
16009baa881SHong Zhang     if (!gnorm) gnorm = 1; /* just in case */
1619566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  ||H - Hfd||_F/||H||_F = %g, ||H - Hfd||_F = %g\n",(double)(nrm/gnorm),(double)nrm));
16209baa881SHong Zhang 
16309baa881SHong Zhang     if (complete_print) {
1649566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer,"  Hand-coded Hessian ----------\n"));
1659566063dSJacob Faibussowitsch       PetscCall(MatView(A,mviewer));
1669566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer,"  Finite difference Hessian ----------\n"));
1679566063dSJacob Faibussowitsch       PetscCall(MatView(B,mviewer));
16809baa881SHong Zhang     }
16909baa881SHong Zhang 
17009baa881SHong Zhang     if (complete_print) {
17109baa881SHong Zhang       PetscInt          Istart, Iend, *ccols, bncols, cncols, j, row;
17209baa881SHong Zhang       PetscScalar       *cvals;
17309baa881SHong Zhang       const PetscInt    *bcols;
17409baa881SHong Zhang       const PetscScalar *bvals;
17509baa881SHong Zhang 
1769566063dSJacob Faibussowitsch       PetscCall(MatAYPX(B,-1.0,A,DIFFERENT_NONZERO_PATTERN));
1779566063dSJacob Faibussowitsch       PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&C));
1789566063dSJacob Faibussowitsch       PetscCall(MatSetSizes(C,m,n,M,N));
1799566063dSJacob Faibussowitsch       PetscCall(MatSetType(C,((PetscObject)A)->type_name));
1809566063dSJacob Faibussowitsch       PetscCall(MatSetUp(C));
1819566063dSJacob Faibussowitsch       PetscCall(MatSetOption(C,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE));
1829566063dSJacob Faibussowitsch       PetscCall(MatGetOwnershipRange(B,&Istart,&Iend));
18309baa881SHong Zhang 
18409baa881SHong Zhang       for (row = Istart; row < Iend; row++) {
1859566063dSJacob Faibussowitsch         PetscCall(MatGetRow(B,row,&bncols,&bcols,&bvals));
1869566063dSJacob Faibussowitsch         PetscCall(PetscMalloc2(bncols,&ccols,bncols,&cvals));
18709baa881SHong Zhang         for (j = 0, cncols = 0; j < bncols; j++) {
18809baa881SHong Zhang           if (PetscAbsScalar(bvals[j]) > threshold) {
18909baa881SHong Zhang             ccols[cncols] = bcols[j];
19009baa881SHong Zhang             cvals[cncols] = bvals[j];
19109baa881SHong Zhang             cncols += 1;
19209baa881SHong Zhang           }
19309baa881SHong Zhang         }
19409baa881SHong Zhang         if (cncols) {
1959566063dSJacob Faibussowitsch           PetscCall(MatSetValues(C,1,&row,cncols,ccols,cvals,INSERT_VALUES));
19609baa881SHong Zhang         }
1979566063dSJacob Faibussowitsch         PetscCall(MatRestoreRow(B,row,&bncols,&bcols,&bvals));
1989566063dSJacob Faibussowitsch         PetscCall(PetscFree2(ccols,cvals));
19909baa881SHong Zhang       }
2009566063dSJacob Faibussowitsch       PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY));
2019566063dSJacob Faibussowitsch       PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY));
2029566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer,"  Finite-difference minus hand-coded Hessian with tolerance %g ----------\n",(double)threshold));
2039566063dSJacob Faibussowitsch       PetscCall(MatView(C,mviewer));
2049566063dSJacob Faibussowitsch       PetscCall(MatDestroy(&C));
20509baa881SHong Zhang     }
2069566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&A));
2079566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&B));
20809baa881SHong Zhang 
20909baa881SHong Zhang     if (hessian != tao->hessian_pre) {
21009baa881SHong Zhang       hessian = tao->hessian_pre;
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer,"  ---------- Testing Hessian for preconditioner -------------\n"));
21209baa881SHong Zhang     } else hessian = NULL;
21309baa881SHong Zhang   }
214f49d1c87SHong Zhang   if (complete_print) {
2159566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(mviewer));
2169566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&mviewer));
217f49d1c87SHong Zhang   }
2189566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISetTab(viewer,tabs));
21909baa881SHong Zhang   PetscFunctionReturn(0);
22009baa881SHong Zhang }
22109baa881SHong Zhang 
222a7e14dcfSSatish Balay /*@C
223a7e14dcfSSatish Balay    TaoComputeHessian - Computes the Hessian matrix that has been
22465ba42b6SBarry Smith    set with `TaoSetHessian()`.
225a7e14dcfSSatish Balay 
22665ba42b6SBarry Smith    Collective on tao
227a7e14dcfSSatish Balay 
228a7e14dcfSSatish Balay    Input Parameters:
229f4c1ad5cSStefano Zampini +  tao - the Tao solver context
230f4c1ad5cSStefano Zampini -  X   - input vector
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay    Output Parameters:
233a7e14dcfSSatish Balay +  H    - Hessian matrix
234aa6c7ce3SBarry Smith -  Hpre - Preconditioning matrix
235a7e14dcfSSatish Balay 
23609baa881SHong Zhang    Options Database Keys:
23709baa881SHong Zhang +     -tao_test_hessian - compare the user provided Hessian with one compute via finite differences to check for errors
23809baa881SHong Zhang .     -tao_test_hessian <numerical value>  - display entries in the difference between the user provided Hessian and finite difference Hessian that are greater than a certain value to help users detect errors
239dfe02fe6SHong Zhang -     -tao_test_hessian_view - display the user provided Hessian, the finite difference Hessian and the difference between them to help users detect the location of errors in the user provided Hessian
24009baa881SHong Zhang 
241a7e14dcfSSatish Balay    Notes:
242a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
243a7e14dcfSSatish Balay    is used internally within the minimization solvers.
244a7e14dcfSSatish Balay 
24565ba42b6SBarry Smith    `TaoComputeHessian()` is typically used within optimization algorithms,
24665ba42b6SBarry Smith    so most users would not generally call this routine
247a7e14dcfSSatish Balay    themselves.
248a7e14dcfSSatish Balay 
24965ba42b6SBarry Smith    Developer Note:
25065ba42b6SBarry Smith    The Hessian test mechanism follows `SNESTestJacobian()`.
25109baa881SHong Zhang 
252a7e14dcfSSatish Balay    Level: developer
253a7e14dcfSSatish Balay 
25465ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetHessian()`
255a7e14dcfSSatish Balay @*/
256ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre)
257a7e14dcfSSatish Balay {
258a7e14dcfSSatish Balay   PetscFunctionBegin;
259441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
260a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
261a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
2623c859ba3SBarry Smith   PetscCheck(tao->ops->computehessian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first");
263a7e14dcfSSatish Balay   ++tao->nhess;
2649566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
2659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_HessianEval,tao,X,H,Hpre));
266*792fecdfSBarry Smith   PetscCallBack("Tao callback Hessian",(*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP));
2679566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_HessianEval,tao,X,H,Hpre));
2689566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
26909baa881SHong Zhang 
2709566063dSJacob Faibussowitsch   PetscCall(TaoTestHessian(tao));
271a7e14dcfSSatish Balay   PetscFunctionReturn(0);
272a7e14dcfSSatish Balay }
273a7e14dcfSSatish Balay 
274a7e14dcfSSatish Balay /*@C
275a7e14dcfSSatish Balay    TaoComputeJacobian - Computes the Jacobian matrix that has been
276a7e14dcfSSatish Balay    set with TaoSetJacobianRoutine().
277a7e14dcfSSatish Balay 
27865ba42b6SBarry Smith    Collective on tao
279a7e14dcfSSatish Balay 
280a7e14dcfSSatish Balay    Input Parameters:
281f4c1ad5cSStefano Zampini +  tao - the Tao solver context
282f4c1ad5cSStefano Zampini -  X   - input vector
283a7e14dcfSSatish Balay 
284a7e14dcfSSatish Balay    Output Parameters:
285f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
286f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
287a7e14dcfSSatish Balay 
288a7e14dcfSSatish Balay    Notes:
289a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
290a7e14dcfSSatish Balay    is used internally within the minimization solvers.
291a7e14dcfSSatish Balay 
29265ba42b6SBarry Smith    `TaoComputeJacobian()` is typically used within minimization
293a7e14dcfSSatish Balay    implementations, so most users would not generally call this routine
294a7e14dcfSSatish Balay    themselves.
295a7e14dcfSSatish Balay 
296a7e14dcfSSatish Balay    Level: developer
297a7e14dcfSSatish Balay 
298db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianRoutine()`
299a7e14dcfSSatish Balay @*/
300ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre)
301a7e14dcfSSatish Balay {
302a7e14dcfSSatish Balay   PetscFunctionBegin;
303441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
304a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
305a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
3063c859ba3SBarry Smith   PetscCheck(tao->ops->computejacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first");
307a7e14dcfSSatish Balay   ++tao->njac;
3089566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
3099566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre));
310*792fecdfSBarry Smith   PetscCallBack("Tao callback Jacobian",(*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP));
3119566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre));
3129566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
313a7e14dcfSSatish Balay   PetscFunctionReturn(0);
314a7e14dcfSSatish Balay }
315a7e14dcfSSatish Balay 
316a7e14dcfSSatish Balay /*@C
3174a48860cSAlp Dener    TaoComputeResidualJacobian - Computes the least-squares residual Jacobian matrix that has been
31865ba42b6SBarry Smith    set with `TaoSetJacobianResidual()`.
3194a48860cSAlp Dener 
32065ba42b6SBarry Smith    Collective on tao
3214a48860cSAlp Dener 
3224a48860cSAlp Dener    Input Parameters:
3234a48860cSAlp Dener +  tao - the Tao solver context
3244a48860cSAlp Dener -  X   - input vector
3254a48860cSAlp Dener 
3264a48860cSAlp Dener    Output Parameters:
3274a48860cSAlp Dener +  J    - Jacobian matrix
3284a48860cSAlp Dener -  Jpre - Preconditioning matrix
3294a48860cSAlp Dener 
3304a48860cSAlp Dener    Notes:
3314a48860cSAlp Dener    Most users should not need to explicitly call this routine, as it
3324a48860cSAlp Dener    is used internally within the minimization solvers.
3334a48860cSAlp Dener 
33465ba42b6SBarry Smith    `TaoComputeResidualJacobian()` is typically used within least-squares
3354a48860cSAlp Dener    implementations, so most users would not generally call this routine
3364a48860cSAlp Dener    themselves.
3374a48860cSAlp Dener 
3384a48860cSAlp Dener    Level: developer
3394a48860cSAlp Dener 
34065ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeResidual()`, `TaoSetJacobianResidual()`
3414a48860cSAlp Dener @*/
3424a48860cSAlp Dener PetscErrorCode TaoComputeResidualJacobian(Tao tao, Vec X, Mat J, Mat Jpre)
3434a48860cSAlp Dener {
3444a48860cSAlp Dener   PetscFunctionBegin;
3454a48860cSAlp Dener   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3464a48860cSAlp Dener   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
3474a48860cSAlp Dener   PetscCheckSameComm(tao,1,X,2);
3483c859ba3SBarry Smith   PetscCheck(tao->ops->computeresidualjacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetResidualJacobian() first");
3494a48860cSAlp Dener   ++tao->njac;
3509566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
3519566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre));
352*792fecdfSBarry Smith   PetscCallBack("Tao callback least-squares residual Jacobian",(*tao->ops->computeresidualjacobian)(tao,X,J,Jpre,tao->user_lsjacP));
3539566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre));
3549566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
3554a48860cSAlp Dener   PetscFunctionReturn(0);
3564a48860cSAlp Dener }
3574a48860cSAlp Dener 
3584a48860cSAlp Dener /*@C
359a7e14dcfSSatish Balay    TaoComputeJacobianState - Computes the Jacobian matrix that has been
36065ba42b6SBarry Smith    set with `TaoSetJacobianStateRoutine()`.
361a7e14dcfSSatish Balay 
36265ba42b6SBarry Smith    Collective on tao
363a7e14dcfSSatish Balay 
364a7e14dcfSSatish Balay    Input Parameters:
365f4c1ad5cSStefano Zampini +  tao - the Tao solver context
366f4c1ad5cSStefano Zampini -  X   - input vector
367a7e14dcfSSatish Balay 
368a7e14dcfSSatish Balay    Output Parameters:
3696b867d5aSJose E. Roman +  J    - Jacobian matrix
3706b867d5aSJose E. Roman .  Jpre - Preconditioning matrix
37165ba42b6SBarry Smith -  Jinv - unknown
372a7e14dcfSSatish Balay 
373a7e14dcfSSatish Balay    Notes:
374a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
37565ba42b6SBarry Smith    is used internally within the optimization algorithms.
376a7e14dcfSSatish Balay 
377a7e14dcfSSatish Balay    Level: developer
378a7e14dcfSSatish Balay 
37965ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()`
380a7e14dcfSSatish Balay @*/
381ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv)
382a7e14dcfSSatish Balay {
383a7e14dcfSSatish Balay   PetscFunctionBegin;
384441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
385a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
386a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
3873c859ba3SBarry Smith   PetscCheck(tao->ops->computejacobianstate,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first");
388a7e14dcfSSatish Balay   ++tao->njac_state;
3899566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
3909566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre));
391*792fecdfSBarry Smith   PetscCallBack("Tao callback Jacobian(state)",(*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP));
3929566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre));
3939566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
394a7e14dcfSSatish Balay   PetscFunctionReturn(0);
395a7e14dcfSSatish Balay }
396a7e14dcfSSatish Balay 
397a7e14dcfSSatish Balay /*@C
398a7e14dcfSSatish Balay    TaoComputeJacobianDesign - Computes the Jacobian matrix that has been
39965ba42b6SBarry Smith    set with `TaoSetJacobianDesignRoutine()`.
400a7e14dcfSSatish Balay 
40165ba42b6SBarry Smith    Collective on tao
402a7e14dcfSSatish Balay 
403a7e14dcfSSatish Balay    Input Parameters:
404f4c1ad5cSStefano Zampini +  tao - the Tao solver context
405f4c1ad5cSStefano Zampini -  X   - input vector
406a7e14dcfSSatish Balay 
407a7e14dcfSSatish Balay    Output Parameters:
408f4c1ad5cSStefano Zampini .  J - Jacobian matrix
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay    Notes:
411a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
41265ba42b6SBarry Smith    is used internally within the optimization algorithms.
413a7e14dcfSSatish Balay 
414a7e14dcfSSatish Balay    Level: developer
415a7e14dcfSSatish Balay 
41665ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianDesignRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()`
417a7e14dcfSSatish Balay @*/
41894ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J)
419a7e14dcfSSatish Balay {
420a7e14dcfSSatish Balay   PetscFunctionBegin;
421441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
422a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
423a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
4243c859ba3SBarry Smith   PetscCheck(tao->ops->computejacobiandesign,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first");
425a7e14dcfSSatish Balay   ++tao->njac_design;
4269566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
4279566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,NULL));
428*792fecdfSBarry Smith   PetscCallBack("Tao callback Jacobian(design)",(*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP));
4299566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,NULL));
4309566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
431a7e14dcfSSatish Balay   PetscFunctionReturn(0);
432a7e14dcfSSatish Balay }
433a7e14dcfSSatish Balay 
434a7e14dcfSSatish Balay /*@C
435a7e14dcfSSatish Balay    TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix.
436a7e14dcfSSatish Balay 
43765ba42b6SBarry Smith    Logically collective on tao
438a7e14dcfSSatish Balay 
439a7e14dcfSSatish Balay    Input Parameters:
440441846f8SBarry Smith +  tao  - the Tao context
441a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
442a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
443f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
444a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
4456c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
446a7e14dcfSSatish Balay 
447f4c1ad5cSStefano Zampini    Calling sequence of func:
448f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
449a7e14dcfSSatish Balay 
450441846f8SBarry Smith +  tao  - the Tao  context
451a7e14dcfSSatish Balay .  x    - input vector
452a7e14dcfSSatish Balay .  J    - Jacobian matrix
453f4c1ad5cSStefano Zampini .  Jpre - preconditioning matrix, usually the same as J
454a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
455a7e14dcfSSatish Balay 
456a7e14dcfSSatish Balay    Level: intermediate
45765ba42b6SBarry Smith 
45865ba42b6SBarry Smith .seealso: `Tao`, `TaoSetGradient()`, `TaoSetObjective()`
459a7e14dcfSSatish Balay @*/
460ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
461a7e14dcfSSatish Balay {
462a7e14dcfSSatish Balay   PetscFunctionBegin;
463441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
464a7e14dcfSSatish Balay   if (J) {
465a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
466a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
467a7e14dcfSSatish Balay   }
468a7e14dcfSSatish Balay   if (Jpre) {
469a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
470a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
471a7e14dcfSSatish Balay   }
472a7e14dcfSSatish Balay   if (ctx) {
473a7e14dcfSSatish Balay     tao->user_jacP = ctx;
474a7e14dcfSSatish Balay   }
475a7e14dcfSSatish Balay   if (func) {
476a7e14dcfSSatish Balay     tao->ops->computejacobian = func;
477a7e14dcfSSatish Balay   }
478a7e14dcfSSatish Balay   if (J) {
4799566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
4809566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian));
481a7e14dcfSSatish Balay     tao->jacobian = J;
482a7e14dcfSSatish Balay   }
483a7e14dcfSSatish Balay   if (Jpre) {
4849566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jpre));
4859566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_pre));
486a7e14dcfSSatish Balay     tao->jacobian_pre=Jpre;
487a7e14dcfSSatish Balay   }
488a7e14dcfSSatish Balay   PetscFunctionReturn(0);
489a7e14dcfSSatish Balay }
490a7e14dcfSSatish Balay 
491a7e14dcfSSatish Balay /*@C
4924ffbe8acSAlp Dener    TaoSetJacobianResidualRoutine - Sets the function to compute the least-squares residual Jacobian as well as the
4934a48860cSAlp Dener    location to store the matrix.
4944a48860cSAlp Dener 
49565ba42b6SBarry Smith    Logically collective on tao
4964a48860cSAlp Dener 
4974a48860cSAlp Dener    Input Parameters:
4984a48860cSAlp Dener +  tao  - the Tao context
4994a48860cSAlp Dener .  J    - Matrix used for the jacobian
5004a48860cSAlp Dener .  Jpre - Matrix that will be used operated on by preconditioner, can be same as J
5014a48860cSAlp Dener .  func - Jacobian evaluation routine
5024a48860cSAlp Dener -  ctx  - [optional] user-defined context for private data for the
5034a48860cSAlp Dener           Jacobian evaluation routine (may be NULL)
5044a48860cSAlp Dener 
5054a48860cSAlp Dener    Calling sequence of func:
5064a48860cSAlp Dener $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
5074a48860cSAlp Dener 
5084a48860cSAlp Dener +  tao  - the Tao  context
5094a48860cSAlp Dener .  x    - input vector
5104a48860cSAlp Dener .  J    - Jacobian matrix
5114a48860cSAlp Dener .  Jpre - preconditioning matrix, usually the same as J
5124a48860cSAlp Dener -  ctx  - [optional] user-defined Jacobian context
5134a48860cSAlp Dener 
5144a48860cSAlp Dener    Level: intermediate
51565ba42b6SBarry Smith 
51665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetGradient()`, `TaoSetObjective()`
5174a48860cSAlp Dener @*/
5184ffbe8acSAlp Dener PetscErrorCode TaoSetJacobianResidualRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
5194a48860cSAlp Dener {
5204a48860cSAlp Dener   PetscFunctionBegin;
5214a48860cSAlp Dener   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
5224a48860cSAlp Dener   if (J) {
5234a48860cSAlp Dener     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
5244a48860cSAlp Dener     PetscCheckSameComm(tao,1,J,2);
5254a48860cSAlp Dener   }
5264a48860cSAlp Dener   if (Jpre) {
5274a48860cSAlp Dener     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
5284a48860cSAlp Dener     PetscCheckSameComm(tao,1,Jpre,3);
5294a48860cSAlp Dener   }
5304a48860cSAlp Dener   if (ctx) {
5314a48860cSAlp Dener     tao->user_lsjacP = ctx;
5324a48860cSAlp Dener   }
5334a48860cSAlp Dener   if (func) {
5344a48860cSAlp Dener     tao->ops->computeresidualjacobian = func;
5354a48860cSAlp Dener   }
5364a48860cSAlp Dener   if (J) {
5379566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
5389566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->ls_jac));
5394a48860cSAlp Dener     tao->ls_jac = J;
5404a48860cSAlp Dener   }
5414a48860cSAlp Dener   if (Jpre) {
5429566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jpre));
5439566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->ls_jac_pre));
5444a48860cSAlp Dener     tao->ls_jac_pre=Jpre;
5454a48860cSAlp Dener   }
5464a48860cSAlp Dener   PetscFunctionReturn(0);
5474a48860cSAlp Dener }
5484a48860cSAlp Dener 
5494a48860cSAlp Dener /*@C
550a7e14dcfSSatish Balay    TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian
551a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the state variables.
55265ba42b6SBarry Smith    Used only for PDE-constrained optimization.
553a7e14dcfSSatish Balay 
55465ba42b6SBarry Smith    Logically collective on tao
555a7e14dcfSSatish Balay 
556a7e14dcfSSatish Balay    Input Parameters:
557441846f8SBarry Smith +  tao  - the Tao context
558a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
5596c23d075SBarry Smith .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.  Only used if Jinv is NULL
5606c23d075SBarry 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.
561f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
562a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
5636c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
564a7e14dcfSSatish Balay 
565f4c1ad5cSStefano Zampini    Calling sequence of func:
566f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,Mat Jinv,void *ctx);
567a7e14dcfSSatish Balay 
568441846f8SBarry Smith +  tao  - the Tao  context
569a7e14dcfSSatish Balay .  x    - input vector
570a7e14dcfSSatish Balay .  J    - Jacobian matrix
571a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
572a7e14dcfSSatish Balay .  Jinv - inverse of J
573a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
574a7e14dcfSSatish Balay 
575a7e14dcfSSatish Balay    Level: intermediate
57665ba42b6SBarry Smith 
57765ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeJacobianState()`, `TaoSetJacobianDesignRoutine()`, `TaoSetStateDesignIS()`
578a7e14dcfSSatish Balay @*/
579ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, void*), void *ctx)
580a7e14dcfSSatish Balay {
581a7e14dcfSSatish Balay   PetscFunctionBegin;
582441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
583a7e14dcfSSatish Balay   if (J) {
584a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
585a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
586a7e14dcfSSatish Balay   }
587a7e14dcfSSatish Balay   if (Jpre) {
588a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
589a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
590a7e14dcfSSatish Balay   }
591a7e14dcfSSatish Balay   if (Jinv) {
592a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4);
593a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jinv,4);
594a7e14dcfSSatish Balay   }
595a7e14dcfSSatish Balay   if (ctx) {
596a7e14dcfSSatish Balay     tao->user_jac_stateP = ctx;
597a7e14dcfSSatish Balay   }
598a7e14dcfSSatish Balay   if (func) {
599a7e14dcfSSatish Balay     tao->ops->computejacobianstate = func;
600a7e14dcfSSatish Balay   }
601a7e14dcfSSatish Balay   if (J) {
6029566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
6039566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_state));
604a7e14dcfSSatish Balay     tao->jacobian_state = J;
605a7e14dcfSSatish Balay   }
606a7e14dcfSSatish Balay   if (Jpre) {
6079566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jpre));
6089566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_state_pre));
609a7e14dcfSSatish Balay     tao->jacobian_state_pre=Jpre;
610a7e14dcfSSatish Balay   }
611a7e14dcfSSatish Balay   if (Jinv) {
6129566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jinv));
6139566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_state_inv));
614a7e14dcfSSatish Balay     tao->jacobian_state_inv=Jinv;
615a7e14dcfSSatish Balay   }
616a7e14dcfSSatish Balay   PetscFunctionReturn(0);
617a7e14dcfSSatish Balay }
618a7e14dcfSSatish Balay 
619a7e14dcfSSatish Balay /*@C
620a7e14dcfSSatish Balay    TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of
621a7e14dcfSSatish Balay    the constraint function with respect to the design variables.  Used only for
62265ba42b6SBarry Smith    PDE-constrained optimization.
623a7e14dcfSSatish Balay 
62465ba42b6SBarry Smith    Logically collective on tao
625a7e14dcfSSatish Balay 
626a7e14dcfSSatish Balay    Input Parameters:
627441846f8SBarry Smith +  tao  - the Tao context
628a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
629f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
630a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
6316c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
632a7e14dcfSSatish Balay 
633f4c1ad5cSStefano Zampini    Calling sequence of func:
634f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,void *ctx);
635a7e14dcfSSatish Balay 
636441846f8SBarry Smith +  tao - the Tao  context
637a7e14dcfSSatish Balay .  x   - input vector
638a7e14dcfSSatish Balay .  J   - Jacobian matrix
639a7e14dcfSSatish Balay -  ctx - [optional] user-defined Jacobian context
640a7e14dcfSSatish Balay 
641a7e14dcfSSatish Balay    Level: intermediate
642f4c1ad5cSStefano Zampini 
64365ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeJacobianDesign()`, `TaoSetJacobianStateRoutine()`, `TaoSetStateDesignIS()`
644a7e14dcfSSatish Balay @*/
64594ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx)
646a7e14dcfSSatish Balay {
647a7e14dcfSSatish Balay   PetscFunctionBegin;
648441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
649a7e14dcfSSatish Balay   if (J) {
650a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
651a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
652a7e14dcfSSatish Balay   }
653a7e14dcfSSatish Balay   if (ctx) {
654a7e14dcfSSatish Balay     tao->user_jac_designP = ctx;
655a7e14dcfSSatish Balay   }
656a7e14dcfSSatish Balay   if (func) {
657a7e14dcfSSatish Balay     tao->ops->computejacobiandesign = func;
658a7e14dcfSSatish Balay   }
659a7e14dcfSSatish Balay   if (J) {
6609566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
6619566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_design));
662a7e14dcfSSatish Balay     tao->jacobian_design = J;
663a7e14dcfSSatish Balay   }
664a7e14dcfSSatish Balay   PetscFunctionReturn(0);
665a7e14dcfSSatish Balay }
666a7e14dcfSSatish Balay 
667a7e14dcfSSatish Balay /*@
668441846f8SBarry Smith    TaoSetStateDesignIS - Indicate to the Tao which variables in the
669a7e14dcfSSatish Balay    solution vector are state variables and which are design.  Only applies to
67065ba42b6SBarry Smith    PDE-constrained optimization.
671a7e14dcfSSatish Balay 
672441846f8SBarry Smith    Logically Collective on Tao
673a7e14dcfSSatish Balay 
674a7e14dcfSSatish Balay    Input Parameters:
675441846f8SBarry Smith +  tao  - The Tao context
676a7e14dcfSSatish Balay .  s_is - the index set corresponding to the state variables
677a7e14dcfSSatish Balay -  d_is - the index set corresponding to the design variables
678a7e14dcfSSatish Balay 
679a7e14dcfSSatish Balay    Level: intermediate
680a7e14dcfSSatish Balay 
68165ba42b6SBarry Smith .seealso: `Tao`, `TaoSetJacobianStateRoutine()`, `TaoSetJacobianDesignRoutine()`
682a7e14dcfSSatish Balay @*/
683441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is)
684a7e14dcfSSatish Balay {
68545cf516eSBarry Smith   PetscFunctionBegin;
6869566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)s_is));
6879566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&tao->state_is));
688a7e14dcfSSatish Balay   tao->state_is = s_is;
6899566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)(d_is)));
6909566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&tao->design_is));
691a7e14dcfSSatish Balay   tao->design_is = d_is;
692a7e14dcfSSatish Balay   PetscFunctionReturn(0);
693a7e14dcfSSatish Balay }
694a7e14dcfSSatish Balay 
695a7e14dcfSSatish Balay /*@C
696a7e14dcfSSatish Balay    TaoComputeJacobianEquality - Computes the Jacobian matrix that has been
69765ba42b6SBarry Smith    set with `TaoSetJacobianEqualityRoutine()`.
698a7e14dcfSSatish Balay 
69965ba42b6SBarry Smith    Collective on tao
700a7e14dcfSSatish Balay 
701a7e14dcfSSatish Balay    Input Parameters:
702f4c1ad5cSStefano Zampini +  tao - the Tao solver context
703f4c1ad5cSStefano Zampini -  X   - input vector
704a7e14dcfSSatish Balay 
705a7e14dcfSSatish Balay    Output Parameters:
706f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
707f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
708a7e14dcfSSatish Balay 
709a7e14dcfSSatish Balay    Notes:
710a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
71165ba42b6SBarry Smith    is used internally within the optimization algorithms.
712a7e14dcfSSatish Balay 
713a7e14dcfSSatish Balay    Level: developer
714a7e14dcfSSatish Balay 
715db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()`
716a7e14dcfSSatish Balay @*/
717ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre)
718a7e14dcfSSatish Balay {
719a7e14dcfSSatish Balay   PetscFunctionBegin;
720441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
721a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
722a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
7233c859ba3SBarry Smith   PetscCheck(tao->ops->computejacobianequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first");
724a7e14dcfSSatish Balay   ++tao->njac_equality;
7259566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
7269566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre));
727*792fecdfSBarry Smith   PetscCallBack("Tao callback Jacobian(equality)",(*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP));
7289566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre));
7299566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
730a7e14dcfSSatish Balay   PetscFunctionReturn(0);
731a7e14dcfSSatish Balay }
732a7e14dcfSSatish Balay 
733a7e14dcfSSatish Balay /*@C
734a7e14dcfSSatish Balay    TaoComputeJacobianInequality - Computes the Jacobian matrix that has been
73565ba42b6SBarry Smith    set with `TaoSetJacobianInequalityRoutine()`.
736a7e14dcfSSatish Balay 
73765ba42b6SBarry Smith    Collective on tao
738a7e14dcfSSatish Balay 
739a7e14dcfSSatish Balay    Input Parameters:
740f4c1ad5cSStefano Zampini +  tao - the Tao solver context
741f4c1ad5cSStefano Zampini -  X   - input vector
742a7e14dcfSSatish Balay 
743a7e14dcfSSatish Balay    Output Parameters:
744f4c1ad5cSStefano Zampini +  J    - Jacobian matrix
745f4c1ad5cSStefano Zampini -  Jpre - Preconditioning matrix
746a7e14dcfSSatish Balay 
747a7e14dcfSSatish Balay    Notes:
748a7e14dcfSSatish Balay    Most users should not need to explicitly call this routine, as it
749a7e14dcfSSatish Balay    is used internally within the minimization solvers.
750a7e14dcfSSatish Balay 
751a7e14dcfSSatish Balay    Level: developer
752a7e14dcfSSatish Balay 
75365ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()`
754a7e14dcfSSatish Balay @*/
755ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre)
756a7e14dcfSSatish Balay {
757a7e14dcfSSatish Balay   PetscFunctionBegin;
758441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
759a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID,2);
760a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
7613c859ba3SBarry Smith   PetscCheck(tao->ops->computejacobianinequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first");
762a7e14dcfSSatish Balay   ++tao->njac_inequality;
7639566063dSJacob Faibussowitsch   PetscCall(VecLockReadPush(X));
7649566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre));
765*792fecdfSBarry Smith   PetscCallBack("Tao callback Jacobian (inequality)",(*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP));
7669566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre));
7679566063dSJacob Faibussowitsch   PetscCall(VecLockReadPop(X));
768a7e14dcfSSatish Balay   PetscFunctionReturn(0);
769a7e14dcfSSatish Balay }
770a7e14dcfSSatish Balay 
771a7e14dcfSSatish Balay /*@C
772a7e14dcfSSatish Balay    TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian
773a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the equality variables.
77465ba42b6SBarry Smith    Used only for PDE-constrained optimization.
775a7e14dcfSSatish Balay 
77665ba42b6SBarry Smith    Logically collective on tao
777a7e14dcfSSatish Balay 
778a7e14dcfSSatish Balay    Input Parameters:
779441846f8SBarry Smith +  tao  - the Tao context
780a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
781a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
782f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
783a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
7846c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
785a7e14dcfSSatish Balay 
786f4c1ad5cSStefano Zampini    Calling sequence of func:
787f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
788a7e14dcfSSatish Balay 
789441846f8SBarry Smith +  tao  - the Tao  context
790a7e14dcfSSatish Balay .  x    - input vector
791a7e14dcfSSatish Balay .  J    - Jacobian matrix
792a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
793a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
794a7e14dcfSSatish Balay 
795a7e14dcfSSatish Balay    Level: intermediate
796f4c1ad5cSStefano Zampini 
79765ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeJacobianEquality()`, `TaoSetJacobianDesignRoutine()`, `TaoSetEqualityDesignIS()`
798a7e14dcfSSatish Balay @*/
799ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx)
800a7e14dcfSSatish Balay {
801a7e14dcfSSatish Balay   PetscFunctionBegin;
802441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
803a7e14dcfSSatish Balay   if (J) {
804a7e14dcfSSatish Balay     PetscValidHeaderSpecific(J,MAT_CLASSID,2);
805a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,J,2);
806a7e14dcfSSatish Balay   }
807a7e14dcfSSatish Balay   if (Jpre) {
808a7e14dcfSSatish Balay     PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3);
809a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,Jpre,3);
810a7e14dcfSSatish Balay   }
811a7e14dcfSSatish Balay   if (ctx) {
812a7e14dcfSSatish Balay     tao->user_jac_equalityP = ctx;
813a7e14dcfSSatish Balay   }
814a7e14dcfSSatish Balay   if (func) {
815a7e14dcfSSatish Balay     tao->ops->computejacobianequality = func;
816a7e14dcfSSatish Balay   }
817a7e14dcfSSatish Balay   if (J) {
8189566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
8199566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_equality));
820a7e14dcfSSatish Balay     tao->jacobian_equality = J;
821a7e14dcfSSatish Balay   }
822a7e14dcfSSatish Balay   if (Jpre) {
8239566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jpre));
8249566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_equality_pre));
825a7e14dcfSSatish Balay     tao->jacobian_equality_pre=Jpre;
826a7e14dcfSSatish Balay   }
827a7e14dcfSSatish Balay   PetscFunctionReturn(0);
828a7e14dcfSSatish Balay }
829a7e14dcfSSatish Balay 
830a7e14dcfSSatish Balay /*@C
831a7e14dcfSSatish Balay    TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian
832a7e14dcfSSatish Balay    (and its inverse) of the constraint function with respect to the inequality variables.
83365ba42b6SBarry Smith    Used only for PDE-constrained optimization.
834a7e14dcfSSatish Balay 
83565ba42b6SBarry Smith    Logically collective on tao
836a7e14dcfSSatish Balay 
837a7e14dcfSSatish Balay    Input Parameters:
838441846f8SBarry Smith +  tao  - the Tao context
839a7e14dcfSSatish Balay .  J    - Matrix used for the jacobian
840a7e14dcfSSatish Balay .  Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J.
841f4c1ad5cSStefano Zampini .  func - Jacobian evaluation routine
842a7e14dcfSSatish Balay -  ctx  - [optional] user-defined context for private data for the
8436c23d075SBarry Smith           Jacobian evaluation routine (may be NULL)
844a7e14dcfSSatish Balay 
845f4c1ad5cSStefano Zampini    Calling sequence of func:
846f4c1ad5cSStefano Zampini $    func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx);
847a7e14dcfSSatish Balay 
848441846f8SBarry Smith +  tao  - the Tao  context
849a7e14dcfSSatish Balay .  x    - input vector
850a7e14dcfSSatish Balay .  J    - Jacobian matrix
851a7e14dcfSSatish Balay .  Jpre - preconditioner matrix, usually the same as J
852a7e14dcfSSatish Balay -  ctx  - [optional] user-defined Jacobian context
853a7e14dcfSSatish Balay 
854a7e14dcfSSatish Balay    Level: intermediate
855f4c1ad5cSStefano Zampini 
85665ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeJacobianInequality()`, `TaoSetJacobianDesignRoutine()`, `TaoSetInequalityDesignIS()`
857a7e14dcfSSatish Balay @*/
858ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx)
859a7e14dcfSSatish Balay {
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) {
8779566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)J));
8789566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_inequality));
879a7e14dcfSSatish Balay     tao->jacobian_inequality = J;
880a7e14dcfSSatish Balay   }
881a7e14dcfSSatish Balay   if (Jpre) {
8829566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)Jpre));
8839566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&tao->jacobian_inequality_pre));
884a7e14dcfSSatish Balay     tao->jacobian_inequality_pre=Jpre;
885a7e14dcfSSatish Balay   }
886a7e14dcfSSatish Balay   PetscFunctionReturn(0);
887a7e14dcfSSatish Balay }
888