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__ "TaoSetVariableBounds" 5*a7e14dcfSSatish Balay /*@ 6*a7e14dcfSSatish Balay TaoSetVariableBounds - Sets the upper and lower bounds 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 . XL - vector of lower bounds 13*a7e14dcfSSatish Balay - XU - vector of upper bounds 14*a7e14dcfSSatish Balay 15*a7e14dcfSSatish Balay Level: beginner 16*a7e14dcfSSatish Balay 17*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine() 18*a7e14dcfSSatish Balay @*/ 19*a7e14dcfSSatish Balay 20*a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBounds(TaoSolver tao, Vec XL, Vec XU) 21*a7e14dcfSSatish Balay { 22*a7e14dcfSSatish Balay PetscErrorCode ierr; 23*a7e14dcfSSatish Balay PetscFunctionBegin; 24*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 25*a7e14dcfSSatish Balay if (XL) { 26*a7e14dcfSSatish Balay PetscValidHeaderSpecific(XL,VEC_CLASSID,2); 27*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)XL); 28*a7e14dcfSSatish Balay } 29*a7e14dcfSSatish Balay if (XU) { 30*a7e14dcfSSatish Balay PetscValidHeaderSpecific(XU,VEC_CLASSID,3); 31*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)XU); 32*a7e14dcfSSatish Balay } 33*a7e14dcfSSatish Balay if (tao->XL) { 34*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XL); CHKERRQ(ierr); 35*a7e14dcfSSatish Balay } 36*a7e14dcfSSatish Balay if (tao->XU) { 37*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XU); CHKERRQ(ierr); 38*a7e14dcfSSatish Balay } 39*a7e14dcfSSatish Balay 40*a7e14dcfSSatish Balay tao->XL = XL; 41*a7e14dcfSSatish Balay tao->XU = XU; 42*a7e14dcfSSatish Balay 43*a7e14dcfSSatish Balay PetscFunctionReturn(0); 44*a7e14dcfSSatish Balay } 45*a7e14dcfSSatish Balay #undef __FUNCT__ 46*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetVariableBoundsRoutine" 47*a7e14dcfSSatish Balay /*@C 48*a7e14dcfSSatish Balay TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds 49*a7e14dcfSSatish Balay 50*a7e14dcfSSatish Balay Logically collective on TaoSolver 51*a7e14dcfSSatish Balay 52*a7e14dcfSSatish Balay Input Parameters: 53*a7e14dcfSSatish Balay + tao - the TaoSolver context 54*a7e14dcfSSatish Balay . func - the bounds computation routine 55*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the bounds computation (may be PETSC_NULL) 56*a7e14dcfSSatish Balay 57*a7e14dcfSSatish Balay Calling sequence of func: 58*a7e14dcfSSatish Balay $ func (TaoSolver tao, Vec xl, Vec xu); 59*a7e14dcfSSatish Balay 60*a7e14dcfSSatish Balay + tao - the TaoSolver 61*a7e14dcfSSatish Balay . xl - vector of lower bounds 62*a7e14dcfSSatish Balay . xu - vector of upper bounds 63*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 64*a7e14dcfSSatish Balay 65*a7e14dcfSSatish Balay Level: beginner 66*a7e14dcfSSatish Balay 67*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 68*a7e14dcfSSatish Balay 69*a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes 70*a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds(). 71*a7e14dcfSSatish Balay 72*a7e14dcfSSatish Balay @*/ 73*a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBoundsRoutine(TaoSolver tao, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx) 74*a7e14dcfSSatish Balay { 75*a7e14dcfSSatish Balay PetscFunctionBegin; 76*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 77*a7e14dcfSSatish Balay tao->user_boundsP = ctx; 78*a7e14dcfSSatish Balay tao->ops->computebounds = func; 79*a7e14dcfSSatish Balay PetscFunctionReturn(0); 80*a7e14dcfSSatish Balay } 81*a7e14dcfSSatish Balay 82*a7e14dcfSSatish Balay #undef __FUNCT__ 83*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetVariableBounds" 84*a7e14dcfSSatish Balay PetscErrorCode TaoGetVariableBounds(TaoSolver tao, Vec *XL, Vec *XU) 85*a7e14dcfSSatish Balay { 86*a7e14dcfSSatish Balay PetscFunctionBegin; 87*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 88*a7e14dcfSSatish Balay if (XL) { 89*a7e14dcfSSatish Balay *XL=tao->XL; 90*a7e14dcfSSatish Balay } 91*a7e14dcfSSatish Balay if (XU) { 92*a7e14dcfSSatish Balay *XU=tao->XU; 93*a7e14dcfSSatish Balay } 94*a7e14dcfSSatish Balay PetscFunctionReturn(0); 95*a7e14dcfSSatish Balay } 96*a7e14dcfSSatish Balay 97*a7e14dcfSSatish Balay #undef __FUNCT__ 98*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeVariableBounds" 99*a7e14dcfSSatish Balay /*@C 100*a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 101*a7e14dcfSSatish Balay routine set by TaoSetVariableBoundsRoutine(). 102*a7e14dcfSSatish Balay 103*a7e14dcfSSatish Balay Collective on TaoSolver 104*a7e14dcfSSatish Balay 105*a7e14dcfSSatish Balay Input Parameters: 106*a7e14dcfSSatish Balay . tao - the TaoSolver context 107*a7e14dcfSSatish Balay 108*a7e14dcfSSatish Balay Level: developer 109*a7e14dcfSSatish Balay 110*a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds() 111*a7e14dcfSSatish Balay @*/ 112*a7e14dcfSSatish Balay 113*a7e14dcfSSatish Balay PetscErrorCode TaoComputeVariableBounds(TaoSolver tao) 114*a7e14dcfSSatish Balay { 115*a7e14dcfSSatish Balay PetscErrorCode ierr; 116*a7e14dcfSSatish Balay 117*a7e14dcfSSatish Balay PetscFunctionBegin; 118*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 119*a7e14dcfSSatish Balay if (tao->ops->computebounds == PETSC_NULL) { 120*a7e14dcfSSatish Balay PetscFunctionReturn(0); 121*a7e14dcfSSatish Balay } 122*a7e14dcfSSatish Balay if (tao->XL == PETSC_NULL || tao->XU == PETSC_NULL) { 123*a7e14dcfSSatish Balay if (tao->solution == PETSC_NULL) { 124*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeVariableBounds"); 125*a7e14dcfSSatish Balay } 126*a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XL); CHKERRQ(ierr); 127*a7e14dcfSSatish Balay ierr = VecSet(tao->XL, TAO_NINFINITY); CHKERRQ(ierr); 128*a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XU); CHKERRQ(ierr); 129*a7e14dcfSSatish Balay ierr = VecSet(tao->XU, TAO_INFINITY); CHKERRQ(ierr); 130*a7e14dcfSSatish Balay } 131*a7e14dcfSSatish Balay CHKMEMQ; 132*a7e14dcfSSatish Balay ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP); 133*a7e14dcfSSatish Balay CHKERRQ(ierr); 134*a7e14dcfSSatish Balay CHKMEMQ; 135*a7e14dcfSSatish Balay 136*a7e14dcfSSatish Balay PetscFunctionReturn(0); 137*a7e14dcfSSatish Balay } 138*a7e14dcfSSatish Balay 139*a7e14dcfSSatish Balay #undef __FUNCT__ 140*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityBounds" 141*a7e14dcfSSatish Balay /*@ 142*a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 143*a7e14dcfSSatish Balay 144*a7e14dcfSSatish Balay Logically collective on TaoSolver 145*a7e14dcfSSatish Balay 146*a7e14dcfSSatish Balay Input Parameters: 147*a7e14dcfSSatish Balay + tao - the TaoSolver context 148*a7e14dcfSSatish Balay . IL - vector of lower bounds 149*a7e14dcfSSatish Balay - IU - vector of upper bounds 150*a7e14dcfSSatish Balay 151*a7e14dcfSSatish Balay Level: beginner 152*a7e14dcfSSatish Balay 153*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine() 154*a7e14dcfSSatish Balay @*/ 155*a7e14dcfSSatish Balay 156*a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityBounds(TaoSolver tao, Vec IL, Vec IU) 157*a7e14dcfSSatish Balay { 158*a7e14dcfSSatish Balay PetscErrorCode ierr; 159*a7e14dcfSSatish Balay PetscFunctionBegin; 160*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 161*a7e14dcfSSatish Balay if (IL) { 162*a7e14dcfSSatish Balay PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 163*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IL); 164*a7e14dcfSSatish Balay } 165*a7e14dcfSSatish Balay if (IU) { 166*a7e14dcfSSatish Balay PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 167*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IU); 168*a7e14dcfSSatish Balay } 169*a7e14dcfSSatish Balay if (tao->IL) { 170*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IL); CHKERRQ(ierr); 171*a7e14dcfSSatish Balay } 172*a7e14dcfSSatish Balay if (tao->IU) { 173*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IU); CHKERRQ(ierr); 174*a7e14dcfSSatish Balay } 175*a7e14dcfSSatish Balay 176*a7e14dcfSSatish Balay tao->IL = IL; 177*a7e14dcfSSatish Balay tao->IU = IU; 178*a7e14dcfSSatish Balay 179*a7e14dcfSSatish Balay PetscFunctionReturn(0); 180*a7e14dcfSSatish Balay } 181*a7e14dcfSSatish Balay 182*a7e14dcfSSatish Balay 183*a7e14dcfSSatish Balay #undef __FUNCT__ 184*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetInequalityBounds" 185*a7e14dcfSSatish Balay PetscErrorCode TaoGetInequalityBounds(TaoSolver tao, Vec *IL, Vec *IU) 186*a7e14dcfSSatish Balay { 187*a7e14dcfSSatish Balay PetscFunctionBegin; 188*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 189*a7e14dcfSSatish Balay if (IL) { 190*a7e14dcfSSatish Balay *IL=tao->IL; 191*a7e14dcfSSatish Balay } 192*a7e14dcfSSatish Balay if (IU) { 193*a7e14dcfSSatish Balay *IU=tao->IU; 194*a7e14dcfSSatish Balay } 195*a7e14dcfSSatish Balay PetscFunctionReturn(0); 196*a7e14dcfSSatish Balay } 197*a7e14dcfSSatish Balay 198*a7e14dcfSSatish Balay #undef __FUNCT__ 199*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeConstraints" 200*a7e14dcfSSatish Balay /*@C 201*a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 202*a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 203*a7e14dcfSSatish Balay 204*a7e14dcfSSatish Balay Collective on TaoSolver 205*a7e14dcfSSatish Balay 206*a7e14dcfSSatish Balay Input Parameters: 207*a7e14dcfSSatish Balay . tao - the TaoSolver context 208*a7e14dcfSSatish Balay 209*a7e14dcfSSatish Balay Level: developer 210*a7e14dcfSSatish Balay 211*a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian() 212*a7e14dcfSSatish Balay @*/ 213*a7e14dcfSSatish Balay 214*a7e14dcfSSatish Balay PetscErrorCode TaoComputeConstraints(TaoSolver tao, Vec X, Vec C) 215*a7e14dcfSSatish Balay { 216*a7e14dcfSSatish Balay PetscErrorCode ierr; 217*a7e14dcfSSatish Balay 218*a7e14dcfSSatish Balay PetscFunctionBegin; 219*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 220*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 221*a7e14dcfSSatish Balay PetscValidHeaderSpecific(C,VEC_CLASSID,2); 222*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 223*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 224*a7e14dcfSSatish Balay 225*a7e14dcfSSatish Balay if (tao->ops->computeconstraints == PETSC_NULL) { 226*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 227*a7e14dcfSSatish Balay } 228*a7e14dcfSSatish Balay if (tao->solution == PETSC_NULL) { 229*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints"); 230*a7e14dcfSSatish Balay } 231*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,C,PETSC_NULL); CHKERRQ(ierr); 232*a7e14dcfSSatish Balay PetscStackPush("TaoSolver constraints evaluation routine"); 233*a7e14dcfSSatish Balay CHKMEMQ; 234*a7e14dcfSSatish Balay ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP); 235*a7e14dcfSSatish Balay CHKERRQ(ierr); 236*a7e14dcfSSatish Balay CHKMEMQ; 237*a7e14dcfSSatish Balay PetscStackPop; 238*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,C,PETSC_NULL); CHKERRQ(ierr); 239*a7e14dcfSSatish Balay tao->nconstraints++; 240*a7e14dcfSSatish Balay PetscFunctionReturn(0); 241*a7e14dcfSSatish Balay } 242*a7e14dcfSSatish Balay 243*a7e14dcfSSatish Balay 244*a7e14dcfSSatish Balay #undef __FUNCT__ 245*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintsRoutine" 246*a7e14dcfSSatish Balay /*@C 247*a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 248*a7e14dcfSSatish Balay 249*a7e14dcfSSatish Balay Logically collective on TaoSolver 250*a7e14dcfSSatish Balay 251*a7e14dcfSSatish Balay Input Parameters: 252*a7e14dcfSSatish Balay + tao - the TaoSolver context 253*a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 254*a7e14dcfSSatish Balay . func - the bounds computation routine 255*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the constraints computation (may be PETSC_NULL) 256*a7e14dcfSSatish Balay 257*a7e14dcfSSatish Balay Calling sequence of func: 258*a7e14dcfSSatish Balay $ func (TaoSolver tao, Vec x, Vec c, void *ctx); 259*a7e14dcfSSatish Balay 260*a7e14dcfSSatish Balay + tao - the TaoSolver 261*a7e14dcfSSatish Balay . x - point to evaluate constraints 262*a7e14dcfSSatish Balay . c - vector constraints evaluated at x 263*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 264*a7e14dcfSSatish Balay 265*a7e14dcfSSatish Balay Level: intermediate 266*a7e14dcfSSatish Balay 267*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds() 268*a7e14dcfSSatish Balay 269*a7e14dcfSSatish Balay @*/ 270*a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintsRoutine(TaoSolver tao, Vec c, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx) 271*a7e14dcfSSatish Balay { 272*a7e14dcfSSatish Balay PetscFunctionBegin; 273*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 274*a7e14dcfSSatish Balay tao->constraints = c; 275*a7e14dcfSSatish Balay tao->user_conP = ctx; 276*a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 277*a7e14dcfSSatish Balay PetscFunctionReturn(0); 278*a7e14dcfSSatish Balay } 279*a7e14dcfSSatish Balay 280*a7e14dcfSSatish Balay #undef __FUNCT__ 281*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeDualVariables" 282*a7e14dcfSSatish Balay /*@ 283*a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 284*a7e14dcfSSatish Balay of the variables 285*a7e14dcfSSatish Balay 286*a7e14dcfSSatish Balay Collective on TaoSolver 287*a7e14dcfSSatish Balay 288*a7e14dcfSSatish Balay Input Parameters: 289*a7e14dcfSSatish Balay . tao - the TaoSolver context 290*a7e14dcfSSatish Balay 291*a7e14dcfSSatish Balay Output Parameter: 292*a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 293*a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 294*a7e14dcfSSatish Balay 295*a7e14dcfSSatish Balay Level: advanced 296*a7e14dcfSSatish Balay 297*a7e14dcfSSatish Balay Note: 298*a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 299*a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 300*a7e14dcfSSatish Balay zeros. 301*a7e14dcfSSatish Balay 302*a7e14dcfSSatish Balay Level: advanced 303*a7e14dcfSSatish Balay 304*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 305*a7e14dcfSSatish Balay @*/ 306*a7e14dcfSSatish Balay PetscErrorCode TaoComputeDualVariables(TaoSolver tao, Vec DL, Vec DU) 307*a7e14dcfSSatish Balay { 308*a7e14dcfSSatish Balay PetscErrorCode ierr; 309*a7e14dcfSSatish Balay PetscFunctionBegin; 310*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 311*a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 312*a7e14dcfSSatish Balay PetscValidHeaderSpecific(DU,VEC_CLASSID,2); 313*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 314*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 315*a7e14dcfSSatish Balay if (tao->ops->computedual) { 316*a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU); CHKERRQ(ierr); 317*a7e14dcfSSatish Balay } else { 318*a7e14dcfSSatish Balay ierr = VecSet(DL,0.0); CHKERRQ(ierr); 319*a7e14dcfSSatish Balay ierr = VecSet(DU,0.0); CHKERRQ(ierr); 320*a7e14dcfSSatish Balay } 321*a7e14dcfSSatish Balay PetscFunctionReturn(0); 322*a7e14dcfSSatish Balay } 323*a7e14dcfSSatish Balay 324*a7e14dcfSSatish Balay #undef __FUNCT__ 325*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetDualVariables" 326*a7e14dcfSSatish Balay /*@ 327*a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 328*a7e14dcfSSatish Balay 329*a7e14dcfSSatish Balay Collective on TaoSolver 330*a7e14dcfSSatish Balay 331*a7e14dcfSSatish Balay Input Parameters: 332*a7e14dcfSSatish Balay . tao - the TaoSolver context 333*a7e14dcfSSatish Balay 334*a7e14dcfSSatish Balay Output Parameter: 335*a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 336*a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 337*a7e14dcfSSatish Balay 338*a7e14dcfSSatish Balay Level: advanced 339*a7e14dcfSSatish Balay 340*a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 341*a7e14dcfSSatish Balay @*/ 342*a7e14dcfSSatish Balay PetscErrorCode TaoGetDualVariables(TaoSolver tao, Vec *DE, Vec *DI) 343*a7e14dcfSSatish Balay { 344*a7e14dcfSSatish Balay PetscFunctionBegin; 345*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 346*a7e14dcfSSatish Balay if (DE) { 347*a7e14dcfSSatish Balay *DE = tao->DE; 348*a7e14dcfSSatish Balay } 349*a7e14dcfSSatish Balay if (DI) { 350*a7e14dcfSSatish Balay *DI = tao->DI; 351*a7e14dcfSSatish Balay } 352*a7e14dcfSSatish Balay PetscFunctionReturn(0); 353*a7e14dcfSSatish Balay } 354*a7e14dcfSSatish Balay 355*a7e14dcfSSatish Balay #undef __FUNCT__ 356*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetEqualityConstraintsRoutine" 357*a7e14dcfSSatish Balay /*@C 358*a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 359*a7e14dcfSSatish Balay 360*a7e14dcfSSatish Balay Logically collective on TaoSolver 361*a7e14dcfSSatish Balay 362*a7e14dcfSSatish Balay Input Parameters: 363*a7e14dcfSSatish Balay + tao - the TaoSolver context 364*a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 365*a7e14dcfSSatish Balay . func - the bounds computation routine 366*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the equality constraints computation (may be PETSC_NULL) 367*a7e14dcfSSatish Balay 368*a7e14dcfSSatish Balay Calling sequence of func: 369*a7e14dcfSSatish Balay $ func (TaoSolver tao, Vec x, Vec ce, void *ctx); 370*a7e14dcfSSatish Balay 371*a7e14dcfSSatish Balay + tao - the TaoSolver 372*a7e14dcfSSatish Balay . x - point to evaluate equality constraints 373*a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 374*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 375*a7e14dcfSSatish Balay 376*a7e14dcfSSatish Balay Level: intermediate 377*a7e14dcfSSatish Balay 378*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 379*a7e14dcfSSatish Balay 380*a7e14dcfSSatish Balay @*/ 381*a7e14dcfSSatish Balay PetscErrorCode TaoSetEqualityConstraintsRoutine(TaoSolver tao, Vec ce, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx) 382*a7e14dcfSSatish Balay { 383*a7e14dcfSSatish Balay PetscErrorCode ierr; 384*a7e14dcfSSatish Balay 385*a7e14dcfSSatish Balay PetscFunctionBegin; 386*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 387*a7e14dcfSSatish Balay if (ce) { 388*a7e14dcfSSatish Balay PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 389*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ce); 390*a7e14dcfSSatish Balay } 391*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality); CHKERRQ(ierr); 392*a7e14dcfSSatish Balay 393*a7e14dcfSSatish Balay tao->constraints_equality = ce; 394*a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 395*a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 396*a7e14dcfSSatish Balay PetscFunctionReturn(0); 397*a7e14dcfSSatish Balay } 398*a7e14dcfSSatish Balay 399*a7e14dcfSSatish Balay 400*a7e14dcfSSatish Balay #undef __FUNCT__ 401*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityConstraintsRoutine" 402*a7e14dcfSSatish Balay /*@C 403*a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 404*a7e14dcfSSatish Balay 405*a7e14dcfSSatish Balay Logically collective on TaoSolver 406*a7e14dcfSSatish Balay 407*a7e14dcfSSatish Balay Input Parameters: 408*a7e14dcfSSatish Balay + tao - the TaoSolver context 409*a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 410*a7e14dcfSSatish Balay . func - the bounds computation routine 411*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be PETSC_NULL) 412*a7e14dcfSSatish Balay 413*a7e14dcfSSatish Balay Calling sequence of func: 414*a7e14dcfSSatish Balay $ func (TaoSolver tao, Vec x, Vec ci, void *ctx); 415*a7e14dcfSSatish Balay 416*a7e14dcfSSatish Balay + tao - the TaoSolver 417*a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 418*a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 419*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 420*a7e14dcfSSatish Balay 421*a7e14dcfSSatish Balay Level: intermediate 422*a7e14dcfSSatish Balay 423*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 424*a7e14dcfSSatish Balay 425*a7e14dcfSSatish Balay @*/ 426*a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityConstraintsRoutine(TaoSolver tao, Vec ci, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx) 427*a7e14dcfSSatish Balay { 428*a7e14dcfSSatish Balay PetscErrorCode ierr; 429*a7e14dcfSSatish Balay 430*a7e14dcfSSatish Balay PetscFunctionBegin; 431*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 432*a7e14dcfSSatish Balay if (ci) { 433*a7e14dcfSSatish Balay PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 434*a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ci); 435*a7e14dcfSSatish Balay } 436*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_inequality); CHKERRQ(ierr); 437*a7e14dcfSSatish Balay tao->constraints_inequality = ci; 438*a7e14dcfSSatish Balay 439*a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 440*a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 441*a7e14dcfSSatish Balay PetscFunctionReturn(0); 442*a7e14dcfSSatish Balay } 443*a7e14dcfSSatish Balay 444*a7e14dcfSSatish Balay 445*a7e14dcfSSatish Balay #undef __FUNCT__ 446*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeEqualityConstraints" 447*a7e14dcfSSatish Balay /*@C 448*a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 449*a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 450*a7e14dcfSSatish Balay 451*a7e14dcfSSatish Balay Collective on TaoSolver 452*a7e14dcfSSatish Balay 453*a7e14dcfSSatish Balay Input Parameters: 454*a7e14dcfSSatish Balay . tao - the TaoSolver context 455*a7e14dcfSSatish Balay 456*a7e14dcfSSatish Balay Level: developer 457*a7e14dcfSSatish Balay 458*a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 459*a7e14dcfSSatish Balay @*/ 460*a7e14dcfSSatish Balay 461*a7e14dcfSSatish Balay PetscErrorCode TaoComputeEqualityConstraints(TaoSolver tao, Vec X, Vec CE) 462*a7e14dcfSSatish Balay { 463*a7e14dcfSSatish Balay PetscErrorCode ierr; 464*a7e14dcfSSatish Balay 465*a7e14dcfSSatish Balay PetscFunctionBegin; 466*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 467*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 468*a7e14dcfSSatish Balay PetscValidHeaderSpecific(CE,VEC_CLASSID,2); 469*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 470*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 471*a7e14dcfSSatish Balay 472*a7e14dcfSSatish Balay if (tao->ops->computeequalityconstraints == PETSC_NULL) { 473*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 474*a7e14dcfSSatish Balay } 475*a7e14dcfSSatish Balay if (tao->solution == PETSC_NULL) { 476*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints"); 477*a7e14dcfSSatish Balay } 478*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CE,PETSC_NULL); CHKERRQ(ierr); 479*a7e14dcfSSatish Balay PetscStackPush("TaoSolver equality constraints evaluation routine"); 480*a7e14dcfSSatish Balay CHKMEMQ; 481*a7e14dcfSSatish Balay ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP); 482*a7e14dcfSSatish Balay CHKERRQ(ierr); 483*a7e14dcfSSatish Balay CHKMEMQ; 484*a7e14dcfSSatish Balay PetscStackPop; 485*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CE,PETSC_NULL); CHKERRQ(ierr); 486*a7e14dcfSSatish Balay tao->nconstraints++; 487*a7e14dcfSSatish Balay PetscFunctionReturn(0); 488*a7e14dcfSSatish Balay } 489*a7e14dcfSSatish Balay 490*a7e14dcfSSatish Balay 491*a7e14dcfSSatish Balay #undef __FUNCT__ 492*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeInequalityConstraints" 493*a7e14dcfSSatish Balay /*@C 494*a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 495*a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 496*a7e14dcfSSatish Balay 497*a7e14dcfSSatish Balay Collective on TaoSolver 498*a7e14dcfSSatish Balay 499*a7e14dcfSSatish Balay Input Parameters: 500*a7e14dcfSSatish Balay . tao - the TaoSolver context 501*a7e14dcfSSatish Balay 502*a7e14dcfSSatish Balay Level: developer 503*a7e14dcfSSatish Balay 504*a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality() 505*a7e14dcfSSatish Balay @*/ 506*a7e14dcfSSatish Balay 507*a7e14dcfSSatish Balay PetscErrorCode TaoComputeInequalityConstraints(TaoSolver tao, Vec X, Vec CI) 508*a7e14dcfSSatish Balay { 509*a7e14dcfSSatish Balay PetscErrorCode ierr; 510*a7e14dcfSSatish Balay 511*a7e14dcfSSatish Balay PetscFunctionBegin; 512*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 513*a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 514*a7e14dcfSSatish Balay PetscValidHeaderSpecific(CI,VEC_CLASSID,2); 515*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 516*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 517*a7e14dcfSSatish Balay 518*a7e14dcfSSatish Balay if (tao->ops->computeinequalityconstraints == PETSC_NULL) { 519*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 520*a7e14dcfSSatish Balay } 521*a7e14dcfSSatish Balay if (tao->solution == PETSC_NULL) { 522*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints"); 523*a7e14dcfSSatish Balay } 524*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CI,PETSC_NULL); CHKERRQ(ierr); 525*a7e14dcfSSatish Balay PetscStackPush("TaoSolver inequality constraints evaluation routine"); 526*a7e14dcfSSatish Balay CHKMEMQ; 527*a7e14dcfSSatish Balay ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP); 528*a7e14dcfSSatish Balay CHKERRQ(ierr); 529*a7e14dcfSSatish Balay CHKMEMQ; 530*a7e14dcfSSatish Balay PetscStackPop; 531*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CI,PETSC_NULL); CHKERRQ(ierr); 532*a7e14dcfSSatish Balay tao->nconstraints++; 533*a7e14dcfSSatish Balay PetscFunctionReturn(0); 534*a7e14dcfSSatish Balay } 535