1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/ 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*@ 4a7e14dcfSSatish Balay TaoSetVariableBounds - Sets the upper and lower bounds 5a7e14dcfSSatish Balay 6441846f8SBarry Smith Logically collective on Tao 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay Input Parameters: 9441846f8SBarry Smith + tao - the Tao context 10a7e14dcfSSatish Balay . XL - vector of lower bounds 11a7e14dcfSSatish Balay - XU - vector of upper bounds 12a7e14dcfSSatish Balay 13a7e14dcfSSatish Balay Level: beginner 14a7e14dcfSSatish Balay 15a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine() 16a7e14dcfSSatish Balay @*/ 17a7e14dcfSSatish Balay 18441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU) 19a7e14dcfSSatish Balay { 20a7e14dcfSSatish Balay PetscErrorCode ierr; 215ca45b2bSBarry Smith 22a7e14dcfSSatish Balay PetscFunctionBegin; 23441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 24a7e14dcfSSatish Balay if (XL) { 25a7e14dcfSSatish Balay PetscValidHeaderSpecific(XL,VEC_CLASSID,2); 26a7e14dcfSSatish Balay PetscObjectReference((PetscObject)XL); 27a7e14dcfSSatish Balay } 28a7e14dcfSSatish Balay if (XU) { 29a7e14dcfSSatish Balay PetscValidHeaderSpecific(XU,VEC_CLASSID,3); 30a7e14dcfSSatish Balay PetscObjectReference((PetscObject)XU); 31a7e14dcfSSatish Balay } 32a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XL);CHKERRQ(ierr); 33a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XU);CHKERRQ(ierr); 34a7e14dcfSSatish Balay tao->XL = XL; 35a7e14dcfSSatish Balay tao->XU = XU; 36a7e14dcfSSatish Balay PetscFunctionReturn(0); 37a7e14dcfSSatish Balay } 3845cf516eSBarry Smith 39a7e14dcfSSatish Balay /*@C 40a7e14dcfSSatish Balay TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds 41a7e14dcfSSatish Balay 42441846f8SBarry Smith Logically collective on Tao 43a7e14dcfSSatish Balay 44a7e14dcfSSatish Balay Input Parameters: 45441846f8SBarry Smith + tao - the Tao context 46a7e14dcfSSatish Balay . func - the bounds computation routine 476c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL) 48a7e14dcfSSatish Balay 49a7e14dcfSSatish Balay Calling sequence of func: 50441846f8SBarry Smith $ func (Tao tao, Vec xl, Vec xu); 51a7e14dcfSSatish Balay 52441846f8SBarry Smith + tao - the Tao 53a7e14dcfSSatish Balay . xl - vector of lower bounds 54a7e14dcfSSatish Balay . xu - vector of upper bounds 55a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 56a7e14dcfSSatish Balay 57a7e14dcfSSatish Balay Level: beginner 58a7e14dcfSSatish Balay 59a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 60a7e14dcfSSatish Balay 61a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes 62a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds(). 63a7e14dcfSSatish Balay 64a7e14dcfSSatish Balay @*/ 65441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 66a7e14dcfSSatish Balay { 67a7e14dcfSSatish Balay PetscFunctionBegin; 68441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 69a7e14dcfSSatish Balay tao->user_boundsP = ctx; 70a7e14dcfSSatish Balay tao->ops->computebounds = func; 71a7e14dcfSSatish Balay PetscFunctionReturn(0); 72a7e14dcfSSatish Balay } 73a7e14dcfSSatish Balay 74441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 75a7e14dcfSSatish Balay { 76a7e14dcfSSatish Balay PetscFunctionBegin; 77441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 78a7e14dcfSSatish Balay if (XL) { 79a7e14dcfSSatish Balay *XL=tao->XL; 80a7e14dcfSSatish Balay } 81a7e14dcfSSatish Balay if (XU) { 82a7e14dcfSSatish Balay *XU=tao->XU; 83a7e14dcfSSatish Balay } 84a7e14dcfSSatish Balay PetscFunctionReturn(0); 85a7e14dcfSSatish Balay } 86a7e14dcfSSatish Balay 87a7e14dcfSSatish Balay /*@C 88a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 89a7e14dcfSSatish Balay routine set by TaoSetVariableBoundsRoutine(). 90a7e14dcfSSatish Balay 91441846f8SBarry Smith Collective on Tao 92a7e14dcfSSatish Balay 93a7e14dcfSSatish Balay Input Parameters: 94441846f8SBarry Smith . tao - the Tao context 95a7e14dcfSSatish Balay 96a7e14dcfSSatish Balay Level: developer 97a7e14dcfSSatish Balay 98a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds() 99a7e14dcfSSatish Balay @*/ 100a7e14dcfSSatish Balay 101441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao) 102a7e14dcfSSatish Balay { 103a7e14dcfSSatish Balay PetscErrorCode ierr; 104a7e14dcfSSatish Balay 105a7e14dcfSSatish Balay PetscFunctionBegin; 106441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 107*2b97c8d8SAlp Dener PetscStackPush("Tao compute variable bounds"); 10887f595a5SBarry Smith if (!tao->XL || !tao->XU) { 10987f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeVariableBounds"); 110a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr); 111e270355aSBarry Smith ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr); 112a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr); 113e270355aSBarry Smith ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr); 114a7e14dcfSSatish Balay } 115*2b97c8d8SAlp Dener if (tao->ops->computebounds) { 11687f595a5SBarry Smith ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr); 117*2b97c8d8SAlp Dener } 1180cbffdbaSBarry Smith PetscStackPop; 119a7e14dcfSSatish Balay PetscFunctionReturn(0); 120a7e14dcfSSatish Balay } 121a7e14dcfSSatish Balay 122a7e14dcfSSatish Balay /*@ 123a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 124a7e14dcfSSatish Balay 125441846f8SBarry Smith Logically collective on Tao 126a7e14dcfSSatish Balay 127a7e14dcfSSatish Balay Input Parameters: 128441846f8SBarry Smith + tao - the Tao context 129a7e14dcfSSatish Balay . IL - vector of lower bounds 130a7e14dcfSSatish Balay - IU - vector of upper bounds 131a7e14dcfSSatish Balay 132a7e14dcfSSatish Balay Level: beginner 133a7e14dcfSSatish Balay 134a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine() 135a7e14dcfSSatish Balay @*/ 136a7e14dcfSSatish Balay 137441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 138a7e14dcfSSatish Balay { 139a7e14dcfSSatish Balay PetscErrorCode ierr; 1405ca45b2bSBarry Smith 141a7e14dcfSSatish Balay PetscFunctionBegin; 142441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 143a7e14dcfSSatish Balay if (IL) { 144a7e14dcfSSatish Balay PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 145a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IL); 146a7e14dcfSSatish Balay } 147a7e14dcfSSatish Balay if (IU) { 148a7e14dcfSSatish Balay PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 149a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IU); 150a7e14dcfSSatish Balay } 151a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IL);CHKERRQ(ierr); 152a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IU);CHKERRQ(ierr); 153a7e14dcfSSatish Balay tao->IL = IL; 154a7e14dcfSSatish Balay tao->IU = IU; 155a7e14dcfSSatish Balay PetscFunctionReturn(0); 156a7e14dcfSSatish Balay } 157a7e14dcfSSatish Balay 158a7e14dcfSSatish Balay 159441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 160a7e14dcfSSatish Balay { 161a7e14dcfSSatish Balay PetscFunctionBegin; 162441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 163a7e14dcfSSatish Balay if (IL) { 164a7e14dcfSSatish Balay *IL=tao->IL; 165a7e14dcfSSatish Balay } 166a7e14dcfSSatish Balay if (IU) { 167a7e14dcfSSatish Balay *IU=tao->IU; 168a7e14dcfSSatish Balay } 169a7e14dcfSSatish Balay PetscFunctionReturn(0); 170a7e14dcfSSatish Balay } 171a7e14dcfSSatish Balay 172a7e14dcfSSatish Balay /*@C 173a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 174a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 175a7e14dcfSSatish Balay 176441846f8SBarry Smith Collective on Tao 177a7e14dcfSSatish Balay 178a7e14dcfSSatish Balay Input Parameters: 179441846f8SBarry Smith . tao - the Tao context 180a7e14dcfSSatish Balay 181a7e14dcfSSatish Balay Level: developer 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian() 184a7e14dcfSSatish Balay @*/ 185a7e14dcfSSatish Balay 186441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 187a7e14dcfSSatish Balay { 188a7e14dcfSSatish Balay PetscErrorCode ierr; 189a7e14dcfSSatish Balay 190a7e14dcfSSatish Balay PetscFunctionBegin; 191441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 192a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 193a7e14dcfSSatish Balay PetscValidHeaderSpecific(C,VEC_CLASSID,2); 194a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 195a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 196a7e14dcfSSatish Balay 19787f595a5SBarry Smith if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 19887f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints"); 199441846f8SBarry Smith ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 200441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 20153506e15SBarry Smith ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr); 202a7e14dcfSSatish Balay PetscStackPop; 203441846f8SBarry Smith ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 204a7e14dcfSSatish Balay tao->nconstraints++; 205a7e14dcfSSatish Balay PetscFunctionReturn(0); 206a7e14dcfSSatish Balay } 207a7e14dcfSSatish Balay 208a7e14dcfSSatish Balay /*@C 209a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 210a7e14dcfSSatish Balay 211441846f8SBarry Smith Logically collective on Tao 212a7e14dcfSSatish Balay 213a7e14dcfSSatish Balay Input Parameters: 214441846f8SBarry Smith + tao - the Tao context 215a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 216a7e14dcfSSatish Balay . func - the bounds computation routine 2176c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 218a7e14dcfSSatish Balay 219a7e14dcfSSatish Balay Calling sequence of func: 220441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 221a7e14dcfSSatish Balay 222441846f8SBarry Smith + tao - the Tao 223a7e14dcfSSatish Balay . x - point to evaluate constraints 224a7e14dcfSSatish Balay . c - vector constraints evaluated at x 225a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 226a7e14dcfSSatish Balay 227a7e14dcfSSatish Balay Level: intermediate 228a7e14dcfSSatish Balay 229a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds() 230a7e14dcfSSatish Balay 231a7e14dcfSSatish Balay @*/ 232441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 233a7e14dcfSSatish Balay { 234a7e14dcfSSatish Balay PetscFunctionBegin; 235441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 236a7e14dcfSSatish Balay tao->constraints = c; 237a7e14dcfSSatish Balay tao->user_conP = ctx; 238a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 239a7e14dcfSSatish Balay PetscFunctionReturn(0); 240a7e14dcfSSatish Balay } 241a7e14dcfSSatish Balay 242a7e14dcfSSatish Balay /*@ 243a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 244a7e14dcfSSatish Balay of the variables 245a7e14dcfSSatish Balay 246441846f8SBarry Smith Collective on Tao 247a7e14dcfSSatish Balay 248a7e14dcfSSatish Balay Input Parameters: 249441846f8SBarry Smith . tao - the Tao context 250a7e14dcfSSatish Balay 251a7e14dcfSSatish Balay Output Parameter: 252a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 253a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 254a7e14dcfSSatish Balay 255a7e14dcfSSatish Balay Level: advanced 256a7e14dcfSSatish Balay 257a7e14dcfSSatish Balay Note: 258a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 259a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 260a7e14dcfSSatish Balay zeros. 261a7e14dcfSSatish Balay 262a7e14dcfSSatish Balay Level: advanced 263a7e14dcfSSatish Balay 264a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 265a7e14dcfSSatish Balay @*/ 266441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 267a7e14dcfSSatish Balay { 268a7e14dcfSSatish Balay PetscErrorCode ierr; 269a7e14dcfSSatish Balay PetscFunctionBegin; 270441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 271a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 272a7e14dcfSSatish Balay PetscValidHeaderSpecific(DU,VEC_CLASSID,2); 273a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 274a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 275a7e14dcfSSatish Balay if (tao->ops->computedual) { 276a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr); 277a7e14dcfSSatish Balay } else { 278a7e14dcfSSatish Balay ierr = VecSet(DL,0.0);CHKERRQ(ierr); 279a7e14dcfSSatish Balay ierr = VecSet(DU,0.0);CHKERRQ(ierr); 280a7e14dcfSSatish Balay } 281a7e14dcfSSatish Balay PetscFunctionReturn(0); 282a7e14dcfSSatish Balay } 283a7e14dcfSSatish Balay 284a7e14dcfSSatish Balay /*@ 285a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 286a7e14dcfSSatish Balay 287441846f8SBarry Smith Collective on Tao 288a7e14dcfSSatish Balay 289a7e14dcfSSatish Balay Input Parameters: 290441846f8SBarry Smith . tao - the Tao context 291a7e14dcfSSatish Balay 292a7e14dcfSSatish Balay Output Parameter: 293a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 294a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 295a7e14dcfSSatish Balay 296a7e14dcfSSatish Balay Level: advanced 297a7e14dcfSSatish Balay 298a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 299a7e14dcfSSatish Balay @*/ 300441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 301a7e14dcfSSatish Balay { 302a7e14dcfSSatish Balay PetscFunctionBegin; 303441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 304a7e14dcfSSatish Balay if (DE) { 305a7e14dcfSSatish Balay *DE = tao->DE; 306a7e14dcfSSatish Balay } 307a7e14dcfSSatish Balay if (DI) { 308a7e14dcfSSatish Balay *DI = tao->DI; 309a7e14dcfSSatish Balay } 310a7e14dcfSSatish Balay PetscFunctionReturn(0); 311a7e14dcfSSatish Balay } 312a7e14dcfSSatish Balay 313a7e14dcfSSatish Balay /*@C 314a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 315a7e14dcfSSatish Balay 316441846f8SBarry Smith Logically collective on Tao 317a7e14dcfSSatish Balay 318a7e14dcfSSatish Balay Input Parameters: 319441846f8SBarry Smith + tao - the Tao context 320a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 321a7e14dcfSSatish Balay . func - the bounds computation routine 3226c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 323a7e14dcfSSatish Balay 324a7e14dcfSSatish Balay Calling sequence of func: 325441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 326a7e14dcfSSatish Balay 327441846f8SBarry Smith + tao - the Tao 328a7e14dcfSSatish Balay . x - point to evaluate equality constraints 329a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 330a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 331a7e14dcfSSatish Balay 332a7e14dcfSSatish Balay Level: intermediate 333a7e14dcfSSatish Balay 334a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 335a7e14dcfSSatish Balay 336a7e14dcfSSatish Balay @*/ 337441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 338a7e14dcfSSatish Balay { 339a7e14dcfSSatish Balay PetscErrorCode ierr; 340a7e14dcfSSatish Balay 341a7e14dcfSSatish Balay PetscFunctionBegin; 342441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 343a7e14dcfSSatish Balay if (ce) { 344a7e14dcfSSatish Balay PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 345a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ce); 346a7e14dcfSSatish Balay } 347a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr); 348a7e14dcfSSatish Balay 349a7e14dcfSSatish Balay tao->constraints_equality = ce; 350a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 351a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 352a7e14dcfSSatish Balay PetscFunctionReturn(0); 353a7e14dcfSSatish Balay } 354a7e14dcfSSatish Balay 355a7e14dcfSSatish Balay 356a7e14dcfSSatish Balay /*@C 357a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 358a7e14dcfSSatish Balay 359441846f8SBarry Smith Logically collective on Tao 360a7e14dcfSSatish Balay 361a7e14dcfSSatish Balay Input Parameters: 362441846f8SBarry Smith + tao - the Tao context 363a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 364a7e14dcfSSatish Balay . func - the bounds computation routine 3656c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 366a7e14dcfSSatish Balay 367a7e14dcfSSatish Balay Calling sequence of func: 368441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 369a7e14dcfSSatish Balay 370441846f8SBarry Smith + tao - the Tao 371a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 372a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 373a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 374a7e14dcfSSatish Balay 375a7e14dcfSSatish Balay Level: intermediate 376a7e14dcfSSatish Balay 377a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 378a7e14dcfSSatish Balay 379a7e14dcfSSatish Balay @*/ 380441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 381a7e14dcfSSatish Balay { 382a7e14dcfSSatish Balay PetscErrorCode ierr; 383a7e14dcfSSatish Balay 384a7e14dcfSSatish Balay PetscFunctionBegin; 385441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 386a7e14dcfSSatish Balay if (ci) { 387a7e14dcfSSatish Balay PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 388a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ci); 389a7e14dcfSSatish Balay } 390a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr); 391a7e14dcfSSatish Balay tao->constraints_inequality = ci; 392a7e14dcfSSatish Balay 393a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 394a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 395a7e14dcfSSatish Balay PetscFunctionReturn(0); 396a7e14dcfSSatish Balay } 397a7e14dcfSSatish Balay 398a7e14dcfSSatish Balay 399a7e14dcfSSatish Balay /*@C 400a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 401a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 402a7e14dcfSSatish Balay 403441846f8SBarry Smith Collective on Tao 404a7e14dcfSSatish Balay 405a7e14dcfSSatish Balay Input Parameters: 406441846f8SBarry Smith . tao - the Tao context 407a7e14dcfSSatish Balay 408a7e14dcfSSatish Balay Level: developer 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 411a7e14dcfSSatish Balay @*/ 412a7e14dcfSSatish Balay 413441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 414a7e14dcfSSatish Balay { 415a7e14dcfSSatish Balay PetscErrorCode ierr; 416a7e14dcfSSatish Balay 417a7e14dcfSSatish Balay PetscFunctionBegin; 418441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 419a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 420a7e14dcfSSatish Balay PetscValidHeaderSpecific(CE,VEC_CLASSID,2); 421a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 422a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 423a7e14dcfSSatish Balay 42487f595a5SBarry Smith if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 42587f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints"); 426441846f8SBarry Smith ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 427441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 42853506e15SBarry Smith ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr); 429a7e14dcfSSatish Balay PetscStackPop; 430441846f8SBarry Smith ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 431a7e14dcfSSatish Balay tao->nconstraints++; 432a7e14dcfSSatish Balay PetscFunctionReturn(0); 433a7e14dcfSSatish Balay } 434a7e14dcfSSatish Balay 435a7e14dcfSSatish Balay 436a7e14dcfSSatish Balay /*@C 437a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 438a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 439a7e14dcfSSatish Balay 440441846f8SBarry Smith Collective on Tao 441a7e14dcfSSatish Balay 442a7e14dcfSSatish Balay Input Parameters: 443441846f8SBarry Smith . tao - the Tao context 444a7e14dcfSSatish Balay 445a7e14dcfSSatish Balay Level: developer 446a7e14dcfSSatish Balay 447a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality() 448a7e14dcfSSatish Balay @*/ 449a7e14dcfSSatish Balay 450441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 451a7e14dcfSSatish Balay { 452a7e14dcfSSatish Balay PetscErrorCode ierr; 453a7e14dcfSSatish Balay 454a7e14dcfSSatish Balay PetscFunctionBegin; 455441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 456a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 457a7e14dcfSSatish Balay PetscValidHeaderSpecific(CI,VEC_CLASSID,2); 458a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 459a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 460a7e14dcfSSatish Balay 46187f595a5SBarry Smith if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 46287f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints"); 463441846f8SBarry Smith ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 464441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 46587f595a5SBarry Smith ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr); 466a7e14dcfSSatish Balay PetscStackPop; 467441846f8SBarry Smith ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 468a7e14dcfSSatish Balay tao->nconstraints++; 469a7e14dcfSSatish Balay PetscFunctionReturn(0); 470a7e14dcfSSatish Balay } 471