1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/ 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*@C 4a7e14dcfSSatish Balay TaoSetHessianRoutine - 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 12*f4c1ad5cSStefano 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 16*f4c1ad5cSStefano Zampini Calling sequence of func: 17*f4c1ad5cSStefano 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 26a7e14dcfSSatish Balay @*/ 27ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 28a7e14dcfSSatish Balay { 29a7e14dcfSSatish Balay PetscErrorCode ierr; 3045cf516eSBarry Smith 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 } 41a7e14dcfSSatish Balay if (ctx) { 42a7e14dcfSSatish Balay tao->user_hessP = ctx; 43a7e14dcfSSatish Balay } 44a7e14dcfSSatish Balay if (func) { 45a7e14dcfSSatish Balay tao->ops->computehessian = func; 46a7e14dcfSSatish Balay } 47a7e14dcfSSatish Balay if (H) { 48a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr); 4945cf516eSBarry Smith ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr); 50a7e14dcfSSatish Balay tao->hessian = H; 51a7e14dcfSSatish Balay } 52a7e14dcfSSatish Balay if (Hpre) { 53a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr); 5445cf516eSBarry Smith ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr); 55a7e14dcfSSatish Balay tao->hessian_pre = Hpre; 56a7e14dcfSSatish Balay } 57a7e14dcfSSatish Balay PetscFunctionReturn(0); 58a7e14dcfSSatish Balay } 59a7e14dcfSSatish Balay 60a7e14dcfSSatish Balay /*@C 61a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 62a7e14dcfSSatish Balay set with TaoSetHessianRoutine(). 63a7e14dcfSSatish Balay 64441846f8SBarry Smith Collective on Tao 65a7e14dcfSSatish Balay 66a7e14dcfSSatish Balay Input Parameters: 67*f4c1ad5cSStefano Zampini + tao - the Tao solver context 68*f4c1ad5cSStefano Zampini - X - input vector 69a7e14dcfSSatish Balay 70a7e14dcfSSatish Balay Output Parameters: 71a7e14dcfSSatish Balay + H - Hessian matrix 72aa6c7ce3SBarry Smith - Hpre - Preconditioning matrix 73a7e14dcfSSatish Balay 74a7e14dcfSSatish Balay Notes: 75a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 76a7e14dcfSSatish Balay is used internally within the minimization solvers. 77a7e14dcfSSatish Balay 78a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 79a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 80a7e14dcfSSatish Balay themselves. 81a7e14dcfSSatish Balay 82a7e14dcfSSatish Balay Level: developer 83a7e14dcfSSatish Balay 84*f4c1ad5cSStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessianRoutine() 85a7e14dcfSSatish Balay @*/ 86ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre) 87a7e14dcfSSatish Balay { 88a7e14dcfSSatish Balay PetscErrorCode ierr; 8987f595a5SBarry Smith 90a7e14dcfSSatish Balay PetscFunctionBegin; 91441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 92a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 93a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 94*f4c1ad5cSStefano Zampini if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessianRoutine() first"); 95a7e14dcfSSatish Balay ++tao->nhess; 96*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 9794ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 98441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 99ffad9901SBarry Smith ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr); 100a7e14dcfSSatish Balay PetscStackPop; 10194ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 102*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 103a7e14dcfSSatish Balay PetscFunctionReturn(0); 104a7e14dcfSSatish Balay } 105a7e14dcfSSatish Balay 106a7e14dcfSSatish Balay /*@C 107a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 108a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 109a7e14dcfSSatish Balay 110441846f8SBarry Smith Collective on Tao 111a7e14dcfSSatish Balay 112a7e14dcfSSatish Balay Input Parameters: 113*f4c1ad5cSStefano Zampini + tao - the Tao solver context 114*f4c1ad5cSStefano Zampini - X - input vector 115a7e14dcfSSatish Balay 116a7e14dcfSSatish Balay Output Parameters: 117*f4c1ad5cSStefano Zampini + J - Jacobian matrix 118*f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 119a7e14dcfSSatish Balay 120a7e14dcfSSatish Balay Notes: 121a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 122a7e14dcfSSatish Balay is used internally within the minimization solvers. 123a7e14dcfSSatish Balay 124a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 125a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 126a7e14dcfSSatish Balay themselves. 127a7e14dcfSSatish Balay 128a7e14dcfSSatish Balay Level: developer 129a7e14dcfSSatish Balay 130*f4c1ad5cSStefano Zampini .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianRoutine() 131a7e14dcfSSatish Balay @*/ 132ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 133a7e14dcfSSatish Balay { 134a7e14dcfSSatish Balay PetscErrorCode ierr; 13587f595a5SBarry Smith 136a7e14dcfSSatish Balay PetscFunctionBegin; 137441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 138a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 139a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 14087f595a5SBarry Smith if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 141a7e14dcfSSatish Balay ++tao->njac; 142*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 14394ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 144441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 145ffad9901SBarry Smith ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr); 146a7e14dcfSSatish Balay PetscStackPop; 14794ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 148*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 149a7e14dcfSSatish Balay PetscFunctionReturn(0); 150a7e14dcfSSatish Balay } 151a7e14dcfSSatish Balay 152a7e14dcfSSatish Balay /*@C 153a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 154a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 155a7e14dcfSSatish Balay 156441846f8SBarry Smith Collective on Tao 157a7e14dcfSSatish Balay 158a7e14dcfSSatish Balay Input Parameters: 159*f4c1ad5cSStefano Zampini + tao - the Tao solver context 160*f4c1ad5cSStefano Zampini - X - input vector 161a7e14dcfSSatish Balay 162a7e14dcfSSatish Balay Output Parameters: 163*f4c1ad5cSStefano Zampini + Jpre - Jacobian matrix 164*f4c1ad5cSStefano Zampini - Jinv - Preconditioning matrix 165a7e14dcfSSatish Balay 166a7e14dcfSSatish Balay Notes: 167a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 168a7e14dcfSSatish Balay is used internally within the minimization solvers. 169a7e14dcfSSatish Balay 170a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 171a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 172a7e14dcfSSatish Balay themselves. 173a7e14dcfSSatish Balay 174a7e14dcfSSatish Balay Level: developer 175a7e14dcfSSatish Balay 176a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 177a7e14dcfSSatish Balay @*/ 178ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv) 179a7e14dcfSSatish Balay { 180a7e14dcfSSatish Balay PetscErrorCode ierr; 18145cf516eSBarry Smith 182a7e14dcfSSatish Balay PetscFunctionBegin; 183441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 184a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 185a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 18687f595a5SBarry Smith if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 187a7e14dcfSSatish Balay ++tao->njac_state; 188*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 18994ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 190441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 191ffad9901SBarry Smith ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr); 192a7e14dcfSSatish Balay PetscStackPop; 19394ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 194*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 195a7e14dcfSSatish Balay PetscFunctionReturn(0); 196a7e14dcfSSatish Balay } 197a7e14dcfSSatish Balay 198a7e14dcfSSatish Balay /*@C 199a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 200a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 201a7e14dcfSSatish Balay 202441846f8SBarry Smith Collective on Tao 203a7e14dcfSSatish Balay 204a7e14dcfSSatish Balay Input Parameters: 205*f4c1ad5cSStefano Zampini + tao - the Tao solver context 206*f4c1ad5cSStefano Zampini - X - input vector 207a7e14dcfSSatish Balay 208a7e14dcfSSatish Balay Output Parameters: 209*f4c1ad5cSStefano Zampini . J - Jacobian matrix 210a7e14dcfSSatish Balay 211a7e14dcfSSatish Balay Notes: 212a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 213a7e14dcfSSatish Balay is used internally within the minimization solvers. 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 216a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 217a7e14dcfSSatish Balay themselves. 218a7e14dcfSSatish Balay 219a7e14dcfSSatish Balay Level: developer 220a7e14dcfSSatish Balay 221a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 222a7e14dcfSSatish Balay @*/ 22394ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 224a7e14dcfSSatish Balay { 225a7e14dcfSSatish Balay PetscErrorCode ierr; 22687f595a5SBarry Smith 227a7e14dcfSSatish Balay PetscFunctionBegin; 228441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 229a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 230a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 23187f595a5SBarry Smith if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 232a7e14dcfSSatish Balay ++tao->njac_design; 233*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 23494ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 235441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 236a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr); 237a7e14dcfSSatish Balay PetscStackPop; 23894ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 239*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 240a7e14dcfSSatish Balay PetscFunctionReturn(0); 241a7e14dcfSSatish Balay } 242a7e14dcfSSatish Balay 243a7e14dcfSSatish Balay /*@C 244a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 245a7e14dcfSSatish Balay 246441846f8SBarry Smith Logically collective on Tao 247a7e14dcfSSatish Balay 248a7e14dcfSSatish Balay Input Parameters: 249441846f8SBarry Smith + tao - the Tao context 250a7e14dcfSSatish Balay . J - Matrix used for the jacobian 251a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 252*f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 253a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 2546c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 255a7e14dcfSSatish Balay 256*f4c1ad5cSStefano Zampini Calling sequence of func: 257*f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 258a7e14dcfSSatish Balay 259441846f8SBarry Smith + tao - the Tao context 260a7e14dcfSSatish Balay . x - input vector 261a7e14dcfSSatish Balay . J - Jacobian matrix 262*f4c1ad5cSStefano Zampini . Jpre - preconditioning matrix, usually the same as J 263a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 264a7e14dcfSSatish Balay 265a7e14dcfSSatish Balay Level: intermediate 266a7e14dcfSSatish Balay @*/ 267ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 268a7e14dcfSSatish Balay { 269a7e14dcfSSatish Balay PetscErrorCode ierr; 270*f4c1ad5cSStefano Zampini 271a7e14dcfSSatish Balay PetscFunctionBegin; 272441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 273a7e14dcfSSatish Balay if (J) { 274a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 275a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 276a7e14dcfSSatish Balay } 277a7e14dcfSSatish Balay if (Jpre) { 278a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 279a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 280a7e14dcfSSatish Balay } 281a7e14dcfSSatish Balay if (ctx) { 282a7e14dcfSSatish Balay tao->user_jacP = ctx; 283a7e14dcfSSatish Balay } 284a7e14dcfSSatish Balay if (func) { 285a7e14dcfSSatish Balay tao->ops->computejacobian = func; 286a7e14dcfSSatish Balay } 287a7e14dcfSSatish Balay if (J) { 288a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 28945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr); 290a7e14dcfSSatish Balay tao->jacobian = J; 291a7e14dcfSSatish Balay } 292a7e14dcfSSatish Balay if (Jpre) { 293a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 29445cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr); 295a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 296a7e14dcfSSatish Balay } 297a7e14dcfSSatish Balay PetscFunctionReturn(0); 298a7e14dcfSSatish Balay } 299a7e14dcfSSatish Balay 300a7e14dcfSSatish Balay /*@C 301a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 302a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 303a7e14dcfSSatish Balay Used only for pde-constrained optimization. 304a7e14dcfSSatish Balay 305441846f8SBarry Smith Logically collective on Tao 306a7e14dcfSSatish Balay 307a7e14dcfSSatish Balay Input Parameters: 308441846f8SBarry Smith + tao - the Tao context 309a7e14dcfSSatish Balay . J - Matrix used for the jacobian 3106c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 3116c23d075SBarry 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. 312*f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 313a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3146c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 315a7e14dcfSSatish Balay 316*f4c1ad5cSStefano Zampini Calling sequence of func: 317*f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,Mat Jinv,void *ctx); 318a7e14dcfSSatish Balay 319441846f8SBarry Smith + tao - the Tao context 320a7e14dcfSSatish Balay . x - input vector 321a7e14dcfSSatish Balay . J - Jacobian matrix 322a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 323a7e14dcfSSatish Balay . Jinv - inverse of J 324a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 325a7e14dcfSSatish Balay 326a7e14dcfSSatish Balay Level: intermediate 327*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 328a7e14dcfSSatish Balay @*/ 329ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, void*), void *ctx) 330a7e14dcfSSatish Balay { 331a7e14dcfSSatish Balay PetscErrorCode ierr; 332*f4c1ad5cSStefano Zampini 333a7e14dcfSSatish Balay PetscFunctionBegin; 334441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 335a7e14dcfSSatish Balay if (J) { 336a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 337a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 338a7e14dcfSSatish Balay } 339a7e14dcfSSatish Balay if (Jpre) { 340a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 341a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 342a7e14dcfSSatish Balay } 343a7e14dcfSSatish Balay if (Jinv) { 344a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 345a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 346a7e14dcfSSatish Balay } 347a7e14dcfSSatish Balay if (ctx) { 348a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 349a7e14dcfSSatish Balay } 350a7e14dcfSSatish Balay if (func) { 351a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 352a7e14dcfSSatish Balay } 353a7e14dcfSSatish Balay if (J) { 354a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 35545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr); 356a7e14dcfSSatish Balay tao->jacobian_state = J; 357a7e14dcfSSatish Balay } 358a7e14dcfSSatish Balay if (Jpre) { 359a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 36045cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr); 361a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 362a7e14dcfSSatish Balay } 363a7e14dcfSSatish Balay if (Jinv) { 364a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr); 36545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr); 366a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 367a7e14dcfSSatish Balay } 368a7e14dcfSSatish Balay PetscFunctionReturn(0); 369a7e14dcfSSatish Balay } 370a7e14dcfSSatish Balay 371a7e14dcfSSatish Balay /*@C 372a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 373a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 374a7e14dcfSSatish Balay pde-constrained optimization. 375a7e14dcfSSatish Balay 376441846f8SBarry Smith Logically collective on Tao 377a7e14dcfSSatish Balay 378a7e14dcfSSatish Balay Input Parameters: 379441846f8SBarry Smith + tao - the Tao context 380a7e14dcfSSatish Balay . J - Matrix used for the jacobian 381*f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 382a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3836c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 384a7e14dcfSSatish Balay 385*f4c1ad5cSStefano Zampini Calling sequence of func: 386*f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,void *ctx); 387a7e14dcfSSatish Balay 388441846f8SBarry Smith + tao - the Tao context 389a7e14dcfSSatish Balay . x - input vector 390a7e14dcfSSatish Balay . J - Jacobian matrix 391a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 392a7e14dcfSSatish Balay 393a7e14dcfSSatish Balay Level: intermediate 394*f4c1ad5cSStefano Zampini 395a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 396a7e14dcfSSatish Balay @*/ 39794ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 398a7e14dcfSSatish Balay { 399a7e14dcfSSatish Balay PetscErrorCode ierr; 40045cf516eSBarry Smith 401a7e14dcfSSatish Balay PetscFunctionBegin; 402441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 403a7e14dcfSSatish Balay if (J) { 404a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 405a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 406a7e14dcfSSatish Balay } 407a7e14dcfSSatish Balay if (ctx) { 408a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 409a7e14dcfSSatish Balay } 410a7e14dcfSSatish Balay if (func) { 411a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 412a7e14dcfSSatish Balay } 413a7e14dcfSSatish Balay if (J) { 414a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 41545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr); 416a7e14dcfSSatish Balay tao->jacobian_design = J; 417a7e14dcfSSatish Balay } 418a7e14dcfSSatish Balay PetscFunctionReturn(0); 419a7e14dcfSSatish Balay } 420a7e14dcfSSatish Balay 421a7e14dcfSSatish Balay /*@ 422441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 423a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 424a7e14dcfSSatish Balay pde-constrained optimization. 425a7e14dcfSSatish Balay 426441846f8SBarry Smith Logically Collective on Tao 427a7e14dcfSSatish Balay 428a7e14dcfSSatish Balay Input Parameters: 429441846f8SBarry Smith + tao - The Tao context 430a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 431a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 432a7e14dcfSSatish Balay 433a7e14dcfSSatish Balay Level: intermediate 434a7e14dcfSSatish Balay 435a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 436a7e14dcfSSatish Balay @*/ 437441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 438a7e14dcfSSatish Balay { 439a7e14dcfSSatish Balay PetscErrorCode ierr; 44045cf516eSBarry Smith 44145cf516eSBarry Smith PetscFunctionBegin; 44245cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr); 44345cf516eSBarry Smith ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr); 444a7e14dcfSSatish Balay tao->state_is = s_is; 44545cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr); 44645cf516eSBarry Smith ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr); 447a7e14dcfSSatish Balay tao->design_is = d_is; 448a7e14dcfSSatish Balay PetscFunctionReturn(0); 449a7e14dcfSSatish Balay } 450a7e14dcfSSatish Balay 451a7e14dcfSSatish Balay /*@C 452a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 453a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 454a7e14dcfSSatish Balay 455441846f8SBarry Smith Collective on Tao 456a7e14dcfSSatish Balay 457a7e14dcfSSatish Balay Input Parameters: 458*f4c1ad5cSStefano Zampini + tao - the Tao solver context 459*f4c1ad5cSStefano Zampini - X - input vector 460a7e14dcfSSatish Balay 461a7e14dcfSSatish Balay Output Parameters: 462*f4c1ad5cSStefano Zampini + J - Jacobian matrix 463*f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 464a7e14dcfSSatish Balay 465a7e14dcfSSatish Balay Notes: 466a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 467a7e14dcfSSatish Balay is used internally within the minimization solvers. 468a7e14dcfSSatish Balay 469a7e14dcfSSatish Balay Level: developer 470a7e14dcfSSatish Balay 471a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 472a7e14dcfSSatish Balay @*/ 473ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre) 474a7e14dcfSSatish Balay { 475a7e14dcfSSatish Balay PetscErrorCode ierr; 47645cf516eSBarry Smith 477a7e14dcfSSatish Balay PetscFunctionBegin; 478441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 479a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 480a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 48187f595a5SBarry Smith if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 482a7e14dcfSSatish Balay ++tao->njac_equality; 483*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 48494ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 485441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 486ffad9901SBarry Smith ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr); 487a7e14dcfSSatish Balay PetscStackPop; 48894ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 489*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 490a7e14dcfSSatish Balay PetscFunctionReturn(0); 491a7e14dcfSSatish Balay } 492a7e14dcfSSatish Balay 493a7e14dcfSSatish Balay /*@C 494a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 495a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 496a7e14dcfSSatish Balay 497441846f8SBarry Smith Collective on Tao 498a7e14dcfSSatish Balay 499a7e14dcfSSatish Balay Input Parameters: 500*f4c1ad5cSStefano Zampini + tao - the Tao solver context 501*f4c1ad5cSStefano Zampini - X - input vector 502a7e14dcfSSatish Balay 503a7e14dcfSSatish Balay Output Parameters: 504*f4c1ad5cSStefano Zampini + J - Jacobian matrix 505*f4c1ad5cSStefano Zampini - Jpre - Preconditioning matrix 506a7e14dcfSSatish Balay 507a7e14dcfSSatish Balay Notes: 508a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 509a7e14dcfSSatish Balay is used internally within the minimization solvers. 510a7e14dcfSSatish Balay 511a7e14dcfSSatish Balay Level: developer 512a7e14dcfSSatish Balay 513a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 514a7e14dcfSSatish Balay @*/ 515ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre) 516a7e14dcfSSatish Balay { 517a7e14dcfSSatish Balay PetscErrorCode ierr; 51887f595a5SBarry Smith 519a7e14dcfSSatish Balay PetscFunctionBegin; 520441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 521a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 522a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 52387f595a5SBarry Smith if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 524a7e14dcfSSatish Balay ++tao->njac_inequality; 525*f4c1ad5cSStefano Zampini ierr = VecLockPush(X);CHKERRQ(ierr); 52694ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 527441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 528ffad9901SBarry Smith ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr); 529a7e14dcfSSatish Balay PetscStackPop; 53094ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 531*f4c1ad5cSStefano Zampini ierr = VecLockPop(X);CHKERRQ(ierr); 532a7e14dcfSSatish Balay PetscFunctionReturn(0); 533a7e14dcfSSatish Balay } 534a7e14dcfSSatish Balay 535a7e14dcfSSatish Balay /*@C 536a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 537a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 538a7e14dcfSSatish Balay Used only for pde-constrained optimization. 539a7e14dcfSSatish Balay 540441846f8SBarry Smith Logically collective on Tao 541a7e14dcfSSatish Balay 542a7e14dcfSSatish Balay Input Parameters: 543441846f8SBarry Smith + tao - the Tao context 544a7e14dcfSSatish Balay . J - Matrix used for the jacobian 545a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 546*f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 547a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 5486c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 549a7e14dcfSSatish Balay 550*f4c1ad5cSStefano Zampini Calling sequence of func: 551*f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 552a7e14dcfSSatish Balay 553441846f8SBarry Smith + tao - the Tao context 554a7e14dcfSSatish Balay . x - input vector 555a7e14dcfSSatish Balay . J - Jacobian matrix 556a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 557a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 558a7e14dcfSSatish Balay 559a7e14dcfSSatish Balay Level: intermediate 560*f4c1ad5cSStefano Zampini 561*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 562a7e14dcfSSatish Balay @*/ 563ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 564a7e14dcfSSatish Balay { 565a7e14dcfSSatish Balay PetscErrorCode ierr; 56645cf516eSBarry Smith 567a7e14dcfSSatish Balay PetscFunctionBegin; 568441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 569a7e14dcfSSatish Balay if (J) { 570a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 571a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 572a7e14dcfSSatish Balay } 573a7e14dcfSSatish Balay if (Jpre) { 574a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 575a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 576a7e14dcfSSatish Balay } 577a7e14dcfSSatish Balay if (ctx) { 578a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 579a7e14dcfSSatish Balay } 580a7e14dcfSSatish Balay if (func) { 581a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 582a7e14dcfSSatish Balay } 583a7e14dcfSSatish Balay if (J) { 584a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 58545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr); 586a7e14dcfSSatish Balay tao->jacobian_equality = J; 587a7e14dcfSSatish Balay } 588a7e14dcfSSatish Balay if (Jpre) { 589a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 59045cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr); 591a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 592a7e14dcfSSatish Balay } 593a7e14dcfSSatish Balay PetscFunctionReturn(0); 594a7e14dcfSSatish Balay } 595a7e14dcfSSatish Balay 596a7e14dcfSSatish Balay /*@C 597a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 598a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 599a7e14dcfSSatish Balay Used only for pde-constrained optimization. 600a7e14dcfSSatish Balay 601441846f8SBarry Smith Logically collective on Tao 602a7e14dcfSSatish Balay 603a7e14dcfSSatish Balay Input Parameters: 604441846f8SBarry Smith + tao - the Tao context 605a7e14dcfSSatish Balay . J - Matrix used for the jacobian 606a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 607*f4c1ad5cSStefano Zampini . func - Jacobian evaluation routine 608a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 6096c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 610a7e14dcfSSatish Balay 611*f4c1ad5cSStefano Zampini Calling sequence of func: 612*f4c1ad5cSStefano Zampini $ func(Tao tao,Vec x,Mat J,Mat Jpre,void *ctx); 613a7e14dcfSSatish Balay 614441846f8SBarry Smith + tao - the Tao context 615a7e14dcfSSatish Balay . x - input vector 616a7e14dcfSSatish Balay . J - Jacobian matrix 617a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 618a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 619a7e14dcfSSatish Balay 620a7e14dcfSSatish Balay Level: intermediate 621*f4c1ad5cSStefano Zampini 622*f4c1ad5cSStefano Zampini .seealso: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 623a7e14dcfSSatish Balay @*/ 624ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 625a7e14dcfSSatish Balay { 626a7e14dcfSSatish Balay PetscErrorCode ierr; 627*f4c1ad5cSStefano Zampini 628a7e14dcfSSatish Balay PetscFunctionBegin; 629441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 630a7e14dcfSSatish Balay if (J) { 631a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 632a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 633a7e14dcfSSatish Balay } 634a7e14dcfSSatish Balay if (Jpre) { 635a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 636a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 637a7e14dcfSSatish Balay } 638a7e14dcfSSatish Balay if (ctx) { 639a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 640a7e14dcfSSatish Balay } 641a7e14dcfSSatish Balay if (func) { 642a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 643a7e14dcfSSatish Balay } 644a7e14dcfSSatish Balay if (J) { 645a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 64645cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr); 647a7e14dcfSSatish Balay tao->jacobian_inequality = J; 648a7e14dcfSSatish Balay } 649a7e14dcfSSatish Balay if (Jpre) { 650a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 65145cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr); 652a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 653a7e14dcfSSatish Balay } 654a7e14dcfSSatish Balay PetscFunctionReturn(0); 655a7e14dcfSSatish Balay } 656