1*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/ 2*a7e14dcfSSatish Balay 3*a7e14dcfSSatish Balay #undef __FUNCT__ 4*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHessianRoutine" 5*a7e14dcfSSatish Balay /*@C 6*a7e14dcfSSatish Balay TaoSetHessianRoutine - Sets the function to compute the Hessian as well as the location to store the matrix. 7*a7e14dcfSSatish Balay 8*a7e14dcfSSatish Balay Logically collective on TaoSolver 9*a7e14dcfSSatish Balay 10*a7e14dcfSSatish Balay Input Parameters: 11*a7e14dcfSSatish Balay + tao - the TaoSolver context 12*a7e14dcfSSatish Balay . H - Matrix used for the hessian 13*a7e14dcfSSatish Balay . Hpre - Matrix that will be used operated on by preconditioner, can be same as H 14*a7e14dcfSSatish Balay . hess - Hessian evaluation routine 15*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 16*a7e14dcfSSatish Balay Hessian evaluation routine (may be PETSC_NULL) 17*a7e14dcfSSatish Balay 18*a7e14dcfSSatish Balay Calling sequence of hess: 19*a7e14dcfSSatish Balay $ hess (TaoSolver tao,Vec x,Mat *H,Mat *Hpre,MatStructure *flag,void *ctx); 20*a7e14dcfSSatish Balay 21*a7e14dcfSSatish Balay + tao - the TaoSolver context 22*a7e14dcfSSatish Balay . x - input vector 23*a7e14dcfSSatish Balay . H - Hessian matrix 24*a7e14dcfSSatish Balay . Hpre - preconditioner matrix, usually the same as H 25*a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 26*a7e14dcfSSatish Balay structure (see below) 27*a7e14dcfSSatish Balay - ctx - [optional] user-defined Hessian context 28*a7e14dcfSSatish Balay 29*a7e14dcfSSatish Balay 30*a7e14dcfSSatish Balay Notes: 31*a7e14dcfSSatish Balay 32*a7e14dcfSSatish Balay The function hess() takes Mat * as the matrix arguments rather than Mat. 33*a7e14dcfSSatish Balay This allows the Hessian evaluation routine to replace A and/or B with a 34*a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 35*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 36*a7e14dcfSSatish Balay throughout the global iterations. 37*a7e14dcfSSatish Balay 38*a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 39*a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 40*a7e14dcfSSatish Balay available options are 41*a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 42*a7e14dcfSSatish Balay $ Hpre is identical during successive linear solves. 43*a7e14dcfSSatish Balay $ This option is intended for folks who are using 44*a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 45*a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 46*a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 47*a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 48*a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 49*a7e14dcfSSatish Balay $ Hpre has the same nonzero structure during 50*a7e14dcfSSatish Balay $ successive linear solves. 51*a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 52*a7e14dcfSSatish Balay $ Hpre does not have the same nonzero structure. 53*a7e14dcfSSatish Balay 54*a7e14dcfSSatish Balay Caution: 55*a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 56*a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 57*a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 58*a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 59*a7e14dcfSSatish Balay feature carefully! 60*a7e14dcfSSatish Balay 61*a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 62*a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 63*a7e14dcfSSatish Balay 64*a7e14dcfSSatish Balay Level: beginner 65*a7e14dcfSSatish Balay 66*a7e14dcfSSatish Balay @*/ 67*a7e14dcfSSatish Balay PetscErrorCode TaoSetHessianRoutine(TaoSolver tao, Mat H, Mat Hpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx) 68*a7e14dcfSSatish Balay { 69*a7e14dcfSSatish Balay PetscErrorCode ierr; 70*a7e14dcfSSatish Balay PetscFunctionBegin; 71*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 72*a7e14dcfSSatish Balay if (H) { 73*a7e14dcfSSatish Balay PetscValidHeaderSpecific(H,MAT_CLASSID,2); 74*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,H,2); 75*a7e14dcfSSatish Balay } 76*a7e14dcfSSatish Balay if (Hpre) { 77*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Hpre,MAT_CLASSID,3); 78*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Hpre,3); 79*a7e14dcfSSatish Balay } 80*a7e14dcfSSatish Balay if (ctx) { 81*a7e14dcfSSatish Balay tao->user_hessP = ctx; 82*a7e14dcfSSatish Balay } 83*a7e14dcfSSatish Balay if (func) { 84*a7e14dcfSSatish Balay tao->ops->computehessian = func; 85*a7e14dcfSSatish Balay } 86*a7e14dcfSSatish Balay 87*a7e14dcfSSatish Balay 88*a7e14dcfSSatish Balay if (H) { 89*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)H); CHKERRQ(ierr); 90*a7e14dcfSSatish Balay if (tao->hessian) { ierr = MatDestroy(&tao->hessian); CHKERRQ(ierr);} 91*a7e14dcfSSatish Balay tao->hessian = H; 92*a7e14dcfSSatish Balay } 93*a7e14dcfSSatish Balay if (Hpre) { 94*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Hpre); CHKERRQ(ierr); 95*a7e14dcfSSatish Balay if (tao->hessian_pre) { ierr = MatDestroy(&tao->hessian_pre); CHKERRQ(ierr);} 96*a7e14dcfSSatish Balay tao->hessian_pre=Hpre; 97*a7e14dcfSSatish Balay } 98*a7e14dcfSSatish Balay PetscFunctionReturn(0); 99*a7e14dcfSSatish Balay } 100*a7e14dcfSSatish Balay 101*a7e14dcfSSatish Balay #undef __FUNCT__ 102*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeHessian" 103*a7e14dcfSSatish Balay /*@C 104*a7e14dcfSSatish Balay TaoComputeHessian - Computes the Hessian matrix that has been 105*a7e14dcfSSatish Balay set with TaoSetHessianRoutine(). 106*a7e14dcfSSatish Balay 107*a7e14dcfSSatish Balay Collective on TaoSolver 108*a7e14dcfSSatish Balay 109*a7e14dcfSSatish Balay Input Parameters: 110*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 111*a7e14dcfSSatish Balay - xx - input vector 112*a7e14dcfSSatish Balay 113*a7e14dcfSSatish Balay Output Parameters: 114*a7e14dcfSSatish Balay + H - Hessian matrix 115*a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 116*a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 117*a7e14dcfSSatish Balay 118*a7e14dcfSSatish Balay Notes: 119*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 120*a7e14dcfSSatish Balay is used internally within the minimization solvers. 121*a7e14dcfSSatish Balay 122*a7e14dcfSSatish Balay TaoComputeHessian() is typically used within minimization 123*a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 124*a7e14dcfSSatish Balay themselves. 125*a7e14dcfSSatish Balay 126*a7e14dcfSSatish Balay Level: developer 127*a7e14dcfSSatish Balay 128*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetHessian() 129*a7e14dcfSSatish Balay 130*a7e14dcfSSatish Balay @*/ 131*a7e14dcfSSatish Balay PetscErrorCode TaoComputeHessian(TaoSolver tao, Vec X, Mat *H, Mat *Hpre, MatStructure *flg) 132*a7e14dcfSSatish Balay { 133*a7e14dcfSSatish Balay PetscErrorCode ierr; 134*a7e14dcfSSatish Balay PetscFunctionBegin; 135*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 136*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 137*a7e14dcfSSatish Balay PetscValidPointer(flg,5); 138*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 139*a7e14dcfSSatish Balay 140*a7e14dcfSSatish Balay if (!tao->ops->computehessian) { 141*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetHessian() first"); 142*a7e14dcfSSatish Balay } 143*a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 144*a7e14dcfSSatish Balay ++tao->nhess; 145*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_HessianEval,tao,X,*H,*Hpre); CHKERRQ(ierr); 146*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Hessian function"); 147*a7e14dcfSSatish Balay CHKMEMQ; 148*a7e14dcfSSatish Balay ierr = (*tao->ops->computehessian)(tao,X,H,Hpre,flg,tao->user_hessP); CHKERRQ(ierr); 149*a7e14dcfSSatish Balay CHKMEMQ; 150*a7e14dcfSSatish Balay PetscStackPop; 151*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_HessianEval,tao,X,*H,*Hpre); CHKERRQ(ierr); 152*a7e14dcfSSatish Balay 153*a7e14dcfSSatish Balay PetscFunctionReturn(0); 154*a7e14dcfSSatish Balay } 155*a7e14dcfSSatish Balay 156*a7e14dcfSSatish Balay #undef __FUNCT__ 157*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobian" 158*a7e14dcfSSatish Balay /*@C 159*a7e14dcfSSatish Balay TaoComputeJacobian - Computes the Jacobian matrix that has been 160*a7e14dcfSSatish Balay set with TaoSetJacobianRoutine(). 161*a7e14dcfSSatish Balay 162*a7e14dcfSSatish Balay Collective on TaoSolver 163*a7e14dcfSSatish Balay 164*a7e14dcfSSatish Balay Input Parameters: 165*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 166*a7e14dcfSSatish Balay - xx - input vector 167*a7e14dcfSSatish Balay 168*a7e14dcfSSatish Balay Output Parameters: 169*a7e14dcfSSatish Balay + H - Jacobian matrix 170*a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 171*a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 172*a7e14dcfSSatish Balay 173*a7e14dcfSSatish Balay Notes: 174*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 175*a7e14dcfSSatish Balay is used internally within the minimization solvers. 176*a7e14dcfSSatish Balay 177*a7e14dcfSSatish Balay TaoComputeJacobian() is typically used within minimization 178*a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 179*a7e14dcfSSatish Balay themselves. 180*a7e14dcfSSatish Balay 181*a7e14dcfSSatish Balay Level: developer 182*a7e14dcfSSatish Balay 183*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobian() 184*a7e14dcfSSatish Balay 185*a7e14dcfSSatish Balay @*/ 186*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobian(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg) 187*a7e14dcfSSatish Balay { 188*a7e14dcfSSatish Balay PetscErrorCode ierr; 189*a7e14dcfSSatish Balay PetscFunctionBegin; 190*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 191*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 192*a7e14dcfSSatish Balay PetscValidPointer(flg,5); 193*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 194*a7e14dcfSSatish Balay 195*a7e14dcfSSatish Balay if (!tao->ops->computejacobian) { 196*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobian() first"); 197*a7e14dcfSSatish Balay } 198*a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 199*a7e14dcfSSatish Balay ++tao->njac; 200*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 201*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Jacobian function"); 202*a7e14dcfSSatish Balay CHKMEMQ; 203*a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobian)(tao,X,J,Jpre,flg,tao->user_jacP); CHKERRQ(ierr); 204*a7e14dcfSSatish Balay CHKMEMQ; 205*a7e14dcfSSatish Balay PetscStackPop; 206*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 207*a7e14dcfSSatish Balay 208*a7e14dcfSSatish Balay PetscFunctionReturn(0); 209*a7e14dcfSSatish Balay } 210*a7e14dcfSSatish Balay 211*a7e14dcfSSatish Balay #undef __FUNCT__ 212*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianState" 213*a7e14dcfSSatish Balay /*@C 214*a7e14dcfSSatish Balay TaoComputeJacobianState - Computes the Jacobian matrix that has been 215*a7e14dcfSSatish Balay set with TaoSetJacobianStateRoutine(). 216*a7e14dcfSSatish Balay 217*a7e14dcfSSatish Balay Collective on TaoSolver 218*a7e14dcfSSatish Balay 219*a7e14dcfSSatish Balay Input Parameters: 220*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 221*a7e14dcfSSatish Balay - xx - input vector 222*a7e14dcfSSatish Balay 223*a7e14dcfSSatish Balay Output Parameters: 224*a7e14dcfSSatish Balay + H - Jacobian matrix 225*a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 226*a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 227*a7e14dcfSSatish Balay 228*a7e14dcfSSatish Balay Notes: 229*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 230*a7e14dcfSSatish Balay is used internally within the minimization solvers. 231*a7e14dcfSSatish Balay 232*a7e14dcfSSatish Balay TaoComputeJacobianState() is typically used within minimization 233*a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 234*a7e14dcfSSatish Balay themselves. 235*a7e14dcfSSatish Balay 236*a7e14dcfSSatish Balay Level: developer 237*a7e14dcfSSatish Balay 238*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 239*a7e14dcfSSatish Balay 240*a7e14dcfSSatish Balay @*/ 241*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianState(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, Mat *Jinv, MatStructure *flg) 242*a7e14dcfSSatish Balay { 243*a7e14dcfSSatish Balay PetscErrorCode ierr; 244*a7e14dcfSSatish Balay PetscFunctionBegin; 245*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 246*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 247*a7e14dcfSSatish Balay PetscValidPointer(flg,5); 248*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 249*a7e14dcfSSatish Balay 250*a7e14dcfSSatish Balay if (!tao->ops->computejacobianstate) { 251*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianState() first"); 252*a7e14dcfSSatish Balay } 253*a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 254*a7e14dcfSSatish Balay ++tao->njac_state; 255*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 256*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Jacobian(state) function"); 257*a7e14dcfSSatish Balay CHKMEMQ; 258*a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianstate)(tao,X,J,Jpre,Jinv,flg,tao->user_jac_stateP); CHKERRQ(ierr); 259*a7e14dcfSSatish Balay CHKMEMQ; 260*a7e14dcfSSatish Balay PetscStackPop; 261*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 262*a7e14dcfSSatish Balay 263*a7e14dcfSSatish Balay PetscFunctionReturn(0); 264*a7e14dcfSSatish Balay } 265*a7e14dcfSSatish Balay 266*a7e14dcfSSatish Balay 267*a7e14dcfSSatish Balay #undef __FUNCT__ 268*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianDesign" 269*a7e14dcfSSatish Balay /*@C 270*a7e14dcfSSatish Balay TaoComputeJacobianDesign - Computes the Jacobian matrix that has been 271*a7e14dcfSSatish Balay set with TaoSetJacobianDesignRoutine(). 272*a7e14dcfSSatish Balay 273*a7e14dcfSSatish Balay Collective on TaoSolver 274*a7e14dcfSSatish Balay 275*a7e14dcfSSatish Balay Input Parameters: 276*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 277*a7e14dcfSSatish Balay - xx - input vector 278*a7e14dcfSSatish Balay 279*a7e14dcfSSatish Balay Output Parameters: 280*a7e14dcfSSatish Balay . H - Jacobian matrix 281*a7e14dcfSSatish Balay 282*a7e14dcfSSatish Balay Notes: 283*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 284*a7e14dcfSSatish Balay is used internally within the minimization solvers. 285*a7e14dcfSSatish Balay 286*a7e14dcfSSatish Balay TaoComputeJacobianDesign() is typically used within minimization 287*a7e14dcfSSatish Balay implementations, so most users would not generally call this routine 288*a7e14dcfSSatish Balay themselves. 289*a7e14dcfSSatish Balay 290*a7e14dcfSSatish Balay Level: developer 291*a7e14dcfSSatish Balay 292*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianDesignRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 293*a7e14dcfSSatish Balay 294*a7e14dcfSSatish Balay @*/ 295*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianDesign(TaoSolver tao, Vec X, Mat *J) 296*a7e14dcfSSatish Balay { 297*a7e14dcfSSatish Balay PetscErrorCode ierr; 298*a7e14dcfSSatish Balay PetscFunctionBegin; 299*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 300*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 301*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 302*a7e14dcfSSatish Balay 303*a7e14dcfSSatish Balay if (!tao->ops->computejacobiandesign) { 304*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianDesign() first"); 305*a7e14dcfSSatish Balay } 306*a7e14dcfSSatish Balay ++tao->njac_design; 307*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,PETSC_NULL); CHKERRQ(ierr); 308*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Jacobian(design) function"); 309*a7e14dcfSSatish Balay CHKMEMQ; 310*a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobiandesign)(tao,X,J,tao->user_jac_designP); CHKERRQ(ierr); 311*a7e14dcfSSatish Balay CHKMEMQ; 312*a7e14dcfSSatish Balay PetscStackPop; 313*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,PETSC_NULL); CHKERRQ(ierr); 314*a7e14dcfSSatish Balay 315*a7e14dcfSSatish Balay PetscFunctionReturn(0); 316*a7e14dcfSSatish Balay } 317*a7e14dcfSSatish Balay 318*a7e14dcfSSatish Balay 319*a7e14dcfSSatish Balay 320*a7e14dcfSSatish Balay #undef __FUNCT__ 321*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianRoutine" 322*a7e14dcfSSatish Balay /*@C 323*a7e14dcfSSatish Balay TaoSetJacobianRoutine - Sets the function to compute the Jacobian as well as the location to store the matrix. 324*a7e14dcfSSatish Balay 325*a7e14dcfSSatish Balay Logically collective on TaoSolver 326*a7e14dcfSSatish Balay 327*a7e14dcfSSatish Balay Input Parameters: 328*a7e14dcfSSatish Balay + tao - the TaoSolver context 329*a7e14dcfSSatish Balay . J - Matrix used for the jacobian 330*a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by preconditioner, can be same as J 331*a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 332*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 333*a7e14dcfSSatish Balay Jacobian evaluation routine (may be PETSC_NULL) 334*a7e14dcfSSatish Balay 335*a7e14dcfSSatish Balay Calling sequence of jac: 336*a7e14dcfSSatish Balay $ jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 337*a7e14dcfSSatish Balay 338*a7e14dcfSSatish Balay + tao - the TaoSolver context 339*a7e14dcfSSatish Balay . x - input vector 340*a7e14dcfSSatish Balay . J - Jacobian matrix 341*a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 342*a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 343*a7e14dcfSSatish Balay structure (see below) 344*a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 345*a7e14dcfSSatish Balay 346*a7e14dcfSSatish Balay 347*a7e14dcfSSatish Balay Notes: 348*a7e14dcfSSatish Balay 349*a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 350*a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 351*a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 352*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 353*a7e14dcfSSatish Balay throughout the global iterations. 354*a7e14dcfSSatish Balay 355*a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 356*a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 357*a7e14dcfSSatish Balay available options are 358*a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 359*a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 360*a7e14dcfSSatish Balay $ This option is intended for folks who are using 361*a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 362*a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 363*a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 364*a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 365*a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 366*a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 367*a7e14dcfSSatish Balay $ successive linear solves. 368*a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 369*a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 370*a7e14dcfSSatish Balay 371*a7e14dcfSSatish Balay Caution: 372*a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 373*a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 374*a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 375*a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 376*a7e14dcfSSatish Balay feature carefully! 377*a7e14dcfSSatish Balay 378*a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 379*a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 380*a7e14dcfSSatish Balay 381*a7e14dcfSSatish Balay Level: intermediate 382*a7e14dcfSSatish Balay 383*a7e14dcfSSatish Balay @*/ 384*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx) 385*a7e14dcfSSatish Balay { 386*a7e14dcfSSatish Balay PetscErrorCode ierr; 387*a7e14dcfSSatish Balay PetscFunctionBegin; 388*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 389*a7e14dcfSSatish Balay if (J) { 390*a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 391*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 392*a7e14dcfSSatish Balay } 393*a7e14dcfSSatish Balay if (Jpre) { 394*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 395*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 396*a7e14dcfSSatish Balay } 397*a7e14dcfSSatish Balay if (ctx) { 398*a7e14dcfSSatish Balay tao->user_jacP = ctx; 399*a7e14dcfSSatish Balay } 400*a7e14dcfSSatish Balay if (func) { 401*a7e14dcfSSatish Balay tao->ops->computejacobian = func; 402*a7e14dcfSSatish Balay } 403*a7e14dcfSSatish Balay 404*a7e14dcfSSatish Balay 405*a7e14dcfSSatish Balay if (J) { 406*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr); 407*a7e14dcfSSatish Balay if (tao->jacobian) { ierr = MatDestroy(&tao->jacobian); CHKERRQ(ierr);} 408*a7e14dcfSSatish Balay tao->jacobian = J; 409*a7e14dcfSSatish Balay } 410*a7e14dcfSSatish Balay if (Jpre) { 411*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr); 412*a7e14dcfSSatish Balay if (tao->jacobian_pre) { ierr = MatDestroy(&tao->jacobian_pre); CHKERRQ(ierr);} 413*a7e14dcfSSatish Balay tao->jacobian_pre=Jpre; 414*a7e14dcfSSatish Balay } 415*a7e14dcfSSatish Balay PetscFunctionReturn(0); 416*a7e14dcfSSatish Balay } 417*a7e14dcfSSatish Balay 418*a7e14dcfSSatish Balay 419*a7e14dcfSSatish Balay #undef __FUNCT__ 420*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianStateRoutine" 421*a7e14dcfSSatish Balay /*@C 422*a7e14dcfSSatish Balay TaoSetJacobianStateRoutine - Sets the function to compute the Jacobian 423*a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the state variables. 424*a7e14dcfSSatish Balay Used only for pde-constrained optimization. 425*a7e14dcfSSatish Balay 426*a7e14dcfSSatish Balay Logically collective on TaoSolver 427*a7e14dcfSSatish Balay 428*a7e14dcfSSatish Balay Input Parameters: 429*a7e14dcfSSatish Balay + tao - the TaoSolver context 430*a7e14dcfSSatish Balay . J - Matrix used for the jacobian 431*a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. Only used if Jinv is PETSC_NULL 432*a7e14dcfSSatish Balay . Jinv - [optional] Matrix used to apply the inverse of the state jacobian. Use PETSC_NULL to default to PETSc KSP solvers to apply the inverse. 433*a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 434*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 435*a7e14dcfSSatish Balay Jacobian evaluation routine (may be PETSC_NULL) 436*a7e14dcfSSatish Balay 437*a7e14dcfSSatish Balay Calling sequence of jac: 438*a7e14dcfSSatish Balay $ jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 439*a7e14dcfSSatish Balay 440*a7e14dcfSSatish Balay + tao - the TaoSolver context 441*a7e14dcfSSatish Balay . x - input vector 442*a7e14dcfSSatish Balay . J - Jacobian matrix 443*a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 444*a7e14dcfSSatish Balay . Jinv - inverse of J 445*a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 446*a7e14dcfSSatish Balay structure (see below) 447*a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 448*a7e14dcfSSatish Balay 449*a7e14dcfSSatish Balay 450*a7e14dcfSSatish Balay Notes: 451*a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 452*a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 453*a7e14dcfSSatish Balay its own Jinv matrix. 454*a7e14dcfSSatish Balay 455*a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 456*a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 457*a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 458*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 459*a7e14dcfSSatish Balay throughout the global iterations. 460*a7e14dcfSSatish Balay 461*a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 462*a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 463*a7e14dcfSSatish Balay available options are 464*a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 465*a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 466*a7e14dcfSSatish Balay $ This option is intended for folks who are using 467*a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 468*a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 469*a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 470*a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 471*a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 472*a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 473*a7e14dcfSSatish Balay $ successive linear solves. 474*a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 475*a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 476*a7e14dcfSSatish Balay 477*a7e14dcfSSatish Balay Caution: 478*a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 479*a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 480*a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 481*a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 482*a7e14dcfSSatish Balay feature carefully! 483*a7e14dcfSSatish Balay 484*a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 485*a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 486*a7e14dcfSSatish Balay 487*a7e14dcfSSatish Balay Level: intermediate 488*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianState(), TaoSetJacobianDesignRoutine(), TaoSetStateDesignIS() 489*a7e14dcfSSatish Balay @*/ 490*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianStateRoutine(TaoSolver tao, Mat J, Mat Jpre, Mat Jinv, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, Mat *, MatStructure *, void*), void *ctx) 491*a7e14dcfSSatish Balay { 492*a7e14dcfSSatish Balay PetscErrorCode ierr; 493*a7e14dcfSSatish Balay PetscFunctionBegin; 494*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 495*a7e14dcfSSatish Balay if (J) { 496*a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 497*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 498*a7e14dcfSSatish Balay } 499*a7e14dcfSSatish Balay if (Jpre) { 500*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 501*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 502*a7e14dcfSSatish Balay } 503*a7e14dcfSSatish Balay if (Jinv) { 504*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jinv,MAT_CLASSID,4); 505*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jinv,4); 506*a7e14dcfSSatish Balay } 507*a7e14dcfSSatish Balay if (ctx) { 508*a7e14dcfSSatish Balay tao->user_jac_stateP = ctx; 509*a7e14dcfSSatish Balay } 510*a7e14dcfSSatish Balay if (func) { 511*a7e14dcfSSatish Balay tao->ops->computejacobianstate = func; 512*a7e14dcfSSatish Balay } 513*a7e14dcfSSatish Balay 514*a7e14dcfSSatish Balay 515*a7e14dcfSSatish Balay if (J) { 516*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr); 517*a7e14dcfSSatish Balay if (tao->jacobian_state) { ierr = MatDestroy(&tao->jacobian_state); CHKERRQ(ierr);} 518*a7e14dcfSSatish Balay tao->jacobian_state = J; 519*a7e14dcfSSatish Balay } 520*a7e14dcfSSatish Balay if (Jpre) { 521*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr); 522*a7e14dcfSSatish Balay if (tao->jacobian_state_pre) { ierr = MatDestroy(&tao->jacobian_state_pre); CHKERRQ(ierr);} 523*a7e14dcfSSatish Balay tao->jacobian_state_pre=Jpre; 524*a7e14dcfSSatish Balay } 525*a7e14dcfSSatish Balay if (Jinv) { 526*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jinv); CHKERRQ(ierr); 527*a7e14dcfSSatish Balay if (tao->jacobian_state_inv) {ierr = MatDestroy(&tao->jacobian_state_inv); CHKERRQ(ierr);} 528*a7e14dcfSSatish Balay tao->jacobian_state_inv=Jinv; 529*a7e14dcfSSatish Balay } 530*a7e14dcfSSatish Balay PetscFunctionReturn(0); 531*a7e14dcfSSatish Balay } 532*a7e14dcfSSatish Balay 533*a7e14dcfSSatish Balay #undef __FUNCT__ 534*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianDesignRoutine" 535*a7e14dcfSSatish Balay /*@C 536*a7e14dcfSSatish Balay TaoSetJacobianDesignRoutine - Sets the function to compute the Jacobian of 537*a7e14dcfSSatish Balay the constraint function with respect to the design variables. Used only for 538*a7e14dcfSSatish Balay pde-constrained optimization. 539*a7e14dcfSSatish Balay 540*a7e14dcfSSatish Balay Logically collective on TaoSolver 541*a7e14dcfSSatish Balay 542*a7e14dcfSSatish Balay Input Parameters: 543*a7e14dcfSSatish Balay + tao - the TaoSolver context 544*a7e14dcfSSatish Balay . J - Matrix used for the jacobian 545*a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 546*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 547*a7e14dcfSSatish Balay Jacobian evaluation routine (may be PETSC_NULL) 548*a7e14dcfSSatish Balay 549*a7e14dcfSSatish Balay Calling sequence of jac: 550*a7e14dcfSSatish Balay $ jac (TaoSolver tao,Vec x,Mat *J,void *ctx); 551*a7e14dcfSSatish Balay 552*a7e14dcfSSatish Balay + tao - the TaoSolver context 553*a7e14dcfSSatish Balay . x - input vector 554*a7e14dcfSSatish Balay . J - Jacobian matrix 555*a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 556*a7e14dcfSSatish Balay 557*a7e14dcfSSatish Balay 558*a7e14dcfSSatish Balay Notes: 559*a7e14dcfSSatish Balay 560*a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 561*a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 562*a7e14dcfSSatish Balay completely new new matrix structure (not just different matrix elements) 563*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 564*a7e14dcfSSatish Balay throughout the global iterations. 565*a7e14dcfSSatish Balay 566*a7e14dcfSSatish Balay Level: intermediate 567*a7e14dcfSSatish Balay .seealso: TaoComputeJacobianDesign(), TaoSetJacobianStateRoutine(), TaoSetStateDesignIS() 568*a7e14dcfSSatish Balay @*/ 569*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianDesignRoutine(TaoSolver tao, Mat J, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, void*), void *ctx) 570*a7e14dcfSSatish Balay { 571*a7e14dcfSSatish Balay PetscErrorCode ierr; 572*a7e14dcfSSatish Balay PetscFunctionBegin; 573*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 574*a7e14dcfSSatish Balay if (J) { 575*a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 576*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 577*a7e14dcfSSatish Balay } 578*a7e14dcfSSatish Balay if (ctx) { 579*a7e14dcfSSatish Balay tao->user_jac_designP = ctx; 580*a7e14dcfSSatish Balay } 581*a7e14dcfSSatish Balay if (func) { 582*a7e14dcfSSatish Balay tao->ops->computejacobiandesign = func; 583*a7e14dcfSSatish Balay } 584*a7e14dcfSSatish Balay 585*a7e14dcfSSatish Balay 586*a7e14dcfSSatish Balay if (J) { 587*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr); 588*a7e14dcfSSatish Balay if (tao->jacobian_design) { ierr = MatDestroy(&tao->jacobian_design); CHKERRQ(ierr);} 589*a7e14dcfSSatish Balay tao->jacobian_design = J; 590*a7e14dcfSSatish Balay } 591*a7e14dcfSSatish Balay PetscFunctionReturn(0); 592*a7e14dcfSSatish Balay } 593*a7e14dcfSSatish Balay 594*a7e14dcfSSatish Balay #undef __FUNCT__ 595*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetStateDesignIS" 596*a7e14dcfSSatish Balay /*@ 597*a7e14dcfSSatish Balay TaoSetStateDesignIS - Indicate to the TaoSolver which variables in the 598*a7e14dcfSSatish Balay solution vector are state variables and which are design. Only applies to 599*a7e14dcfSSatish Balay pde-constrained optimization. 600*a7e14dcfSSatish Balay 601*a7e14dcfSSatish Balay Logically Collective on TaoSolver 602*a7e14dcfSSatish Balay 603*a7e14dcfSSatish Balay Input Parameters: 604*a7e14dcfSSatish Balay + tao - The TaoSolver context 605*a7e14dcfSSatish Balay . s_is - the index set corresponding to the state variables 606*a7e14dcfSSatish Balay - d_is - the index set corresponding to the design variables 607*a7e14dcfSSatish Balay 608*a7e14dcfSSatish Balay Level: intermediate 609*a7e14dcfSSatish Balay 610*a7e14dcfSSatish Balay .seealso: TaoSetJacobianStateRoutine(), TaoSetJacobianDesignRoutine() 611*a7e14dcfSSatish Balay @*/ 612*a7e14dcfSSatish Balay PetscErrorCode TaoSetStateDesignIS(TaoSolver tao, IS s_is, IS d_is) 613*a7e14dcfSSatish Balay { 614*a7e14dcfSSatish Balay PetscErrorCode ierr; 615*a7e14dcfSSatish Balay if (tao->state_is) { 616*a7e14dcfSSatish Balay ierr = PetscObjectDereference((PetscObject)(tao->state_is)); CHKERRQ(ierr); 617*a7e14dcfSSatish Balay } 618*a7e14dcfSSatish Balay if (tao->design_is) { 619*a7e14dcfSSatish Balay ierr = PetscObjectDereference((PetscObject)(tao->design_is)); CHKERRQ(ierr); 620*a7e14dcfSSatish Balay } 621*a7e14dcfSSatish Balay tao->state_is = s_is; 622*a7e14dcfSSatish Balay tao->design_is = d_is; 623*a7e14dcfSSatish Balay if (s_is) { 624*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)(tao->state_is)); CHKERRQ(ierr); 625*a7e14dcfSSatish Balay } 626*a7e14dcfSSatish Balay if (d_is) { 627*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)(tao->design_is)); CHKERRQ(ierr); 628*a7e14dcfSSatish Balay } 629*a7e14dcfSSatish Balay PetscFunctionReturn(0); 630*a7e14dcfSSatish Balay } 631*a7e14dcfSSatish Balay 632*a7e14dcfSSatish Balay 633*a7e14dcfSSatish Balay #undef __FUNCT__ 634*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianEquality" 635*a7e14dcfSSatish Balay /*@C 636*a7e14dcfSSatish Balay TaoComputeJacobianEquality - Computes the Jacobian matrix that has been 637*a7e14dcfSSatish Balay set with TaoSetJacobianEqualityRoutine(). 638*a7e14dcfSSatish Balay 639*a7e14dcfSSatish Balay Collective on TaoSolver 640*a7e14dcfSSatish Balay 641*a7e14dcfSSatish Balay Input Parameters: 642*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 643*a7e14dcfSSatish Balay - xx - input vector 644*a7e14dcfSSatish Balay 645*a7e14dcfSSatish Balay Output Parameters: 646*a7e14dcfSSatish Balay + H - Jacobian matrix 647*a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 648*a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 649*a7e14dcfSSatish Balay 650*a7e14dcfSSatish Balay Notes: 651*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 652*a7e14dcfSSatish Balay is used internally within the minimization solvers. 653*a7e14dcfSSatish Balay 654*a7e14dcfSSatish Balay Level: developer 655*a7e14dcfSSatish Balay 656*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 657*a7e14dcfSSatish Balay 658*a7e14dcfSSatish Balay @*/ 659*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianEquality(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg) 660*a7e14dcfSSatish Balay { 661*a7e14dcfSSatish Balay PetscErrorCode ierr; 662*a7e14dcfSSatish Balay PetscFunctionBegin; 663*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 664*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 665*a7e14dcfSSatish Balay PetscValidPointer(flg,5); 666*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 667*a7e14dcfSSatish Balay 668*a7e14dcfSSatish Balay if (!tao->ops->computejacobianequality) { 669*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianEquality() first"); 670*a7e14dcfSSatish Balay } 671*a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 672*a7e14dcfSSatish Balay ++tao->njac_equality; 673*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 674*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Jacobian(equality) function"); 675*a7e14dcfSSatish Balay CHKMEMQ; 676*a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianequality)(tao,X,J,Jpre,flg,tao->user_jac_equalityP); CHKERRQ(ierr); 677*a7e14dcfSSatish Balay CHKMEMQ; 678*a7e14dcfSSatish Balay PetscStackPop; 679*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 680*a7e14dcfSSatish Balay 681*a7e14dcfSSatish Balay PetscFunctionReturn(0); 682*a7e14dcfSSatish Balay } 683*a7e14dcfSSatish Balay 684*a7e14dcfSSatish Balay #undef __FUNCT__ 685*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeJacobianInequality" 686*a7e14dcfSSatish Balay /*@C 687*a7e14dcfSSatish Balay TaoComputeJacobianInequality - Computes the Jacobian matrix that has been 688*a7e14dcfSSatish Balay set with TaoSetJacobianInequalityRoutine(). 689*a7e14dcfSSatish Balay 690*a7e14dcfSSatish Balay Collective on TaoSolver 691*a7e14dcfSSatish Balay 692*a7e14dcfSSatish Balay Input Parameters: 693*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 694*a7e14dcfSSatish Balay - xx - input vector 695*a7e14dcfSSatish Balay 696*a7e14dcfSSatish Balay Output Parameters: 697*a7e14dcfSSatish Balay + H - Jacobian matrix 698*a7e14dcfSSatish Balay . Hpre - Preconditioning matrix 699*a7e14dcfSSatish Balay - flag - flag indicating matrix structure (SAME_NONZERO_PATTERN, DIFFERENT_NONZERO_PATTERN, or SAME_PRECONDITIONER) 700*a7e14dcfSSatish Balay 701*a7e14dcfSSatish Balay Notes: 702*a7e14dcfSSatish Balay Most users should not need to explicitly call this routine, as it 703*a7e14dcfSSatish Balay is used internally within the minimization solvers. 704*a7e14dcfSSatish Balay 705*a7e14dcfSSatish Balay Level: developer 706*a7e14dcfSSatish Balay 707*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetJacobianStateRoutine(), TaoComputeJacobianDesign(), TaoSetStateDesignIS() 708*a7e14dcfSSatish Balay 709*a7e14dcfSSatish Balay @*/ 710*a7e14dcfSSatish Balay PetscErrorCode TaoComputeJacobianInequality(TaoSolver tao, Vec X, Mat *J, Mat *Jpre, MatStructure *flg) 711*a7e14dcfSSatish Balay { 712*a7e14dcfSSatish Balay PetscErrorCode ierr; 713*a7e14dcfSSatish Balay PetscFunctionBegin; 714*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 715*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID,2); 716*a7e14dcfSSatish Balay PetscValidPointer(flg,5); 717*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 718*a7e14dcfSSatish Balay 719*a7e14dcfSSatish Balay if (!tao->ops->computejacobianinequality) { 720*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetJacobianInequality() first"); 721*a7e14dcfSSatish Balay } 722*a7e14dcfSSatish Balay *flg = DIFFERENT_NONZERO_PATTERN; 723*a7e14dcfSSatish Balay ++tao->njac_inequality; 724*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 725*a7e14dcfSSatish Balay PetscStackPush("TaoSolver user Jacobian(inequality) function"); 726*a7e14dcfSSatish Balay CHKMEMQ; 727*a7e14dcfSSatish Balay ierr = (*tao->ops->computejacobianinequality)(tao,X,J,Jpre,flg,tao->user_jac_inequalityP); CHKERRQ(ierr); 728*a7e14dcfSSatish Balay CHKMEMQ; 729*a7e14dcfSSatish Balay PetscStackPop; 730*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_JacobianEval,tao,X,*J,*Jpre); CHKERRQ(ierr); 731*a7e14dcfSSatish Balay 732*a7e14dcfSSatish Balay PetscFunctionReturn(0); 733*a7e14dcfSSatish Balay } 734*a7e14dcfSSatish Balay 735*a7e14dcfSSatish Balay 736*a7e14dcfSSatish Balay #undef __FUNCT__ 737*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianEqualityRoutine" 738*a7e14dcfSSatish Balay /*@C 739*a7e14dcfSSatish Balay TaoSetJacobianEqualityRoutine - Sets the function to compute the Jacobian 740*a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the equality variables. 741*a7e14dcfSSatish Balay Used only for pde-constrained optimization. 742*a7e14dcfSSatish Balay 743*a7e14dcfSSatish Balay Logically collective on TaoSolver 744*a7e14dcfSSatish Balay 745*a7e14dcfSSatish Balay Input Parameters: 746*a7e14dcfSSatish Balay + tao - the TaoSolver context 747*a7e14dcfSSatish Balay . J - Matrix used for the jacobian 748*a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 749*a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 750*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 751*a7e14dcfSSatish Balay Jacobian evaluation routine (may be PETSC_NULL) 752*a7e14dcfSSatish Balay 753*a7e14dcfSSatish Balay Calling sequence of jac: 754*a7e14dcfSSatish Balay $ jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 755*a7e14dcfSSatish Balay 756*a7e14dcfSSatish Balay + tao - the TaoSolver context 757*a7e14dcfSSatish Balay . x - input vector 758*a7e14dcfSSatish Balay . J - Jacobian matrix 759*a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 760*a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 761*a7e14dcfSSatish Balay structure (see below) 762*a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 763*a7e14dcfSSatish Balay 764*a7e14dcfSSatish Balay 765*a7e14dcfSSatish Balay Notes: 766*a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 767*a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 768*a7e14dcfSSatish Balay its own Jinv matrix. 769*a7e14dcfSSatish Balay 770*a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 771*a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 772*a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 773*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 774*a7e14dcfSSatish Balay throughout the global iterations. 775*a7e14dcfSSatish Balay 776*a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 777*a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 778*a7e14dcfSSatish Balay available options are 779*a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 780*a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 781*a7e14dcfSSatish Balay $ This option is intended for folks who are using 782*a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 783*a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 784*a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 785*a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 786*a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 787*a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 788*a7e14dcfSSatish Balay $ successive linear solves. 789*a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 790*a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 791*a7e14dcfSSatish Balay 792*a7e14dcfSSatish Balay Caution: 793*a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 794*a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 795*a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 796*a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 797*a7e14dcfSSatish Balay feature carefully! 798*a7e14dcfSSatish Balay 799*a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 800*a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 801*a7e14dcfSSatish Balay 802*a7e14dcfSSatish Balay Level: intermediate 803*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianEquality(), TaoSetJacobianDesignRoutine(), TaoSetEqualityDesignIS() 804*a7e14dcfSSatish Balay @*/ 805*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianEqualityRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx) 806*a7e14dcfSSatish Balay { 807*a7e14dcfSSatish Balay PetscErrorCode ierr; 808*a7e14dcfSSatish Balay PetscFunctionBegin; 809*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 810*a7e14dcfSSatish Balay if (J) { 811*a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 812*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 813*a7e14dcfSSatish Balay } 814*a7e14dcfSSatish Balay if (Jpre) { 815*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 816*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 817*a7e14dcfSSatish Balay } 818*a7e14dcfSSatish Balay if (ctx) { 819*a7e14dcfSSatish Balay tao->user_jac_equalityP = ctx; 820*a7e14dcfSSatish Balay } 821*a7e14dcfSSatish Balay if (func) { 822*a7e14dcfSSatish Balay tao->ops->computejacobianequality = func; 823*a7e14dcfSSatish Balay } 824*a7e14dcfSSatish Balay 825*a7e14dcfSSatish Balay 826*a7e14dcfSSatish Balay if (J) { 827*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr); 828*a7e14dcfSSatish Balay if (tao->jacobian_equality) { ierr = MatDestroy(&tao->jacobian_equality); CHKERRQ(ierr);} 829*a7e14dcfSSatish Balay tao->jacobian_equality = J; 830*a7e14dcfSSatish Balay } 831*a7e14dcfSSatish Balay if (Jpre) { 832*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr); 833*a7e14dcfSSatish Balay if (tao->jacobian_equality_pre) { ierr = MatDestroy(&tao->jacobian_equality_pre); CHKERRQ(ierr);} 834*a7e14dcfSSatish Balay tao->jacobian_equality_pre=Jpre; 835*a7e14dcfSSatish Balay } 836*a7e14dcfSSatish Balay PetscFunctionReturn(0); 837*a7e14dcfSSatish Balay } 838*a7e14dcfSSatish Balay 839*a7e14dcfSSatish Balay #undef __FUNCT__ 840*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetJacobianInequalityRoutine" 841*a7e14dcfSSatish Balay /*@C 842*a7e14dcfSSatish Balay TaoSetJacobianInequalityRoutine - Sets the function to compute the Jacobian 843*a7e14dcfSSatish Balay (and its inverse) of the constraint function with respect to the inequality variables. 844*a7e14dcfSSatish Balay Used only for pde-constrained optimization. 845*a7e14dcfSSatish Balay 846*a7e14dcfSSatish Balay Logically collective on TaoSolver 847*a7e14dcfSSatish Balay 848*a7e14dcfSSatish Balay Input Parameters: 849*a7e14dcfSSatish Balay + tao - the TaoSolver context 850*a7e14dcfSSatish Balay . J - Matrix used for the jacobian 851*a7e14dcfSSatish Balay . Jpre - Matrix that will be used operated on by PETSc preconditioner, can be same as J. 852*a7e14dcfSSatish Balay . jac - Jacobian evaluation routine 853*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the 854*a7e14dcfSSatish Balay Jacobian evaluation routine (may be PETSC_NULL) 855*a7e14dcfSSatish Balay 856*a7e14dcfSSatish Balay Calling sequence of jac: 857*a7e14dcfSSatish Balay $ jac (TaoSolver tao,Vec x,Mat *J,Mat *Jpre,MatStructure *flag,void *ctx); 858*a7e14dcfSSatish Balay 859*a7e14dcfSSatish Balay + tao - the TaoSolver context 860*a7e14dcfSSatish Balay . x - input vector 861*a7e14dcfSSatish Balay . J - Jacobian matrix 862*a7e14dcfSSatish Balay . Jpre - preconditioner matrix, usually the same as J 863*a7e14dcfSSatish Balay . flag - flag indicating information about the preconditioner matrix 864*a7e14dcfSSatish Balay structure (see below) 865*a7e14dcfSSatish Balay - ctx - [optional] user-defined Jacobian context 866*a7e14dcfSSatish Balay 867*a7e14dcfSSatish Balay 868*a7e14dcfSSatish Balay Notes: 869*a7e14dcfSSatish Balay Because of the structure of the jacobian matrix, 870*a7e14dcfSSatish Balay It may be more efficient for a pde-constrained application to provide 871*a7e14dcfSSatish Balay its own Jinv matrix. 872*a7e14dcfSSatish Balay 873*a7e14dcfSSatish Balay The function jac() takes Mat * as the matrix arguments rather than Mat. 874*a7e14dcfSSatish Balay This allows the Jacobian evaluation routine to replace A and/or B with a 875*a7e14dcfSSatish Balay completely new new maitrix structure (not just different matrix elements) 876*a7e14dcfSSatish Balay when appropriate, for instance, if the nonzero structure is changing 877*a7e14dcfSSatish Balay throughout the global iterations. 878*a7e14dcfSSatish Balay 879*a7e14dcfSSatish Balay The flag can be used to eliminate unnecessary work in the preconditioner 880*a7e14dcfSSatish Balay during the repeated solution of linear systems of the same size. The 881*a7e14dcfSSatish Balay available options are 882*a7e14dcfSSatish Balay $ SAME_PRECONDITIONER - 883*a7e14dcfSSatish Balay $ Jpre is identical during successive linear solves. 884*a7e14dcfSSatish Balay $ This option is intended for folks who are using 885*a7e14dcfSSatish Balay $ different Amat and Pmat matrices and want to reuse the 886*a7e14dcfSSatish Balay $ same preconditioner matrix. For example, this option 887*a7e14dcfSSatish Balay $ saves work by not recomputing incomplete factorization 888*a7e14dcfSSatish Balay $ for ILU/ICC preconditioners. 889*a7e14dcfSSatish Balay $ SAME_NONZERO_PATTERN - 890*a7e14dcfSSatish Balay $ Jpre has the same nonzero structure during 891*a7e14dcfSSatish Balay $ successive linear solves. 892*a7e14dcfSSatish Balay $ DIFFERENT_NONZERO_PATTERN - 893*a7e14dcfSSatish Balay $ Jpre does not have the same nonzero structure. 894*a7e14dcfSSatish Balay 895*a7e14dcfSSatish Balay Caution: 896*a7e14dcfSSatish Balay If you specify SAME_NONZERO_PATTERN, the software believes your assertion 897*a7e14dcfSSatish Balay and does not check the structure of the matrix. If you erroneously 898*a7e14dcfSSatish Balay claim that the structure is the same when it actually is not, the new 899*a7e14dcfSSatish Balay preconditioner will not function correctly. Thus, use this optimization 900*a7e14dcfSSatish Balay feature carefully! 901*a7e14dcfSSatish Balay 902*a7e14dcfSSatish Balay If in doubt about whether your preconditioner matrix has changed 903*a7e14dcfSSatish Balay structure or not, use the flag DIFFERENT_NONZERO_PATTERN. 904*a7e14dcfSSatish Balay 905*a7e14dcfSSatish Balay Level: intermediate 906*a7e14dcfSSatish Balay .seealse: TaoComputeJacobianInequality(), TaoSetJacobianDesignRoutine(), TaoSetInequalityDesignIS() 907*a7e14dcfSSatish Balay @*/ 908*a7e14dcfSSatish Balay PetscErrorCode TaoSetJacobianInequalityRoutine(TaoSolver tao, Mat J, Mat Jpre, PetscErrorCode (*func)(TaoSolver, Vec, Mat*, Mat *, MatStructure *, void*), void *ctx) 909*a7e14dcfSSatish Balay { 910*a7e14dcfSSatish Balay PetscErrorCode ierr; 911*a7e14dcfSSatish Balay PetscFunctionBegin; 912*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 913*a7e14dcfSSatish Balay if (J) { 914*a7e14dcfSSatish Balay PetscValidHeaderSpecific(J,MAT_CLASSID,2); 915*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,J,2); 916*a7e14dcfSSatish Balay } 917*a7e14dcfSSatish Balay if (Jpre) { 918*a7e14dcfSSatish Balay PetscValidHeaderSpecific(Jpre,MAT_CLASSID,3); 919*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,Jpre,3); 920*a7e14dcfSSatish Balay } 921*a7e14dcfSSatish Balay if (ctx) { 922*a7e14dcfSSatish Balay tao->user_jac_inequalityP = ctx; 923*a7e14dcfSSatish Balay } 924*a7e14dcfSSatish Balay if (func) { 925*a7e14dcfSSatish Balay tao->ops->computejacobianinequality = func; 926*a7e14dcfSSatish Balay } 927*a7e14dcfSSatish Balay 928*a7e14dcfSSatish Balay 929*a7e14dcfSSatish Balay if (J) { 930*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)J); CHKERRQ(ierr); 931*a7e14dcfSSatish Balay if (tao->jacobian_inequality) { ierr = MatDestroy(&tao->jacobian_inequality); CHKERRQ(ierr);} 932*a7e14dcfSSatish Balay tao->jacobian_inequality = J; 933*a7e14dcfSSatish Balay } 934*a7e14dcfSSatish Balay if (Jpre) { 935*a7e14dcfSSatish Balay ierr = PetscObjectReference((PetscObject)Jpre); CHKERRQ(ierr); 936*a7e14dcfSSatish Balay if (tao->jacobian_inequality_pre) { ierr = MatDestroy(&tao->jacobian_inequality_pre); CHKERRQ(ierr);} 937*a7e14dcfSSatish Balay tao->jacobian_inequality_pre=Jpre; 938*a7e14dcfSSatish Balay } 939*a7e14dcfSSatish Balay PetscFunctionReturn(0); 940*a7e14dcfSSatish Balay } 941