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 27a82e8c82SStefano Zampini .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) { 44*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)H)); 45*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->hessian)); 46a7e14dcfSSatish Balay tao->hessian = H; 47a7e14dcfSSatish Balay } 48a7e14dcfSSatish Balay if (Hpre) { 49*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Hpre)); 50*9566063dSJacob 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 81a82e8c82SStefano Zampini .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 PetscErrorCode ierr; 9909baa881SHong Zhang PetscReal nrm,gnorm; 10009baa881SHong Zhang PetscReal threshold = 1.e-5; 10109baa881SHong Zhang PetscInt m,n,M,N; 10209baa881SHong Zhang PetscBool complete_print = PETSC_FALSE,test = PETSC_FALSE,flg; 103f49d1c87SHong Zhang PetscViewer viewer,mviewer; 10409baa881SHong Zhang MPI_Comm comm; 10509baa881SHong Zhang PetscInt tabs; 10609baa881SHong Zhang static PetscBool directionsprinted = PETSC_FALSE; 107f49d1c87SHong Zhang PetscViewerFormat format; 10809baa881SHong Zhang 10909baa881SHong Zhang PetscFunctionBegin; 110*9566063dSJacob Faibussowitsch ierr = PetscObjectOptionsBegin((PetscObject)tao);PetscCall(ierr); 111*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsName("-tao_test_hessian","Compare hand-coded and finite difference Hessians","None",&test)); 112*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_test_hessian", "Threshold for element difference between hand-coded and finite difference being meaningful","None",threshold,&threshold,NULL)); 113*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsViewer("-tao_test_hessian_view","View difference between hand-coded and finite difference Hessians element entries","None",&mviewer,&format,&complete_print)); 114*9566063dSJacob Faibussowitsch ierr = PetscOptionsEnd();PetscCall(ierr); 11509baa881SHong Zhang if (!test) PetscFunctionReturn(0); 11609baa881SHong Zhang 117*9566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)tao,&comm)); 118*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetStdout(comm,&viewer)); 119*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tabs)); 120*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel)); 121*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," ---------- Testing Hessian -------------\n")); 12209baa881SHong Zhang if (!complete_print && !directionsprinted) { 123*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," Run with -tao_test_hessian_view and optionally -tao_test_hessian <threshold> to show difference\n")); 124*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," of hand-coded and finite difference Hessian entries greater than <threshold>.\n")); 12509baa881SHong Zhang } 12609baa881SHong Zhang if (!directionsprinted) { 127*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," Testing hand-coded Hessian, if (for double precision runs) ||J - Jfd||_F/||J||_F is\n")); 128*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," O(1.e-8), the hand-coded Hessian is probably correct.\n")); 12909baa881SHong Zhang directionsprinted = PETSC_TRUE; 13009baa881SHong Zhang } 131f49d1c87SHong Zhang if (complete_print) { 132*9566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(mviewer,format)); 133f49d1c87SHong Zhang } 13409baa881SHong Zhang 135*9566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tao->hessian,MATMFFD,&flg)); 13609baa881SHong Zhang if (!flg) hessian = tao->hessian; 13709baa881SHong Zhang else hessian = tao->hessian_pre; 13809baa881SHong Zhang 13909baa881SHong Zhang while (hessian) { 140*9566063dSJacob Faibussowitsch PetscCall(PetscObjectBaseTypeCompareAny((PetscObject)hessian,&flg,MATSEQAIJ,MATMPIAIJ,MATSEQDENSE,MATMPIDENSE,MATSEQBAIJ,MATMPIBAIJ,MATSEQSBAIJ,MATMPIBAIJ,"")); 14109baa881SHong Zhang if (flg) { 14209baa881SHong Zhang A = hessian; 143*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)A)); 14409baa881SHong Zhang } else { 145*9566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(hessian,MATAIJ,&A)); 14609baa881SHong Zhang } 14709baa881SHong Zhang 148*9566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&B)); 149*9566063dSJacob Faibussowitsch PetscCall(MatGetSize(A,&M,&N)); 150*9566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(A,&m,&n)); 151*9566063dSJacob Faibussowitsch PetscCall(MatSetSizes(B,m,n,M,N)); 152*9566063dSJacob Faibussowitsch PetscCall(MatSetType(B,((PetscObject)A)->type_name)); 153*9566063dSJacob Faibussowitsch PetscCall(MatSetUp(B)); 154*9566063dSJacob Faibussowitsch PetscCall(MatSetOption(B,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE)); 15509baa881SHong Zhang 156*9566063dSJacob Faibussowitsch PetscCall(TaoDefaultComputeHessian(tao,x,B,B,NULL)); 15709baa881SHong Zhang 158*9566063dSJacob Faibussowitsch PetscCall(MatDuplicate(B,MAT_COPY_VALUES,&D)); 159*9566063dSJacob Faibussowitsch PetscCall(MatAYPX(D,-1.0,A,DIFFERENT_NONZERO_PATTERN)); 160*9566063dSJacob Faibussowitsch PetscCall(MatNorm(D,NORM_FROBENIUS,&nrm)); 161*9566063dSJacob Faibussowitsch PetscCall(MatNorm(A,NORM_FROBENIUS,&gnorm)); 162*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&D)); 16309baa881SHong Zhang if (!gnorm) gnorm = 1; /* just in case */ 164*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," ||H - Hfd||_F/||H||_F = %g, ||H - Hfd||_F = %g\n",(double)(nrm/gnorm),(double)nrm)); 16509baa881SHong Zhang 16609baa881SHong Zhang if (complete_print) { 167*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," Hand-coded Hessian ----------\n")); 168*9566063dSJacob Faibussowitsch PetscCall(MatView(A,mviewer)); 169*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," Finite difference Hessian ----------\n")); 170*9566063dSJacob Faibussowitsch PetscCall(MatView(B,mviewer)); 17109baa881SHong Zhang } 17209baa881SHong Zhang 17309baa881SHong Zhang if (complete_print) { 17409baa881SHong Zhang PetscInt Istart, Iend, *ccols, bncols, cncols, j, row; 17509baa881SHong Zhang PetscScalar *cvals; 17609baa881SHong Zhang const PetscInt *bcols; 17709baa881SHong Zhang const PetscScalar *bvals; 17809baa881SHong Zhang 179*9566063dSJacob Faibussowitsch PetscCall(MatAYPX(B,-1.0,A,DIFFERENT_NONZERO_PATTERN)); 180*9566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&C)); 181*9566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C,m,n,M,N)); 182*9566063dSJacob Faibussowitsch PetscCall(MatSetType(C,((PetscObject)A)->type_name)); 183*9566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 184*9566063dSJacob Faibussowitsch PetscCall(MatSetOption(C,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE)); 185*9566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(B,&Istart,&Iend)); 18609baa881SHong Zhang 18709baa881SHong Zhang for (row = Istart; row < Iend; row++) { 188*9566063dSJacob Faibussowitsch PetscCall(MatGetRow(B,row,&bncols,&bcols,&bvals)); 189*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(bncols,&ccols,bncols,&cvals)); 19009baa881SHong Zhang for (j = 0, cncols = 0; j < bncols; j++) { 19109baa881SHong Zhang if (PetscAbsScalar(bvals[j]) > threshold) { 19209baa881SHong Zhang ccols[cncols] = bcols[j]; 19309baa881SHong Zhang cvals[cncols] = bvals[j]; 19409baa881SHong Zhang cncols += 1; 19509baa881SHong Zhang } 19609baa881SHong Zhang } 19709baa881SHong Zhang if (cncols) { 198*9566063dSJacob Faibussowitsch PetscCall(MatSetValues(C,1,&row,cncols,ccols,cvals,INSERT_VALUES)); 19909baa881SHong Zhang } 200*9566063dSJacob Faibussowitsch PetscCall(MatRestoreRow(B,row,&bncols,&bcols,&bvals)); 201*9566063dSJacob Faibussowitsch PetscCall(PetscFree2(ccols,cvals)); 20209baa881SHong Zhang } 203*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); 204*9566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); 205*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," Finite-difference minus hand-coded Hessian with tolerance %g ----------\n",(double)threshold)); 206*9566063dSJacob Faibussowitsch PetscCall(MatView(C,mviewer)); 207*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 20809baa881SHong Zhang } 209*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 210*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B)); 21109baa881SHong Zhang 21209baa881SHong Zhang if (hessian != tao->hessian_pre) { 21309baa881SHong Zhang hessian = tao->hessian_pre; 214*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," ---------- Testing Hessian for preconditioner -------------\n")); 21509baa881SHong Zhang } else hessian = NULL; 21609baa881SHong Zhang } 217f49d1c87SHong Zhang if (complete_print) { 218*9566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(mviewer)); 219*9566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&mviewer)); 220f49d1c87SHong Zhang } 221*9566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer,tabs)); 22209baa881SHong Zhang PetscFunctionReturn(0); 22309baa881SHong Zhang } 22409baa881SHong Zhang 225a7e14dcfSSatish Balay /*@C 226a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 227a82e8c82SStefano Zampini set with TaoSetHessian(). 228a7e14dcfSSatish Balay 229441846f8SBarry Smith Collective on Tao 230a7e14dcfSSatish Balay 231a7e14dcfSSatish Balay Input Parameters: 232f4c1ad5cSStefano Zampini + tao - the Tao solver context 233f4c1ad5cSStefano Zampini - X - input vector 234a7e14dcfSSatish Balay 235a7e14dcfSSatish Balay Output Parameters: 236a7e14dcfSSatish Balay + H - Hessian matrix 237aa6c7ce3SBarry Smith - Hpre - Preconditioning matrix 238a7e14dcfSSatish Balay 23909baa881SHong Zhang Options Database Keys: 24009baa881SHong Zhang + -tao_test_hessian - compare the user provided Hessian with one compute via finite differences to check for errors 24109baa881SHong 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 242dfe02fe6SHong 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 24309baa881SHong Zhang 244a7e14dcfSSatish Balay Notes: 245a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 246a7e14dcfSSatish Balay is used internally within the minimization solvers. 247a7e14dcfSSatish Balay 248a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 249a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 250a7e14dcfSSatish Balay themselves. 251a7e14dcfSSatish Balay 25209baa881SHong Zhang Developer Notes: 25309baa881SHong Zhang The Hessian test mechanism follows SNESTestJacobian(). 25409baa881SHong Zhang 255a7e14dcfSSatish Balay Level: developer 256a7e14dcfSSatish Balay 257a82e8c82SStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian() 258a7e14dcfSSatish Balay @*/ 259ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre) 260a7e14dcfSSatish Balay { 261a7e14dcfSSatish Balay PetscFunctionBegin; 262441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 263a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 264a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 2653c859ba3SBarry Smith PetscCheck(tao->ops->computehessian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first"); 266a7e14dcfSSatish Balay ++tao->nhess; 267*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 268*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_HessianEval,tao,X,H,Hpre)); 269441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 270*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP)); 271a7e14dcfSSatish Balay PetscStackPop; 272*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_HessianEval,tao,X,H,Hpre)); 273*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 27409baa881SHong Zhang 275*9566063dSJacob Faibussowitsch PetscCall(TaoTestHessian(tao)); 276a7e14dcfSSatish Balay PetscFunctionReturn(0); 277a7e14dcfSSatish Balay } 278a7e14dcfSSatish Balay 279a7e14dcfSSatish Balay /*@C 280a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 281a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 282a7e14dcfSSatish Balay 283441846f8SBarry Smith Collective on Tao 284a7e14dcfSSatish Balay 285a7e14dcfSSatish Balay Input Parameters: 286f4c1ad5cSStefano Zampini + tao - the Tao solver context 287f4c1ad5cSStefano Zampini - X - input vector 288a7e14dcfSSatish Balay 289a7e14dcfSSatish Balay Output Parameters: 290f4c1ad5cSStefano Zampini + J - Jacobian matrix 291f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 292a7e14dcfSSatish Balay 293a7e14dcfSSatish Balay Notes: 294a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 295a7e14dcfSSatish Balay is used internally within the minimization solvers. 296a7e14dcfSSatish Balay 297a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 298a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 299a7e14dcfSSatish Balay themselves. 300a7e14dcfSSatish Balay 301a7e14dcfSSatish Balay Level: developer 302a7e14dcfSSatish Balay 303f4c1ad5cSStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianRoutine() 304a7e14dcfSSatish Balay @*/ 305ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 306a7e14dcfSSatish Balay { 307a7e14dcfSSatish Balay PetscFunctionBegin; 308441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 309a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 310a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 3113c859ba3SBarry Smith PetscCheck(tao->ops->computejacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 312a7e14dcfSSatish Balay ++tao->njac; 313*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 314*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 315441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 316*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP)); 317a7e14dcfSSatish Balay PetscStackPop; 318*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 319*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 320a7e14dcfSSatish Balay PetscFunctionReturn(0); 321a7e14dcfSSatish Balay } 322a7e14dcfSSatish Balay 323a7e14dcfSSatish Balay /*@C 3244a48860cSAlp Dener TaoComputeResidualJacobian - Computes the least-squares residual Jacobian matrix that has been 325a6fed868SAlp Dener set with TaoSetJacobianResidual(). 3264a48860cSAlp Dener 3274a48860cSAlp Dener Collective on Tao 3284a48860cSAlp Dener 3294a48860cSAlp Dener Input Parameters: 3304a48860cSAlp Dener + tao - the Tao solver context 3314a48860cSAlp Dener - X - input vector 3324a48860cSAlp Dener 3334a48860cSAlp Dener Output Parameters: 3344a48860cSAlp Dener + J - Jacobian matrix 3354a48860cSAlp Dener - Jpre - Preconditioning matrix 3364a48860cSAlp Dener 3374a48860cSAlp Dener Notes: 3384a48860cSAlp Dener Most users should not need to explicitly call this routine, as it 3394a48860cSAlp Dener is used internally within the minimization solvers. 3404a48860cSAlp Dener 3414a48860cSAlp Dener TaoComputeResidualJacobian() is typically used within least-squares 3424a48860cSAlp Dener implementations, so most users would not generally call this routine 3434a48860cSAlp Dener themselves. 3444a48860cSAlp Dener 3454a48860cSAlp Dener Level: developer 3464a48860cSAlp Dener 347a6fed868SAlp Dener .seealso: TaoComputeResidual(), TaoSetJacobianResidual() 3484a48860cSAlp Dener @*/ 3494a48860cSAlp Dener PetscErrorCode TaoComputeResidualJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 3504a48860cSAlp Dener { 3514a48860cSAlp Dener PetscFunctionBegin; 3524a48860cSAlp Dener PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3534a48860cSAlp Dener PetscValidHeaderSpecific(X, VEC_CLASSID,2); 3544a48860cSAlp Dener PetscCheckSameComm(tao,1,X,2); 3553c859ba3SBarry Smith PetscCheck(tao->ops->computeresidualjacobian,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetResidualJacobian() first"); 3564a48860cSAlp Dener ++tao->njac; 357*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 358*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 3594a48860cSAlp Dener PetscStackPush("Tao user least-squares residual Jacobian function"); 360*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeresidualjacobian)(tao,X,J,Jpre,tao->user_lsjacP)); 3614a48860cSAlp Dener PetscStackPop; 362*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 363*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 3644a48860cSAlp Dener PetscFunctionReturn(0); 3654a48860cSAlp Dener } 3664a48860cSAlp Dener 3674a48860cSAlp Dener /*@C 368a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 369a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 370a7e14dcfSSatish Balay 371441846f8SBarry Smith Collective on Tao 372a7e14dcfSSatish Balay 373a7e14dcfSSatish Balay Input Parameters: 374f4c1ad5cSStefano Zampini + tao - the Tao solver context 375f4c1ad5cSStefano Zampini - X - input vector 376a7e14dcfSSatish Balay 377a7e14dcfSSatish Balay Output Parameters: 3786b867d5aSJose E. Roman + J - Jacobian matrix 3796b867d5aSJose E. Roman . Jpre - Preconditioning matrix 3806b867d5aSJose E. Roman - Jinv - 381a7e14dcfSSatish Balay 382a7e14dcfSSatish Balay Notes: 383a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 384a7e14dcfSSatish Balay is used internally within the minimization solvers. 385a7e14dcfSSatish Balay 386a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 387a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 388a7e14dcfSSatish Balay themselves. 389a7e14dcfSSatish Balay 390a7e14dcfSSatish Balay Level: developer 391a7e14dcfSSatish Balay 392a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 393a7e14dcfSSatish Balay @*/ 394ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv) 395a7e14dcfSSatish Balay { 396a7e14dcfSSatish Balay PetscFunctionBegin; 397441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 398a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 399a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 4003c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianstate,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 401a7e14dcfSSatish Balay ++tao->njac_state; 402*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 403*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 404441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 405*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP)); 406a7e14dcfSSatish Balay PetscStackPop; 407*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 408*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 409a7e14dcfSSatish Balay PetscFunctionReturn(0); 410a7e14dcfSSatish Balay } 411a7e14dcfSSatish Balay 412a7e14dcfSSatish Balay /*@C 413a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 414a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 415a7e14dcfSSatish Balay 416441846f8SBarry Smith Collective on Tao 417a7e14dcfSSatish Balay 418a7e14dcfSSatish Balay Input Parameters: 419f4c1ad5cSStefano Zampini + tao - the Tao solver context 420f4c1ad5cSStefano Zampini - X - input vector 421a7e14dcfSSatish Balay 422a7e14dcfSSatish Balay Output Parameters: 423f4c1ad5cSStefano Zampini . J - Jacobian matrix 424a7e14dcfSSatish Balay 425a7e14dcfSSatish Balay Notes: 426a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 427a7e14dcfSSatish Balay is used internally within the minimization solvers. 428a7e14dcfSSatish Balay 429a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 430a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 431a7e14dcfSSatish Balay themselves. 432a7e14dcfSSatish Balay 433a7e14dcfSSatish Balay Level: developer 434a7e14dcfSSatish Balay 435a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 436a7e14dcfSSatish Balay @*/ 43794ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 438a7e14dcfSSatish Balay { 439a7e14dcfSSatish Balay PetscFunctionBegin; 440441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 441a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 442a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 4433c859ba3SBarry Smith PetscCheck(tao->ops->computejacobiandesign,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 444a7e14dcfSSatish Balay ++tao->njac_design; 445*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 446*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,NULL)); 447441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 448*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP)); 449a7e14dcfSSatish Balay PetscStackPop; 450*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,NULL)); 451*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 452a7e14dcfSSatish Balay PetscFunctionReturn(0); 453a7e14dcfSSatish Balay } 454a7e14dcfSSatish Balay 455a7e14dcfSSatish Balay /*@C 456a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 457a7e14dcfSSatish Balay 458441846f8SBarry Smith Logically collective on Tao 459a7e14dcfSSatish Balay 460a7e14dcfSSatish Balay Input Parameters: 461441846f8SBarry Smith + tao - the Tao context 462a7e14dcfSSatish Balay . J - Matrix used for the jacobian 463a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 464f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 465a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 4666c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 467a7e14dcfSSatish Balay 468f4c1ad5cSStefano Zampini Calling sequence of func: 469f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 470a7e14dcfSSatish Balay 471441846f8SBarry Smith + tao - the Tao context 472a7e14dcfSSatish Balay . x - input vector 473a7e14dcfSSatish Balay . J - Jacobian matrix 474f4c1ad5cSStefano Zampini . Jpre - preconditioning matrix, usually the same as J 475a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 476a7e14dcfSSatish Balay 477a7e14dcfSSatish Balay Level: intermediate 478a7e14dcfSSatish Balay @*/ 479ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 480a7e14dcfSSatish Balay { 481a7e14dcfSSatish Balay PetscFunctionBegin; 482441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 483a7e14dcfSSatish Balay if (J) { 484a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 485a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 486a7e14dcfSSatish Balay } 487a7e14dcfSSatish Balay if (Jpre) { 488a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 489a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 490a7e14dcfSSatish Balay } 491a7e14dcfSSatish Balay if (ctx) { 492a7e14dcfSSatish Balay tao->user_jacP = ctx; 493a7e14dcfSSatish Balay } 494a7e14dcfSSatish Balay if (func) { 495a7e14dcfSSatish Balay tao->ops->computejacobian = func; 496a7e14dcfSSatish Balay } 497a7e14dcfSSatish Balay if (J) { 498*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 499*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian)); 500a7e14dcfSSatish Balay tao->jacobian = J; 501a7e14dcfSSatish Balay } 502a7e14dcfSSatish Balay if (Jpre) { 503*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 504*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_pre)); 505a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 506a7e14dcfSSatish Balay } 507a7e14dcfSSatish Balay PetscFunctionReturn(0); 508a7e14dcfSSatish Balay } 509a7e14dcfSSatish Balay 510a7e14dcfSSatish Balay /*@C 5114ffbe8acSAlp Dener TaoSetJacobianResidualRoutine - Sets the function to compute the least-squares residual Jacobian as well as the 5124a48860cSAlp Dener location to store the matrix. 5134a48860cSAlp Dener 5144a48860cSAlp Dener Logically collective on Tao 5154a48860cSAlp Dener 5164a48860cSAlp Dener Input Parameters: 5174a48860cSAlp Dener + tao - the Tao context 5184a48860cSAlp Dener . J - Matrix used for the jacobian 5194a48860cSAlp Dener . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 5204a48860cSAlp Dener . func - Jacobian evaluation routine 5214a48860cSAlp Dener - ctx - [optional] user-defined context for private data for the 5224a48860cSAlp Dener Jacobian evaluation routine (may be NULL) 5234a48860cSAlp Dener 5244a48860cSAlp Dener Calling sequence of func: 5254a48860cSAlp Dener $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 5264a48860cSAlp Dener 5274a48860cSAlp Dener + tao - the Tao context 5284a48860cSAlp Dener . x - input vector 5294a48860cSAlp Dener . J - Jacobian matrix 5304a48860cSAlp Dener . Jpre - preconditioning matrix, usually the same as J 5314a48860cSAlp Dener - ctx - [optional] user-defined Jacobian context 5324a48860cSAlp Dener 5334a48860cSAlp Dener Level: intermediate 5344a48860cSAlp Dener @*/ 5354ffbe8acSAlp Dener PetscErrorCode TaoSetJacobianResidualRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 5364a48860cSAlp Dener { 5374a48860cSAlp Dener PetscFunctionBegin; 5384a48860cSAlp Dener PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 5394a48860cSAlp Dener if (J) { 5404a48860cSAlp Dener PetscValidHeaderSpecific(J,MAT_CLASSID,2); 5414a48860cSAlp Dener PetscCheckSameComm(tao,1,J,2); 5424a48860cSAlp Dener } 5434a48860cSAlp Dener if (Jpre) { 5444a48860cSAlp Dener PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 5454a48860cSAlp Dener PetscCheckSameComm(tao,1,Jpre,3); 5464a48860cSAlp Dener } 5474a48860cSAlp Dener if (ctx) { 5484a48860cSAlp Dener tao->user_lsjacP = ctx; 5494a48860cSAlp Dener } 5504a48860cSAlp Dener if (func) { 5514a48860cSAlp Dener tao->ops->computeresidualjacobian = func; 5524a48860cSAlp Dener } 5534a48860cSAlp Dener if (J) { 554*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 555*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->ls_jac)); 5564a48860cSAlp Dener tao->ls_jac = J; 5574a48860cSAlp Dener } 5584a48860cSAlp Dener if (Jpre) { 559*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 560*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->ls_jac_pre)); 5614a48860cSAlp Dener tao->ls_jac_pre=Jpre; 5624a48860cSAlp Dener } 5634a48860cSAlp Dener PetscFunctionReturn(0); 5644a48860cSAlp Dener } 5654a48860cSAlp Dener 5664a48860cSAlp Dener /*@C 567a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 568a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 569a7e14dcfSSatish Balay Used only for pde-constrained optimization. 570a7e14dcfSSatish Balay 571441846f8SBarry Smith Logically collective on Tao 572a7e14dcfSSatish Balay 573a7e14dcfSSatish Balay Input Parameters: 574441846f8SBarry Smith + tao - the Tao context 575a7e14dcfSSatish Balay . J - Matrix used for the jacobian 5766c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 5776c23d075SBarry 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. 578f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 579a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 5806c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 581a7e14dcfSSatish Balay 582f4c1ad5cSStefano Zampini Calling sequence of func: 583f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,Mat Jinv,void *ctx); 584a7e14dcfSSatish Balay 585441846f8SBarry Smith + tao - the Tao context 586a7e14dcfSSatish Balay . x - input vector 587a7e14dcfSSatish Balay . J - Jacobian matrix 588a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 589a7e14dcfSSatish Balay . Jinv - inverse of J 590a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 591a7e14dcfSSatish Balay 592a7e14dcfSSatish Balay Level: intermediate 593f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 594a7e14dcfSSatish Balay @*/ 595ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, void*), void *ctx) 596a7e14dcfSSatish Balay { 597a7e14dcfSSatish Balay PetscFunctionBegin; 598441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 599a7e14dcfSSatish Balay if (J) { 600a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 601a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 602a7e14dcfSSatish Balay } 603a7e14dcfSSatish Balay if (Jpre) { 604a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 605a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 606a7e14dcfSSatish Balay } 607a7e14dcfSSatish Balay if (Jinv) { 608a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 609a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 610a7e14dcfSSatish Balay } 611a7e14dcfSSatish Balay if (ctx) { 612a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 613a7e14dcfSSatish Balay } 614a7e14dcfSSatish Balay if (func) { 615a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 616a7e14dcfSSatish Balay } 617a7e14dcfSSatish Balay if (J) { 618*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 619*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state)); 620a7e14dcfSSatish Balay tao->jacobian_state = J; 621a7e14dcfSSatish Balay } 622a7e14dcfSSatish Balay if (Jpre) { 623*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 624*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state_pre)); 625a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 626a7e14dcfSSatish Balay } 627a7e14dcfSSatish Balay if (Jinv) { 628*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jinv)); 629*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_state_inv)); 630a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 631a7e14dcfSSatish Balay } 632a7e14dcfSSatish Balay PetscFunctionReturn(0); 633a7e14dcfSSatish Balay } 634a7e14dcfSSatish Balay 635a7e14dcfSSatish Balay /*@C 636a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 637a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 638a7e14dcfSSatish Balay pde-constrained optimization. 639a7e14dcfSSatish Balay 640441846f8SBarry Smith Logically collective on Tao 641a7e14dcfSSatish Balay 642a7e14dcfSSatish Balay Input Parameters: 643441846f8SBarry Smith + tao - the Tao context 644a7e14dcfSSatish Balay . J - Matrix used for the jacobian 645f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 646a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 6476c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 648a7e14dcfSSatish Balay 649f4c1ad5cSStefano Zampini Calling sequence of func: 650f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,void *ctx); 651a7e14dcfSSatish Balay 652441846f8SBarry Smith + tao - the Tao context 653a7e14dcfSSatish Balay . x - input vector 654a7e14dcfSSatish Balay . J - Jacobian matrix 655a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 656a7e14dcfSSatish Balay 657a7e14dcfSSatish Balay Level: intermediate 658f4c1ad5cSStefano Zampini 659a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 660a7e14dcfSSatish Balay @*/ 66194ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 662a7e14dcfSSatish Balay { 663a7e14dcfSSatish Balay PetscFunctionBegin; 664441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 665a7e14dcfSSatish Balay if (J) { 666a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 667a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 668a7e14dcfSSatish Balay } 669a7e14dcfSSatish Balay if (ctx) { 670a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 671a7e14dcfSSatish Balay } 672a7e14dcfSSatish Balay if (func) { 673a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 674a7e14dcfSSatish Balay } 675a7e14dcfSSatish Balay if (J) { 676*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 677*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_design)); 678a7e14dcfSSatish Balay tao->jacobian_design = J; 679a7e14dcfSSatish Balay } 680a7e14dcfSSatish Balay PetscFunctionReturn(0); 681a7e14dcfSSatish Balay } 682a7e14dcfSSatish Balay 683a7e14dcfSSatish Balay /*@ 684441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 685a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 686a7e14dcfSSatish Balay pde-constrained optimization. 687a7e14dcfSSatish Balay 688441846f8SBarry Smith Logically Collective on Tao 689a7e14dcfSSatish Balay 690a7e14dcfSSatish Balay Input Parameters: 691441846f8SBarry Smith + tao - The Tao context 692a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 693a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 694a7e14dcfSSatish Balay 695a7e14dcfSSatish Balay Level: intermediate 696a7e14dcfSSatish Balay 697a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 698a7e14dcfSSatish Balay @*/ 699441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 700a7e14dcfSSatish Balay { 70145cf516eSBarry Smith PetscFunctionBegin; 702*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)s_is)); 703*9566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tao->state_is)); 704a7e14dcfSSatish Balay tao->state_is = s_is; 705*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)(d_is))); 706*9566063dSJacob Faibussowitsch PetscCall(ISDestroy(&tao->design_is)); 707a7e14dcfSSatish Balay tao->design_is = d_is; 708a7e14dcfSSatish Balay PetscFunctionReturn(0); 709a7e14dcfSSatish Balay } 710a7e14dcfSSatish Balay 711a7e14dcfSSatish Balay /*@C 712a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 713a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 714a7e14dcfSSatish Balay 715441846f8SBarry Smith Collective on Tao 716a7e14dcfSSatish Balay 717a7e14dcfSSatish Balay Input Parameters: 718f4c1ad5cSStefano Zampini + tao - the Tao solver context 719f4c1ad5cSStefano Zampini - X - input vector 720a7e14dcfSSatish Balay 721a7e14dcfSSatish Balay Output Parameters: 722f4c1ad5cSStefano Zampini + J - Jacobian matrix 723f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 724a7e14dcfSSatish Balay 725a7e14dcfSSatish Balay Notes: 726a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 727a7e14dcfSSatish Balay is used internally within the minimization solvers. 728a7e14dcfSSatish Balay 729a7e14dcfSSatish Balay Level: developer 730a7e14dcfSSatish Balay 731a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 732a7e14dcfSSatish Balay @*/ 733ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre) 734a7e14dcfSSatish Balay { 735a7e14dcfSSatish Balay PetscFunctionBegin; 736441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 737a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 738a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 7393c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 740a7e14dcfSSatish Balay ++tao->njac_equality; 741*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 742*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 743441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 744*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP)); 745a7e14dcfSSatish Balay PetscStackPop; 746*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 747*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 748a7e14dcfSSatish Balay PetscFunctionReturn(0); 749a7e14dcfSSatish Balay } 750a7e14dcfSSatish Balay 751a7e14dcfSSatish Balay /*@C 752a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 753a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 754a7e14dcfSSatish Balay 755441846f8SBarry Smith Collective on Tao 756a7e14dcfSSatish Balay 757a7e14dcfSSatish Balay Input Parameters: 758f4c1ad5cSStefano Zampini + tao - the Tao solver context 759f4c1ad5cSStefano Zampini - X - input vector 760a7e14dcfSSatish Balay 761a7e14dcfSSatish Balay Output Parameters: 762f4c1ad5cSStefano Zampini + J - Jacobian matrix 763f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 764a7e14dcfSSatish Balay 765a7e14dcfSSatish Balay Notes: 766a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 767a7e14dcfSSatish Balay is used internally within the minimization solvers. 768a7e14dcfSSatish Balay 769a7e14dcfSSatish Balay Level: developer 770a7e14dcfSSatish Balay 771a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 772a7e14dcfSSatish Balay @*/ 773ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre) 774a7e14dcfSSatish Balay { 775a7e14dcfSSatish Balay PetscFunctionBegin; 776441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 777a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 778a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 7793c859ba3SBarry Smith PetscCheck(tao->ops->computejacobianinequality,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 780a7e14dcfSSatish Balay ++tao->njac_inequality; 781*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(X)); 782*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_JacobianEval,tao,X,J,Jpre)); 783441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 784*9566063dSJacob Faibussowitsch PetscCall((*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP)); 785a7e14dcfSSatish Balay PetscStackPop; 786*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_JacobianEval,tao,X,J,Jpre)); 787*9566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(X)); 788a7e14dcfSSatish Balay PetscFunctionReturn(0); 789a7e14dcfSSatish Balay } 790a7e14dcfSSatish Balay 791a7e14dcfSSatish Balay /*@C 792a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 793a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 794a7e14dcfSSatish Balay Used only for pde-constrained optimization. 795a7e14dcfSSatish Balay 796441846f8SBarry Smith Logically collective on Tao 797a7e14dcfSSatish Balay 798a7e14dcfSSatish Balay Input Parameters: 799441846f8SBarry Smith + tao - the Tao context 800a7e14dcfSSatish Balay . J - Matrix used for the jacobian 801a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 802f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 803a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 8046c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 805a7e14dcfSSatish Balay 806f4c1ad5cSStefano Zampini Calling sequence of func: 807f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 808a7e14dcfSSatish Balay 809441846f8SBarry Smith + tao - the Tao context 810a7e14dcfSSatish Balay . x - input vector 811a7e14dcfSSatish Balay . J - Jacobian matrix 812a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 813a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 814a7e14dcfSSatish Balay 815a7e14dcfSSatish Balay Level: intermediate 816f4c1ad5cSStefano Zampini 817f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 818a7e14dcfSSatish Balay @*/ 819ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 820a7e14dcfSSatish Balay { 821a7e14dcfSSatish Balay PetscFunctionBegin; 822441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 823a7e14dcfSSatish Balay if (J) { 824a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 825a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 826a7e14dcfSSatish Balay } 827a7e14dcfSSatish Balay if (Jpre) { 828a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 829a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 830a7e14dcfSSatish Balay } 831a7e14dcfSSatish Balay if (ctx) { 832a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 833a7e14dcfSSatish Balay } 834a7e14dcfSSatish Balay if (func) { 835a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 836a7e14dcfSSatish Balay } 837a7e14dcfSSatish Balay if (J) { 838*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 839*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_equality)); 840a7e14dcfSSatish Balay tao->jacobian_equality = J; 841a7e14dcfSSatish Balay } 842a7e14dcfSSatish Balay if (Jpre) { 843*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 844*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_equality_pre)); 845a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 846a7e14dcfSSatish Balay } 847a7e14dcfSSatish Balay PetscFunctionReturn(0); 848a7e14dcfSSatish Balay } 849a7e14dcfSSatish Balay 850a7e14dcfSSatish Balay /*@C 851a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 852a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 853a7e14dcfSSatish Balay Used only for pde-constrained optimization. 854a7e14dcfSSatish Balay 855441846f8SBarry Smith Logically collective on Tao 856a7e14dcfSSatish Balay 857a7e14dcfSSatish Balay Input Parameters: 858441846f8SBarry Smith + tao - the Tao context 859a7e14dcfSSatish Balay . J - Matrix used for the jacobian 860a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 861f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 862a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 8636c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 864a7e14dcfSSatish Balay 865f4c1ad5cSStefano Zampini Calling sequence of func: 866f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 867a7e14dcfSSatish Balay 868441846f8SBarry Smith + tao - the Tao context 869a7e14dcfSSatish Balay . x - input vector 870a7e14dcfSSatish Balay . J - Jacobian matrix 871a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 872a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 873a7e14dcfSSatish Balay 874a7e14dcfSSatish Balay Level: intermediate 875f4c1ad5cSStefano Zampini 876f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 877a7e14dcfSSatish Balay @*/ 878ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 879a7e14dcfSSatish Balay { 880a7e14dcfSSatish Balay PetscFunctionBegin; 881441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 882a7e14dcfSSatish Balay if (J) { 883a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 884a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 885a7e14dcfSSatish Balay } 886a7e14dcfSSatish Balay if (Jpre) { 887a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 888a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 889a7e14dcfSSatish Balay } 890a7e14dcfSSatish Balay if (ctx) { 891a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 892a7e14dcfSSatish Balay } 893a7e14dcfSSatish Balay if (func) { 894a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 895a7e14dcfSSatish Balay } 896a7e14dcfSSatish Balay if (J) { 897*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)J)); 898*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_inequality)); 899a7e14dcfSSatish Balay tao->jacobian_inequality = J; 900a7e14dcfSSatish Balay } 901a7e14dcfSSatish Balay if (Jpre) { 902*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)Jpre)); 903*9566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->jacobian_inequality_pre)); 904a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 905a7e14dcfSSatish Balay } 906a7e14dcfSSatish Balay PetscFunctionReturn(0); 907a7e14dcfSSatish Balay } 908