1ba92ff59SBarry Smith #include <petsc-private/taoimpl.h> /*I "petsctao.h" I*/ 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay #undef __FUNCT__ 4a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHessianRoutine" 5a7e14dcfSSatish Balay /*@C 6a7e14dcfSSatish Balay TaoSetHessianRoutine - Sets the function to compute the Hessian as well as the location to store the matrix. 7a7e14dcfSSatish Balay 8441846f8SBarry Smith Logically collective on Tao 9a7e14dcfSSatish Balay 10a7e14dcfSSatish Balay Input Parameters: 11441846f8SBarry Smith + tao - the Tao context 12a7e14dcfSSatish Balay . H - Matrix used for the hessian 13a7e14dcfSSatish Balay . Hpre - Matrix that will be used operated on by preconditioner, can be same as H 14a7e14dcfSSatish Balay . hess - Hessian evaluation routine 15a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 166c23d075SBarry Smith Hessian evaluation routine (may be NULL) 17a7e14dcfSSatish Balay 18a7e14dcfSSatish Balay Calling sequence of hess: 19ffad9901SBarry Smith $ hess (Tao tao,Vec x,Mat H,Mat Hpre,void *ctx); 20a7e14dcfSSatish Balay 21441846f8SBarry Smith + tao - the Tao context 22a7e14dcfSSatish Balay . x - input vector 23a7e14dcfSSatish Balay . H - Hessian matrix 24a7e14dcfSSatish Balay . Hpre - preconditioner matrix, usually the same as H 25a7e14dcfSSatish Balay - ctx - [optional] user-defined Hessian context 26a7e14dcfSSatish Balay 27a7e14dcfSSatish Balay Level: beginner 28a7e14dcfSSatish Balay 29a7e14dcfSSatish Balay @*/ 30ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 31a7e14dcfSSatish Balay { 32a7e14dcfSSatish Balay PetscErrorCode ierr; 3345cf516eSBarry Smith 34a7e14dcfSSatish Balay PetscFunctionBegin; 35441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 36a7e14dcfSSatish Balay if (H) { 37a7e14dcfSSatish Balay PetscValidHeaderSpecific(H,MAT_CLASSID,2); 38a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,H,2); 39a7e14dcfSSatish Balay } 40a7e14dcfSSatish Balay if (Hpre) { 41a7e14dcfSSatish Balay PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3); 42a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Hpre,3); 43a7e14dcfSSatish Balay } 44a7e14dcfSSatish Balay if (ctx) { 45a7e14dcfSSatish Balay tao->user_hessP = ctx; 46a7e14dcfSSatish Balay } 47a7e14dcfSSatish Balay if (func) { 48a7e14dcfSSatish Balay tao->ops->computehessian = func; 49a7e14dcfSSatish Balay } 50a7e14dcfSSatish Balay if (H) { 51a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr); 5245cf516eSBarry Smith ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr); 53a7e14dcfSSatish Balay tao->hessian = H; 54a7e14dcfSSatish Balay } 55a7e14dcfSSatish Balay if (Hpre) { 56a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr); 5745cf516eSBarry Smith ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr); 58a7e14dcfSSatish Balay tao->hessian_pre = Hpre; 59a7e14dcfSSatish Balay } 60a7e14dcfSSatish Balay PetscFunctionReturn(0); 61a7e14dcfSSatish Balay } 62a7e14dcfSSatish Balay 63a7e14dcfSSatish Balay #undef __FUNCT__ 64a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian" 65a7e14dcfSSatish Balay /*@C 66a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 67a7e14dcfSSatish Balay set with TaoSetHessianRoutine(). 68a7e14dcfSSatish Balay 69441846f8SBarry Smith Collective on Tao 70a7e14dcfSSatish Balay 71a7e14dcfSSatish Balay Input Parameters: 72441846f8SBarry Smith + solver - the Tao solver context 73a7e14dcfSSatish Balay - xx - input vector 74a7e14dcfSSatish Balay 75a7e14dcfSSatish Balay Output Parameters: 76a7e14dcfSSatish Balay + H - Hessian matrix 77*aa6c7ce3SBarry Smith - Hpre - Preconditioning matrix 78a7e14dcfSSatish Balay 79a7e14dcfSSatish Balay Notes: 80a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 81a7e14dcfSSatish Balay is used internally within the minimization solvers. 82a7e14dcfSSatish Balay 83a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 84a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 85a7e14dcfSSatish Balay themselves. 86a7e14dcfSSatish Balay 87a7e14dcfSSatish Balay Level: developer 88a7e14dcfSSatish Balay 89a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian() 90a7e14dcfSSatish Balay 91a7e14dcfSSatish Balay @*/ 92ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre) 93a7e14dcfSSatish Balay { 94a7e14dcfSSatish Balay PetscErrorCode ierr; 9587f595a5SBarry Smith 96a7e14dcfSSatish Balay PetscFunctionBegin; 97441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 98a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 99a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 100a7e14dcfSSatish Balay 10187f595a5SBarry Smith if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first"); 102a7e14dcfSSatish Balay ++tao->nhess; 10394ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 104441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 105ffad9901SBarry Smith ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr); 106a7e14dcfSSatish Balay PetscStackPop; 10794ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 108a7e14dcfSSatish Balay PetscFunctionReturn(0); 109a7e14dcfSSatish Balay } 110a7e14dcfSSatish Balay 111a7e14dcfSSatish Balay #undef __FUNCT__ 112a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian" 113a7e14dcfSSatish Balay /*@C 114a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 115a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 116a7e14dcfSSatish Balay 117441846f8SBarry Smith Collective on Tao 118a7e14dcfSSatish Balay 119a7e14dcfSSatish Balay Input Parameters: 120441846f8SBarry Smith + solver - the Tao solver context 121a7e14dcfSSatish Balay - xx - input vector 122a7e14dcfSSatish Balay 123a7e14dcfSSatish Balay Output Parameters: 124a7e14dcfSSatish Balay + H - Jacobian matrix 125ffad9901SBarry Smith - Hpre - Preconditioning matrix 126a7e14dcfSSatish Balay 127a7e14dcfSSatish Balay Notes: 128a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 129a7e14dcfSSatish Balay is used internally within the minimization solvers. 130a7e14dcfSSatish Balay 131a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 132a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 133a7e14dcfSSatish Balay themselves. 134a7e14dcfSSatish Balay 135a7e14dcfSSatish Balay Level: developer 136a7e14dcfSSatish Balay 137a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian() 138a7e14dcfSSatish Balay 139a7e14dcfSSatish Balay @*/ 140ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 141a7e14dcfSSatish Balay { 142a7e14dcfSSatish Balay PetscErrorCode ierr; 14387f595a5SBarry Smith 144a7e14dcfSSatish Balay PetscFunctionBegin; 145441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 146a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 147a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 148a7e14dcfSSatish Balay 14987f595a5SBarry Smith if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 150a7e14dcfSSatish Balay ++tao->njac; 15194ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 152441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 153ffad9901SBarry Smith ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr); 154a7e14dcfSSatish Balay PetscStackPop; 15594ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 156a7e14dcfSSatish Balay PetscFunctionReturn(0); 157a7e14dcfSSatish Balay } 158a7e14dcfSSatish Balay 159a7e14dcfSSatish Balay #undef __FUNCT__ 160a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState" 161a7e14dcfSSatish Balay /*@C 162a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 163a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 164a7e14dcfSSatish Balay 165441846f8SBarry Smith Collective on Tao 166a7e14dcfSSatish Balay 167a7e14dcfSSatish Balay Input Parameters: 168441846f8SBarry Smith + solver - the Tao solver context 169a7e14dcfSSatish Balay - xx - input vector 170a7e14dcfSSatish Balay 171a7e14dcfSSatish Balay Output Parameters: 172a7e14dcfSSatish Balay + H - Jacobian matrix 173ffad9901SBarry Smith - Hpre - Preconditioning matrix 174a7e14dcfSSatish Balay 175a7e14dcfSSatish Balay Notes: 176a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 177a7e14dcfSSatish Balay is used internally within the minimization solvers. 178a7e14dcfSSatish Balay 179a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 180a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 181a7e14dcfSSatish Balay themselves. 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay Level: developer 184a7e14dcfSSatish Balay 185a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 186a7e14dcfSSatish Balay 187a7e14dcfSSatish Balay @*/ 188ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv) 189a7e14dcfSSatish Balay { 190a7e14dcfSSatish Balay PetscErrorCode ierr; 19145cf516eSBarry Smith 192a7e14dcfSSatish Balay PetscFunctionBegin; 193441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 194a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 195a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 196a7e14dcfSSatish Balay 19787f595a5SBarry Smith if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 198a7e14dcfSSatish Balay ++tao->njac_state; 19994ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 200441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 201ffad9901SBarry Smith ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr); 202a7e14dcfSSatish Balay PetscStackPop; 20394ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 204a7e14dcfSSatish Balay PetscFunctionReturn(0); 205a7e14dcfSSatish Balay } 206a7e14dcfSSatish Balay 207a7e14dcfSSatish Balay #undef __FUNCT__ 208a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign" 209a7e14dcfSSatish Balay /*@C 210a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 211a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 212a7e14dcfSSatish Balay 213441846f8SBarry Smith Collective on Tao 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay Input Parameters: 216441846f8SBarry Smith + solver - the Tao solver context 217a7e14dcfSSatish Balay - xx - input vector 218a7e14dcfSSatish Balay 219a7e14dcfSSatish Balay Output Parameters: 220a7e14dcfSSatish Balay . H - Jacobian matrix 221a7e14dcfSSatish Balay 222a7e14dcfSSatish Balay Notes: 223a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 224a7e14dcfSSatish Balay is used internally within the minimization solvers. 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 227a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 228a7e14dcfSSatish Balay themselves. 229a7e14dcfSSatish Balay 230a7e14dcfSSatish Balay Level: developer 231a7e14dcfSSatish Balay 232a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 233a7e14dcfSSatish Balay 234a7e14dcfSSatish Balay @*/ 23594ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 236a7e14dcfSSatish Balay { 237a7e14dcfSSatish Balay PetscErrorCode ierr; 23887f595a5SBarry Smith 239a7e14dcfSSatish Balay PetscFunctionBegin; 240441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 241a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 242a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 243a7e14dcfSSatish Balay 24487f595a5SBarry Smith if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 245a7e14dcfSSatish Balay ++tao->njac_design; 24694ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 247441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 248a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr); 249a7e14dcfSSatish Balay PetscStackPop; 25094ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 251a7e14dcfSSatish Balay PetscFunctionReturn(0); 252a7e14dcfSSatish Balay } 253a7e14dcfSSatish Balay 254a7e14dcfSSatish Balay #undef __FUNCT__ 255a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine" 256a7e14dcfSSatish Balay /*@C 257a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 258a7e14dcfSSatish Balay 259441846f8SBarry Smith Logically collective on Tao 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay Input Parameters: 262441846f8SBarry Smith + tao - the Tao context 263a7e14dcfSSatish Balay . J - Matrix used for the jacobian 264a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 265a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 266a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 2676c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 268a7e14dcfSSatish Balay 269a7e14dcfSSatish Balay Calling sequence of jac: 270ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 271a7e14dcfSSatish Balay 272441846f8SBarry Smith + tao - the Tao context 273a7e14dcfSSatish Balay . x - input vector 274a7e14dcfSSatish Balay . J - Jacobian matrix 275a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 276a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 277a7e14dcfSSatish Balay 278a7e14dcfSSatish Balay Level: intermediate 279a7e14dcfSSatish Balay 280a7e14dcfSSatish Balay @*/ 281ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 282a7e14dcfSSatish Balay { 283a7e14dcfSSatish Balay PetscErrorCode ierr; 284a7e14dcfSSatish Balay PetscFunctionBegin; 285441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 286a7e14dcfSSatish Balay if (J) { 287a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 288a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 289a7e14dcfSSatish Balay } 290a7e14dcfSSatish Balay if (Jpre) { 291a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 292a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 293a7e14dcfSSatish Balay } 294a7e14dcfSSatish Balay if (ctx) { 295a7e14dcfSSatish Balay tao->user_jacP = ctx; 296a7e14dcfSSatish Balay } 297a7e14dcfSSatish Balay if (func) { 298a7e14dcfSSatish Balay tao->ops->computejacobian = func; 299a7e14dcfSSatish Balay } 300a7e14dcfSSatish Balay if (J) { 301a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 30245cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr); 303a7e14dcfSSatish Balay tao->jacobian = J; 304a7e14dcfSSatish Balay } 305a7e14dcfSSatish Balay if (Jpre) { 306a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 30745cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr); 308a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 309a7e14dcfSSatish Balay } 310a7e14dcfSSatish Balay PetscFunctionReturn(0); 311a7e14dcfSSatish Balay } 312a7e14dcfSSatish Balay 313a7e14dcfSSatish Balay #undef __FUNCT__ 314a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine" 315a7e14dcfSSatish Balay /*@C 316a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 317a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 318a7e14dcfSSatish Balay Used only for pde-constrained optimization. 319a7e14dcfSSatish Balay 320441846f8SBarry Smith Logically collective on Tao 321a7e14dcfSSatish Balay 322a7e14dcfSSatish Balay Input Parameters: 323441846f8SBarry Smith + tao - the Tao context 324a7e14dcfSSatish Balay . J - Matrix used for the jacobian 3256c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 3266c23d075SBarry 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. 327a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 328a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3296c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 330a7e14dcfSSatish Balay 331a7e14dcfSSatish Balay Calling sequence of jac: 332ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 333a7e14dcfSSatish Balay 334441846f8SBarry Smith + tao - the Tao context 335a7e14dcfSSatish Balay . x - input vector 336a7e14dcfSSatish Balay . J - Jacobian matrix 337a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 338a7e14dcfSSatish Balay . Jinv - inverse of J 339a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 340a7e14dcfSSatish Balay 341a7e14dcfSSatish Balay Level: intermediate 342a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 343a7e14dcfSSatish Balay @*/ 344ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat,void*), void *ctx) 345a7e14dcfSSatish Balay { 346a7e14dcfSSatish Balay PetscErrorCode ierr; 347a7e14dcfSSatish Balay PetscFunctionBegin; 348441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 349a7e14dcfSSatish Balay if (J) { 350a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 351a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 352a7e14dcfSSatish Balay } 353a7e14dcfSSatish Balay if (Jpre) { 354a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 355a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 356a7e14dcfSSatish Balay } 357a7e14dcfSSatish Balay if (Jinv) { 358a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 359a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 360a7e14dcfSSatish Balay } 361a7e14dcfSSatish Balay if (ctx) { 362a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 363a7e14dcfSSatish Balay } 364a7e14dcfSSatish Balay if (func) { 365a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 366a7e14dcfSSatish Balay } 367a7e14dcfSSatish Balay if (J) { 368a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 36945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr); 370a7e14dcfSSatish Balay tao->jacobian_state = J; 371a7e14dcfSSatish Balay } 372a7e14dcfSSatish Balay if (Jpre) { 373a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 37445cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr); 375a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 376a7e14dcfSSatish Balay } 377a7e14dcfSSatish Balay if (Jinv) { 378a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr); 37945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr); 380a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 381a7e14dcfSSatish Balay } 382a7e14dcfSSatish Balay PetscFunctionReturn(0); 383a7e14dcfSSatish Balay } 384a7e14dcfSSatish Balay 385a7e14dcfSSatish Balay #undef __FUNCT__ 386a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine" 387a7e14dcfSSatish Balay /*@C 388a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 389a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 390a7e14dcfSSatish Balay pde-constrained optimization. 391a7e14dcfSSatish Balay 392441846f8SBarry Smith Logically collective on Tao 393a7e14dcfSSatish Balay 394a7e14dcfSSatish Balay Input Parameters: 395441846f8SBarry Smith + tao - the Tao context 396a7e14dcfSSatish Balay . J - Matrix used for the jacobian 397a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 398a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3996c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 400a7e14dcfSSatish Balay 401a7e14dcfSSatish Balay Calling sequence of jac: 402441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,void *ctx); 403a7e14dcfSSatish Balay 404441846f8SBarry Smith + tao - the Tao context 405a7e14dcfSSatish Balay . x - input vector 406a7e14dcfSSatish Balay . J - Jacobian matrix 407a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 408a7e14dcfSSatish Balay 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay Notes: 411a7e14dcfSSatish Balay 412a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 413a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 414a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 415a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 416a7e14dcfSSatish Balay throughout the global iterations. 417a7e14dcfSSatish Balay 418a7e14dcfSSatish Balay Level: intermediate 419a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 420a7e14dcfSSatish Balay @*/ 42194ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 422a7e14dcfSSatish Balay { 423a7e14dcfSSatish Balay PetscErrorCode ierr; 42445cf516eSBarry Smith 425a7e14dcfSSatish Balay PetscFunctionBegin; 426441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 427a7e14dcfSSatish Balay if (J) { 428a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 429a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 430a7e14dcfSSatish Balay } 431a7e14dcfSSatish Balay if (ctx) { 432a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 433a7e14dcfSSatish Balay } 434a7e14dcfSSatish Balay if (func) { 435a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 436a7e14dcfSSatish Balay } 437a7e14dcfSSatish Balay if (J) { 438a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 43945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr); 440a7e14dcfSSatish Balay tao->jacobian_design = J; 441a7e14dcfSSatish Balay } 442a7e14dcfSSatish Balay PetscFunctionReturn(0); 443a7e14dcfSSatish Balay } 444a7e14dcfSSatish Balay 445a7e14dcfSSatish Balay #undef __FUNCT__ 446a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS" 447a7e14dcfSSatish Balay /*@ 448441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 449a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 450a7e14dcfSSatish Balay pde-constrained optimization. 451a7e14dcfSSatish Balay 452441846f8SBarry Smith Logically Collective on Tao 453a7e14dcfSSatish Balay 454a7e14dcfSSatish Balay Input Parameters: 455441846f8SBarry Smith + tao - The Tao context 456a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 457a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 458a7e14dcfSSatish Balay 459a7e14dcfSSatish Balay Level: intermediate 460a7e14dcfSSatish Balay 461a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 462a7e14dcfSSatish Balay @*/ 463441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 464a7e14dcfSSatish Balay { 465a7e14dcfSSatish Balay PetscErrorCode ierr; 46645cf516eSBarry Smith 46745cf516eSBarry Smith PetscFunctionBegin; 46845cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr); 46945cf516eSBarry Smith ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr); 470a7e14dcfSSatish Balay tao->state_is = s_is; 47145cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr); 47245cf516eSBarry Smith ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr); 473a7e14dcfSSatish Balay tao->design_is = d_is; 474a7e14dcfSSatish Balay PetscFunctionReturn(0); 475a7e14dcfSSatish Balay } 476a7e14dcfSSatish Balay 477a7e14dcfSSatish Balay #undef __FUNCT__ 478a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality" 479a7e14dcfSSatish Balay /*@C 480a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 481a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 482a7e14dcfSSatish Balay 483441846f8SBarry Smith Collective on Tao 484a7e14dcfSSatish Balay 485a7e14dcfSSatish Balay Input Parameters: 486441846f8SBarry Smith + solver - the Tao solver context 487a7e14dcfSSatish Balay - xx - input vector 488a7e14dcfSSatish Balay 489a7e14dcfSSatish Balay Output Parameters: 490a7e14dcfSSatish Balay + H - Jacobian matrix 491*aa6c7ce3SBarry Smith - Hpre - Preconditioning matrix 492a7e14dcfSSatish Balay 493a7e14dcfSSatish Balay Notes: 494a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 495a7e14dcfSSatish Balay is used internally within the minimization solvers. 496a7e14dcfSSatish Balay 497a7e14dcfSSatish Balay Level: developer 498a7e14dcfSSatish Balay 499a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 500a7e14dcfSSatish Balay 501a7e14dcfSSatish Balay @*/ 502ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre) 503a7e14dcfSSatish Balay { 504a7e14dcfSSatish Balay PetscErrorCode ierr; 50545cf516eSBarry Smith 506a7e14dcfSSatish Balay PetscFunctionBegin; 507441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 508a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 509a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 510a7e14dcfSSatish Balay 51187f595a5SBarry Smith if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 512a7e14dcfSSatish Balay ++tao->njac_equality; 51394ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 514441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 515ffad9901SBarry Smith ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr); 516a7e14dcfSSatish Balay PetscStackPop; 51794ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 518a7e14dcfSSatish Balay PetscFunctionReturn(0); 519a7e14dcfSSatish Balay } 520a7e14dcfSSatish Balay 521a7e14dcfSSatish Balay #undef __FUNCT__ 522a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality" 523a7e14dcfSSatish Balay /*@C 524a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 525a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 526a7e14dcfSSatish Balay 527441846f8SBarry Smith Collective on Tao 528a7e14dcfSSatish Balay 529a7e14dcfSSatish Balay Input Parameters: 530441846f8SBarry Smith + solver - the Tao solver context 531a7e14dcfSSatish Balay - xx - input vector 532a7e14dcfSSatish Balay 533a7e14dcfSSatish Balay Output Parameters: 534a7e14dcfSSatish Balay + H - Jacobian matrix 535*aa6c7ce3SBarry Smith - Hpre - Preconditioning matrix 536a7e14dcfSSatish Balay 537a7e14dcfSSatish Balay Notes: 538a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 539a7e14dcfSSatish Balay is used internally within the minimization solvers. 540a7e14dcfSSatish Balay 541a7e14dcfSSatish Balay Level: developer 542a7e14dcfSSatish Balay 543a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 544a7e14dcfSSatish Balay 545a7e14dcfSSatish Balay @*/ 546ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre) 547a7e14dcfSSatish Balay { 548a7e14dcfSSatish Balay PetscErrorCode ierr; 54987f595a5SBarry Smith 550a7e14dcfSSatish Balay PetscFunctionBegin; 551441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 552a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 553a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 554a7e14dcfSSatish Balay 55587f595a5SBarry Smith if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 556a7e14dcfSSatish Balay ++tao->njac_inequality; 55794ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 558441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 559ffad9901SBarry Smith ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr); 560a7e14dcfSSatish Balay PetscStackPop; 56194ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 562a7e14dcfSSatish Balay PetscFunctionReturn(0); 563a7e14dcfSSatish Balay } 564a7e14dcfSSatish Balay 565a7e14dcfSSatish Balay #undef __FUNCT__ 566a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine" 567a7e14dcfSSatish Balay /*@C 568a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 569a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 570a7e14dcfSSatish Balay Used only for pde-constrained optimization. 571a7e14dcfSSatish Balay 572441846f8SBarry Smith Logically collective on Tao 573a7e14dcfSSatish Balay 574a7e14dcfSSatish Balay Input Parameters: 575441846f8SBarry Smith + tao - the Tao context 576a7e14dcfSSatish Balay . J - Matrix used for the jacobian 577a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 578a7e14dcfSSatish Balay . jac - 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 582a7e14dcfSSatish Balay Calling sequence of jac: 583ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,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 - ctx - [optional] user-defined Jacobian context 590a7e14dcfSSatish Balay 591a7e14dcfSSatish Balay Level: intermediate 592a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 593a7e14dcfSSatish Balay @*/ 594ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 595a7e14dcfSSatish Balay { 596a7e14dcfSSatish Balay PetscErrorCode ierr; 59745cf516eSBarry Smith 598a7e14dcfSSatish Balay PetscFunctionBegin; 599441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 600a7e14dcfSSatish Balay if (J) { 601a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 602a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 603a7e14dcfSSatish Balay } 604a7e14dcfSSatish Balay if (Jpre) { 605a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 606a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 607a7e14dcfSSatish Balay } 608a7e14dcfSSatish Balay if (ctx) { 609a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 610a7e14dcfSSatish Balay } 611a7e14dcfSSatish Balay if (func) { 612a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 613a7e14dcfSSatish Balay } 614a7e14dcfSSatish Balay if (J) { 615a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 61645cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr); 617a7e14dcfSSatish Balay tao->jacobian_equality = J; 618a7e14dcfSSatish Balay } 619a7e14dcfSSatish Balay if (Jpre) { 620a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 62145cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr); 622a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 623a7e14dcfSSatish Balay } 624a7e14dcfSSatish Balay PetscFunctionReturn(0); 625a7e14dcfSSatish Balay } 626a7e14dcfSSatish Balay 627a7e14dcfSSatish Balay #undef __FUNCT__ 628a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine" 629a7e14dcfSSatish Balay /*@C 630a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 631a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 632a7e14dcfSSatish Balay Used only for pde-constrained optimization. 633a7e14dcfSSatish Balay 634441846f8SBarry Smith Logically collective on Tao 635a7e14dcfSSatish Balay 636a7e14dcfSSatish Balay Input Parameters: 637441846f8SBarry Smith + tao - the Tao context 638a7e14dcfSSatish Balay . J - Matrix used for the jacobian 639a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 640a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 641a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 6426c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 643a7e14dcfSSatish Balay 644a7e14dcfSSatish Balay Calling sequence of jac: 645ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 646a7e14dcfSSatish Balay 647441846f8SBarry Smith + tao - the Tao context 648a7e14dcfSSatish Balay . x - input vector 649a7e14dcfSSatish Balay . J - Jacobian matrix 650a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 651a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 652a7e14dcfSSatish Balay 653a7e14dcfSSatish Balay Level: intermediate 654a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 655a7e14dcfSSatish Balay @*/ 656ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 657a7e14dcfSSatish Balay { 658a7e14dcfSSatish Balay PetscErrorCode ierr; 659a7e14dcfSSatish Balay PetscFunctionBegin; 660441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 661a7e14dcfSSatish Balay if (J) { 662a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 663a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 664a7e14dcfSSatish Balay } 665a7e14dcfSSatish Balay if (Jpre) { 666a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 667a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 668a7e14dcfSSatish Balay } 669a7e14dcfSSatish Balay if (ctx) { 670a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 671a7e14dcfSSatish Balay } 672a7e14dcfSSatish Balay if (func) { 673a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 674a7e14dcfSSatish Balay } 675a7e14dcfSSatish Balay if (J) { 676a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 67745cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr); 678a7e14dcfSSatish Balay tao->jacobian_inequality = J; 679a7e14dcfSSatish Balay } 680a7e14dcfSSatish Balay if (Jpre) { 681a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 68245cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr); 683a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 684a7e14dcfSSatish Balay } 685a7e14dcfSSatish Balay PetscFunctionReturn(0); 686a7e14dcfSSatish Balay } 687