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*94ab13aaSBarry Smith $ hess (Tao tao,Vec x,Mat H,Mat Hpre,MatStructure *flag,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 . flag - flag indicating information about the preconditioner matrix 26a7e14dcfSSatish Balay structure (see below) 27a7e14dcfSSatish Balay - ctx - [optional] user-defined Hessian context 28a7e14dcfSSatish Balay 29a7e14dcfSSatish Balay 30a7e14dcfSSatish Balay Notes: 31a7e14dcfSSatish Balay 32a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 33a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 34a7e14dcfSSatish Balay available options are 35a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 36a7e14dcfSSatish Balay $ Hpre is identical during successive linear solves. 37a7e14dcfSSatish Balay $ This option is intended for folks who are using 38a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 39a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 40a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 41a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 42a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 43a7e14dcfSSatish Balay $ Hpre has the same nonzero structure during 44a7e14dcfSSatish Balay $ successive linear solves. 45a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 46a7e14dcfSSatish Balay $ Hpre does not have the same nonzero structure. 47a7e14dcfSSatish Balay 48a7e14dcfSSatish Balay Caution: 49a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 50a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 51a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 52a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 53a7e14dcfSSatish Balay feature carefully! 54a7e14dcfSSatish Balay 55a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 56a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 57a7e14dcfSSatish Balay 58a7e14dcfSSatish Balay Level: beginner 59a7e14dcfSSatish Balay 60a7e14dcfSSatish Balay @*/ 61*94ab13aaSBarry Smith PetscErrorCode TaoSetHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat , MatStructure *, void*), void *ctx) 62a7e14dcfSSatish Balay { 63a7e14dcfSSatish Balay PetscErrorCode ierr; 6445cf516eSBarry Smith 65a7e14dcfSSatish Balay PetscFunctionBegin; 66441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 67a7e14dcfSSatish Balay if (H) { 68a7e14dcfSSatish Balay PetscValidHeaderSpecific(H,MAT_CLASSID,2); 69a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,H,2); 70a7e14dcfSSatish Balay } 71a7e14dcfSSatish Balay if (Hpre) { 72a7e14dcfSSatish Balay PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3); 73a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Hpre,3); 74a7e14dcfSSatish Balay } 75a7e14dcfSSatish Balay if (ctx) { 76a7e14dcfSSatish Balay tao->user_hessP = ctx; 77a7e14dcfSSatish Balay } 78a7e14dcfSSatish Balay if (func) { 79a7e14dcfSSatish Balay tao->ops->computehessian = func; 80a7e14dcfSSatish Balay } 81a7e14dcfSSatish Balay if (H) { 82a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)H);CHKERRQ(ierr); 8345cf516eSBarry Smith ierr = MatDestroy(&tao->hessian);CHKERRQ(ierr); 84a7e14dcfSSatish Balay tao->hessian = H; 85a7e14dcfSSatish Balay } 86a7e14dcfSSatish Balay if (Hpre) { 87a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Hpre);CHKERRQ(ierr); 8845cf516eSBarry Smith ierr = MatDestroy(&tao->hessian_pre);CHKERRQ(ierr); 89a7e14dcfSSatish Balay tao->hessian_pre = Hpre; 90a7e14dcfSSatish Balay } 91a7e14dcfSSatish Balay PetscFunctionReturn(0); 92a7e14dcfSSatish Balay } 93a7e14dcfSSatish Balay 94a7e14dcfSSatish Balay #undef __FUNCT__ 95a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian" 96a7e14dcfSSatish Balay /*@C 97a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 98a7e14dcfSSatish Balay set with TaoSetHessianRoutine(). 99a7e14dcfSSatish Balay 100441846f8SBarry Smith Collective on Tao 101a7e14dcfSSatish Balay 102a7e14dcfSSatish Balay Input Parameters: 103441846f8SBarry Smith + solver - the Tao solver context 104a7e14dcfSSatish Balay - xx - input vector 105a7e14dcfSSatish Balay 106a7e14dcfSSatish Balay Output Parameters: 107a7e14dcfSSatish Balay + H - Hessian matrix 108a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 109a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 110a7e14dcfSSatish Balay 111a7e14dcfSSatish Balay Notes: 112a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 113a7e14dcfSSatish Balay is used internally within the minimization solvers. 114a7e14dcfSSatish Balay 115a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 116a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 117a7e14dcfSSatish Balay themselves. 118a7e14dcfSSatish Balay 119a7e14dcfSSatish Balay Level: developer 120a7e14dcfSSatish Balay 121a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian() 122a7e14dcfSSatish Balay 123a7e14dcfSSatish Balay @*/ 124*94ab13aaSBarry Smith PetscErrorCode TaoComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre, MatStructure *flg) 125a7e14dcfSSatish Balay { 126a7e14dcfSSatish Balay PetscErrorCode ierr; 12787f595a5SBarry Smith 128a7e14dcfSSatish Balay PetscFunctionBegin; 129441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 130a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 131a7e14dcfSSatish Balay PetscValidPointer(flg,5); 132a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 133a7e14dcfSSatish Balay 13487f595a5SBarry Smith if (!tao->ops->computehessian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first"); 135a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 136a7e14dcfSSatish Balay ++tao->nhess; 137*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 138441846f8SBarry Smith PetscStackPush("Tao user Hessian function"); 139a7e14dcfSSatish Balay ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,flg,tao->user_hessP);CHKERRQ(ierr); 140a7e14dcfSSatish Balay PetscStackPop; 141*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_HessianEval,tao,X,H,Hpre);CHKERRQ(ierr); 142a7e14dcfSSatish Balay PetscFunctionReturn(0); 143a7e14dcfSSatish Balay } 144a7e14dcfSSatish Balay 145a7e14dcfSSatish Balay #undef __FUNCT__ 146a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian" 147a7e14dcfSSatish Balay /*@C 148a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 149a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 150a7e14dcfSSatish Balay 151441846f8SBarry Smith Collective on Tao 152a7e14dcfSSatish Balay 153a7e14dcfSSatish Balay Input Parameters: 154441846f8SBarry Smith + solver - the Tao solver context 155a7e14dcfSSatish Balay - xx - input vector 156a7e14dcfSSatish Balay 157a7e14dcfSSatish Balay Output Parameters: 158a7e14dcfSSatish Balay + H - Jacobian matrix 159a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 160a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 161a7e14dcfSSatish Balay 162a7e14dcfSSatish Balay Notes: 163a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 164a7e14dcfSSatish Balay is used internally within the minimization solvers. 165a7e14dcfSSatish Balay 166a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 167a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 168a7e14dcfSSatish Balay themselves. 169a7e14dcfSSatish Balay 170a7e14dcfSSatish Balay Level: developer 171a7e14dcfSSatish Balay 172a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian() 173a7e14dcfSSatish Balay 174a7e14dcfSSatish Balay @*/ 175*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobian(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg) 176a7e14dcfSSatish Balay { 177a7e14dcfSSatish Balay PetscErrorCode ierr; 17887f595a5SBarry Smith 179a7e14dcfSSatish Balay PetscFunctionBegin; 180441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 181a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 182a7e14dcfSSatish Balay PetscValidPointer(flg,5); 183a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 184a7e14dcfSSatish Balay 18587f595a5SBarry Smith if (!tao->ops->computejacobian) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 186a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 187a7e14dcfSSatish Balay ++tao->njac; 188*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 189441846f8SBarry Smith PetscStackPush("Tao user Jacobian function"); 190a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,flg,tao->user_jacP);CHKERRQ(ierr); 191a7e14dcfSSatish Balay PetscStackPop; 192*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 193a7e14dcfSSatish Balay PetscFunctionReturn(0); 194a7e14dcfSSatish Balay } 195a7e14dcfSSatish Balay 196a7e14dcfSSatish Balay #undef __FUNCT__ 197a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState" 198a7e14dcfSSatish Balay /*@C 199a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 200a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 201a7e14dcfSSatish Balay 202441846f8SBarry Smith Collective on Tao 203a7e14dcfSSatish Balay 204a7e14dcfSSatish Balay Input Parameters: 205441846f8SBarry Smith + solver - the Tao solver context 206a7e14dcfSSatish Balay - xx - input vector 207a7e14dcfSSatish Balay 208a7e14dcfSSatish Balay Output Parameters: 209a7e14dcfSSatish Balay + H - Jacobian matrix 210a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 211a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 212a7e14dcfSSatish Balay 213a7e14dcfSSatish Balay Notes: 214a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 215a7e14dcfSSatish Balay is used internally within the minimization solvers. 216a7e14dcfSSatish Balay 217a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 218a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 219a7e14dcfSSatish Balay themselves. 220a7e14dcfSSatish Balay 221a7e14dcfSSatish Balay Level: developer 222a7e14dcfSSatish Balay 223a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 224a7e14dcfSSatish Balay 225a7e14dcfSSatish Balay @*/ 226*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianState(Tao tao, Vec X, Mat J, Mat Jpre, Mat Jinv, MatStructure *flg) 227a7e14dcfSSatish Balay { 228a7e14dcfSSatish Balay PetscErrorCode ierr; 22945cf516eSBarry Smith 230a7e14dcfSSatish Balay PetscFunctionBegin; 231441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 232a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 233a7e14dcfSSatish Balay PetscValidPointer(flg,5); 234a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 235a7e14dcfSSatish Balay 23687f595a5SBarry Smith if (!tao->ops->computejacobianstate) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 237a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 238a7e14dcfSSatish Balay ++tao->njac_state; 239*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 240441846f8SBarry Smith PetscStackPush("Tao user Jacobian(state) function"); 241a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,flg,tao->user_jac_stateP);CHKERRQ(ierr); 242a7e14dcfSSatish Balay PetscStackPop; 243*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 244a7e14dcfSSatish Balay PetscFunctionReturn(0); 245a7e14dcfSSatish Balay } 246a7e14dcfSSatish Balay 247a7e14dcfSSatish Balay #undef __FUNCT__ 248a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign" 249a7e14dcfSSatish Balay /*@C 250a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 251a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 252a7e14dcfSSatish Balay 253441846f8SBarry Smith Collective on Tao 254a7e14dcfSSatish Balay 255a7e14dcfSSatish Balay Input Parameters: 256441846f8SBarry Smith + solver - the Tao solver context 257a7e14dcfSSatish Balay - xx - input vector 258a7e14dcfSSatish Balay 259a7e14dcfSSatish Balay Output Parameters: 260a7e14dcfSSatish Balay . H - Jacobian matrix 261a7e14dcfSSatish Balay 262a7e14dcfSSatish Balay Notes: 263a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 264a7e14dcfSSatish Balay is used internally within the minimization solvers. 265a7e14dcfSSatish Balay 266a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 267a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 268a7e14dcfSSatish Balay themselves. 269a7e14dcfSSatish Balay 270a7e14dcfSSatish Balay Level: developer 271a7e14dcfSSatish Balay 272a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 273a7e14dcfSSatish Balay 274a7e14dcfSSatish Balay @*/ 275*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianDesign(Tao tao, Vec X, Mat J) 276a7e14dcfSSatish Balay { 277a7e14dcfSSatish Balay PetscErrorCode ierr; 27887f595a5SBarry Smith 279a7e14dcfSSatish Balay PetscFunctionBegin; 280441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 281a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 282a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 283a7e14dcfSSatish Balay 28487f595a5SBarry Smith if (!tao->ops->computejacobiandesign) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 285a7e14dcfSSatish Balay ++tao->njac_design; 286*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 287441846f8SBarry Smith PetscStackPush("Tao user Jacobian(design) function"); 288a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP);CHKERRQ(ierr); 289a7e14dcfSSatish Balay PetscStackPop; 290*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,NULL);CHKERRQ(ierr); 291a7e14dcfSSatish Balay PetscFunctionReturn(0); 292a7e14dcfSSatish Balay } 293a7e14dcfSSatish Balay 294a7e14dcfSSatish Balay #undef __FUNCT__ 295a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine" 296a7e14dcfSSatish Balay /*@C 297a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 298a7e14dcfSSatish Balay 299441846f8SBarry Smith Logically collective on Tao 300a7e14dcfSSatish Balay 301a7e14dcfSSatish Balay Input Parameters: 302441846f8SBarry Smith + tao - the Tao context 303a7e14dcfSSatish Balay . J - Matrix used for the jacobian 304a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 305a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 306a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 3076c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 308a7e14dcfSSatish Balay 309a7e14dcfSSatish Balay Calling sequence of jac: 310441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 311a7e14dcfSSatish Balay 312441846f8SBarry Smith + tao - the Tao context 313a7e14dcfSSatish Balay . x - input vector 314a7e14dcfSSatish Balay . J - Jacobian matrix 315a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 316a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 317a7e14dcfSSatish Balay structure (see below) 318a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 319a7e14dcfSSatish Balay 320a7e14dcfSSatish Balay Notes: 321a7e14dcfSSatish Balay 322a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 323a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 324a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 325a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 326a7e14dcfSSatish Balay throughout the global iterations. 327a7e14dcfSSatish Balay 328a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 329a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 330a7e14dcfSSatish Balay available options are 331a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 332a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 333a7e14dcfSSatish Balay $ This option is intended for folks who are using 334a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 335a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 336a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 337a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 338a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 339a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 340a7e14dcfSSatish Balay $ successive linear solves. 341a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 342a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 343a7e14dcfSSatish Balay 344a7e14dcfSSatish Balay Caution: 345a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 346a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 347a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 348a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 349a7e14dcfSSatish Balay feature carefully! 350a7e14dcfSSatish Balay 351a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 352a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 353a7e14dcfSSatish Balay 354a7e14dcfSSatish Balay Level: intermediate 355a7e14dcfSSatish Balay 356a7e14dcfSSatish Balay @*/ 357*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx) 358a7e14dcfSSatish Balay { 359a7e14dcfSSatish Balay PetscErrorCode ierr; 360a7e14dcfSSatish Balay PetscFunctionBegin; 361441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 362a7e14dcfSSatish Balay if (J) { 363a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 364a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 365a7e14dcfSSatish Balay } 366a7e14dcfSSatish Balay if (Jpre) { 367a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 368a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 369a7e14dcfSSatish Balay } 370a7e14dcfSSatish Balay if (ctx) { 371a7e14dcfSSatish Balay tao->user_jacP = ctx; 372a7e14dcfSSatish Balay } 373a7e14dcfSSatish Balay if (func) { 374a7e14dcfSSatish Balay tao->ops->computejacobian = func; 375a7e14dcfSSatish Balay } 376a7e14dcfSSatish Balay if (J) { 377a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 37845cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian);CHKERRQ(ierr); 379a7e14dcfSSatish Balay tao->jacobian = J; 380a7e14dcfSSatish Balay } 381a7e14dcfSSatish Balay if (Jpre) { 382a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 38345cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_pre);CHKERRQ(ierr); 384a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 385a7e14dcfSSatish Balay } 386a7e14dcfSSatish Balay PetscFunctionReturn(0); 387a7e14dcfSSatish Balay } 388a7e14dcfSSatish Balay 389a7e14dcfSSatish Balay #undef __FUNCT__ 390a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine" 391a7e14dcfSSatish Balay /*@C 392a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 393a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 394a7e14dcfSSatish Balay Used only for pde-constrained optimization. 395a7e14dcfSSatish Balay 396441846f8SBarry Smith Logically collective on Tao 397a7e14dcfSSatish Balay 398a7e14dcfSSatish Balay Input Parameters: 399441846f8SBarry Smith + tao - the Tao context 400a7e14dcfSSatish Balay . J - Matrix used for the jacobian 4016c23d075SBarry Smith . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is NULL 4026c23d075SBarry 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. 403a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 404a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 4056c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 406a7e14dcfSSatish Balay 407a7e14dcfSSatish Balay Calling sequence of jac: 408441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 409a7e14dcfSSatish Balay 410441846f8SBarry Smith + tao - the Tao context 411a7e14dcfSSatish Balay . x - input vector 412a7e14dcfSSatish Balay . J - Jacobian matrix 413a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 414a7e14dcfSSatish Balay . Jinv - inverse of J 415a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 416a7e14dcfSSatish Balay structure (see below) 417a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 418a7e14dcfSSatish Balay 419a7e14dcfSSatish Balay 420a7e14dcfSSatish Balay Notes: 421a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 422a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 423a7e14dcfSSatish Balay its own Jinv matrix. 424a7e14dcfSSatish Balay 425a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 426a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 427a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 428a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 429a7e14dcfSSatish Balay throughout the global iterations. 430a7e14dcfSSatish Balay 431a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 432a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 433a7e14dcfSSatish Balay available options are 434a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 435a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 436a7e14dcfSSatish Balay $ This option is intended for folks who are using 437a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 438a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 439a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 440a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 441a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 442a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 443a7e14dcfSSatish Balay $ successive linear solves. 444a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 445a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 446a7e14dcfSSatish Balay 447a7e14dcfSSatish Balay Caution: 448a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 449a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 450a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 451a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 452a7e14dcfSSatish Balay feature carefully! 453a7e14dcfSSatish Balay 454a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 455a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 456a7e14dcfSSatish Balay 457a7e14dcfSSatish Balay Level: intermediate 458a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 459a7e14dcfSSatish Balay @*/ 460*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianStateRoutine(Tao tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, Mat, MatStructure *, void*), void *ctx) 461a7e14dcfSSatish Balay { 462a7e14dcfSSatish Balay PetscErrorCode ierr; 463a7e14dcfSSatish Balay PetscFunctionBegin; 464441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 465a7e14dcfSSatish Balay if (J) { 466a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 467a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 468a7e14dcfSSatish Balay } 469a7e14dcfSSatish Balay if (Jpre) { 470a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 471a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 472a7e14dcfSSatish Balay } 473a7e14dcfSSatish Balay if (Jinv) { 474a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 475a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 476a7e14dcfSSatish Balay } 477a7e14dcfSSatish Balay if (ctx) { 478a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 479a7e14dcfSSatish Balay } 480a7e14dcfSSatish Balay if (func) { 481a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 482a7e14dcfSSatish Balay } 483a7e14dcfSSatish Balay if (J) { 484a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 48545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state);CHKERRQ(ierr); 486a7e14dcfSSatish Balay tao->jacobian_state = J; 487a7e14dcfSSatish Balay } 488a7e14dcfSSatish Balay if (Jpre) { 489a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 49045cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_pre);CHKERRQ(ierr); 491a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 492a7e14dcfSSatish Balay } 493a7e14dcfSSatish Balay if (Jinv) { 494a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jinv);CHKERRQ(ierr); 49545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_state_inv);CHKERRQ(ierr); 496a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 497a7e14dcfSSatish Balay } 498a7e14dcfSSatish Balay PetscFunctionReturn(0); 499a7e14dcfSSatish Balay } 500a7e14dcfSSatish Balay 501a7e14dcfSSatish Balay #undef __FUNCT__ 502a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine" 503a7e14dcfSSatish Balay /*@C 504a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 505a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 506a7e14dcfSSatish Balay pde-constrained optimization. 507a7e14dcfSSatish Balay 508441846f8SBarry Smith Logically collective on Tao 509a7e14dcfSSatish Balay 510a7e14dcfSSatish Balay Input Parameters: 511441846f8SBarry Smith + tao - the Tao context 512a7e14dcfSSatish Balay . J - Matrix used for the jacobian 513a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 514a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 5156c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 516a7e14dcfSSatish Balay 517a7e14dcfSSatish Balay Calling sequence of jac: 518441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,void *ctx); 519a7e14dcfSSatish Balay 520441846f8SBarry Smith + tao - the Tao context 521a7e14dcfSSatish Balay . x - input vector 522a7e14dcfSSatish Balay . J - Jacobian matrix 523a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 524a7e14dcfSSatish Balay 525a7e14dcfSSatish Balay 526a7e14dcfSSatish Balay Notes: 527a7e14dcfSSatish Balay 528a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 529a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 530a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 531a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 532a7e14dcfSSatish Balay throughout the global iterations. 533a7e14dcfSSatish Balay 534a7e14dcfSSatish Balay Level: intermediate 535a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 536a7e14dcfSSatish Balay @*/ 537*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianDesignRoutine(Tao tao, Mat J, PetscErrorCode (*func)(Tao, Vec, Mat, void*), void *ctx) 538a7e14dcfSSatish Balay { 539a7e14dcfSSatish Balay PetscErrorCode ierr; 54045cf516eSBarry Smith 541a7e14dcfSSatish Balay PetscFunctionBegin; 542441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 543a7e14dcfSSatish Balay if (J) { 544a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 545a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 546a7e14dcfSSatish Balay } 547a7e14dcfSSatish Balay if (ctx) { 548a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 549a7e14dcfSSatish Balay } 550a7e14dcfSSatish Balay if (func) { 551a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 552a7e14dcfSSatish Balay } 553a7e14dcfSSatish Balay if (J) { 554a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 55545cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_design);CHKERRQ(ierr); 556a7e14dcfSSatish Balay tao->jacobian_design = J; 557a7e14dcfSSatish Balay } 558a7e14dcfSSatish Balay PetscFunctionReturn(0); 559a7e14dcfSSatish Balay } 560a7e14dcfSSatish Balay 561a7e14dcfSSatish Balay #undef __FUNCT__ 562a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS" 563a7e14dcfSSatish Balay /*@ 564441846f8SBarry Smith TaoSetStateDesignIS - Indicate to the Tao which variables in the 565a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 566a7e14dcfSSatish Balay pde-constrained optimization. 567a7e14dcfSSatish Balay 568441846f8SBarry Smith Logically Collective on Tao 569a7e14dcfSSatish Balay 570a7e14dcfSSatish Balay Input Parameters: 571441846f8SBarry Smith + tao - The Tao context 572a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 573a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 574a7e14dcfSSatish Balay 575a7e14dcfSSatish Balay Level: intermediate 576a7e14dcfSSatish Balay 577a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 578a7e14dcfSSatish Balay @*/ 579441846f8SBarry Smith PetscErrorCode TaoSetStateDesignIS(Tao tao, IS s_is, IS d_is) 580a7e14dcfSSatish Balay { 581a7e14dcfSSatish Balay PetscErrorCode ierr; 58245cf516eSBarry Smith 58345cf516eSBarry Smith PetscFunctionBegin; 58445cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)s_is);CHKERRQ(ierr); 58545cf516eSBarry Smith ierr = ISDestroy(&tao->state_is);CHKERRQ(ierr); 586a7e14dcfSSatish Balay tao->state_is = s_is; 58745cf516eSBarry Smith ierr = PetscObjectReference((PetscObject)(d_is));CHKERRQ(ierr); 58845cf516eSBarry Smith ierr = ISDestroy(&tao->design_is);CHKERRQ(ierr); 589a7e14dcfSSatish Balay tao->design_is = d_is; 590a7e14dcfSSatish Balay PetscFunctionReturn(0); 591a7e14dcfSSatish Balay } 592a7e14dcfSSatish Balay 593a7e14dcfSSatish Balay #undef __FUNCT__ 594a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality" 595a7e14dcfSSatish Balay /*@C 596a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 597a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 598a7e14dcfSSatish Balay 599441846f8SBarry Smith Collective on Tao 600a7e14dcfSSatish Balay 601a7e14dcfSSatish Balay Input Parameters: 602441846f8SBarry Smith + solver - the Tao solver context 603a7e14dcfSSatish Balay - xx - input vector 604a7e14dcfSSatish Balay 605a7e14dcfSSatish Balay Output Parameters: 606a7e14dcfSSatish Balay + H - Jacobian matrix 607a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 608a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 609a7e14dcfSSatish Balay 610a7e14dcfSSatish Balay Notes: 611a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 612a7e14dcfSSatish Balay is used internally within the minimization solvers. 613a7e14dcfSSatish Balay 614a7e14dcfSSatish Balay Level: developer 615a7e14dcfSSatish Balay 616a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 617a7e14dcfSSatish Balay 618a7e14dcfSSatish Balay @*/ 619*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianEquality(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg) 620a7e14dcfSSatish Balay { 621a7e14dcfSSatish Balay PetscErrorCode ierr; 62245cf516eSBarry Smith 623a7e14dcfSSatish Balay PetscFunctionBegin; 624441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 625a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 626a7e14dcfSSatish Balay PetscValidPointer(flg,5); 627a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 628a7e14dcfSSatish Balay 62987f595a5SBarry Smith if (!tao->ops->computejacobianequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 630a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 631a7e14dcfSSatish Balay ++tao->njac_equality; 632*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 633441846f8SBarry Smith PetscStackPush("Tao user Jacobian(equality) function"); 634a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,flg,tao->user_jac_equalityP);CHKERRQ(ierr); 635a7e14dcfSSatish Balay PetscStackPop; 636*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 637a7e14dcfSSatish Balay PetscFunctionReturn(0); 638a7e14dcfSSatish Balay } 639a7e14dcfSSatish Balay 640a7e14dcfSSatish Balay #undef __FUNCT__ 641a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality" 642a7e14dcfSSatish Balay /*@C 643a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 644a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 645a7e14dcfSSatish Balay 646441846f8SBarry Smith Collective on Tao 647a7e14dcfSSatish Balay 648a7e14dcfSSatish Balay Input Parameters: 649441846f8SBarry Smith + solver - the Tao solver context 650a7e14dcfSSatish Balay - xx - input vector 651a7e14dcfSSatish Balay 652a7e14dcfSSatish Balay Output Parameters: 653a7e14dcfSSatish Balay + H - Jacobian matrix 654a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 655a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 656a7e14dcfSSatish Balay 657a7e14dcfSSatish Balay Notes: 658a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 659a7e14dcfSSatish Balay is used internally within the minimization solvers. 660a7e14dcfSSatish Balay 661a7e14dcfSSatish Balay Level: developer 662a7e14dcfSSatish Balay 663a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 664a7e14dcfSSatish Balay 665a7e14dcfSSatish Balay @*/ 666*94ab13aaSBarry Smith PetscErrorCode TaoComputeJacobianInequality(Tao tao, Vec X, Mat J, Mat Jpre, MatStructure *flg) 667a7e14dcfSSatish Balay { 668a7e14dcfSSatish Balay PetscErrorCode ierr; 66987f595a5SBarry Smith 670a7e14dcfSSatish Balay PetscFunctionBegin; 671441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 672a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 673a7e14dcfSSatish Balay PetscValidPointer(flg,5); 674a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 675a7e14dcfSSatish Balay 67687f595a5SBarry Smith if (!tao->ops->computejacobianinequality) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 677a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 678a7e14dcfSSatish Balay ++tao->njac_inequality; 679*94ab13aaSBarry Smith ierr = PetscLogEventBegin(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 680441846f8SBarry Smith PetscStackPush("Tao user Jacobian(inequality) function"); 681a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,flg,tao->user_jac_inequalityP);CHKERRQ(ierr); 682a7e14dcfSSatish Balay PetscStackPop; 683*94ab13aaSBarry Smith ierr = PetscLogEventEnd(Tao_JacobianEval,tao,X,J,Jpre);CHKERRQ(ierr); 684a7e14dcfSSatish Balay PetscFunctionReturn(0); 685a7e14dcfSSatish Balay } 686a7e14dcfSSatish Balay 687a7e14dcfSSatish Balay #undef __FUNCT__ 688a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine" 689a7e14dcfSSatish Balay /*@C 690a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 691a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 692a7e14dcfSSatish Balay Used only for pde-constrained optimization. 693a7e14dcfSSatish Balay 694441846f8SBarry Smith Logically collective on Tao 695a7e14dcfSSatish Balay 696a7e14dcfSSatish Balay Input Parameters: 697441846f8SBarry Smith + tao - the Tao context 698a7e14dcfSSatish Balay . J - Matrix used for the jacobian 699a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 700a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 701a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 7026c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 703a7e14dcfSSatish Balay 704a7e14dcfSSatish Balay Calling sequence of jac: 705441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 706a7e14dcfSSatish Balay 707441846f8SBarry Smith + tao - the Tao context 708a7e14dcfSSatish Balay . x - input vector 709a7e14dcfSSatish Balay . J - Jacobian matrix 710a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 711a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 712a7e14dcfSSatish Balay structure (see below) 713a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 714a7e14dcfSSatish Balay 715a7e14dcfSSatish Balay Notes: 716a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 717a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 718a7e14dcfSSatish Balay its own Jinv matrix. 719a7e14dcfSSatish Balay 720a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 721a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 722a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 723a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 724a7e14dcfSSatish Balay throughout the global iterations. 725a7e14dcfSSatish Balay 726a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 727a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 728a7e14dcfSSatish Balay available options are 729a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 730a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 731a7e14dcfSSatish Balay $ This option is intended for folks who are using 732a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 733a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 734a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 735a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 736a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 737a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 738a7e14dcfSSatish Balay $ successive linear solves. 739a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 740a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 741a7e14dcfSSatish Balay 742a7e14dcfSSatish Balay Caution: 743a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 744a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 745a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 746a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 747a7e14dcfSSatish Balay feature carefully! 748a7e14dcfSSatish Balay 749a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 750a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 751a7e14dcfSSatish Balay 752a7e14dcfSSatish Balay Level: intermediate 753a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 754a7e14dcfSSatish Balay @*/ 755*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianEqualityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx) 756a7e14dcfSSatish Balay { 757a7e14dcfSSatish Balay PetscErrorCode ierr; 75845cf516eSBarry Smith 759a7e14dcfSSatish Balay PetscFunctionBegin; 760441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 761a7e14dcfSSatish Balay if (J) { 762a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 763a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 764a7e14dcfSSatish Balay } 765a7e14dcfSSatish Balay if (Jpre) { 766a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 767a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 768a7e14dcfSSatish Balay } 769a7e14dcfSSatish Balay if (ctx) { 770a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 771a7e14dcfSSatish Balay } 772a7e14dcfSSatish Balay if (func) { 773a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 774a7e14dcfSSatish Balay } 775a7e14dcfSSatish Balay if (J) { 776a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 77745cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality);CHKERRQ(ierr); 778a7e14dcfSSatish Balay tao->jacobian_equality = J; 779a7e14dcfSSatish Balay } 780a7e14dcfSSatish Balay if (Jpre) { 781a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 78245cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_equality_pre);CHKERRQ(ierr); 783a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 784a7e14dcfSSatish Balay } 785a7e14dcfSSatish Balay PetscFunctionReturn(0); 786a7e14dcfSSatish Balay } 787a7e14dcfSSatish Balay 788a7e14dcfSSatish Balay #undef __FUNCT__ 789a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine" 790a7e14dcfSSatish Balay /*@C 791a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 792a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 793a7e14dcfSSatish Balay Used only for pde-constrained optimization. 794a7e14dcfSSatish Balay 795441846f8SBarry Smith Logically collective on Tao 796a7e14dcfSSatish Balay 797a7e14dcfSSatish Balay Input Parameters: 798441846f8SBarry Smith + tao - the Tao context 799a7e14dcfSSatish Balay . J - Matrix used for the jacobian 800a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 801a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 802a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 8036c23d075SBarry Smith Jacobian evaluation routine (may be NULL) 804a7e14dcfSSatish Balay 805a7e14dcfSSatish Balay Calling sequence of jac: 806441846f8SBarry Smith $ jac (Tao tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 807a7e14dcfSSatish Balay 808441846f8SBarry Smith + tao - the Tao context 809a7e14dcfSSatish Balay . x - input vector 810a7e14dcfSSatish Balay . J - Jacobian matrix 811a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 812a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 813a7e14dcfSSatish Balay structure (see below) 814a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 815a7e14dcfSSatish Balay 816a7e14dcfSSatish Balay 817a7e14dcfSSatish Balay Notes: 818a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 819a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 820a7e14dcfSSatish Balay its own Jinv matrix. 821a7e14dcfSSatish Balay 822a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 823a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 824a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 825a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 826a7e14dcfSSatish Balay throughout the global iterations. 827a7e14dcfSSatish Balay 828a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 829a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 830a7e14dcfSSatish Balay available options are 831a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 832a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 833a7e14dcfSSatish Balay $ This option is intended for folks who are using 834a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 835a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 836a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 837a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 838a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 839a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 840a7e14dcfSSatish Balay $ successive linear solves. 841a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 842a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 843a7e14dcfSSatish Balay 844a7e14dcfSSatish Balay Caution: 845a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 846a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 847a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 848a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 849a7e14dcfSSatish Balay feature carefully! 850a7e14dcfSSatish Balay 851a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 852a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 853a7e14dcfSSatish Balay 854a7e14dcfSSatish Balay Level: intermediate 855a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 856a7e14dcfSSatish Balay @*/ 857*94ab13aaSBarry Smith PetscErrorCode TaoSetJacobianInequalityRoutine(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, MatStructure *, void*), void *ctx) 858a7e14dcfSSatish Balay { 859a7e14dcfSSatish Balay PetscErrorCode ierr; 860a7e14dcfSSatish Balay PetscFunctionBegin; 861441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 862a7e14dcfSSatish Balay if (J) { 863a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 864a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 865a7e14dcfSSatish Balay } 866a7e14dcfSSatish Balay if (Jpre) { 867a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 868a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 869a7e14dcfSSatish Balay } 870a7e14dcfSSatish Balay if (ctx) { 871a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 872a7e14dcfSSatish Balay } 873a7e14dcfSSatish Balay if (func) { 874a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 875a7e14dcfSSatish Balay } 876a7e14dcfSSatish Balay if (J) { 877a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J);CHKERRQ(ierr); 87845cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality);CHKERRQ(ierr); 879a7e14dcfSSatish Balay tao->jacobian_inequality = J; 880a7e14dcfSSatish Balay } 881a7e14dcfSSatish Balay if (Jpre) { 882a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre);CHKERRQ(ierr); 88345cf516eSBarry Smith ierr = MatDestroy(&tao->jacobian_inequality_pre);CHKERRQ(ierr); 884a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 885a7e14dcfSSatish Balay } 886a7e14dcfSSatish Balay PetscFunctionReturn(0); 887a7e14dcfSSatish Balay } 888