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 6441846f8SBarry 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 27db781477SPatrick Sanan .seealso: `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 81db781477SPatrick Sanan .seealso: `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 } 130*1baa6e33SBarry 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 224a82e8c82SStefano Zampini set with TaoSetHessian(). 225a7e14dcfSSatish Balay 226441846f8SBarry 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 245a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 246a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 247a7e14dcfSSatish Balay themselves. 248a7e14dcfSSatish Balay 24909baa881SHong Zhang Developer Notes: 25009baa881SHong Zhang The Hessian test mechanism follows SNESTestJacobian(). 25109baa881SHong Zhang 252a7e14dcfSSatish Balay Level: developer 253a7e14dcfSSatish Balay 254db781477SPatrick Sanan .seealso: `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)); 266441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 2679566063dSJacob Faibussowitsch PetscCall((*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP)); 268a7e14dcfSSatish Balay PetscStackPop; 2699566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_HessianEval,tao,X,H,Hpre)); 2709566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 27109baa881SHong Zhang 2729566063dSJacob Faibussowitsch PetscCall(TaoTestHessian(tao)); 273a7e14dcfSSatish Balay PetscFunctionReturn(0); 274a7e14dcfSSatish Balay } 275a7e14dcfSSatish Balay 276a7e14dcfSSatish Balay /*@C 277a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 278a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 279a7e14dcfSSatish Balay 280441846f8SBarry Smith Collective on Tao 281a7e14dcfSSatish Balay 282a7e14dcfSSatish Balay Input Parameters: 283f4c1ad5cSStefano Zampini + tao - the Tao solver context 284f4c1ad5cSStefano Zampini - X - input vector 285a7e14dcfSSatish Balay 286a7e14dcfSSatish Balay Output Parameters: 287f4c1ad5cSStefano Zampini + J - Jacobian matrix 288f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 289a7e14dcfSSatish Balay 290a7e14dcfSSatish Balay Notes: 291a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 292a7e14dcfSSatish Balay is used internally within the minimization solvers. 293a7e14dcfSSatish Balay 294a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 295a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 296a7e14dcfSSatish Balay themselves. 297a7e14dcfSSatish Balay 298a7e14dcfSSatish Balay Level: developer 299a7e14dcfSSatish Balay 300db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianRoutine()` 301a7e14dcfSSatish Balay @*/ 302ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 303a7e14dcfSSatish Balay { 304a7e14dcfSSatish Balay PetscFunctionBegin; 305441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 306a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 307a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 3083c859ba3SBarry Smith PetscCheck(tao->ops->computejacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 309a7e14dcfSSatish Balay ++tao->njac; 3109566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 3119566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 312441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 3139566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP)); 314a7e14dcfSSatish Balay PetscStackPop; 3159566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 3169566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 317a7e14dcfSSatish Balay PetscFunctionReturn(0); 318a7e14dcfSSatish Balay } 319a7e14dcfSSatish Balay 320a7e14dcfSSatish Balay /*@C 3214a48860cSAlp Dener TaoComputeResidualJacobian - Computes the least-squares residual Jacobian matrix that has been 322a6fed868SAlp Dener set with TaoSetJacobianResidual(). 3234a48860cSAlp Dener 3244a48860cSAlp Dener Collective on Tao 3254a48860cSAlp Dener 3264a48860cSAlp Dener Input Parameters: 3274a48860cSAlp Dener + tao - the Tao solver context 3284a48860cSAlp Dener - X - input vector 3294a48860cSAlp Dener 3304a48860cSAlp Dener Output Parameters: 3314a48860cSAlp Dener + J - Jacobian matrix 3324a48860cSAlp Dener - Jpre - Preconditioning matrix 3334a48860cSAlp Dener 3344a48860cSAlp Dener Notes: 3354a48860cSAlp Dener Most users should not need to explicitly call this routine, as it 3364a48860cSAlp Dener is used internally within the minimization solvers. 3374a48860cSAlp Dener 3384a48860cSAlp Dener TaoComputeResidualJacobian() is typically used within least-squares 3394a48860cSAlp Dener implementations, so most users would not generally call this routine 3404a48860cSAlp Dener themselves. 3414a48860cSAlp Dener 3424a48860cSAlp Dener Level: developer 3434a48860cSAlp Dener 344db781477SPatrick Sanan .seealso: `TaoComputeResidual()`, `TaoSetJacobianResidual()` 3454a48860cSAlp Dener @*/ 3464a48860cSAlp Dener PetscErrorCode TaoComputeResidualJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 3474a48860cSAlp Dener { 3484a48860cSAlp Dener PetscFunctionBegin; 3494a48860cSAlp Dener PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3504a48860cSAlp Dener PetscValidHeaderSpecific(X, VEC_CLASSID,2); 3514a48860cSAlp Dener PetscCheckSameComm(tao,1,X,2); 3523c859ba3SBarry Smith PetscCheck(tao->ops->computeresidualjacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetResidualJacobian() first"); 3534a48860cSAlp Dener ++tao->njac; 3549566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 3559566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 3564a48860cSAlp Dener PetscStackPush("Tao user least-squares residual Jacobian function"); 3579566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeresidualjacobian)(tao,X,J,Jpre,tao->user_lsjacP)); 3584a48860cSAlp Dener PetscStackPop; 3599566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 3609566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 3614a48860cSAlp Dener PetscFunctionReturn(0); 3624a48860cSAlp Dener } 3634a48860cSAlp Dener 3644a48860cSAlp Dener /*@C 365a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 366a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 367a7e14dcfSSatish Balay 368441846f8SBarry Smith Collective on Tao 369a7e14dcfSSatish Balay 370a7e14dcfSSatish Balay Input Parameters: 371f4c1ad5cSStefano Zampini + tao - the Tao solver context 372f4c1ad5cSStefano Zampini - X - input vector 373a7e14dcfSSatish Balay 374a7e14dcfSSatish Balay Output Parameters: 3756b867d5aSJose E. Roman + J - Jacobian matrix 3766b867d5aSJose E. Roman . Jpre - Preconditioning matrix 3776b867d5aSJose E. Roman - Jinv - 378a7e14dcfSSatish Balay 379a7e14dcfSSatish Balay Notes: 380a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 381a7e14dcfSSatish Balay is used internally within the minimization solvers. 382a7e14dcfSSatish Balay 383a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 384a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 385a7e14dcfSSatish Balay themselves. 386a7e14dcfSSatish Balay 387a7e14dcfSSatish Balay Level: developer 388a7e14dcfSSatish Balay 389db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()` 390a7e14dcfSSatish Balay @*/ 391ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv) 392a7e14dcfSSatish Balay { 393a7e14dcfSSatish Balay PetscFunctionBegin; 394441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 395a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 396a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 3973c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianstate,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 398a7e14dcfSSatish Balay ++tao->njac_state; 3999566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 4009566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 401441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 4029566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP)); 403a7e14dcfSSatish Balay PetscStackPop; 4049566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 4059566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 406a7e14dcfSSatish Balay PetscFunctionReturn(0); 407a7e14dcfSSatish Balay } 408a7e14dcfSSatish Balay 409a7e14dcfSSatish Balay /*@C 410a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 411a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 412a7e14dcfSSatish Balay 413441846f8SBarry Smith Collective on Tao 414a7e14dcfSSatish Balay 415a7e14dcfSSatish Balay Input Parameters: 416f4c1ad5cSStefano Zampini + tao - the Tao solver context 417f4c1ad5cSStefano Zampini - X - input vector 418a7e14dcfSSatish Balay 419a7e14dcfSSatish Balay Output Parameters: 420f4c1ad5cSStefano Zampini . J - Jacobian matrix 421a7e14dcfSSatish Balay 422a7e14dcfSSatish Balay Notes: 423a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 424a7e14dcfSSatish Balay is used internally within the minimization solvers. 425a7e14dcfSSatish Balay 426a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 427a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 428a7e14dcfSSatish Balay themselves. 429a7e14dcfSSatish Balay 430a7e14dcfSSatish Balay Level: developer 431a7e14dcfSSatish Balay 432db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianDesignRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()` 433a7e14dcfSSatish Balay @*/ 43494ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 435a7e14dcfSSatish Balay { 436a7e14dcfSSatish Balay PetscFunctionBegin; 437441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 438a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 439a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 4403c859ba3SBarry Smith PetscCheck(tao->ops->computejacobiandesign,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 441a7e14dcfSSatish Balay ++tao->njac_design; 4429566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 4439566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,NULL)); 444441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 4459566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP)); 446a7e14dcfSSatish Balay PetscStackPop; 4479566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,NULL)); 4489566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 449a7e14dcfSSatish Balay PetscFunctionReturn(0); 450a7e14dcfSSatish Balay } 451a7e14dcfSSatish Balay 452a7e14dcfSSatish Balay /*@C 453a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 454a7e14dcfSSatish Balay 455441846f8SBarry Smith Logically collective on Tao 456a7e14dcfSSatish Balay 457a7e14dcfSSatish Balay Input Parameters: 458441846f8SBarry Smith + tao - the Tao context 459a7e14dcfSSatish Balay . J - Matrix used for the jacobian 460a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 461f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 462a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 4636c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 464a7e14dcfSSatish Balay 465f4c1ad5cSStefano Zampini Calling sequence of func: 466f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 467a7e14dcfSSatish Balay 468441846f8SBarry Smith + tao - the Tao context 469a7e14dcfSSatish Balay . x - input vector 470a7e14dcfSSatish Balay . J - Jacobian matrix 471f4c1ad5cSStefano Zampini . Jpre - preconditioning matrix, usually the same as J 472a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 473a7e14dcfSSatish Balay 474a7e14dcfSSatish Balay Level: intermediate 475a7e14dcfSSatish Balay @*/ 476ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 477a7e14dcfSSatish Balay { 478a7e14dcfSSatish Balay PetscFunctionBegin; 479441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 480a7e14dcfSSatish Balay if (J) { 481a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 482a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 483a7e14dcfSSatish Balay } 484a7e14dcfSSatish Balay if (Jpre) { 485a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 486a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 487a7e14dcfSSatish Balay } 488a7e14dcfSSatish Balay if (ctx) { 489a7e14dcfSSatish Balay tao->user_jacP = ctx; 490a7e14dcfSSatish Balay } 491a7e14dcfSSatish Balay if (func) { 492a7e14dcfSSatish Balay tao->ops->computejacobian = func; 493a7e14dcfSSatish Balay } 494a7e14dcfSSatish Balay if (J) { 4959566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 4969566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian)); 497a7e14dcfSSatish Balay tao->jacobian = J; 498a7e14dcfSSatish Balay } 499a7e14dcfSSatish Balay if (Jpre) { 5009566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 5019566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_pre)); 502a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 503a7e14dcfSSatish Balay } 504a7e14dcfSSatish Balay PetscFunctionReturn(0); 505a7e14dcfSSatish Balay } 506a7e14dcfSSatish Balay 507a7e14dcfSSatish Balay /*@C 5084ffbe8acSAlp Dener TaoSetJacobianResidualRoutine - Sets the function to compute the least-squares residual Jacobian as well as the 5094a48860cSAlp Dener location to store the matrix. 5104a48860cSAlp Dener 5114a48860cSAlp Dener Logically collective on Tao 5124a48860cSAlp Dener 5134a48860cSAlp Dener Input Parameters: 5144a48860cSAlp Dener + tao - the Tao context 5154a48860cSAlp Dener . J - Matrix used for the jacobian 5164a48860cSAlp Dener . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 5174a48860cSAlp Dener . func - Jacobian evaluation routine 5184a48860cSAlp Dener - ctx - [optional] user-defined context for private data for the 5194a48860cSAlp Dener Jacobian evaluation routine (may be NULL) 5204a48860cSAlp Dener 5214a48860cSAlp Dener Calling sequence of func: 5224a48860cSAlp Dener $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 5234a48860cSAlp Dener 5244a48860cSAlp Dener + tao - the Tao context 5254a48860cSAlp Dener . x - input vector 5264a48860cSAlp Dener . J - Jacobian matrix 5274a48860cSAlp Dener . Jpre - preconditioning matrix, usually the same as J 5284a48860cSAlp Dener - ctx - [optional] user-defined Jacobian context 5294a48860cSAlp Dener 5304a48860cSAlp Dener Level: intermediate 5314a48860cSAlp Dener @*/ 5324ffbe8acSAlp Dener PetscErrorCode TaoSetJacobianResidualRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 5334a48860cSAlp Dener { 5344a48860cSAlp Dener PetscFunctionBegin; 5354a48860cSAlp Dener PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 5364a48860cSAlp Dener if (J) { 5374a48860cSAlp Dener PetscValidHeaderSpecific(J,MAT_CLASSID,2); 5384a48860cSAlp Dener PetscCheckSameComm(tao,1,J,2); 5394a48860cSAlp Dener } 5404a48860cSAlp Dener if (Jpre) { 5414a48860cSAlp Dener PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 5424a48860cSAlp Dener PetscCheckSameComm(tao,1,Jpre,3); 5434a48860cSAlp Dener } 5444a48860cSAlp Dener if (ctx) { 5454a48860cSAlp Dener tao->user_lsjacP = ctx; 5464a48860cSAlp Dener } 5474a48860cSAlp Dener if (func) { 5484a48860cSAlp Dener tao->ops->computeresidualjacobian = func; 5494a48860cSAlp Dener } 5504a48860cSAlp Dener if (J) { 5519566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 5529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->ls_jac)); 5534a48860cSAlp Dener tao->ls_jac = J; 5544a48860cSAlp Dener } 5554a48860cSAlp Dener if (Jpre) { 5569566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 5579566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->ls_jac_pre)); 5584a48860cSAlp Dener tao->ls_jac_pre=Jpre; 5594a48860cSAlp Dener } 5604a48860cSAlp Dener PetscFunctionReturn(0); 5614a48860cSAlp Dener } 5624a48860cSAlp Dener 5634a48860cSAlp Dener /*@C 564a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 565a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 566a7e14dcfSSatish Balay Used only for pde-constrained optimization. 567a7e14dcfSSatish Balay 568441846f8SBarry Smith Logically collective on Tao 569a7e14dcfSSatish Balay 570a7e14dcfSSatish Balay Input Parameters: 571441846f8SBarry Smith + tao - the Tao context 572a7e14dcfSSatish Balay . J - Matrix used for the jacobian 5736c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 5746c23d075SBarry 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. 575f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 576a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 5776c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 578a7e14dcfSSatish Balay 579f4c1ad5cSStefano Zampini Calling sequence of func: 580f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,Mat Jinv,void *ctx); 581a7e14dcfSSatish Balay 582441846f8SBarry Smith + tao - the Tao context 583a7e14dcfSSatish Balay . x - input vector 584a7e14dcfSSatish Balay . J - Jacobian matrix 585a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 586a7e14dcfSSatish Balay . Jinv - inverse of J 587a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 588a7e14dcfSSatish Balay 589a7e14dcfSSatish Balay Level: intermediate 590db781477SPatrick Sanan .seealso: `TaoComputeJacobianState()`, `TaoSetJacobianDesignRoutine()`, `TaoSetStateDesignIS()` 591a7e14dcfSSatish Balay @*/ 592ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, void*), void *ctx) 593a7e14dcfSSatish Balay { 594a7e14dcfSSatish Balay PetscFunctionBegin; 595441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 596a7e14dcfSSatish Balay if (J) { 597a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 598a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 599a7e14dcfSSatish Balay } 600a7e14dcfSSatish Balay if (Jpre) { 601a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 602a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 603a7e14dcfSSatish Balay } 604a7e14dcfSSatish Balay if (Jinv) { 605a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 606a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 607a7e14dcfSSatish Balay } 608a7e14dcfSSatish Balay if (ctx) { 609a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 610a7e14dcfSSatish Balay } 611a7e14dcfSSatish Balay if (func) { 612a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 613a7e14dcfSSatish Balay } 614a7e14dcfSSatish Balay if (J) { 6159566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 6169566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state)); 617a7e14dcfSSatish Balay tao->jacobian_state = J; 618a7e14dcfSSatish Balay } 619a7e14dcfSSatish Balay if (Jpre) { 6209566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 6219566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state_pre)); 622a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 623a7e14dcfSSatish Balay } 624a7e14dcfSSatish Balay if (Jinv) { 6259566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jinv)); 6269566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state_inv)); 627a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 628a7e14dcfSSatish Balay } 629a7e14dcfSSatish Balay PetscFunctionReturn(0); 630a7e14dcfSSatish Balay } 631a7e14dcfSSatish Balay 632a7e14dcfSSatish Balay /*@C 633a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 634a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 635a7e14dcfSSatish Balay pde-constrained optimization. 636a7e14dcfSSatish Balay 637441846f8SBarry Smith Logically collective on Tao 638a7e14dcfSSatish Balay 639a7e14dcfSSatish Balay Input Parameters: 640441846f8SBarry Smith + tao - the Tao context 641a7e14dcfSSatish Balay . J - Matrix used for the jacobian 642f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 643a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 6446c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 645a7e14dcfSSatish Balay 646f4c1ad5cSStefano Zampini Calling sequence of func: 647f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,void *ctx); 648a7e14dcfSSatish Balay 649441846f8SBarry Smith + tao - the Tao context 650a7e14dcfSSatish Balay . x - input vector 651a7e14dcfSSatish Balay . J - Jacobian matrix 652a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 653a7e14dcfSSatish Balay 654a7e14dcfSSatish Balay Level: intermediate 655f4c1ad5cSStefano Zampini 656db781477SPatrick Sanan .seealso: `TaoComputeJacobianDesign()`, `TaoSetJacobianStateRoutine()`, `TaoSetStateDesignIS()` 657a7e14dcfSSatish Balay @*/ 65894ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 659a7e14dcfSSatish Balay { 660a7e14dcfSSatish Balay PetscFunctionBegin; 661441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 662a7e14dcfSSatish Balay if (J) { 663a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 664a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 665a7e14dcfSSatish Balay } 666a7e14dcfSSatish Balay if (ctx) { 667a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 668a7e14dcfSSatish Balay } 669a7e14dcfSSatish Balay if (func) { 670a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 671a7e14dcfSSatish Balay } 672a7e14dcfSSatish Balay if (J) { 6739566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 6749566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_design)); 675a7e14dcfSSatish Balay tao->jacobian_design = J; 676a7e14dcfSSatish Balay } 677a7e14dcfSSatish Balay PetscFunctionReturn(0); 678a7e14dcfSSatish Balay } 679a7e14dcfSSatish Balay 680a7e14dcfSSatish Balay /*@ 681441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 682a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 683a7e14dcfSSatish Balay pde-constrained optimization. 684a7e14dcfSSatish Balay 685441846f8SBarry Smith Logically Collective on Tao 686a7e14dcfSSatish Balay 687a7e14dcfSSatish Balay Input Parameters: 688441846f8SBarry Smith + tao - The Tao context 689a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 690a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 691a7e14dcfSSatish Balay 692a7e14dcfSSatish Balay Level: intermediate 693a7e14dcfSSatish Balay 694db781477SPatrick Sanan .seealso: `TaoSetJacobianStateRoutine()`, `TaoSetJacobianDesignRoutine()` 695a7e14dcfSSatish Balay @*/ 696441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 697a7e14dcfSSatish Balay { 69845cf516eSBarry Smith PetscFunctionBegin; 6999566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)s_is)); 7009566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tao->state_is)); 701a7e14dcfSSatish Balay tao->state_is = s_is; 7029566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)(d_is))); 7039566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tao->design_is)); 704a7e14dcfSSatish Balay tao->design_is = d_is; 705a7e14dcfSSatish Balay PetscFunctionReturn(0); 706a7e14dcfSSatish Balay } 707a7e14dcfSSatish Balay 708a7e14dcfSSatish Balay /*@C 709a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 710a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 711a7e14dcfSSatish Balay 712441846f8SBarry Smith Collective on Tao 713a7e14dcfSSatish Balay 714a7e14dcfSSatish Balay Input Parameters: 715f4c1ad5cSStefano Zampini + tao - the Tao solver context 716f4c1ad5cSStefano Zampini - X - input vector 717a7e14dcfSSatish Balay 718a7e14dcfSSatish Balay Output Parameters: 719f4c1ad5cSStefano Zampini + J - Jacobian matrix 720f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 721a7e14dcfSSatish Balay 722a7e14dcfSSatish Balay Notes: 723a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 724a7e14dcfSSatish Balay is used internally within the minimization solvers. 725a7e14dcfSSatish Balay 726a7e14dcfSSatish Balay Level: developer 727a7e14dcfSSatish Balay 728db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()` 729a7e14dcfSSatish Balay @*/ 730ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre) 731a7e14dcfSSatish Balay { 732a7e14dcfSSatish Balay PetscFunctionBegin; 733441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 734a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 735a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 7363c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 737a7e14dcfSSatish Balay ++tao->njac_equality; 7389566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 7399566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 740441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 7419566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP)); 742a7e14dcfSSatish Balay PetscStackPop; 7439566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 7449566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 745a7e14dcfSSatish Balay PetscFunctionReturn(0); 746a7e14dcfSSatish Balay } 747a7e14dcfSSatish Balay 748a7e14dcfSSatish Balay /*@C 749a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 750a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 751a7e14dcfSSatish Balay 752441846f8SBarry Smith Collective on Tao 753a7e14dcfSSatish Balay 754a7e14dcfSSatish Balay Input Parameters: 755f4c1ad5cSStefano Zampini + tao - the Tao solver context 756f4c1ad5cSStefano Zampini - X - input vector 757a7e14dcfSSatish Balay 758a7e14dcfSSatish Balay Output Parameters: 759f4c1ad5cSStefano Zampini + J - Jacobian matrix 760f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 761a7e14dcfSSatish Balay 762a7e14dcfSSatish Balay Notes: 763a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 764a7e14dcfSSatish Balay is used internally within the minimization solvers. 765a7e14dcfSSatish Balay 766a7e14dcfSSatish Balay Level: developer 767a7e14dcfSSatish Balay 768db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoComputeObjectiveAndGradient()`, `TaoSetJacobianStateRoutine()`, `TaoComputeJacobianDesign()`, `TaoSetStateDesignIS()` 769a7e14dcfSSatish Balay @*/ 770ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre) 771a7e14dcfSSatish Balay { 772a7e14dcfSSatish Balay PetscFunctionBegin; 773441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 774a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 775a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 7763c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianinequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 777a7e14dcfSSatish Balay ++tao->njac_inequality; 7789566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 7799566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 780441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 7819566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP)); 782a7e14dcfSSatish Balay PetscStackPop; 7839566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 7849566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 785a7e14dcfSSatish Balay PetscFunctionReturn(0); 786a7e14dcfSSatish Balay } 787a7e14dcfSSatish Balay 788a7e14dcfSSatish Balay /*@C 789a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 790a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 791a7e14dcfSSatish Balay Used only for pde-constrained optimization. 792a7e14dcfSSatish Balay 793441846f8SBarry Smith Logically collective on Tao 794a7e14dcfSSatish Balay 795a7e14dcfSSatish Balay Input Parameters: 796441846f8SBarry Smith + tao - the Tao context 797a7e14dcfSSatish Balay . J - Matrix used for the jacobian 798a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 799f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 800a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 8016c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 802a7e14dcfSSatish Balay 803f4c1ad5cSStefano Zampini Calling sequence of func: 804f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 805a7e14dcfSSatish Balay 806441846f8SBarry Smith + tao - the Tao context 807a7e14dcfSSatish Balay . x - input vector 808a7e14dcfSSatish Balay . J - Jacobian matrix 809a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 810a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 811a7e14dcfSSatish Balay 812a7e14dcfSSatish Balay Level: intermediate 813f4c1ad5cSStefano Zampini 814db781477SPatrick Sanan .seealso: `TaoComputeJacobianEquality()`, `TaoSetJacobianDesignRoutine()`, `TaoSetEqualityDesignIS()` 815a7e14dcfSSatish Balay @*/ 816ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 817a7e14dcfSSatish Balay { 818a7e14dcfSSatish Balay PetscFunctionBegin; 819441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 820a7e14dcfSSatish Balay if (J) { 821a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 822a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 823a7e14dcfSSatish Balay } 824a7e14dcfSSatish Balay if (Jpre) { 825a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 826a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 827a7e14dcfSSatish Balay } 828a7e14dcfSSatish Balay if (ctx) { 829a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 830a7e14dcfSSatish Balay } 831a7e14dcfSSatish Balay if (func) { 832a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 833a7e14dcfSSatish Balay } 834a7e14dcfSSatish Balay if (J) { 8359566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 8369566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_equality)); 837a7e14dcfSSatish Balay tao->jacobian_equality = J; 838a7e14dcfSSatish Balay } 839a7e14dcfSSatish Balay if (Jpre) { 8409566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 8419566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_equality_pre)); 842a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 843a7e14dcfSSatish Balay } 844a7e14dcfSSatish Balay PetscFunctionReturn(0); 845a7e14dcfSSatish Balay } 846a7e14dcfSSatish Balay 847a7e14dcfSSatish Balay /*@C 848a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 849a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 850a7e14dcfSSatish Balay Used only for pde-constrained optimization. 851a7e14dcfSSatish Balay 852441846f8SBarry Smith Logically collective on Tao 853a7e14dcfSSatish Balay 854a7e14dcfSSatish Balay Input Parameters: 855441846f8SBarry Smith + tao - the Tao context 856a7e14dcfSSatish Balay . J - Matrix used for the jacobian 857a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 858f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 859a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 8606c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 861a7e14dcfSSatish Balay 862f4c1ad5cSStefano Zampini Calling sequence of func: 863f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 864a7e14dcfSSatish Balay 865441846f8SBarry Smith + tao - the Tao context 866a7e14dcfSSatish Balay . x - input vector 867a7e14dcfSSatish Balay . J - Jacobian matrix 868a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 869a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 870a7e14dcfSSatish Balay 871a7e14dcfSSatish Balay Level: intermediate 872f4c1ad5cSStefano Zampini 873db781477SPatrick Sanan .seealso: `TaoComputeJacobianInequality()`, `TaoSetJacobianDesignRoutine()`, `TaoSetInequalityDesignIS()` 874a7e14dcfSSatish Balay @*/ 875ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 876a7e14dcfSSatish Balay { 877a7e14dcfSSatish Balay PetscFunctionBegin; 878441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 879a7e14dcfSSatish Balay if (J) { 880a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 881a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 882a7e14dcfSSatish Balay } 883a7e14dcfSSatish Balay if (Jpre) { 884a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 885a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 886a7e14dcfSSatish Balay } 887a7e14dcfSSatish Balay if (ctx) { 888a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 889a7e14dcfSSatish Balay } 890a7e14dcfSSatish Balay if (func) { 891a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 892a7e14dcfSSatish Balay } 893a7e14dcfSSatish Balay if (J) { 8949566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 8959566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_inequality)); 896a7e14dcfSSatish Balay tao->jacobian_inequality = J; 897a7e14dcfSSatish Balay } 898a7e14dcfSSatish Balay if (Jpre) { 8999566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 9009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_inequality_pre)); 901a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 902a7e14dcfSSatish Balay } 903a7e14dcfSSatish Balay PetscFunctionReturn(0); 904a7e14dcfSSatish Balay } 905