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; 36cd929ea3SAlp Dener tao->bounded = PETSC_TRUE; 37a7e14dcfSSatish Balay PetscFunctionReturn(0); 38a7e14dcfSSatish Balay } 3945cf516eSBarry Smith 40a7e14dcfSSatish Balay /*@C 41a7e14dcfSSatish Balay TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds 42a7e14dcfSSatish Balay 43441846f8SBarry Smith Logically collective on Tao 44a7e14dcfSSatish Balay 45a7e14dcfSSatish Balay Input Parameters: 46441846f8SBarry Smith + tao - the Tao context 47a7e14dcfSSatish Balay . func - the bounds computation routine 486c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL) 49a7e14dcfSSatish Balay 50a7e14dcfSSatish Balay Calling sequence of func: 51441846f8SBarry Smith $ func (Tao tao, Vec xl, Vec xu); 52a7e14dcfSSatish Balay 53441846f8SBarry Smith + tao - the Tao 54a7e14dcfSSatish Balay . xl - vector of lower bounds 55a7e14dcfSSatish Balay . xu - vector of upper bounds 56a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 57a7e14dcfSSatish Balay 58a7e14dcfSSatish Balay Level: beginner 59a7e14dcfSSatish Balay 60a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 61a7e14dcfSSatish Balay 62a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes 63a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds(). 64a7e14dcfSSatish Balay 65a7e14dcfSSatish Balay @*/ 66441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 67a7e14dcfSSatish Balay { 68a7e14dcfSSatish Balay PetscFunctionBegin; 69441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 70a7e14dcfSSatish Balay tao->user_boundsP = ctx; 71a7e14dcfSSatish Balay tao->ops->computebounds = func; 72cd929ea3SAlp Dener tao->bounded = PETSC_TRUE; 73a7e14dcfSSatish Balay PetscFunctionReturn(0); 74a7e14dcfSSatish Balay } 75a7e14dcfSSatish Balay 76441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 77a7e14dcfSSatish Balay { 78a7e14dcfSSatish Balay PetscFunctionBegin; 79441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 80a7e14dcfSSatish Balay if (XL) { 81a7e14dcfSSatish Balay *XL=tao->XL; 82a7e14dcfSSatish Balay } 83a7e14dcfSSatish Balay if (XU) { 84a7e14dcfSSatish Balay *XU=tao->XU; 85a7e14dcfSSatish Balay } 86a7e14dcfSSatish Balay PetscFunctionReturn(0); 87a7e14dcfSSatish Balay } 88a7e14dcfSSatish Balay 89a7e14dcfSSatish Balay /*@C 90a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 91a7e14dcfSSatish Balay routine set by TaoSetVariableBoundsRoutine(). 92a7e14dcfSSatish Balay 93441846f8SBarry Smith Collective on Tao 94a7e14dcfSSatish Balay 95a7e14dcfSSatish Balay Input Parameters: 96441846f8SBarry Smith . tao - the Tao context 97a7e14dcfSSatish Balay 98a7e14dcfSSatish Balay Level: developer 99a7e14dcfSSatish Balay 100a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds() 101a7e14dcfSSatish Balay @*/ 102a7e14dcfSSatish Balay 103441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao) 104a7e14dcfSSatish Balay { 105a7e14dcfSSatish Balay PetscErrorCode ierr; 106a7e14dcfSSatish Balay 107a7e14dcfSSatish Balay PetscFunctionBegin; 108441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1092b97c8d8SAlp Dener PetscStackPush("Tao compute variable bounds"); 11087f595a5SBarry Smith if (!tao->XL || !tao->XU) { 111691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ORDER,"TaoSetInitialVector must be called before TaoComputeVariableBounds"); 112a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr); 113e270355aSBarry Smith ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr); 114a7e14dcfSSatish Balay ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr); 115e270355aSBarry Smith ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr); 116a7e14dcfSSatish Balay } 1172b97c8d8SAlp Dener if (tao->ops->computebounds) { 11887f595a5SBarry Smith ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr); 1192b97c8d8SAlp Dener } 1200cbffdbaSBarry Smith PetscStackPop; 121a7e14dcfSSatish Balay PetscFunctionReturn(0); 122a7e14dcfSSatish Balay } 123a7e14dcfSSatish Balay 124a7e14dcfSSatish Balay /*@ 125a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 126a7e14dcfSSatish Balay 127441846f8SBarry Smith Logically collective on Tao 128a7e14dcfSSatish Balay 129a7e14dcfSSatish Balay Input Parameters: 130441846f8SBarry Smith + tao - the Tao context 131a7e14dcfSSatish Balay . IL - vector of lower bounds 132a7e14dcfSSatish Balay - IU - vector of upper bounds 133a7e14dcfSSatish Balay 134a7e14dcfSSatish Balay Level: beginner 135a7e14dcfSSatish Balay 136a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine() 137a7e14dcfSSatish Balay @*/ 138a7e14dcfSSatish Balay 139441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 140a7e14dcfSSatish Balay { 141a7e14dcfSSatish Balay PetscErrorCode ierr; 1425ca45b2bSBarry Smith 143a7e14dcfSSatish Balay PetscFunctionBegin; 144441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 145a7e14dcfSSatish Balay if (IL) { 146a7e14dcfSSatish Balay PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 147a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IL); 148a7e14dcfSSatish Balay } 149a7e14dcfSSatish Balay if (IU) { 150a7e14dcfSSatish Balay PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 151a7e14dcfSSatish Balay PetscObjectReference((PetscObject)IU); 152a7e14dcfSSatish Balay } 153a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IL);CHKERRQ(ierr); 154a7e14dcfSSatish Balay ierr = VecDestroy(&tao->IU);CHKERRQ(ierr); 155a7e14dcfSSatish Balay tao->IL = IL; 156a7e14dcfSSatish Balay tao->IU = IU; 157661095bbSAlp Dener tao->ineq_doublesided = PETSC_TRUE; 158a7e14dcfSSatish Balay PetscFunctionReturn(0); 159a7e14dcfSSatish Balay } 160a7e14dcfSSatish Balay 161441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 162a7e14dcfSSatish Balay { 163a7e14dcfSSatish Balay PetscFunctionBegin; 164441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 165a7e14dcfSSatish Balay if (IL) { 166a7e14dcfSSatish Balay *IL=tao->IL; 167a7e14dcfSSatish Balay } 168a7e14dcfSSatish Balay if (IU) { 169a7e14dcfSSatish Balay *IU=tao->IU; 170a7e14dcfSSatish Balay } 171a7e14dcfSSatish Balay PetscFunctionReturn(0); 172a7e14dcfSSatish Balay } 173a7e14dcfSSatish Balay 174a7e14dcfSSatish Balay /*@C 175a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 176a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 177a7e14dcfSSatish Balay 178441846f8SBarry Smith Collective on Tao 179a7e14dcfSSatish Balay 180a7e14dcfSSatish Balay Input Parameters: 181441846f8SBarry Smith . tao - the Tao context 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay Level: developer 184a7e14dcfSSatish Balay 185a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian() 186a7e14dcfSSatish Balay @*/ 187a7e14dcfSSatish Balay 188441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 189a7e14dcfSSatish Balay { 190a7e14dcfSSatish Balay PetscErrorCode ierr; 191a7e14dcfSSatish Balay 192a7e14dcfSSatish Balay PetscFunctionBegin; 193441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 194a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 195064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C,VEC_CLASSID,3); 196a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 197a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 198a7e14dcfSSatish Balay 199691b26d3SBarry Smith if (!tao->ops->computeconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 200691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints"); 2010ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 202441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 20353506e15SBarry Smith ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr); 204a7e14dcfSSatish Balay PetscStackPop; 2050ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 206a7e14dcfSSatish Balay tao->nconstraints++; 207a7e14dcfSSatish Balay PetscFunctionReturn(0); 208a7e14dcfSSatish Balay } 209a7e14dcfSSatish Balay 210a7e14dcfSSatish Balay /*@C 211a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 212a7e14dcfSSatish Balay 213441846f8SBarry Smith Logically collective on Tao 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay Input Parameters: 216441846f8SBarry Smith + tao - the Tao context 217a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 218a7e14dcfSSatish Balay . func - the bounds computation routine 2196c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 220a7e14dcfSSatish Balay 221a7e14dcfSSatish Balay Calling sequence of func: 222441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 223a7e14dcfSSatish Balay 224441846f8SBarry Smith + tao - the Tao 225a7e14dcfSSatish Balay . x - point to evaluate constraints 226a7e14dcfSSatish Balay . c - vector constraints evaluated at x 227a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 228a7e14dcfSSatish Balay 229a7e14dcfSSatish Balay Level: intermediate 230a7e14dcfSSatish Balay 231a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds() 232a7e14dcfSSatish Balay 233a7e14dcfSSatish Balay @*/ 234441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 235a7e14dcfSSatish Balay { 236a7e14dcfSSatish Balay PetscFunctionBegin; 237441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2386246e8cdSAlp Dener tao->constrained = PETSC_TRUE; 239a7e14dcfSSatish Balay tao->constraints = c; 240a7e14dcfSSatish Balay tao->user_conP = ctx; 241a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 242a7e14dcfSSatish Balay PetscFunctionReturn(0); 243a7e14dcfSSatish Balay } 244a7e14dcfSSatish Balay 245a7e14dcfSSatish Balay /*@ 246a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 247a7e14dcfSSatish Balay of the variables 248a7e14dcfSSatish Balay 249441846f8SBarry Smith Collective on Tao 250a7e14dcfSSatish Balay 251a7e14dcfSSatish Balay Input Parameters: 252441846f8SBarry Smith . tao - the Tao context 253a7e14dcfSSatish Balay 254*d8d19677SJose E. Roman Output Parameters: 255a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 256a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 257a7e14dcfSSatish Balay 258a7e14dcfSSatish Balay Level: advanced 259a7e14dcfSSatish Balay 260a7e14dcfSSatish Balay Note: 261a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 262a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 263a7e14dcfSSatish Balay zeros. 264a7e14dcfSSatish Balay 265a7e14dcfSSatish Balay Level: advanced 266a7e14dcfSSatish Balay 267a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 268a7e14dcfSSatish Balay @*/ 269441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 270a7e14dcfSSatish Balay { 271a7e14dcfSSatish Balay PetscErrorCode ierr; 272a7e14dcfSSatish Balay PetscFunctionBegin; 273441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 274a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 275064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 276a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 277a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 278a7e14dcfSSatish Balay if (tao->ops->computedual) { 279a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr); 280a7e14dcfSSatish Balay } else { 281a7e14dcfSSatish Balay ierr = VecSet(DL,0.0);CHKERRQ(ierr); 282a7e14dcfSSatish Balay ierr = VecSet(DU,0.0);CHKERRQ(ierr); 283a7e14dcfSSatish Balay } 284a7e14dcfSSatish Balay PetscFunctionReturn(0); 285a7e14dcfSSatish Balay } 286a7e14dcfSSatish Balay 287a7e14dcfSSatish Balay /*@ 288a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 289a7e14dcfSSatish Balay 290441846f8SBarry Smith Collective on Tao 291a7e14dcfSSatish Balay 292a7e14dcfSSatish Balay Input Parameters: 293441846f8SBarry Smith . tao - the Tao context 294a7e14dcfSSatish Balay 295*d8d19677SJose E. Roman Output Parameters: 296a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 297a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 298a7e14dcfSSatish Balay 299a7e14dcfSSatish Balay Level: advanced 300a7e14dcfSSatish Balay 301a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 302a7e14dcfSSatish Balay @*/ 303441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 304a7e14dcfSSatish Balay { 305a7e14dcfSSatish Balay PetscFunctionBegin; 306441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 307a7e14dcfSSatish Balay if (DE) { 308a7e14dcfSSatish Balay *DE = tao->DE; 309a7e14dcfSSatish Balay } 310a7e14dcfSSatish Balay if (DI) { 311a7e14dcfSSatish Balay *DI = tao->DI; 312a7e14dcfSSatish Balay } 313a7e14dcfSSatish Balay PetscFunctionReturn(0); 314a7e14dcfSSatish Balay } 315a7e14dcfSSatish Balay 316a7e14dcfSSatish Balay /*@C 317a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 318a7e14dcfSSatish Balay 319441846f8SBarry Smith Logically collective on Tao 320a7e14dcfSSatish Balay 321a7e14dcfSSatish Balay Input Parameters: 322441846f8SBarry Smith + tao - the Tao context 323a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 324a7e14dcfSSatish Balay . func - the bounds computation routine 3256c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 326a7e14dcfSSatish Balay 327a7e14dcfSSatish Balay Calling sequence of func: 328441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 329a7e14dcfSSatish Balay 330441846f8SBarry Smith + tao - the Tao 331a7e14dcfSSatish Balay . x - point to evaluate equality constraints 332a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 333a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 334a7e14dcfSSatish Balay 335a7e14dcfSSatish Balay Level: intermediate 336a7e14dcfSSatish Balay 337a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 338a7e14dcfSSatish Balay 339a7e14dcfSSatish Balay @*/ 340441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 341a7e14dcfSSatish Balay { 342a7e14dcfSSatish Balay PetscErrorCode ierr; 343a7e14dcfSSatish Balay 344a7e14dcfSSatish Balay PetscFunctionBegin; 345441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 346a7e14dcfSSatish Balay if (ce) { 347a7e14dcfSSatish Balay PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 348a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ce); 349a7e14dcfSSatish Balay } 350a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr); 351661095bbSAlp Dener tao->eq_constrained = PETSC_TRUE; 352a7e14dcfSSatish Balay tao->constraints_equality = ce; 353a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 354a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 355a7e14dcfSSatish Balay PetscFunctionReturn(0); 356a7e14dcfSSatish Balay } 357a7e14dcfSSatish Balay 358a7e14dcfSSatish Balay /*@C 359a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 360a7e14dcfSSatish Balay 361441846f8SBarry Smith Logically collective on Tao 362a7e14dcfSSatish Balay 363a7e14dcfSSatish Balay Input Parameters: 364441846f8SBarry Smith + tao - the Tao context 365a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 366a7e14dcfSSatish Balay . func - the bounds computation routine 3676c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 368a7e14dcfSSatish Balay 369a7e14dcfSSatish Balay Calling sequence of func: 370441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 371a7e14dcfSSatish Balay 372441846f8SBarry Smith + tao - the Tao 373a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 374a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 375a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 376a7e14dcfSSatish Balay 377a7e14dcfSSatish Balay Level: intermediate 378a7e14dcfSSatish Balay 379a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 380a7e14dcfSSatish Balay 381a7e14dcfSSatish Balay @*/ 382441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 383a7e14dcfSSatish Balay { 384a7e14dcfSSatish Balay PetscErrorCode ierr; 385a7e14dcfSSatish Balay 386a7e14dcfSSatish Balay PetscFunctionBegin; 387441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 388a7e14dcfSSatish Balay if (ci) { 389a7e14dcfSSatish Balay PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 390a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ci); 391a7e14dcfSSatish Balay } 392a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr); 393a7e14dcfSSatish Balay tao->constraints_inequality = ci; 394661095bbSAlp Dener tao->ineq_constrained = PETSC_TRUE; 395a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 396a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 397a7e14dcfSSatish Balay PetscFunctionReturn(0); 398a7e14dcfSSatish Balay } 399a7e14dcfSSatish Balay 400a7e14dcfSSatish Balay /*@C 401a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 402a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 403a7e14dcfSSatish Balay 404441846f8SBarry Smith Collective on Tao 405a7e14dcfSSatish Balay 406a7e14dcfSSatish Balay Input Parameters: 407441846f8SBarry Smith . tao - the Tao context 408a7e14dcfSSatish Balay 409a7e14dcfSSatish Balay Level: developer 410a7e14dcfSSatish Balay 411a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 412a7e14dcfSSatish Balay @*/ 413a7e14dcfSSatish Balay 414441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 415a7e14dcfSSatish Balay { 416a7e14dcfSSatish Balay PetscErrorCode ierr; 417a7e14dcfSSatish Balay 418a7e14dcfSSatish Balay PetscFunctionBegin; 419441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 420a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 421064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 422a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 423a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 424a7e14dcfSSatish Balay 425691b26d3SBarry Smith if (!tao->ops->computeequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 426691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints"); 4270ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 428441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 42953506e15SBarry Smith ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr); 430a7e14dcfSSatish Balay PetscStackPop; 4310ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 432a7e14dcfSSatish Balay tao->nconstraints++; 433a7e14dcfSSatish Balay PetscFunctionReturn(0); 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); 457064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 458a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 459a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 460a7e14dcfSSatish Balay 461691b26d3SBarry Smith if (!tao->ops->computeinequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 462691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints"); 4630ebee16dSLisandro Dalcin 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; 4670ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 468a7e14dcfSSatish Balay tao->nconstraints++; 469a7e14dcfSSatish Balay PetscFunctionReturn(0); 470a7e14dcfSSatish Balay } 471