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 15a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoGetVariableBounds() 16a7e14dcfSSatish Balay @*/ 17441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU) 18a7e14dcfSSatish Balay { 19a7e14dcfSSatish Balay PetscErrorCode ierr; 205ca45b2bSBarry Smith 21a7e14dcfSSatish Balay PetscFunctionBegin; 22441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 237721a36fSStefano Zampini if (XL) PetscValidHeaderSpecific(XL,VEC_CLASSID,2); 247721a36fSStefano Zampini if (XU) PetscValidHeaderSpecific(XU,VEC_CLASSID,3); 257721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)XL);CHKERRQ(ierr); 267721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)XU);CHKERRQ(ierr); 27a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XL);CHKERRQ(ierr); 28a7e14dcfSSatish Balay ierr = VecDestroy(&tao->XU);CHKERRQ(ierr); 29a7e14dcfSSatish Balay tao->XL = XL; 30a7e14dcfSSatish Balay tao->XU = XU; 317721a36fSStefano Zampini tao->bounded = (PetscBool)(XL || XU); 32a7e14dcfSSatish Balay PetscFunctionReturn(0); 33a7e14dcfSSatish Balay } 3445cf516eSBarry Smith 35a7e14dcfSSatish Balay /*@C 36a7e14dcfSSatish Balay TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds 37a7e14dcfSSatish Balay 38441846f8SBarry Smith Logically collective on Tao 39a7e14dcfSSatish Balay 40a7e14dcfSSatish Balay Input Parameters: 41441846f8SBarry Smith + tao - the Tao context 42a7e14dcfSSatish Balay . func - the bounds computation routine 436c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL) 44a7e14dcfSSatish Balay 45a7e14dcfSSatish Balay Calling sequence of func: 46441846f8SBarry Smith $ func (Tao tao, Vec xl, Vec xu); 47a7e14dcfSSatish Balay 48441846f8SBarry Smith + tao - the Tao 49a7e14dcfSSatish Balay . xl - vector of lower bounds 50a7e14dcfSSatish Balay . xu - vector of upper bounds 51a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 52a7e14dcfSSatish Balay 53a7e14dcfSSatish Balay Level: beginner 54a7e14dcfSSatish Balay 55a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetVariableBounds() 56a7e14dcfSSatish Balay 57a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes 58a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds(). 59a7e14dcfSSatish Balay 60a7e14dcfSSatish Balay @*/ 61441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 62a7e14dcfSSatish Balay { 63a7e14dcfSSatish Balay PetscFunctionBegin; 64441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 65a7e14dcfSSatish Balay tao->user_boundsP = ctx; 66a7e14dcfSSatish Balay tao->ops->computebounds = func; 677721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 68a7e14dcfSSatish Balay PetscFunctionReturn(0); 69a7e14dcfSSatish Balay } 70a7e14dcfSSatish Balay 717721a36fSStefano Zampini /*@ 727721a36fSStefano Zampini TaoGetVariableBounds - Gets the upper and lower bounds vectors set with TaoSetVariableBounds 737721a36fSStefano Zampini 747721a36fSStefano Zampini Not collective 757721a36fSStefano Zampini 767721a36fSStefano Zampini Input Parameter: 777721a36fSStefano Zampini . tao - the Tao context 787721a36fSStefano Zampini 797721a36fSStefano Zampini Output Parametrs: 807721a36fSStefano Zampini + XL - vector of lower bounds 817721a36fSStefano Zampini - XU - vector of upper bounds 827721a36fSStefano Zampini 837721a36fSStefano Zampini Level: beginner 847721a36fSStefano Zampini 85a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetVariableBounds() 867721a36fSStefano Zampini @*/ 87441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 88a7e14dcfSSatish Balay { 89a7e14dcfSSatish Balay PetscFunctionBegin; 90441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 917721a36fSStefano Zampini if (XL) *XL = tao->XL; 927721a36fSStefano Zampini if (XU) *XU = tao->XU; 93a7e14dcfSSatish Balay PetscFunctionReturn(0); 94a7e14dcfSSatish Balay } 95a7e14dcfSSatish Balay 96a7e14dcfSSatish Balay /*@C 97a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 98a7e14dcfSSatish Balay routine set by TaoSetVariableBoundsRoutine(). 99a7e14dcfSSatish Balay 100441846f8SBarry Smith Collective on Tao 101a7e14dcfSSatish Balay 1027721a36fSStefano Zampini Input Parameter: 103441846f8SBarry Smith . tao - the Tao context 104a7e14dcfSSatish Balay 105a7e14dcfSSatish Balay Level: developer 106a7e14dcfSSatish Balay 107a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds() 108a7e14dcfSSatish Balay @*/ 109a7e14dcfSSatish Balay 110441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao) 111a7e14dcfSSatish Balay { 112a7e14dcfSSatish Balay PetscErrorCode ierr; 113a7e14dcfSSatish Balay 114a7e14dcfSSatish Balay PetscFunctionBegin; 115441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 11687f595a5SBarry Smith if (!tao->XL || !tao->XU) { 117*3c859ba3SBarry Smith PetscCheck(tao->solution,PetscObjectComm((PetscObject)tao),PETSC_ERR_ORDER,"TaoSetSolution must be called before TaoComputeVariableBounds"); 118a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr); 119e270355aSBarry Smith ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr); 120a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr); 121e270355aSBarry Smith ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr); 122a7e14dcfSSatish Balay } 1232b97c8d8SAlp Dener if (tao->ops->computebounds) { 1247721a36fSStefano Zampini PetscStackPush("Tao compute variable bounds"); 12587f595a5SBarry Smith ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr); 1260cbffdbaSBarry Smith PetscStackPop; 1277721a36fSStefano Zampini } 128a7e14dcfSSatish Balay PetscFunctionReturn(0); 129a7e14dcfSSatish Balay } 130a7e14dcfSSatish Balay 131a7e14dcfSSatish Balay /*@ 132a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 133a7e14dcfSSatish Balay 134441846f8SBarry Smith Logically collective on Tao 135a7e14dcfSSatish Balay 136a7e14dcfSSatish Balay Input Parameters: 137441846f8SBarry Smith + tao - the Tao context 138a7e14dcfSSatish Balay . IL - vector of lower bounds 139a7e14dcfSSatish Balay - IU - vector of upper bounds 140a7e14dcfSSatish Balay 141a7e14dcfSSatish Balay Level: beginner 142a7e14dcfSSatish Balay 143a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoGetInequalityBounds() 144a7e14dcfSSatish Balay @*/ 145441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 146a7e14dcfSSatish Balay { 147a7e14dcfSSatish Balay PetscErrorCode ierr; 1485ca45b2bSBarry Smith 149a7e14dcfSSatish Balay PetscFunctionBegin; 150441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1517721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 1527721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 1537721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)IL);CHKERRQ(ierr); 1547721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)IU);CHKERRQ(ierr); 155a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IL);CHKERRQ(ierr); 156a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IU);CHKERRQ(ierr); 157a7e14dcfSSatish Balay tao->IL = IL; 158a7e14dcfSSatish Balay tao->IU = IU; 1597721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 160a7e14dcfSSatish Balay PetscFunctionReturn(0); 161a7e14dcfSSatish Balay } 162a7e14dcfSSatish Balay 1637721a36fSStefano Zampini /*@ 1647721a36fSStefano Zampini TaoGetInequalityBounds - Gets the upper and lower bounds set via TaoSetInequalityBounds 1657721a36fSStefano Zampini 1667721a36fSStefano Zampini Logically collective on Tao 1677721a36fSStefano Zampini 1687721a36fSStefano Zampini Input Parameter: 169f1a722f8SMatthew G. Knepley . tao - the Tao context 1707721a36fSStefano Zampini 1717721a36fSStefano Zampini Output Parameters: 1727721a36fSStefano Zampini + IL - vector of lower bounds 1737721a36fSStefano Zampini - IU - vector of upper bounds 1747721a36fSStefano Zampini 1757721a36fSStefano Zampini Level: beginner 1767721a36fSStefano Zampini 177a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetInequalityBounds() 1787721a36fSStefano Zampini @*/ 179441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 180a7e14dcfSSatish Balay { 181a7e14dcfSSatish Balay PetscFunctionBegin; 182441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1837721a36fSStefano Zampini if (IL) *IL = tao->IL; 1847721a36fSStefano Zampini if (IU) *IU = tao->IU; 185a7e14dcfSSatish Balay PetscFunctionReturn(0); 186a7e14dcfSSatish Balay } 187a7e14dcfSSatish Balay 188a7e14dcfSSatish Balay /*@C 189a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 190a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 191a7e14dcfSSatish Balay 192441846f8SBarry Smith Collective on Tao 193a7e14dcfSSatish Balay 194a7e14dcfSSatish Balay Input Parameters: 195441846f8SBarry Smith . tao - the Tao context 196a7e14dcfSSatish Balay 197a7e14dcfSSatish Balay Level: developer 198a7e14dcfSSatish Balay 199a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian() 200a7e14dcfSSatish Balay @*/ 201a7e14dcfSSatish Balay 202441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 203a7e14dcfSSatish Balay { 204a7e14dcfSSatish Balay PetscErrorCode ierr; 205a7e14dcfSSatish Balay 206a7e14dcfSSatish Balay PetscFunctionBegin; 207441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 208a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 209064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C,VEC_CLASSID,3); 210a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 211a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 212*3c859ba3SBarry Smith PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 2130ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 214441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 21553506e15SBarry Smith ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr); 216a7e14dcfSSatish Balay PetscStackPop; 2170ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 218a7e14dcfSSatish Balay tao->nconstraints++; 219a7e14dcfSSatish Balay PetscFunctionReturn(0); 220a7e14dcfSSatish Balay } 221a7e14dcfSSatish Balay 222a7e14dcfSSatish Balay /*@C 223a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 224a7e14dcfSSatish Balay 225441846f8SBarry Smith Logically collective on Tao 226a7e14dcfSSatish Balay 227a7e14dcfSSatish Balay Input Parameters: 228441846f8SBarry Smith + tao - the Tao context 229a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 230a7e14dcfSSatish Balay . func - the bounds computation routine 2316c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 232a7e14dcfSSatish Balay 233a7e14dcfSSatish Balay Calling sequence of func: 234441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 235a7e14dcfSSatish Balay 236441846f8SBarry Smith + tao - the Tao 237a7e14dcfSSatish Balay . x - point to evaluate constraints 238a7e14dcfSSatish Balay . c - vector constraints evaluated at x 239a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 240a7e14dcfSSatish Balay 241a7e14dcfSSatish Balay Level: intermediate 242a7e14dcfSSatish Balay 243a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetVariablevBounds() 244a7e14dcfSSatish Balay 245a7e14dcfSSatish Balay @*/ 246441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 247a7e14dcfSSatish Balay { 2487721a36fSStefano Zampini PetscErrorCode ierr; 2497721a36fSStefano Zampini 250a7e14dcfSSatish Balay PetscFunctionBegin; 251441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2527721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2); 2537721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)c);CHKERRQ(ierr); 2547721a36fSStefano Zampini ierr = VecDestroy(&tao->constraints);CHKERRQ(ierr); 2557721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 256a7e14dcfSSatish Balay tao->constraints = c; 257a7e14dcfSSatish Balay tao->user_conP = ctx; 258a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 259a7e14dcfSSatish Balay PetscFunctionReturn(0); 260a7e14dcfSSatish Balay } 261a7e14dcfSSatish Balay 262a7e14dcfSSatish Balay /*@ 263a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 264a7e14dcfSSatish Balay of the variables 265a7e14dcfSSatish Balay 266441846f8SBarry Smith Collective on Tao 267a7e14dcfSSatish Balay 268f899ff85SJose E. Roman Input Parameter: 269441846f8SBarry Smith . tao - the Tao context 270a7e14dcfSSatish Balay 271d8d19677SJose E. Roman Output Parameters: 272a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 273a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 274a7e14dcfSSatish Balay 275a7e14dcfSSatish Balay Level: advanced 276a7e14dcfSSatish Balay 277a7e14dcfSSatish Balay Note: 278a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 279a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 280a7e14dcfSSatish Balay zeros. 281a7e14dcfSSatish Balay 282a7e14dcfSSatish Balay Level: advanced 283a7e14dcfSSatish Balay 284a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 285a7e14dcfSSatish Balay @*/ 286441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 287a7e14dcfSSatish Balay { 288a7e14dcfSSatish Balay PetscErrorCode ierr; 2897721a36fSStefano Zampini 290a7e14dcfSSatish Balay PetscFunctionBegin; 291441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 292a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 293064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 294a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 295a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 296a7e14dcfSSatish Balay if (tao->ops->computedual) { 297a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr); 298a7e14dcfSSatish Balay } else { 299a7e14dcfSSatish Balay ierr = VecSet(DL,0.0);CHKERRQ(ierr); 300a7e14dcfSSatish Balay ierr = VecSet(DU,0.0);CHKERRQ(ierr); 301a7e14dcfSSatish Balay } 302a7e14dcfSSatish Balay PetscFunctionReturn(0); 303a7e14dcfSSatish Balay } 304a7e14dcfSSatish Balay 305a7e14dcfSSatish Balay /*@ 306a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 307a7e14dcfSSatish Balay 308441846f8SBarry Smith Collective on Tao 309a7e14dcfSSatish Balay 310f899ff85SJose E. Roman Input Parameter: 311441846f8SBarry Smith . tao - the Tao context 312a7e14dcfSSatish Balay 313d8d19677SJose E. Roman Output Parameters: 314a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 315a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 316a7e14dcfSSatish Balay 317a7e14dcfSSatish Balay Level: advanced 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 320a7e14dcfSSatish Balay @*/ 321441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 322a7e14dcfSSatish Balay { 323a7e14dcfSSatish Balay PetscFunctionBegin; 324441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3257721a36fSStefano Zampini if (DE) *DE = tao->DE; 3267721a36fSStefano Zampini if (DI) *DI = tao->DI; 327a7e14dcfSSatish Balay PetscFunctionReturn(0); 328a7e14dcfSSatish Balay } 329a7e14dcfSSatish Balay 330a7e14dcfSSatish Balay /*@C 331a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 332a7e14dcfSSatish Balay 333441846f8SBarry Smith Logically collective on Tao 334a7e14dcfSSatish Balay 335a7e14dcfSSatish Balay Input Parameters: 336441846f8SBarry Smith + tao - the Tao context 337a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 338a7e14dcfSSatish Balay . func - the bounds computation routine 3396c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 340a7e14dcfSSatish Balay 341a7e14dcfSSatish Balay Calling sequence of func: 342441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 343a7e14dcfSSatish Balay 344441846f8SBarry Smith + tao - the Tao 345a7e14dcfSSatish Balay . x - point to evaluate equality constraints 346a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 347a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 348a7e14dcfSSatish Balay 349a7e14dcfSSatish Balay Level: intermediate 350a7e14dcfSSatish Balay 351a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetVariableBounds() 352a7e14dcfSSatish Balay 353a7e14dcfSSatish Balay @*/ 354441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 355a7e14dcfSSatish Balay { 356a7e14dcfSSatish Balay PetscErrorCode ierr; 357a7e14dcfSSatish Balay 358a7e14dcfSSatish Balay PetscFunctionBegin; 359441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3607721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 3617721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)ce);CHKERRQ(ierr); 362a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr); 3637721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 364a7e14dcfSSatish Balay tao->constraints_equality = ce; 365a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 366a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 367a7e14dcfSSatish Balay PetscFunctionReturn(0); 368a7e14dcfSSatish Balay } 369a7e14dcfSSatish Balay 370a7e14dcfSSatish Balay /*@C 371a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 372a7e14dcfSSatish Balay 373441846f8SBarry Smith Logically collective on Tao 374a7e14dcfSSatish Balay 375a7e14dcfSSatish Balay Input Parameters: 376441846f8SBarry Smith + tao - the Tao context 377a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 378a7e14dcfSSatish Balay . func - the bounds computation routine 3796c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 380a7e14dcfSSatish Balay 381a7e14dcfSSatish Balay Calling sequence of func: 382441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 383a7e14dcfSSatish Balay 384441846f8SBarry Smith + tao - the Tao 385a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 386a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 387a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 388a7e14dcfSSatish Balay 389a7e14dcfSSatish Balay Level: intermediate 390a7e14dcfSSatish Balay 391a82e8c82SStefano Zampini .seealso: TaoSetObjective(), TaoSetHessian(), TaoSetObjectiveAndGradient(), TaoSetVariableBounds() 392a7e14dcfSSatish Balay 393a7e14dcfSSatish Balay @*/ 394441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 395a7e14dcfSSatish Balay { 396a7e14dcfSSatish Balay PetscErrorCode ierr; 397a7e14dcfSSatish Balay 398a7e14dcfSSatish Balay PetscFunctionBegin; 399441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 4007721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 4017721a36fSStefano Zampini ierr = PetscObjectReference((PetscObject)ci);CHKERRQ(ierr); 402a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr); 403a7e14dcfSSatish Balay tao->constraints_inequality = ci; 4047721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 405a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 406a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 407a7e14dcfSSatish Balay PetscFunctionReturn(0); 408a7e14dcfSSatish Balay } 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay /*@C 411a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 412a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 413a7e14dcfSSatish Balay 414441846f8SBarry Smith Collective on Tao 415a7e14dcfSSatish Balay 416a7e14dcfSSatish Balay Input Parameters: 417441846f8SBarry Smith . tao - the Tao context 418a7e14dcfSSatish Balay 419a7e14dcfSSatish Balay Level: developer 420a7e14dcfSSatish Balay 421a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 422a7e14dcfSSatish Balay @*/ 423a7e14dcfSSatish Balay 424441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 425a7e14dcfSSatish Balay { 426a7e14dcfSSatish Balay PetscErrorCode ierr; 427a7e14dcfSSatish Balay 428a7e14dcfSSatish Balay PetscFunctionBegin; 429441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 430a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 431064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 432a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 433a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 434*3c859ba3SBarry Smith PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 4350ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 436441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 43753506e15SBarry Smith ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr); 438a7e14dcfSSatish Balay PetscStackPop; 4390ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 440a7e14dcfSSatish Balay tao->nconstraints++; 441a7e14dcfSSatish Balay PetscFunctionReturn(0); 442a7e14dcfSSatish Balay } 443a7e14dcfSSatish Balay 444a7e14dcfSSatish Balay /*@C 445a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 446a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 447a7e14dcfSSatish Balay 448441846f8SBarry Smith Collective on Tao 449a7e14dcfSSatish Balay 450a7e14dcfSSatish Balay Input Parameters: 451441846f8SBarry Smith . tao - the Tao context 452a7e14dcfSSatish Balay 453a7e14dcfSSatish Balay Level: developer 454a7e14dcfSSatish Balay 455a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality() 456a7e14dcfSSatish Balay @*/ 457a7e14dcfSSatish Balay 458441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 459a7e14dcfSSatish Balay { 460a7e14dcfSSatish Balay PetscErrorCode ierr; 461a7e14dcfSSatish Balay 462a7e14dcfSSatish Balay PetscFunctionBegin; 463441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 464a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 465064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 466a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 467a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 468*3c859ba3SBarry Smith PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 4690ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 470441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 47187f595a5SBarry Smith ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr); 472a7e14dcfSSatish Balay PetscStackPop; 4730ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 474a7e14dcfSSatish Balay tao->nconstraints++; 475a7e14dcfSSatish Balay PetscFunctionReturn(0); 476a7e14dcfSSatish Balay } 477