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 15db781477SPatrick 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 53db781477SPatrick 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 83db781477SPatrick 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 105db781477SPatrick 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); 112*76be6f4fSStefano Zampini if (tao->ops->computebounds) { 113*76be6f4fSStefano Zampini if (!tao->XL) { 1149566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1159566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 116*76be6f4fSStefano Zampini } 117*76be6f4fSStefano Zampini if (!tao->XU) { 1189566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1199566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 120a7e14dcfSSatish Balay } 1217721a36fSStefano Zampini PetscStackPush("Tao compute variable bounds"); 1229566063dSJacob Faibussowitsch PetscCall((*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP)); 1230cbffdbaSBarry Smith PetscStackPop; 1247721a36fSStefano Zampini } 125a7e14dcfSSatish Balay PetscFunctionReturn(0); 126a7e14dcfSSatish Balay } 127a7e14dcfSSatish Balay 128a7e14dcfSSatish Balay /*@ 129a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 130a7e14dcfSSatish Balay 131441846f8SBarry Smith Logically collective on Tao 132a7e14dcfSSatish Balay 133a7e14dcfSSatish Balay Input Parameters: 134441846f8SBarry Smith + tao - the Tao context 135a7e14dcfSSatish Balay . IL - vector of lower bounds 136a7e14dcfSSatish Balay - IU - vector of upper bounds 137a7e14dcfSSatish Balay 138a7e14dcfSSatish Balay Level: beginner 139a7e14dcfSSatish Balay 140db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 141a7e14dcfSSatish Balay @*/ 142441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 143a7e14dcfSSatish Balay { 144a7e14dcfSSatish Balay PetscFunctionBegin; 145441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1467721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 1477721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 1489566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1499566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1519566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 152a7e14dcfSSatish Balay tao->IL = IL; 153a7e14dcfSSatish Balay tao->IU = IU; 1547721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 155a7e14dcfSSatish Balay PetscFunctionReturn(0); 156a7e14dcfSSatish Balay } 157a7e14dcfSSatish Balay 1587721a36fSStefano Zampini /*@ 1597721a36fSStefano Zampini TaoGetInequalityBounds - Gets the upper and lower bounds set via TaoSetInequalityBounds 1607721a36fSStefano Zampini 1617721a36fSStefano Zampini Logically collective on Tao 1627721a36fSStefano Zampini 1637721a36fSStefano Zampini Input Parameter: 164f1a722f8SMatthew G. Knepley . tao - the Tao context 1657721a36fSStefano Zampini 1667721a36fSStefano Zampini Output Parameters: 1677721a36fSStefano Zampini + IL - vector of lower bounds 1687721a36fSStefano Zampini - IU - vector of upper bounds 1697721a36fSStefano Zampini 1707721a36fSStefano Zampini Level: beginner 1717721a36fSStefano Zampini 172db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1737721a36fSStefano Zampini @*/ 174441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 175a7e14dcfSSatish Balay { 176a7e14dcfSSatish Balay PetscFunctionBegin; 177441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1787721a36fSStefano Zampini if (IL) *IL = tao->IL; 1797721a36fSStefano Zampini if (IU) *IU = tao->IU; 180a7e14dcfSSatish Balay PetscFunctionReturn(0); 181a7e14dcfSSatish Balay } 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay /*@C 184a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 185a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 186a7e14dcfSSatish Balay 187441846f8SBarry Smith Collective on Tao 188a7e14dcfSSatish Balay 189a7e14dcfSSatish Balay Input Parameters: 190441846f8SBarry Smith . tao - the Tao context 191a7e14dcfSSatish Balay 192a7e14dcfSSatish Balay Level: developer 193a7e14dcfSSatish Balay 194db781477SPatrick Sanan .seealso: `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 195a7e14dcfSSatish Balay @*/ 196a7e14dcfSSatish Balay 197441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 198a7e14dcfSSatish Balay { 199a7e14dcfSSatish Balay PetscFunctionBegin; 200441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 201a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 202064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C,VEC_CLASSID,3); 203a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 204a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 2053c859ba3SBarry Smith PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 2069566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL)); 207441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 2089566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeconstraints)(tao,X,C,tao->user_conP)); 209a7e14dcfSSatish Balay PetscStackPop; 2109566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL)); 211a7e14dcfSSatish Balay tao->nconstraints++; 212a7e14dcfSSatish Balay PetscFunctionReturn(0); 213a7e14dcfSSatish Balay } 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay /*@C 216a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 217a7e14dcfSSatish Balay 218441846f8SBarry Smith Logically collective on Tao 219a7e14dcfSSatish Balay 220a7e14dcfSSatish Balay Input Parameters: 221441846f8SBarry Smith + tao - the Tao context 222a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 223a7e14dcfSSatish Balay . func - the bounds computation routine 2246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay Calling sequence of func: 227441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 228a7e14dcfSSatish Balay 229441846f8SBarry Smith + tao - the Tao 230a7e14dcfSSatish Balay . x - point to evaluate constraints 231a7e14dcfSSatish Balay . c - vector constraints evaluated at x 232a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 233a7e14dcfSSatish Balay 234a7e14dcfSSatish Balay Level: intermediate 235a7e14dcfSSatish Balay 236db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 237a7e14dcfSSatish Balay 238a7e14dcfSSatish Balay @*/ 239441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 240a7e14dcfSSatish Balay { 241a7e14dcfSSatish Balay PetscFunctionBegin; 242441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2437721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2); 2449566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2467721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 247a7e14dcfSSatish Balay tao->constraints = c; 248a7e14dcfSSatish Balay tao->user_conP = ctx; 249a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 250a7e14dcfSSatish Balay PetscFunctionReturn(0); 251a7e14dcfSSatish Balay } 252a7e14dcfSSatish Balay 253a7e14dcfSSatish Balay /*@ 254a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 255a7e14dcfSSatish Balay of the variables 256a7e14dcfSSatish Balay 257441846f8SBarry Smith Collective on Tao 258a7e14dcfSSatish Balay 259f899ff85SJose E. Roman Input Parameter: 260441846f8SBarry Smith . tao - the Tao context 261a7e14dcfSSatish Balay 262d8d19677SJose E. Roman Output Parameters: 263a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 264a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 265a7e14dcfSSatish Balay 266a7e14dcfSSatish Balay Level: advanced 267a7e14dcfSSatish Balay 268a7e14dcfSSatish Balay Note: 269a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 270a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 271a7e14dcfSSatish Balay zeros. 272a7e14dcfSSatish Balay 273a7e14dcfSSatish Balay Level: advanced 274a7e14dcfSSatish Balay 275db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoSetVariableBounds()` 276a7e14dcfSSatish Balay @*/ 277441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 278a7e14dcfSSatish Balay { 279a7e14dcfSSatish Balay PetscFunctionBegin; 280441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 281a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 282064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 283a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 284a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 285a7e14dcfSSatish Balay if (tao->ops->computedual) { 2869566063dSJacob Faibussowitsch PetscCall((*tao->ops->computedual)(tao,DL,DU)); 287a7e14dcfSSatish Balay } else { 2889566063dSJacob Faibussowitsch PetscCall(VecSet(DL,0.0)); 2899566063dSJacob Faibussowitsch PetscCall(VecSet(DU,0.0)); 290a7e14dcfSSatish Balay } 291a7e14dcfSSatish Balay PetscFunctionReturn(0); 292a7e14dcfSSatish Balay } 293a7e14dcfSSatish Balay 294a7e14dcfSSatish Balay /*@ 295a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 296a7e14dcfSSatish Balay 297441846f8SBarry Smith Collective on Tao 298a7e14dcfSSatish Balay 299f899ff85SJose E. Roman Input Parameter: 300441846f8SBarry Smith . tao - the Tao context 301a7e14dcfSSatish Balay 302d8d19677SJose E. Roman Output Parameters: 303a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 304a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 305a7e14dcfSSatish Balay 306a7e14dcfSSatish Balay Level: advanced 307a7e14dcfSSatish Balay 308db781477SPatrick Sanan .seealso: `TaoComputeDualVariables()` 309a7e14dcfSSatish Balay @*/ 310441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 311a7e14dcfSSatish Balay { 312a7e14dcfSSatish Balay PetscFunctionBegin; 313441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3147721a36fSStefano Zampini if (DE) *DE = tao->DE; 3157721a36fSStefano Zampini if (DI) *DI = tao->DI; 316a7e14dcfSSatish Balay PetscFunctionReturn(0); 317a7e14dcfSSatish Balay } 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay /*@C 320a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 321a7e14dcfSSatish Balay 322441846f8SBarry Smith Logically collective on Tao 323a7e14dcfSSatish Balay 324a7e14dcfSSatish Balay Input Parameters: 325441846f8SBarry Smith + tao - the Tao context 326a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 327a7e14dcfSSatish Balay . func - the bounds computation routine 3286c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 329a7e14dcfSSatish Balay 330a7e14dcfSSatish Balay Calling sequence of func: 331441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 332a7e14dcfSSatish Balay 333441846f8SBarry Smith + tao - the Tao 334a7e14dcfSSatish Balay . x - point to evaluate equality constraints 335a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 336a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 337a7e14dcfSSatish Balay 338a7e14dcfSSatish Balay Level: intermediate 339a7e14dcfSSatish Balay 340db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 341a7e14dcfSSatish Balay 342a7e14dcfSSatish Balay @*/ 343441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 344a7e14dcfSSatish Balay { 345a7e14dcfSSatish Balay PetscFunctionBegin; 346441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3477721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 3489566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3499566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3507721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 351a7e14dcfSSatish Balay tao->constraints_equality = ce; 352a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 353a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 354a7e14dcfSSatish Balay PetscFunctionReturn(0); 355a7e14dcfSSatish Balay } 356a7e14dcfSSatish Balay 357a7e14dcfSSatish Balay /*@C 358a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 359a7e14dcfSSatish Balay 360441846f8SBarry Smith Logically collective on Tao 361a7e14dcfSSatish Balay 362a7e14dcfSSatish Balay Input Parameters: 363441846f8SBarry Smith + tao - the Tao context 364a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 365a7e14dcfSSatish Balay . func - the bounds computation routine 3666c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 367a7e14dcfSSatish Balay 368a7e14dcfSSatish Balay Calling sequence of func: 369441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 370a7e14dcfSSatish Balay 371441846f8SBarry Smith + tao - the Tao 372a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 373a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 374a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 375a7e14dcfSSatish Balay 376a7e14dcfSSatish Balay Level: intermediate 377a7e14dcfSSatish Balay 378db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 379a7e14dcfSSatish Balay 380a7e14dcfSSatish Balay @*/ 381441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 382a7e14dcfSSatish Balay { 383a7e14dcfSSatish Balay PetscFunctionBegin; 384441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3857721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 3869566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3879566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 388a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3897721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 390a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 391a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 392a7e14dcfSSatish Balay PetscFunctionReturn(0); 393a7e14dcfSSatish Balay } 394a7e14dcfSSatish Balay 395a7e14dcfSSatish Balay /*@C 396a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 397a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 398a7e14dcfSSatish Balay 399441846f8SBarry Smith Collective on Tao 400a7e14dcfSSatish Balay 401a7e14dcfSSatish Balay Input Parameters: 402441846f8SBarry Smith . tao - the Tao context 403a7e14dcfSSatish Balay 404a7e14dcfSSatish Balay Level: developer 405a7e14dcfSSatish Balay 406db781477SPatrick Sanan .seealso: `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()` 407a7e14dcfSSatish Balay @*/ 408a7e14dcfSSatish Balay 409441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 410a7e14dcfSSatish Balay { 411a7e14dcfSSatish Balay PetscFunctionBegin; 412441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 413a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 414064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 415a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 416a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 4173c859ba3SBarry Smith PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 4189566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL)); 419441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 4209566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP)); 421a7e14dcfSSatish Balay PetscStackPop; 4229566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL)); 423a7e14dcfSSatish Balay tao->nconstraints++; 424a7e14dcfSSatish Balay PetscFunctionReturn(0); 425a7e14dcfSSatish Balay } 426a7e14dcfSSatish Balay 427a7e14dcfSSatish Balay /*@C 428a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 429a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 430a7e14dcfSSatish Balay 431441846f8SBarry Smith Collective on Tao 432a7e14dcfSSatish Balay 433a7e14dcfSSatish Balay Input Parameters: 434441846f8SBarry Smith . tao - the Tao context 435a7e14dcfSSatish Balay 436a7e14dcfSSatish Balay Level: developer 437a7e14dcfSSatish Balay 438db781477SPatrick Sanan .seealso: `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()` 439a7e14dcfSSatish Balay @*/ 440a7e14dcfSSatish Balay 441441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 442a7e14dcfSSatish Balay { 443a7e14dcfSSatish Balay PetscFunctionBegin; 444441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 445a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 446064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 447a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 448a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 4493c859ba3SBarry Smith PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 4509566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL)); 451441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 4529566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP)); 453a7e14dcfSSatish Balay PetscStackPop; 4549566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL)); 455a7e14dcfSSatish Balay tao->nconstraints++; 456a7e14dcfSSatish Balay PetscFunctionReturn(0); 457a7e14dcfSSatish Balay } 458