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; 36*cd929ea3SAlp 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; 72*cd929ea3SAlp 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) { 111a6d3728eSAlp Dener if (!tao->solution) SETERRQ(PETSC_COMM_SELF,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; 157a7e14dcfSSatish Balay PetscFunctionReturn(0); 158a7e14dcfSSatish Balay } 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); 195a7e14dcfSSatish Balay PetscValidHeaderSpecific(C,VEC_CLASSID,2); 196a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 197a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 198a7e14dcfSSatish Balay 19987f595a5SBarry Smith if (!tao->ops->computeconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 20087f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints"); 201441846f8SBarry Smith 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; 205441846f8SBarry Smith 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); 238a7e14dcfSSatish Balay tao->constraints = c; 239a7e14dcfSSatish Balay tao->user_conP = ctx; 240a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 241a7e14dcfSSatish Balay PetscFunctionReturn(0); 242a7e14dcfSSatish Balay } 243a7e14dcfSSatish Balay 244a7e14dcfSSatish Balay /*@ 245a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 246a7e14dcfSSatish Balay of the variables 247a7e14dcfSSatish Balay 248441846f8SBarry Smith Collective on Tao 249a7e14dcfSSatish Balay 250a7e14dcfSSatish Balay Input Parameters: 251441846f8SBarry Smith . tao - the Tao context 252a7e14dcfSSatish Balay 253a7e14dcfSSatish Balay Output Parameter: 254a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 255a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 256a7e14dcfSSatish Balay 257a7e14dcfSSatish Balay Level: advanced 258a7e14dcfSSatish Balay 259a7e14dcfSSatish Balay Note: 260a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 261a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 262a7e14dcfSSatish Balay zeros. 263a7e14dcfSSatish Balay 264a7e14dcfSSatish Balay Level: advanced 265a7e14dcfSSatish Balay 266a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 267a7e14dcfSSatish Balay @*/ 268441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 269a7e14dcfSSatish Balay { 270a7e14dcfSSatish Balay PetscErrorCode ierr; 271a7e14dcfSSatish Balay PetscFunctionBegin; 272441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 273a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 274a7e14dcfSSatish Balay PetscValidHeaderSpecific(DU,VEC_CLASSID,2); 275a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 276a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 277a7e14dcfSSatish Balay if (tao->ops->computedual) { 278a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr); 279a7e14dcfSSatish Balay } else { 280a7e14dcfSSatish Balay ierr = VecSet(DL,0.0);CHKERRQ(ierr); 281a7e14dcfSSatish Balay ierr = VecSet(DU,0.0);CHKERRQ(ierr); 282a7e14dcfSSatish Balay } 283a7e14dcfSSatish Balay PetscFunctionReturn(0); 284a7e14dcfSSatish Balay } 285a7e14dcfSSatish Balay 286a7e14dcfSSatish Balay /*@ 287a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 288a7e14dcfSSatish Balay 289441846f8SBarry Smith Collective on Tao 290a7e14dcfSSatish Balay 291a7e14dcfSSatish Balay Input Parameters: 292441846f8SBarry Smith . tao - the Tao context 293a7e14dcfSSatish Balay 294a7e14dcfSSatish Balay Output Parameter: 295a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 296a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 297a7e14dcfSSatish Balay 298a7e14dcfSSatish Balay Level: advanced 299a7e14dcfSSatish Balay 300a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 301a7e14dcfSSatish Balay @*/ 302441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 303a7e14dcfSSatish Balay { 304a7e14dcfSSatish Balay PetscFunctionBegin; 305441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 306a7e14dcfSSatish Balay if (DE) { 307a7e14dcfSSatish Balay *DE = tao->DE; 308a7e14dcfSSatish Balay } 309a7e14dcfSSatish Balay if (DI) { 310a7e14dcfSSatish Balay *DI = tao->DI; 311a7e14dcfSSatish Balay } 312a7e14dcfSSatish Balay PetscFunctionReturn(0); 313a7e14dcfSSatish Balay } 314a7e14dcfSSatish Balay 315a7e14dcfSSatish Balay /*@C 316a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 317a7e14dcfSSatish Balay 318441846f8SBarry Smith Logically collective on Tao 319a7e14dcfSSatish Balay 320a7e14dcfSSatish Balay Input Parameters: 321441846f8SBarry Smith + tao - the Tao context 322a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 323a7e14dcfSSatish Balay . func - the bounds computation routine 3246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 325a7e14dcfSSatish Balay 326a7e14dcfSSatish Balay Calling sequence of func: 327441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 328a7e14dcfSSatish Balay 329441846f8SBarry Smith + tao - the Tao 330a7e14dcfSSatish Balay . x - point to evaluate equality constraints 331a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 332a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 333a7e14dcfSSatish Balay 334a7e14dcfSSatish Balay Level: intermediate 335a7e14dcfSSatish Balay 336a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 337a7e14dcfSSatish Balay 338a7e14dcfSSatish Balay @*/ 339441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 340a7e14dcfSSatish Balay { 341a7e14dcfSSatish Balay PetscErrorCode ierr; 342a7e14dcfSSatish Balay 343a7e14dcfSSatish Balay PetscFunctionBegin; 344441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 345a7e14dcfSSatish Balay if (ce) { 346a7e14dcfSSatish Balay PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 347a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ce); 348a7e14dcfSSatish Balay } 349a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr); 350a7e14dcfSSatish Balay 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 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; 394a7e14dcfSSatish Balay 395a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 396a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 397a7e14dcfSSatish Balay PetscFunctionReturn(0); 398a7e14dcfSSatish Balay } 399a7e14dcfSSatish Balay 400a7e14dcfSSatish Balay 401a7e14dcfSSatish Balay /*@C 402a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 403a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 404a7e14dcfSSatish Balay 405441846f8SBarry Smith Collective on Tao 406a7e14dcfSSatish Balay 407a7e14dcfSSatish Balay Input Parameters: 408441846f8SBarry Smith . tao - the Tao context 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay Level: developer 411a7e14dcfSSatish Balay 412a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 413a7e14dcfSSatish Balay @*/ 414a7e14dcfSSatish Balay 415441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 416a7e14dcfSSatish Balay { 417a7e14dcfSSatish Balay PetscErrorCode ierr; 418a7e14dcfSSatish Balay 419a7e14dcfSSatish Balay PetscFunctionBegin; 420441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 421a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 422a7e14dcfSSatish Balay PetscValidHeaderSpecific(CE,VEC_CLASSID,2); 423a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 424a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 425a7e14dcfSSatish Balay 42687f595a5SBarry Smith if (!tao->ops->computeequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 42787f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints"); 428441846f8SBarry Smith ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 429441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 43053506e15SBarry Smith ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr); 431a7e14dcfSSatish Balay PetscStackPop; 432441846f8SBarry Smith ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 433a7e14dcfSSatish Balay tao->nconstraints++; 434a7e14dcfSSatish Balay PetscFunctionReturn(0); 435a7e14dcfSSatish Balay } 436a7e14dcfSSatish Balay 437a7e14dcfSSatish Balay 438a7e14dcfSSatish Balay /*@C 439a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 440a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 441a7e14dcfSSatish Balay 442441846f8SBarry Smith Collective on Tao 443a7e14dcfSSatish Balay 444a7e14dcfSSatish Balay Input Parameters: 445441846f8SBarry Smith . tao - the Tao context 446a7e14dcfSSatish Balay 447a7e14dcfSSatish Balay Level: developer 448a7e14dcfSSatish Balay 449a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality() 450a7e14dcfSSatish Balay @*/ 451a7e14dcfSSatish Balay 452441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 453a7e14dcfSSatish Balay { 454a7e14dcfSSatish Balay PetscErrorCode ierr; 455a7e14dcfSSatish Balay 456a7e14dcfSSatish Balay PetscFunctionBegin; 457441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 458a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 459a7e14dcfSSatish Balay PetscValidHeaderSpecific(CI,VEC_CLASSID,2); 460a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 461a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 462a7e14dcfSSatish Balay 46387f595a5SBarry Smith if (!tao->ops->computeinequalityconstraints) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 46487f595a5SBarry Smith if (!tao->solution) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints"); 465441846f8SBarry Smith ierr = PetscLogEventBegin(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 466441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 46787f595a5SBarry Smith ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr); 468a7e14dcfSSatish Balay PetscStackPop; 469441846f8SBarry Smith ierr = PetscLogEventEnd(Tao_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 470a7e14dcfSSatish Balay tao->nconstraints++; 471a7e14dcfSSatish Balay PetscFunctionReturn(0); 472a7e14dcfSSatish Balay } 473