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 15*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()` 16a7e14dcfSSatish Balay @*/ 17441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU) 18a7e14dcfSSatish Balay { 19a7e14dcfSSatish Balay PetscFunctionBegin; 20441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 217721a36fSStefano Zampini if (XL) PetscValidHeaderSpecific(XL,VEC_CLASSID,2); 227721a36fSStefano Zampini if (XU) PetscValidHeaderSpecific(XU,VEC_CLASSID,3); 239566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XL)); 249566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XU)); 259566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XL)); 269566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XU)); 27a7e14dcfSSatish Balay tao->XL = XL; 28a7e14dcfSSatish Balay tao->XU = XU; 297721a36fSStefano Zampini tao->bounded = (PetscBool)(XL || XU); 30a7e14dcfSSatish Balay PetscFunctionReturn(0); 31a7e14dcfSSatish Balay } 3245cf516eSBarry Smith 33a7e14dcfSSatish Balay /*@C 34a7e14dcfSSatish Balay TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds 35a7e14dcfSSatish Balay 36441846f8SBarry Smith Logically collective on Tao 37a7e14dcfSSatish Balay 38a7e14dcfSSatish Balay Input Parameters: 39441846f8SBarry Smith + tao - the Tao context 40a7e14dcfSSatish Balay . func - the bounds computation routine 416c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL) 42a7e14dcfSSatish Balay 43a7e14dcfSSatish Balay Calling sequence of func: 44441846f8SBarry Smith $ func (Tao tao, Vec xl, Vec xu); 45a7e14dcfSSatish Balay 46441846f8SBarry Smith + tao - the Tao 47a7e14dcfSSatish Balay . xl - vector of lower bounds 48a7e14dcfSSatish Balay . xu - vector of upper bounds 49a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 50a7e14dcfSSatish Balay 51a7e14dcfSSatish Balay Level: beginner 52a7e14dcfSSatish Balay 53*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 54a7e14dcfSSatish Balay 55a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes 56a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds(). 57a7e14dcfSSatish Balay 58a7e14dcfSSatish Balay @*/ 59441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 60a7e14dcfSSatish Balay { 61a7e14dcfSSatish Balay PetscFunctionBegin; 62441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 63a7e14dcfSSatish Balay tao->user_boundsP = ctx; 64a7e14dcfSSatish Balay tao->ops->computebounds = func; 657721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 66a7e14dcfSSatish Balay PetscFunctionReturn(0); 67a7e14dcfSSatish Balay } 68a7e14dcfSSatish Balay 697721a36fSStefano Zampini /*@ 707721a36fSStefano Zampini TaoGetVariableBounds - Gets the upper and lower bounds vectors set with TaoSetVariableBounds 717721a36fSStefano Zampini 727721a36fSStefano Zampini Not collective 737721a36fSStefano Zampini 747721a36fSStefano Zampini Input Parameter: 757721a36fSStefano Zampini . tao - the Tao context 767721a36fSStefano Zampini 777721a36fSStefano Zampini Output Parametrs: 787721a36fSStefano Zampini + XL - vector of lower bounds 797721a36fSStefano Zampini - XU - vector of upper bounds 807721a36fSStefano Zampini 817721a36fSStefano Zampini Level: beginner 827721a36fSStefano Zampini 83*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 847721a36fSStefano Zampini @*/ 85441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 86a7e14dcfSSatish Balay { 87a7e14dcfSSatish Balay PetscFunctionBegin; 88441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 897721a36fSStefano Zampini if (XL) *XL = tao->XL; 907721a36fSStefano Zampini if (XU) *XU = tao->XU; 91a7e14dcfSSatish Balay PetscFunctionReturn(0); 92a7e14dcfSSatish Balay } 93a7e14dcfSSatish Balay 94a7e14dcfSSatish Balay /*@C 95a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 96a7e14dcfSSatish Balay routine set by TaoSetVariableBoundsRoutine(). 97a7e14dcfSSatish Balay 98441846f8SBarry Smith Collective on Tao 99a7e14dcfSSatish Balay 1007721a36fSStefano Zampini Input Parameter: 101441846f8SBarry Smith . tao - the Tao context 102a7e14dcfSSatish Balay 103a7e14dcfSSatish Balay Level: developer 104a7e14dcfSSatish Balay 105*db781477SPatrick Sanan .seealso: `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()` 106a7e14dcfSSatish Balay @*/ 107a7e14dcfSSatish Balay 108441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao) 109a7e14dcfSSatish Balay { 110a7e14dcfSSatish Balay PetscFunctionBegin; 111441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 11287f595a5SBarry Smith if (!tao->XL || !tao->XU) { 1133c859ba3SBarry Smith PetscCheck(tao->solution,PetscObjectComm((PetscObject)tao),PETSC_ERR_ORDER,"TaoSetSolution must be called before TaoComputeVariableBounds"); 1149566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1159566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 1169566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1179566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 118a7e14dcfSSatish Balay } 1192b97c8d8SAlp Dener if (tao->ops->computebounds) { 1207721a36fSStefano Zampini PetscStackPush("Tao compute variable bounds"); 1219566063dSJacob Faibussowitsch PetscCall((*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP)); 1220cbffdbaSBarry Smith PetscStackPop; 1237721a36fSStefano Zampini } 124a7e14dcfSSatish Balay PetscFunctionReturn(0); 125a7e14dcfSSatish Balay } 126a7e14dcfSSatish Balay 127a7e14dcfSSatish Balay /*@ 128a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 129a7e14dcfSSatish Balay 130441846f8SBarry Smith Logically collective on Tao 131a7e14dcfSSatish Balay 132a7e14dcfSSatish Balay Input Parameters: 133441846f8SBarry Smith + tao - the Tao context 134a7e14dcfSSatish Balay . IL - vector of lower bounds 135a7e14dcfSSatish Balay - IU - vector of upper bounds 136a7e14dcfSSatish Balay 137a7e14dcfSSatish Balay Level: beginner 138a7e14dcfSSatish Balay 139*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 140a7e14dcfSSatish Balay @*/ 141441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 142a7e14dcfSSatish Balay { 143a7e14dcfSSatish Balay PetscFunctionBegin; 144441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1457721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 1467721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 1479566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1489566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1499566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 151a7e14dcfSSatish Balay tao->IL = IL; 152a7e14dcfSSatish Balay tao->IU = IU; 1537721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 154a7e14dcfSSatish Balay PetscFunctionReturn(0); 155a7e14dcfSSatish Balay } 156a7e14dcfSSatish Balay 1577721a36fSStefano Zampini /*@ 1587721a36fSStefano Zampini TaoGetInequalityBounds - Gets the upper and lower bounds set via TaoSetInequalityBounds 1597721a36fSStefano Zampini 1607721a36fSStefano Zampini Logically collective on Tao 1617721a36fSStefano Zampini 1627721a36fSStefano Zampini Input Parameter: 163f1a722f8SMatthew G. Knepley . tao - the Tao context 1647721a36fSStefano Zampini 1657721a36fSStefano Zampini Output Parameters: 1667721a36fSStefano Zampini + IL - vector of lower bounds 1677721a36fSStefano Zampini - IU - vector of upper bounds 1687721a36fSStefano Zampini 1697721a36fSStefano Zampini Level: beginner 1707721a36fSStefano Zampini 171*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1727721a36fSStefano Zampini @*/ 173441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 174a7e14dcfSSatish Balay { 175a7e14dcfSSatish Balay PetscFunctionBegin; 176441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1777721a36fSStefano Zampini if (IL) *IL = tao->IL; 1787721a36fSStefano Zampini if (IU) *IU = tao->IU; 179a7e14dcfSSatish Balay PetscFunctionReturn(0); 180a7e14dcfSSatish Balay } 181a7e14dcfSSatish Balay 182a7e14dcfSSatish Balay /*@C 183a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 184a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 185a7e14dcfSSatish Balay 186441846f8SBarry Smith Collective on Tao 187a7e14dcfSSatish Balay 188a7e14dcfSSatish Balay Input Parameters: 189441846f8SBarry Smith . tao - the Tao context 190a7e14dcfSSatish Balay 191a7e14dcfSSatish Balay Level: developer 192a7e14dcfSSatish Balay 193*db781477SPatrick Sanan .seealso: `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 194a7e14dcfSSatish Balay @*/ 195a7e14dcfSSatish Balay 196441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 197a7e14dcfSSatish Balay { 198a7e14dcfSSatish Balay PetscFunctionBegin; 199441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 200a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 201064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C,VEC_CLASSID,3); 202a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 203a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 2043c859ba3SBarry Smith PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 2059566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL)); 206441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 2079566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeconstraints)(tao,X,C,tao->user_conP)); 208a7e14dcfSSatish Balay PetscStackPop; 2099566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL)); 210a7e14dcfSSatish Balay tao->nconstraints++; 211a7e14dcfSSatish Balay PetscFunctionReturn(0); 212a7e14dcfSSatish Balay } 213a7e14dcfSSatish Balay 214a7e14dcfSSatish Balay /*@C 215a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 216a7e14dcfSSatish Balay 217441846f8SBarry Smith Logically collective on Tao 218a7e14dcfSSatish Balay 219a7e14dcfSSatish Balay Input Parameters: 220441846f8SBarry Smith + tao - the Tao context 221a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 222a7e14dcfSSatish Balay . func - the bounds computation routine 2236c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 224a7e14dcfSSatish Balay 225a7e14dcfSSatish Balay Calling sequence of func: 226441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 227a7e14dcfSSatish Balay 228441846f8SBarry Smith + tao - the Tao 229a7e14dcfSSatish Balay . x - point to evaluate constraints 230a7e14dcfSSatish Balay . c - vector constraints evaluated at x 231a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 232a7e14dcfSSatish Balay 233a7e14dcfSSatish Balay Level: intermediate 234a7e14dcfSSatish Balay 235*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 236a7e14dcfSSatish Balay 237a7e14dcfSSatish Balay @*/ 238441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 239a7e14dcfSSatish Balay { 240a7e14dcfSSatish Balay PetscFunctionBegin; 241441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2427721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2); 2439566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2449566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2457721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 246a7e14dcfSSatish Balay tao->constraints = c; 247a7e14dcfSSatish Balay tao->user_conP = ctx; 248a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 249a7e14dcfSSatish Balay PetscFunctionReturn(0); 250a7e14dcfSSatish Balay } 251a7e14dcfSSatish Balay 252a7e14dcfSSatish Balay /*@ 253a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 254a7e14dcfSSatish Balay of the variables 255a7e14dcfSSatish Balay 256441846f8SBarry Smith Collective on Tao 257a7e14dcfSSatish Balay 258f899ff85SJose E. Roman Input Parameter: 259441846f8SBarry Smith . tao - the Tao context 260a7e14dcfSSatish Balay 261d8d19677SJose E. Roman Output Parameters: 262a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 263a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 264a7e14dcfSSatish Balay 265a7e14dcfSSatish Balay Level: advanced 266a7e14dcfSSatish Balay 267a7e14dcfSSatish Balay Note: 268a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 269a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 270a7e14dcfSSatish Balay zeros. 271a7e14dcfSSatish Balay 272a7e14dcfSSatish Balay Level: advanced 273a7e14dcfSSatish Balay 274*db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoSetVariableBounds()` 275a7e14dcfSSatish Balay @*/ 276441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 277a7e14dcfSSatish Balay { 278a7e14dcfSSatish Balay PetscFunctionBegin; 279441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 280a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 281064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 282a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 283a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 284a7e14dcfSSatish Balay if (tao->ops->computedual) { 2859566063dSJacob Faibussowitsch PetscCall((*tao->ops->computedual)(tao,DL,DU)); 286a7e14dcfSSatish Balay } else { 2879566063dSJacob Faibussowitsch PetscCall(VecSet(DL,0.0)); 2889566063dSJacob Faibussowitsch PetscCall(VecSet(DU,0.0)); 289a7e14dcfSSatish Balay } 290a7e14dcfSSatish Balay PetscFunctionReturn(0); 291a7e14dcfSSatish Balay } 292a7e14dcfSSatish Balay 293a7e14dcfSSatish Balay /*@ 294a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 295a7e14dcfSSatish Balay 296441846f8SBarry Smith Collective on Tao 297a7e14dcfSSatish Balay 298f899ff85SJose E. Roman Input Parameter: 299441846f8SBarry Smith . tao - the Tao context 300a7e14dcfSSatish Balay 301d8d19677SJose E. Roman Output Parameters: 302a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 303a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 304a7e14dcfSSatish Balay 305a7e14dcfSSatish Balay Level: advanced 306a7e14dcfSSatish Balay 307*db781477SPatrick Sanan .seealso: `TaoComputeDualVariables()` 308a7e14dcfSSatish Balay @*/ 309441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 310a7e14dcfSSatish Balay { 311a7e14dcfSSatish Balay PetscFunctionBegin; 312441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3137721a36fSStefano Zampini if (DE) *DE = tao->DE; 3147721a36fSStefano Zampini if (DI) *DI = tao->DI; 315a7e14dcfSSatish Balay PetscFunctionReturn(0); 316a7e14dcfSSatish Balay } 317a7e14dcfSSatish Balay 318a7e14dcfSSatish Balay /*@C 319a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 320a7e14dcfSSatish Balay 321441846f8SBarry Smith Logically collective on Tao 322a7e14dcfSSatish Balay 323a7e14dcfSSatish Balay Input Parameters: 324441846f8SBarry Smith + tao - the Tao context 325a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 326a7e14dcfSSatish Balay . func - the bounds computation routine 3276c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 328a7e14dcfSSatish Balay 329a7e14dcfSSatish Balay Calling sequence of func: 330441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 331a7e14dcfSSatish Balay 332441846f8SBarry Smith + tao - the Tao 333a7e14dcfSSatish Balay . x - point to evaluate equality constraints 334a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 335a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 336a7e14dcfSSatish Balay 337a7e14dcfSSatish Balay Level: intermediate 338a7e14dcfSSatish Balay 339*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 340a7e14dcfSSatish Balay 341a7e14dcfSSatish Balay @*/ 342441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 343a7e14dcfSSatish Balay { 344a7e14dcfSSatish Balay PetscFunctionBegin; 345441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3467721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 3479566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3489566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3497721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 350a7e14dcfSSatish Balay tao->constraints_equality = ce; 351a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 352a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 353a7e14dcfSSatish Balay PetscFunctionReturn(0); 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 377*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `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 PetscFunctionBegin; 383441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3847721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 3859566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3869566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 387a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3887721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 389a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 390a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 391a7e14dcfSSatish Balay PetscFunctionReturn(0); 392a7e14dcfSSatish Balay } 393a7e14dcfSSatish Balay 394a7e14dcfSSatish Balay /*@C 395a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 396a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 397a7e14dcfSSatish Balay 398441846f8SBarry Smith Collective on Tao 399a7e14dcfSSatish Balay 400a7e14dcfSSatish Balay Input Parameters: 401441846f8SBarry Smith . tao - the Tao context 402a7e14dcfSSatish Balay 403a7e14dcfSSatish Balay Level: developer 404a7e14dcfSSatish Balay 405*db781477SPatrick Sanan .seealso: `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()` 406a7e14dcfSSatish Balay @*/ 407a7e14dcfSSatish Balay 408441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 409a7e14dcfSSatish Balay { 410a7e14dcfSSatish Balay PetscFunctionBegin; 411441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 412a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 413064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 414a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 415a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 4163c859ba3SBarry Smith PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 4179566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL)); 418441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 4199566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP)); 420a7e14dcfSSatish Balay PetscStackPop; 4219566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL)); 422a7e14dcfSSatish Balay tao->nconstraints++; 423a7e14dcfSSatish Balay PetscFunctionReturn(0); 424a7e14dcfSSatish Balay } 425a7e14dcfSSatish Balay 426a7e14dcfSSatish Balay /*@C 427a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 428a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 429a7e14dcfSSatish Balay 430441846f8SBarry Smith Collective on Tao 431a7e14dcfSSatish Balay 432a7e14dcfSSatish Balay Input Parameters: 433441846f8SBarry Smith . tao - the Tao context 434a7e14dcfSSatish Balay 435a7e14dcfSSatish Balay Level: developer 436a7e14dcfSSatish Balay 437*db781477SPatrick Sanan .seealso: `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()` 438a7e14dcfSSatish Balay @*/ 439a7e14dcfSSatish Balay 440441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 441a7e14dcfSSatish Balay { 442a7e14dcfSSatish Balay PetscFunctionBegin; 443441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 444a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 445064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 446a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 447a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 4483c859ba3SBarry Smith PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 4499566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL)); 450441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 4519566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP)); 452a7e14dcfSSatish Balay PetscStackPop; 4539566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL)); 454a7e14dcfSSatish Balay tao->nconstraints++; 455a7e14dcfSSatish Balay PetscFunctionReturn(0); 456a7e14dcfSSatish Balay } 457