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: 19*ffad9901SBarry 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 structure (see below) 26a7e14dcfSSatish Balay - ctx - [optional] user-defined Hessian context 27a7e14dcfSSatish Balay 28a7e14dcfSSatish Balay 29a7e14dcfSSatish Balay Notes: 30a7e14dcfSSatish Balay 31a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 32a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 33a7e14dcfSSatish Balay available options are 34a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 35a7e14dcfSSatish Balay $ Hpre is identical during successive linear solves. 36a7e14dcfSSatish Balay $ This option is intended for folks who are using 37a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 38a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 39a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 40a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 41a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 42a7e14dcfSSatish Balay $ Hpre has the same nonzero structure during 43a7e14dcfSSatish Balay $ successive linear solves. 44a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 45a7e14dcfSSatish Balay $ Hpre does not have the same nonzero structure. 46a7e14dcfSSatish Balay 47a7e14dcfSSatish Balay Caution: 48a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 49a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 50a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 51a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 52a7e14dcfSSatish Balay feature carefully! 53a7e14dcfSSatish Balay 54a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 55a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 56a7e14dcfSSatish Balay 57a7e14dcfSSatish Balay Level: beginner 58a7e14dcfSSatish Balay 59a7e14dcfSSatish Balay @*/ 60*ffad9901SBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 61a7e14dcfSSatish Balay { 62a7e14dcfSSatish Balay PetscErrorCode ierr; 6345cf516eSBarry Smith 64a7e14dcfSSatish Balay PetscFunctionBegin; 65441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 66a7e14dcfSSatish Balay if (H) { 67a7e14dcfSSatish Balay PetscValidHeaderSpecific(H,MAT_CLASSID,2); 68a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,H,2); 69a7e14dcfSSatish Balay } 70a7e14dcfSSatish Balay if (Hpre) { 71a7e14dcfSSatish Balay PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3); 72a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Hpre,3); 73a7e14dcfSSatish Balay } 74a7e14dcfSSatish Balay if (ctx) { 75a7e14dcfSSatish Balay tao->user_hessP = ctx; 76a7e14dcfSSatish Balay } 77a7e14dcfSSatish Balay if (func) { 78a7e14dcfSSatish Balay tao->ops->computehessian = func; 79a7e14dcfSSatish Balay } 80a7e14dcfSSatish Balay if (H) { 81a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr); 8245cf516eSBarry Smith ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr); 83a7e14dcfSSatish Balay tao->hessian = H; 84a7e14dcfSSatish Balay } 85a7e14dcfSSatish Balay if (Hpre) { 86a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr); 8745cf516eSBarry Smith ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr); 88a7e14dcfSSatish Balay tao->hessian_pre = Hpre; 89a7e14dcfSSatish Balay } 90a7e14dcfSSatish Balay PetscFunctionReturn(0); 91a7e14dcfSSatish Balay } 92a7e14dcfSSatish Balay 93a7e14dcfSSatish Balay #undef __FUNCT__ 94a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian" 95a7e14dcfSSatish Balay /*@C 96a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 97a7e14dcfSSatish Balay set with TaoSetHessianRoutine(). 98a7e14dcfSSatish Balay 99441846f8SBarry Smith Collective on Tao 100a7e14dcfSSatish Balay 101a7e14dcfSSatish Balay Input Parameters: 102441846f8SBarry Smith + solver - the Tao solver context 103a7e14dcfSSatish Balay - xx - input vector 104a7e14dcfSSatish Balay 105a7e14dcfSSatish Balay Output Parameters: 106a7e14dcfSSatish Balay + H - Hessian matrix 107a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 108a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 109a7e14dcfSSatish Balay 110a7e14dcfSSatish Balay Notes: 111a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 112a7e14dcfSSatish Balay is used internally within the minimization solvers. 113a7e14dcfSSatish Balay 114a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 115a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 116a7e14dcfSSatish Balay themselves. 117a7e14dcfSSatish Balay 118a7e14dcfSSatish Balay Level: developer 119a7e14dcfSSatish Balay 120a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian() 121a7e14dcfSSatish Balay 122a7e14dcfSSatish Balay @*/ 123*ffad9901SBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre) 124a7e14dcfSSatish Balay { 125a7e14dcfSSatish Balay PetscErrorCode ierr; 12687f595a5SBarry Smith 127a7e14dcfSSatish Balay PetscFunctionBegin; 128441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 129a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 130a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 131a7e14dcfSSatish Balay 13287f595a5SBarry Smith if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first"); 133a7e14dcfSSatish Balay ++tao->nhess; 13494ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 135441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 136*ffad9901SBarry Smith ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,tao->user_hessP);CHKERRQ(ierr); 137a7e14dcfSSatish Balay PetscStackPop; 13894ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 139a7e14dcfSSatish Balay PetscFunctionReturn(0); 140a7e14dcfSSatish Balay } 141a7e14dcfSSatish Balay 142a7e14dcfSSatish Balay #undef __FUNCT__ 143a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian" 144a7e14dcfSSatish Balay /*@C 145a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 146a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 147a7e14dcfSSatish Balay 148441846f8SBarry Smith Collective on Tao 149a7e14dcfSSatish Balay 150a7e14dcfSSatish Balay Input Parameters: 151441846f8SBarry Smith + solver - the Tao solver context 152a7e14dcfSSatish Balay - xx - input vector 153a7e14dcfSSatish Balay 154a7e14dcfSSatish Balay Output Parameters: 155a7e14dcfSSatish Balay + H - Jacobian matrix 156*ffad9901SBarry Smith - Hpre - Preconditioning matrix 157a7e14dcfSSatish Balay 158a7e14dcfSSatish Balay Notes: 159a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 160a7e14dcfSSatish Balay is used internally within the minimization solvers. 161a7e14dcfSSatish Balay 162a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 163a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 164a7e14dcfSSatish Balay themselves. 165a7e14dcfSSatish Balay 166a7e14dcfSSatish Balay Level: developer 167a7e14dcfSSatish Balay 168a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian() 169a7e14dcfSSatish Balay 170a7e14dcfSSatish Balay @*/ 171*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre) 172a7e14dcfSSatish Balay { 173a7e14dcfSSatish Balay PetscErrorCode ierr; 17487f595a5SBarry Smith 175a7e14dcfSSatish Balay PetscFunctionBegin; 176441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 177a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 178a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 179a7e14dcfSSatish Balay 18087f595a5SBarry Smith if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 181a7e14dcfSSatish Balay ++tao->njac; 18294ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 183441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 184*ffad9901SBarry Smith ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,tao->user_jacP);CHKERRQ(ierr); 185a7e14dcfSSatish Balay PetscStackPop; 18694ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 187a7e14dcfSSatish Balay PetscFunctionReturn(0); 188a7e14dcfSSatish Balay } 189a7e14dcfSSatish Balay 190a7e14dcfSSatish Balay #undef __FUNCT__ 191a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState" 192a7e14dcfSSatish Balay /*@C 193a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 194a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 195a7e14dcfSSatish Balay 196441846f8SBarry Smith Collective on Tao 197a7e14dcfSSatish Balay 198a7e14dcfSSatish Balay Input Parameters: 199441846f8SBarry Smith + solver - the Tao solver context 200a7e14dcfSSatish Balay - xx - input vector 201a7e14dcfSSatish Balay 202a7e14dcfSSatish Balay Output Parameters: 203a7e14dcfSSatish Balay + H - Jacobian matrix 204*ffad9901SBarry Smith - Hpre - Preconditioning matrix 205a7e14dcfSSatish Balay 206a7e14dcfSSatish Balay Notes: 207a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 208a7e14dcfSSatish Balay is used internally within the minimization solvers. 209a7e14dcfSSatish Balay 210a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 211a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 212a7e14dcfSSatish Balay themselves. 213a7e14dcfSSatish Balay 214a7e14dcfSSatish Balay Level: developer 215a7e14dcfSSatish Balay 216a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 217a7e14dcfSSatish Balay 218a7e14dcfSSatish Balay @*/ 219*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv) 220a7e14dcfSSatish Balay { 221a7e14dcfSSatish Balay PetscErrorCode ierr; 22245cf516eSBarry Smith 223a7e14dcfSSatish Balay PetscFunctionBegin; 224441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 225a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 226a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 227a7e14dcfSSatish Balay 22887f595a5SBarry Smith if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 229a7e14dcfSSatish Balay ++tao->njac_state; 23094ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 231441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 232*ffad9901SBarry Smith ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,tao->user_jac_stateP);CHKERRQ(ierr); 233a7e14dcfSSatish Balay PetscStackPop; 23494ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 235a7e14dcfSSatish Balay PetscFunctionReturn(0); 236a7e14dcfSSatish Balay } 237a7e14dcfSSatish Balay 238a7e14dcfSSatish Balay #undef __FUNCT__ 239a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign" 240a7e14dcfSSatish Balay /*@C 241a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 242a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 243a7e14dcfSSatish Balay 244441846f8SBarry Smith Collective on Tao 245a7e14dcfSSatish Balay 246a7e14dcfSSatish Balay Input Parameters: 247441846f8SBarry Smith + solver - the Tao solver context 248a7e14dcfSSatish Balay - xx - input vector 249a7e14dcfSSatish Balay 250a7e14dcfSSatish Balay Output Parameters: 251a7e14dcfSSatish Balay . H - Jacobian matrix 252a7e14dcfSSatish Balay 253a7e14dcfSSatish Balay Notes: 254a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 255a7e14dcfSSatish Balay is used internally within the minimization solvers. 256a7e14dcfSSatish Balay 257a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 258a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 259a7e14dcfSSatish Balay themselves. 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay Level: developer 262a7e14dcfSSatish Balay 263a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 264a7e14dcfSSatish Balay 265a7e14dcfSSatish Balay @*/ 26694ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 267a7e14dcfSSatish Balay { 268a7e14dcfSSatish Balay PetscErrorCode ierr; 26987f595a5SBarry Smith 270a7e14dcfSSatish Balay PetscFunctionBegin; 271441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 272a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 273a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 274a7e14dcfSSatish Balay 27587f595a5SBarry Smith if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 276a7e14dcfSSatish Balay ++tao->njac_design; 27794ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 278441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 279a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr); 280a7e14dcfSSatish Balay PetscStackPop; 28194ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 282a7e14dcfSSatish Balay PetscFunctionReturn(0); 283a7e14dcfSSatish Balay } 284a7e14dcfSSatish Balay 285a7e14dcfSSatish Balay #undef __FUNCT__ 286a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine" 287a7e14dcfSSatish Balay /*@C 288a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 289a7e14dcfSSatish Balay 290441846f8SBarry Smith Logically collective on Tao 291a7e14dcfSSatish Balay 292a7e14dcfSSatish Balay Input Parameters: 293441846f8SBarry Smith + tao - the Tao context 294a7e14dcfSSatish Balay . J - Matrix used for the jacobian 295a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 296a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 297a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 2986c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 299a7e14dcfSSatish Balay 300a7e14dcfSSatish Balay Calling sequence of jac: 301*ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 302a7e14dcfSSatish Balay 303441846f8SBarry Smith + tao - the Tao context 304a7e14dcfSSatish Balay . x - input vector 305a7e14dcfSSatish Balay . J - Jacobian matrix 306a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 307a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 308a7e14dcfSSatish Balay structure (see below) 309a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 310a7e14dcfSSatish Balay 311a7e14dcfSSatish Balay Notes: 312a7e14dcfSSatish Balay 313a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 314a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 315a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 316a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 317a7e14dcfSSatish Balay throughout the global iterations. 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 320a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 321a7e14dcfSSatish Balay available options are 322a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 323a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 324a7e14dcfSSatish Balay $ This option is intended for folks who are using 325a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 326a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 327a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 328a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 329a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 330a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 331a7e14dcfSSatish Balay $ successive linear solves. 332a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 333a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 334a7e14dcfSSatish Balay 335a7e14dcfSSatish Balay Caution: 336a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 337a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 338a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 339a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 340a7e14dcfSSatish Balay feature carefully! 341a7e14dcfSSatish Balay 342a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 343a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 344a7e14dcfSSatish Balay 345a7e14dcfSSatish Balay Level: intermediate 346a7e14dcfSSatish Balay 347a7e14dcfSSatish Balay @*/ 348*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void*), void *ctx) 349a7e14dcfSSatish Balay { 350a7e14dcfSSatish Balay PetscErrorCode ierr; 351a7e14dcfSSatish Balay PetscFunctionBegin; 352441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 353a7e14dcfSSatish Balay if (J) { 354a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 355a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 356a7e14dcfSSatish Balay } 357a7e14dcfSSatish Balay if (Jpre) { 358a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 359a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 360a7e14dcfSSatish Balay } 361a7e14dcfSSatish Balay if (ctx) { 362a7e14dcfSSatish Balay tao->user_jacP = ctx; 363a7e14dcfSSatish Balay } 364a7e14dcfSSatish Balay if (func) { 365a7e14dcfSSatish Balay tao->ops->computejacobian = func; 366a7e14dcfSSatish Balay } 367a7e14dcfSSatish Balay if (J) { 368a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 36945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr); 370a7e14dcfSSatish Balay tao->jacobian = J; 371a7e14dcfSSatish Balay } 372a7e14dcfSSatish Balay if (Jpre) { 373a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 37445cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr); 375a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 376a7e14dcfSSatish Balay } 377a7e14dcfSSatish Balay PetscFunctionReturn(0); 378a7e14dcfSSatish Balay } 379a7e14dcfSSatish Balay 380a7e14dcfSSatish Balay #undef __FUNCT__ 381a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine" 382a7e14dcfSSatish Balay /*@C 383a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 384a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 385a7e14dcfSSatish Balay Used only for pde-constrained optimization. 386a7e14dcfSSatish Balay 387441846f8SBarry Smith Logically collective on Tao 388a7e14dcfSSatish Balay 389a7e14dcfSSatish Balay Input Parameters: 390441846f8SBarry Smith + tao - the Tao context 391a7e14dcfSSatish Balay . J - Matrix used for the jacobian 3926c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 3936c23d075SBarry 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. 394a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 395a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3966c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 397a7e14dcfSSatish Balay 398a7e14dcfSSatish Balay Calling sequence of jac: 399*ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 400a7e14dcfSSatish Balay 401441846f8SBarry Smith + tao - the Tao context 402a7e14dcfSSatish Balay . x - input vector 403a7e14dcfSSatish Balay . J - Jacobian matrix 404a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 405a7e14dcfSSatish Balay . Jinv - inverse of J 406a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 407a7e14dcfSSatish Balay structure (see below) 408a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay 411a7e14dcfSSatish Balay Notes: 412a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 413a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 414a7e14dcfSSatish Balay its own Jinv matrix. 415a7e14dcfSSatish Balay 416a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 417a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 418a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 419a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 420a7e14dcfSSatish Balay throughout the global iterations. 421a7e14dcfSSatish Balay 422a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 423a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 424a7e14dcfSSatish Balay available options are 425a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 426a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 427a7e14dcfSSatish Balay $ This option is intended for folks who are using 428a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 429a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 430a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 431a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 432a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 433a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 434a7e14dcfSSatish Balay $ successive linear solves. 435a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 436a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 437a7e14dcfSSatish Balay 438a7e14dcfSSatish Balay Caution: 439a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 440a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 441a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 442a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 443a7e14dcfSSatish Balay feature carefully! 444a7e14dcfSSatish Balay 445a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 446a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 447a7e14dcfSSatish Balay 448a7e14dcfSSatish Balay Level: intermediate 449a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 450a7e14dcfSSatish Balay @*/ 451*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat,void*), void *ctx) 452a7e14dcfSSatish Balay { 453a7e14dcfSSatish Balay PetscErrorCode ierr; 454a7e14dcfSSatish Balay PetscFunctionBegin; 455441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 456a7e14dcfSSatish Balay if (J) { 457a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 458a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 459a7e14dcfSSatish Balay } 460a7e14dcfSSatish Balay if (Jpre) { 461a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 462a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 463a7e14dcfSSatish Balay } 464a7e14dcfSSatish Balay if (Jinv) { 465a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 466a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 467a7e14dcfSSatish Balay } 468a7e14dcfSSatish Balay if (ctx) { 469a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 470a7e14dcfSSatish Balay } 471a7e14dcfSSatish Balay if (func) { 472a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 473a7e14dcfSSatish Balay } 474a7e14dcfSSatish Balay if (J) { 475a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 47645cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr); 477a7e14dcfSSatish Balay tao->jacobian_state = J; 478a7e14dcfSSatish Balay } 479a7e14dcfSSatish Balay if (Jpre) { 480a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 48145cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr); 482a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 483a7e14dcfSSatish Balay } 484a7e14dcfSSatish Balay if (Jinv) { 485a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr); 48645cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr); 487a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 488a7e14dcfSSatish Balay } 489a7e14dcfSSatish Balay PetscFunctionReturn(0); 490a7e14dcfSSatish Balay } 491a7e14dcfSSatish Balay 492a7e14dcfSSatish Balay #undef __FUNCT__ 493a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine" 494a7e14dcfSSatish Balay /*@C 495a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 496a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 497a7e14dcfSSatish Balay pde-constrained optimization. 498a7e14dcfSSatish Balay 499441846f8SBarry Smith Logically collective on Tao 500a7e14dcfSSatish Balay 501a7e14dcfSSatish Balay Input Parameters: 502441846f8SBarry Smith + tao - the Tao context 503a7e14dcfSSatish Balay . J - Matrix used for the jacobian 504a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 505a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 5066c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 507a7e14dcfSSatish Balay 508a7e14dcfSSatish Balay Calling sequence of jac: 509441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,void *ctx); 510a7e14dcfSSatish Balay 511441846f8SBarry Smith + tao - the Tao context 512a7e14dcfSSatish Balay . x - input vector 513a7e14dcfSSatish Balay . J - Jacobian matrix 514a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 515a7e14dcfSSatish Balay 516a7e14dcfSSatish Balay 517a7e14dcfSSatish Balay Notes: 518a7e14dcfSSatish Balay 519a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 520a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 521a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 522a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 523a7e14dcfSSatish Balay throughout the global iterations. 524a7e14dcfSSatish Balay 525a7e14dcfSSatish Balay Level: intermediate 526a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 527a7e14dcfSSatish Balay @*/ 52894ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 529a7e14dcfSSatish Balay { 530a7e14dcfSSatish Balay PetscErrorCode ierr; 53145cf516eSBarry Smith 532a7e14dcfSSatish Balay PetscFunctionBegin; 533441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 534a7e14dcfSSatish Balay if (J) { 535a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 536a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 537a7e14dcfSSatish Balay } 538a7e14dcfSSatish Balay if (ctx) { 539a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 540a7e14dcfSSatish Balay } 541a7e14dcfSSatish Balay if (func) { 542a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 543a7e14dcfSSatish Balay } 544a7e14dcfSSatish Balay if (J) { 545a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 54645cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr); 547a7e14dcfSSatish Balay tao->jacobian_design = J; 548a7e14dcfSSatish Balay } 549a7e14dcfSSatish Balay PetscFunctionReturn(0); 550a7e14dcfSSatish Balay } 551a7e14dcfSSatish Balay 552a7e14dcfSSatish Balay #undef __FUNCT__ 553a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS" 554a7e14dcfSSatish Balay /*@ 555441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 556a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 557a7e14dcfSSatish Balay pde-constrained optimization. 558a7e14dcfSSatish Balay 559441846f8SBarry Smith Logically Collective on Tao 560a7e14dcfSSatish Balay 561a7e14dcfSSatish Balay Input Parameters: 562441846f8SBarry Smith + tao - The Tao context 563a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 564a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 565a7e14dcfSSatish Balay 566a7e14dcfSSatish Balay Level: intermediate 567a7e14dcfSSatish Balay 568a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 569a7e14dcfSSatish Balay @*/ 570441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 571a7e14dcfSSatish Balay { 572a7e14dcfSSatish Balay PetscErrorCode ierr; 57345cf516eSBarry Smith 57445cf516eSBarry Smith PetscFunctionBegin; 57545cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr); 57645cf516eSBarry Smith ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr); 577a7e14dcfSSatish Balay tao->state_is = s_is; 57845cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr); 57945cf516eSBarry Smith ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr); 580a7e14dcfSSatish Balay tao->design_is = d_is; 581a7e14dcfSSatish Balay PetscFunctionReturn(0); 582a7e14dcfSSatish Balay } 583a7e14dcfSSatish Balay 584a7e14dcfSSatish Balay #undef __FUNCT__ 585a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality" 586a7e14dcfSSatish Balay /*@C 587a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 588a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 589a7e14dcfSSatish Balay 590441846f8SBarry Smith Collective on Tao 591a7e14dcfSSatish Balay 592a7e14dcfSSatish Balay Input Parameters: 593441846f8SBarry Smith + solver - the Tao solver context 594a7e14dcfSSatish Balay - xx - input vector 595a7e14dcfSSatish Balay 596a7e14dcfSSatish Balay Output Parameters: 597a7e14dcfSSatish Balay + H - Jacobian matrix 598a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 599a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 600a7e14dcfSSatish Balay 601a7e14dcfSSatish Balay Notes: 602a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 603a7e14dcfSSatish Balay is used internally within the minimization solvers. 604a7e14dcfSSatish Balay 605a7e14dcfSSatish Balay Level: developer 606a7e14dcfSSatish Balay 607a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 608a7e14dcfSSatish Balay 609a7e14dcfSSatish Balay @*/ 610*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre) 611a7e14dcfSSatish Balay { 612a7e14dcfSSatish Balay PetscErrorCode ierr; 61345cf516eSBarry Smith 614a7e14dcfSSatish Balay PetscFunctionBegin; 615441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 616a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 617a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 618a7e14dcfSSatish Balay 61987f595a5SBarry Smith if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 620a7e14dcfSSatish Balay ++tao->njac_equality; 62194ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 622441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 623*ffad9901SBarry Smith ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,tao->user_jac_equalityP);CHKERRQ(ierr); 624a7e14dcfSSatish Balay PetscStackPop; 62594ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 626a7e14dcfSSatish Balay PetscFunctionReturn(0); 627a7e14dcfSSatish Balay } 628a7e14dcfSSatish Balay 629a7e14dcfSSatish Balay #undef __FUNCT__ 630a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality" 631a7e14dcfSSatish Balay /*@C 632a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 633a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 634a7e14dcfSSatish Balay 635441846f8SBarry Smith Collective on Tao 636a7e14dcfSSatish Balay 637a7e14dcfSSatish Balay Input Parameters: 638441846f8SBarry Smith + solver - the Tao solver context 639a7e14dcfSSatish Balay - xx - input vector 640a7e14dcfSSatish Balay 641a7e14dcfSSatish Balay Output Parameters: 642a7e14dcfSSatish Balay + H - Jacobian matrix 643a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 644a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 645a7e14dcfSSatish Balay 646a7e14dcfSSatish Balay Notes: 647a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 648a7e14dcfSSatish Balay is used internally within the minimization solvers. 649a7e14dcfSSatish Balay 650a7e14dcfSSatish Balay Level: developer 651a7e14dcfSSatish Balay 652a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 653a7e14dcfSSatish Balay 654a7e14dcfSSatish Balay @*/ 655*ffad9901SBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre) 656a7e14dcfSSatish Balay { 657a7e14dcfSSatish Balay PetscErrorCode ierr; 65887f595a5SBarry Smith 659a7e14dcfSSatish Balay PetscFunctionBegin; 660441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 661a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 662a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 663a7e14dcfSSatish Balay 66487f595a5SBarry Smith if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 665a7e14dcfSSatish Balay ++tao->njac_inequality; 66694ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 667441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 668*ffad9901SBarry Smith ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,tao->user_jac_inequalityP);CHKERRQ(ierr); 669a7e14dcfSSatish Balay PetscStackPop; 67094ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 671a7e14dcfSSatish Balay PetscFunctionReturn(0); 672a7e14dcfSSatish Balay } 673a7e14dcfSSatish Balay 674a7e14dcfSSatish Balay #undef __FUNCT__ 675a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine" 676a7e14dcfSSatish Balay /*@C 677a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 678a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 679a7e14dcfSSatish Balay Used only for pde-constrained optimization. 680a7e14dcfSSatish Balay 681441846f8SBarry Smith Logically collective on Tao 682a7e14dcfSSatish Balay 683a7e14dcfSSatish Balay Input Parameters: 684441846f8SBarry Smith + tao - the Tao context 685a7e14dcfSSatish Balay . J - Matrix used for the jacobian 686a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 687a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 688a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 6896c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 690a7e14dcfSSatish Balay 691a7e14dcfSSatish Balay Calling sequence of jac: 692*ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 693a7e14dcfSSatish Balay 694441846f8SBarry Smith + tao - the Tao context 695a7e14dcfSSatish Balay . x - input vector 696a7e14dcfSSatish Balay . J - Jacobian matrix 697a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 698a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 699a7e14dcfSSatish Balay structure (see below) 700a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 701a7e14dcfSSatish Balay 702a7e14dcfSSatish Balay Notes: 703a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 704a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 705a7e14dcfSSatish Balay its own Jinv matrix. 706a7e14dcfSSatish Balay 707a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 708a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 709a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 710a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 711a7e14dcfSSatish Balay throughout the global iterations. 712a7e14dcfSSatish Balay 713a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 714a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 715a7e14dcfSSatish Balay available options are 716a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 717a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 718a7e14dcfSSatish Balay $ This option is intended for folks who are using 719a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 720a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 721a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 722a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 723a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 724a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 725a7e14dcfSSatish Balay $ successive linear solves. 726a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 727a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 728a7e14dcfSSatish Balay 729a7e14dcfSSatish Balay Caution: 730a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 731a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 732a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 733a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 734a7e14dcfSSatish Balay feature carefully! 735a7e14dcfSSatish Balay 736a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 737a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 738a7e14dcfSSatish Balay 739a7e14dcfSSatish Balay Level: intermediate 740a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 741a7e14dcfSSatish Balay @*/ 742*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 743a7e14dcfSSatish Balay { 744a7e14dcfSSatish Balay PetscErrorCode ierr; 74545cf516eSBarry Smith 746a7e14dcfSSatish Balay PetscFunctionBegin; 747441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 748a7e14dcfSSatish Balay if (J) { 749a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 750a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 751a7e14dcfSSatish Balay } 752a7e14dcfSSatish Balay if (Jpre) { 753a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 754a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 755a7e14dcfSSatish Balay } 756a7e14dcfSSatish Balay if (ctx) { 757a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 758a7e14dcfSSatish Balay } 759a7e14dcfSSatish Balay if (func) { 760a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 761a7e14dcfSSatish Balay } 762a7e14dcfSSatish Balay if (J) { 763a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 76445cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr); 765a7e14dcfSSatish Balay tao->jacobian_equality = J; 766a7e14dcfSSatish Balay } 767a7e14dcfSSatish Balay if (Jpre) { 768a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 76945cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr); 770a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 771a7e14dcfSSatish Balay } 772a7e14dcfSSatish Balay PetscFunctionReturn(0); 773a7e14dcfSSatish Balay } 774a7e14dcfSSatish Balay 775a7e14dcfSSatish Balay #undef __FUNCT__ 776a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine" 777a7e14dcfSSatish Balay /*@C 778a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 779a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 780a7e14dcfSSatish Balay Used only for pde-constrained optimization. 781a7e14dcfSSatish Balay 782441846f8SBarry Smith Logically collective on Tao 783a7e14dcfSSatish Balay 784a7e14dcfSSatish Balay Input Parameters: 785441846f8SBarry Smith + tao - the Tao context 786a7e14dcfSSatish Balay . J - Matrix used for the jacobian 787a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 788a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 789a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 7906c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 791a7e14dcfSSatish Balay 792a7e14dcfSSatish Balay Calling sequence of jac: 793*ffad9901SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,void *ctx); 794a7e14dcfSSatish Balay 795441846f8SBarry Smith + tao - the Tao context 796a7e14dcfSSatish Balay . x - input vector 797a7e14dcfSSatish Balay . J - Jacobian matrix 798a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 799a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 800a7e14dcfSSatish Balay structure (see below) 801a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 802a7e14dcfSSatish Balay 803a7e14dcfSSatish Balay 804a7e14dcfSSatish Balay Notes: 805a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 806a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 807a7e14dcfSSatish Balay its own Jinv matrix. 808a7e14dcfSSatish Balay 809a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 810a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 811a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 812a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 813a7e14dcfSSatish Balay throughout the global iterations. 814a7e14dcfSSatish Balay 815a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 816a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 817a7e14dcfSSatish Balay available options are 818a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 819a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 820a7e14dcfSSatish Balay $ This option is intended for folks who are using 821a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 822a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 823a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 824a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 825a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 826a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 827a7e14dcfSSatish Balay $ successive linear solves. 828a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 829a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 830a7e14dcfSSatish Balay 831a7e14dcfSSatish Balay Caution: 832a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 833a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 834a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 835a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 836a7e14dcfSSatish Balay feature carefully! 837a7e14dcfSSatish Balay 838a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 839a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 840a7e14dcfSSatish Balay 841a7e14dcfSSatish Balay Level: intermediate 842a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 843a7e14dcfSSatish Balay @*/ 844*ffad9901SBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat,void*), void *ctx) 845a7e14dcfSSatish Balay { 846a7e14dcfSSatish Balay PetscErrorCode ierr; 847a7e14dcfSSatish Balay PetscFunctionBegin; 848441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 849a7e14dcfSSatish Balay if (J) { 850a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 851a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 852a7e14dcfSSatish Balay } 853a7e14dcfSSatish Balay if (Jpre) { 854a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 855a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 856a7e14dcfSSatish Balay } 857a7e14dcfSSatish Balay if (ctx) { 858a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 859a7e14dcfSSatish Balay } 860a7e14dcfSSatish Balay if (func) { 861a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 862a7e14dcfSSatish Balay } 863a7e14dcfSSatish Balay if (J) { 864a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 86545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr); 866a7e14dcfSSatish Balay tao->jacobian_inequality = J; 867a7e14dcfSSatish Balay } 868a7e14dcfSSatish Balay if (Jpre) { 869a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 87045cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr); 871a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 872a7e14dcfSSatish Balay } 873a7e14dcfSSatish Balay PetscFunctionReturn(0); 874a7e14dcfSSatish Balay } 875