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; 157*661095bbSAlp Dener tao->ineq_doublesided = PETSC_TRUE; 158a7e14dcfSSatish Balay PetscFunctionReturn(0); 159a7e14dcfSSatish Balay } 160a7e14dcfSSatish Balay 161a7e14dcfSSatish Balay 162441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 163a7e14dcfSSatish Balay { 164a7e14dcfSSatish Balay PetscFunctionBegin; 165441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 166a7e14dcfSSatish Balay if (IL) { 167a7e14dcfSSatish Balay *IL=tao->IL; 168a7e14dcfSSatish Balay } 169a7e14dcfSSatish Balay if (IU) { 170a7e14dcfSSatish Balay *IU=tao->IU; 171a7e14dcfSSatish Balay } 172a7e14dcfSSatish Balay PetscFunctionReturn(0); 173a7e14dcfSSatish Balay } 174a7e14dcfSSatish Balay 175a7e14dcfSSatish Balay /*@C 176a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 177a7e14dcfSSatish Balay routine set by TaoSetConstraintsRoutine(). 178a7e14dcfSSatish Balay 179441846f8SBarry Smith Collective on Tao 180a7e14dcfSSatish Balay 181a7e14dcfSSatish Balay Input Parameters: 182441846f8SBarry Smith . tao - the Tao context 183a7e14dcfSSatish Balay 184a7e14dcfSSatish Balay Level: developer 185a7e14dcfSSatish Balay 186a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian() 187a7e14dcfSSatish Balay @*/ 188a7e14dcfSSatish Balay 189441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 190a7e14dcfSSatish Balay { 191a7e14dcfSSatish Balay PetscErrorCode ierr; 192a7e14dcfSSatish Balay 193a7e14dcfSSatish Balay PetscFunctionBegin; 194441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 195a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 196a7e14dcfSSatish Balay PetscValidHeaderSpecific(C,VEC_CLASSID,2); 197a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 198a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 199a7e14dcfSSatish Balay 200691b26d3SBarry Smith if (!tao->ops->computeconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 201691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints"); 2020ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 203441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 20453506e15SBarry Smith ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr); 205a7e14dcfSSatish Balay PetscStackPop; 2060ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr); 207a7e14dcfSSatish Balay tao->nconstraints++; 208a7e14dcfSSatish Balay PetscFunctionReturn(0); 209a7e14dcfSSatish Balay } 210a7e14dcfSSatish Balay 211a7e14dcfSSatish Balay /*@C 212a7e14dcfSSatish Balay TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 213a7e14dcfSSatish Balay 214441846f8SBarry Smith Logically collective on Tao 215a7e14dcfSSatish Balay 216a7e14dcfSSatish Balay Input Parameters: 217441846f8SBarry Smith + tao - the Tao context 218a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 219a7e14dcfSSatish Balay . func - the bounds computation routine 2206c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 221a7e14dcfSSatish Balay 222a7e14dcfSSatish Balay Calling sequence of func: 223441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 224a7e14dcfSSatish Balay 225441846f8SBarry Smith + tao - the Tao 226a7e14dcfSSatish Balay . x - point to evaluate constraints 227a7e14dcfSSatish Balay . c - vector constraints evaluated at x 228a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 229a7e14dcfSSatish Balay 230a7e14dcfSSatish Balay Level: intermediate 231a7e14dcfSSatish Balay 232a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds() 233a7e14dcfSSatish Balay 234a7e14dcfSSatish Balay @*/ 235441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 236a7e14dcfSSatish Balay { 237a7e14dcfSSatish Balay PetscFunctionBegin; 238441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2396246e8cdSAlp Dener tao->constrained = PETSC_TRUE; 240a7e14dcfSSatish Balay tao->constraints = c; 241a7e14dcfSSatish Balay tao->user_conP = ctx; 242a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 243a7e14dcfSSatish Balay PetscFunctionReturn(0); 244a7e14dcfSSatish Balay } 245a7e14dcfSSatish Balay 246a7e14dcfSSatish Balay /*@ 247a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 248a7e14dcfSSatish Balay of the variables 249a7e14dcfSSatish Balay 250441846f8SBarry Smith Collective on Tao 251a7e14dcfSSatish Balay 252a7e14dcfSSatish Balay Input Parameters: 253441846f8SBarry Smith . tao - the Tao context 254a7e14dcfSSatish Balay 255a7e14dcfSSatish Balay Output Parameter: 256a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 257a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 258a7e14dcfSSatish Balay 259a7e14dcfSSatish Balay Level: advanced 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay Note: 262a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 263a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 264a7e14dcfSSatish Balay zeros. 265a7e14dcfSSatish Balay 266a7e14dcfSSatish Balay Level: advanced 267a7e14dcfSSatish Balay 268a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds() 269a7e14dcfSSatish Balay @*/ 270441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 271a7e14dcfSSatish Balay { 272a7e14dcfSSatish Balay PetscErrorCode ierr; 273a7e14dcfSSatish Balay PetscFunctionBegin; 274441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 275a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 276a7e14dcfSSatish Balay PetscValidHeaderSpecific(DU,VEC_CLASSID,2); 277a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 278a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 279a7e14dcfSSatish Balay if (tao->ops->computedual) { 280a7e14dcfSSatish Balay ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr); 281a7e14dcfSSatish Balay } else { 282a7e14dcfSSatish Balay ierr = VecSet(DL,0.0);CHKERRQ(ierr); 283a7e14dcfSSatish Balay ierr = VecSet(DU,0.0);CHKERRQ(ierr); 284a7e14dcfSSatish Balay } 285a7e14dcfSSatish Balay PetscFunctionReturn(0); 286a7e14dcfSSatish Balay } 287a7e14dcfSSatish Balay 288a7e14dcfSSatish Balay /*@ 289a7e14dcfSSatish Balay TaoGetDualVariables - Gets pointers to the dual vectors 290a7e14dcfSSatish Balay 291441846f8SBarry Smith Collective on Tao 292a7e14dcfSSatish Balay 293a7e14dcfSSatish Balay Input Parameters: 294441846f8SBarry Smith . tao - the Tao context 295a7e14dcfSSatish Balay 296a7e14dcfSSatish Balay Output Parameter: 297a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 298a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 299a7e14dcfSSatish Balay 300a7e14dcfSSatish Balay Level: advanced 301a7e14dcfSSatish Balay 302a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables() 303a7e14dcfSSatish Balay @*/ 304441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 305a7e14dcfSSatish Balay { 306a7e14dcfSSatish Balay PetscFunctionBegin; 307441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 308a7e14dcfSSatish Balay if (DE) { 309a7e14dcfSSatish Balay *DE = tao->DE; 310a7e14dcfSSatish Balay } 311a7e14dcfSSatish Balay if (DI) { 312a7e14dcfSSatish Balay *DI = tao->DI; 313a7e14dcfSSatish Balay } 314a7e14dcfSSatish Balay PetscFunctionReturn(0); 315a7e14dcfSSatish Balay } 316a7e14dcfSSatish Balay 317a7e14dcfSSatish Balay /*@C 318a7e14dcfSSatish Balay TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 319a7e14dcfSSatish Balay 320441846f8SBarry Smith Logically collective on Tao 321a7e14dcfSSatish Balay 322a7e14dcfSSatish Balay Input Parameters: 323441846f8SBarry Smith + tao - the Tao context 324a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 325a7e14dcfSSatish Balay . func - the bounds computation routine 3266c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 327a7e14dcfSSatish Balay 328a7e14dcfSSatish Balay Calling sequence of func: 329441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 330a7e14dcfSSatish Balay 331441846f8SBarry Smith + tao - the Tao 332a7e14dcfSSatish Balay . x - point to evaluate equality constraints 333a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 334a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 335a7e14dcfSSatish Balay 336a7e14dcfSSatish Balay Level: intermediate 337a7e14dcfSSatish Balay 338a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 339a7e14dcfSSatish Balay 340a7e14dcfSSatish Balay @*/ 341441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 342a7e14dcfSSatish Balay { 343a7e14dcfSSatish Balay PetscErrorCode ierr; 344a7e14dcfSSatish Balay 345a7e14dcfSSatish Balay PetscFunctionBegin; 346441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 347a7e14dcfSSatish Balay if (ce) { 348a7e14dcfSSatish Balay PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 349a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ce); 350a7e14dcfSSatish Balay } 351a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr); 352*661095bbSAlp Dener tao->eq_constrained = PETSC_TRUE; 353a7e14dcfSSatish Balay tao->constraints_equality = ce; 354a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 355a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 356a7e14dcfSSatish Balay PetscFunctionReturn(0); 357a7e14dcfSSatish Balay } 358a7e14dcfSSatish Balay 359a7e14dcfSSatish Balay 360a7e14dcfSSatish Balay /*@C 361a7e14dcfSSatish Balay TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. TAO only handles constraints under certain conditions, see manual for details 362a7e14dcfSSatish Balay 363441846f8SBarry Smith Logically collective on Tao 364a7e14dcfSSatish Balay 365a7e14dcfSSatish Balay Input Parameters: 366441846f8SBarry Smith + tao - the Tao context 367a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 368a7e14dcfSSatish Balay . func - the bounds computation routine 3696c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 370a7e14dcfSSatish Balay 371a7e14dcfSSatish Balay Calling sequence of func: 372441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 373a7e14dcfSSatish Balay 374441846f8SBarry Smith + tao - the Tao 375a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 376a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 377a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 378a7e14dcfSSatish Balay 379a7e14dcfSSatish Balay Level: intermediate 380a7e14dcfSSatish Balay 381a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds() 382a7e14dcfSSatish Balay 383a7e14dcfSSatish Balay @*/ 384441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 385a7e14dcfSSatish Balay { 386a7e14dcfSSatish Balay PetscErrorCode ierr; 387a7e14dcfSSatish Balay 388a7e14dcfSSatish Balay PetscFunctionBegin; 389441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 390a7e14dcfSSatish Balay if (ci) { 391a7e14dcfSSatish Balay PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 392a7e14dcfSSatish Balay PetscObjectReference((PetscObject)ci); 393a7e14dcfSSatish Balay } 394a7e14dcfSSatish Balay ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr); 395a7e14dcfSSatish Balay tao->constraints_inequality = ci; 396*661095bbSAlp Dener tao->ineq_constrained = PETSC_TRUE; 397a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 398a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 399a7e14dcfSSatish Balay PetscFunctionReturn(0); 400a7e14dcfSSatish Balay } 401a7e14dcfSSatish Balay 402a7e14dcfSSatish Balay 403a7e14dcfSSatish Balay /*@C 404a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 405a7e14dcfSSatish Balay routine set by TaoSetEqualityConstraintsRoutine(). 406a7e14dcfSSatish Balay 407441846f8SBarry Smith Collective on Tao 408a7e14dcfSSatish Balay 409a7e14dcfSSatish Balay Input Parameters: 410441846f8SBarry Smith . tao - the Tao context 411a7e14dcfSSatish Balay 412a7e14dcfSSatish Balay Level: developer 413a7e14dcfSSatish Balay 414a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality() 415a7e14dcfSSatish Balay @*/ 416a7e14dcfSSatish Balay 417441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 418a7e14dcfSSatish Balay { 419a7e14dcfSSatish Balay PetscErrorCode ierr; 420a7e14dcfSSatish Balay 421a7e14dcfSSatish Balay PetscFunctionBegin; 422441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 423a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 424a7e14dcfSSatish Balay PetscValidHeaderSpecific(CE,VEC_CLASSID,2); 425a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 426a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 427a7e14dcfSSatish Balay 428691b26d3SBarry Smith if (!tao->ops->computeequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 429691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints"); 4300ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 431441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 43253506e15SBarry Smith ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr); 433a7e14dcfSSatish Balay PetscStackPop; 4340ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr); 435a7e14dcfSSatish Balay tao->nconstraints++; 436a7e14dcfSSatish Balay PetscFunctionReturn(0); 437a7e14dcfSSatish Balay } 438a7e14dcfSSatish Balay 439a7e14dcfSSatish Balay 440a7e14dcfSSatish Balay /*@C 441a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 442a7e14dcfSSatish Balay routine set by TaoSetInequalityConstraintsRoutine(). 443a7e14dcfSSatish Balay 444441846f8SBarry Smith Collective on Tao 445a7e14dcfSSatish Balay 446a7e14dcfSSatish Balay Input Parameters: 447441846f8SBarry Smith . tao - the Tao context 448a7e14dcfSSatish Balay 449a7e14dcfSSatish Balay Level: developer 450a7e14dcfSSatish Balay 451a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality() 452a7e14dcfSSatish Balay @*/ 453a7e14dcfSSatish Balay 454441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 455a7e14dcfSSatish Balay { 456a7e14dcfSSatish Balay PetscErrorCode ierr; 457a7e14dcfSSatish Balay 458a7e14dcfSSatish Balay PetscFunctionBegin; 459441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 460a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 461a7e14dcfSSatish Balay PetscValidHeaderSpecific(CI,VEC_CLASSID,2); 462a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 463a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 464a7e14dcfSSatish Balay 465691b26d3SBarry Smith if (!tao->ops->computeinequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 466691b26d3SBarry Smith if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints"); 4670ebee16dSLisandro Dalcin ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 468441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 46987f595a5SBarry Smith ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr); 470a7e14dcfSSatish Balay PetscStackPop; 4710ebee16dSLisandro Dalcin ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr); 472a7e14dcfSSatish Balay tao->nconstraints++; 473a7e14dcfSSatish Balay PetscFunctionReturn(0); 474a7e14dcfSSatish Balay } 475