1*a7e14dcfSSatish Balay #define TAOSOLVER_DLL 2*a7e14dcfSSatish Balay 3*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/ 4*a7e14dcfSSatish Balay 5*a7e14dcfSSatish Balay PetscBool TaoSolverRegisterAllCalled = PETSC_FALSE; 6*a7e14dcfSSatish Balay PetscFunctionList TaoSolverList = PETSC_NULL; 7*a7e14dcfSSatish Balay 8*a7e14dcfSSatish Balay PetscClassId TAOSOLVER_CLASSID; 9*a7e14dcfSSatish Balay PetscLogEvent TaoSolver_Solve, TaoSolver_ObjectiveEval, TaoSolver_GradientEval, TaoSolver_ObjGradientEval, TaoSolver_HessianEval, TaoSolver_ConstraintsEval, TaoSolver_JacobianEval; 10*a7e14dcfSSatish Balay 11*a7e14dcfSSatish Balay 12*a7e14dcfSSatish Balay 13*a7e14dcfSSatish Balay static const char *TAO_SUBSET[64] = { 14*a7e14dcfSSatish Balay "subvec","mask","matrixfree" 15*a7e14dcfSSatish Balay }; 16*a7e14dcfSSatish Balay 17*a7e14dcfSSatish Balay #undef __FUNCT__ 18*a7e14dcfSSatish Balay #define __FUNCT__ "TaoCreate" 19*a7e14dcfSSatish Balay /*@ 20*a7e14dcfSSatish Balay TaoCreate - Creates a TAO solver 21*a7e14dcfSSatish Balay 22*a7e14dcfSSatish Balay Collective on MPI_Comm 23*a7e14dcfSSatish Balay 24*a7e14dcfSSatish Balay Input Parameter: 25*a7e14dcfSSatish Balay . comm - MPI communicator 26*a7e14dcfSSatish Balay 27*a7e14dcfSSatish Balay Output Parameter: 28*a7e14dcfSSatish Balay . newtao - the new TaoSolver context 29*a7e14dcfSSatish Balay 30*a7e14dcfSSatish Balay Available methods include: 31*a7e14dcfSSatish Balay + tao_nls - Newton's method with line search for unconstrained minimization 32*a7e14dcfSSatish Balay . tao_ntr - Newton's method with trust region for unconstrained minimization 33*a7e14dcfSSatish Balay . tao_ntl - Newton's method with trust region, line search for unconstrained minimization 34*a7e14dcfSSatish Balay . tao_lmvm - Limited memory variable metric method for unconstrained minimization 35*a7e14dcfSSatish Balay . tao_cg - Nonlinear conjugate gradient method for unconstrained minimization 36*a7e14dcfSSatish Balay . tao_nm - Nelder-Mead algorithm for derivate-free unconstrained minimization 37*a7e14dcfSSatish Balay ation 38*a7e14dcfSSatish Balay . tao_tron - Newton Trust Region method for bound constrained minimization 39*a7e14dcfSSatish Balay . tao_gpcg - Newton Trust Region method for quadratic bound constrained minimization 40*a7e14dcfSSatish Balay . tao_blmvm - Limited memory variable metric method for bound constrained minimization 41*a7e14dcfSSatish Balay . tao_lcl - Linearly constrained Lagrangian method for pde-constrained minimization 42*a7e14dcfSSatish Balay - tao_pounders - Model-based algorithm for nonlinear least squares 43*a7e14dcfSSatish Balay 44*a7e14dcfSSatish Balay Options Database Keys: 45*a7e14dcfSSatish Balay + -tao_method - select which method TAO should use 46*a7e14dcfSSatish Balay - -tao_type - identical to -tao_method 47*a7e14dcfSSatish Balay 48*a7e14dcfSSatish Balay Level: beginner 49*a7e14dcfSSatish Balay 50*a7e14dcfSSatish Balay .seealso: TaoSolve(), TaoDestroy() 51*a7e14dcfSSatish Balay @*/ 52*a7e14dcfSSatish Balay PetscErrorCode TaoCreate(MPI_Comm comm, TaoSolver *newtao) 53*a7e14dcfSSatish Balay { 54*a7e14dcfSSatish Balay PetscErrorCode ierr; 55*a7e14dcfSSatish Balay TaoSolver tao; 56*a7e14dcfSSatish Balay 57*a7e14dcfSSatish Balay PetscFunctionBegin; 58*a7e14dcfSSatish Balay PetscValidPointer(newtao,2); 59*a7e14dcfSSatish Balay *newtao = PETSC_NULL; 60*a7e14dcfSSatish Balay 61*a7e14dcfSSatish Balay ierr = TaoInitializePackage(); CHKERRQ(ierr); 62*a7e14dcfSSatish Balay ierr = TaoLineSearchInitializePackage(); CHKERRQ(ierr); 63*a7e14dcfSSatish Balay 64*a7e14dcfSSatish Balay ierr = PetscHeaderCreate(tao,_p_TaoSolver, struct _TaoSolverOps, TAOSOLVER_CLASSID,"TaoSolver",0,0,comm,TaoDestroy,TaoView); CHKERRQ(ierr); 65*a7e14dcfSSatish Balay 66*a7e14dcfSSatish Balay tao->ops->computeobjective=0; 67*a7e14dcfSSatish Balay tao->ops->computeobjectiveandgradient=0; 68*a7e14dcfSSatish Balay tao->ops->computegradient=0; 69*a7e14dcfSSatish Balay tao->ops->computehessian=0; 70*a7e14dcfSSatish Balay tao->ops->computeseparableobjective=0; 71*a7e14dcfSSatish Balay tao->ops->computeconstraints=0; 72*a7e14dcfSSatish Balay tao->ops->computejacobian=0; 73*a7e14dcfSSatish Balay tao->ops->computejacobianequality=0; 74*a7e14dcfSSatish Balay tao->ops->computejacobianinequality=0; 75*a7e14dcfSSatish Balay tao->ops->computeequalityconstraints=0; 76*a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints=0; 77*a7e14dcfSSatish Balay tao->ops->convergencetest=TaoDefaultConvergenceTest; 78*a7e14dcfSSatish Balay tao->ops->convergencedestroy=0; 79*a7e14dcfSSatish Balay tao->ops->computedual=0; 80*a7e14dcfSSatish Balay tao->ops->setup=0; 81*a7e14dcfSSatish Balay tao->ops->solve=0; 82*a7e14dcfSSatish Balay tao->ops->view=0; 83*a7e14dcfSSatish Balay tao->ops->setfromoptions=0; 84*a7e14dcfSSatish Balay tao->ops->destroy=0; 85*a7e14dcfSSatish Balay 86*a7e14dcfSSatish Balay tao->solution=PETSC_NULL; 87*a7e14dcfSSatish Balay tao->gradient=PETSC_NULL; 88*a7e14dcfSSatish Balay tao->sep_objective = PETSC_NULL; 89*a7e14dcfSSatish Balay tao->constraints=PETSC_NULL; 90*a7e14dcfSSatish Balay tao->constraints_equality=PETSC_NULL; 91*a7e14dcfSSatish Balay tao->constraints_inequality=PETSC_NULL; 92*a7e14dcfSSatish Balay tao->stepdirection=PETSC_NULL; 93*a7e14dcfSSatish Balay tao->XL = PETSC_NULL; 94*a7e14dcfSSatish Balay tao->XU = PETSC_NULL; 95*a7e14dcfSSatish Balay tao->IL = PETSC_NULL; 96*a7e14dcfSSatish Balay tao->IU = PETSC_NULL; 97*a7e14dcfSSatish Balay tao->DI = PETSC_NULL; 98*a7e14dcfSSatish Balay tao->DE = PETSC_NULL; 99*a7e14dcfSSatish Balay tao->hessian = PETSC_NULL; 100*a7e14dcfSSatish Balay tao->hessian_pre = PETSC_NULL; 101*a7e14dcfSSatish Balay tao->jacobian = PETSC_NULL; 102*a7e14dcfSSatish Balay tao->jacobian_pre = PETSC_NULL; 103*a7e14dcfSSatish Balay tao->jacobian_state = PETSC_NULL; 104*a7e14dcfSSatish Balay tao->jacobian_state_pre = PETSC_NULL; 105*a7e14dcfSSatish Balay tao->jacobian_state_inv = PETSC_NULL; 106*a7e14dcfSSatish Balay tao->jacobian_design = PETSC_NULL; 107*a7e14dcfSSatish Balay tao->jacobian_design_pre = PETSC_NULL; 108*a7e14dcfSSatish Balay tao->jacobian_equality = PETSC_NULL; 109*a7e14dcfSSatish Balay tao->jacobian_equality_pre = PETSC_NULL; 110*a7e14dcfSSatish Balay tao->jacobian_inequality = PETSC_NULL; 111*a7e14dcfSSatish Balay tao->jacobian_inequality_pre = PETSC_NULL; 112*a7e14dcfSSatish Balay tao->state_is = PETSC_NULL; 113*a7e14dcfSSatish Balay tao->design_is = PETSC_NULL; 114*a7e14dcfSSatish Balay 115*a7e14dcfSSatish Balay tao->max_it = 10000; 116*a7e14dcfSSatish Balay tao->max_funcs = 10000; 117*a7e14dcfSSatish Balay tao->fatol = 1e-8; 118*a7e14dcfSSatish Balay tao->frtol = 1e-8; 119*a7e14dcfSSatish Balay tao->gatol = 1e-8; 120*a7e14dcfSSatish Balay tao->grtol = 1e-8; 121*a7e14dcfSSatish Balay tao->gttol = 0.0; 122*a7e14dcfSSatish Balay tao->catol = 0.0; 123*a7e14dcfSSatish Balay tao->crtol = 0.0; 124*a7e14dcfSSatish Balay tao->xtol = 0.0; 125*a7e14dcfSSatish Balay tao->steptol = 0.0; 126*a7e14dcfSSatish Balay tao->trust0 = TAO_INFINITY; 127*a7e14dcfSSatish Balay tao->fmin = -1e100; 128*a7e14dcfSSatish Balay tao->hist_reset = PETSC_TRUE; 129*a7e14dcfSSatish Balay tao->hist_max = 0; 130*a7e14dcfSSatish Balay tao->hist_len = 0; 131*a7e14dcfSSatish Balay tao->hist_obj = PETSC_NULL; 132*a7e14dcfSSatish Balay tao->hist_resid = PETSC_NULL; 133*a7e14dcfSSatish Balay tao->hist_cnorm = PETSC_NULL; 134*a7e14dcfSSatish Balay 135*a7e14dcfSSatish Balay tao->numbermonitors=0; 136*a7e14dcfSSatish Balay tao->viewsolution=PETSC_FALSE; 137*a7e14dcfSSatish Balay tao->viewhessian=PETSC_FALSE; 138*a7e14dcfSSatish Balay tao->viewgradient=PETSC_FALSE; 139*a7e14dcfSSatish Balay tao->viewjacobian=PETSC_FALSE; 140*a7e14dcfSSatish Balay tao->viewconstraints = PETSC_FALSE; 141*a7e14dcfSSatish Balay tao->viewtao = PETSC_FALSE; 142*a7e14dcfSSatish Balay 143*a7e14dcfSSatish Balay ierr = TaoResetStatistics(tao); CHKERRQ(ierr); 144*a7e14dcfSSatish Balay 145*a7e14dcfSSatish Balay 146*a7e14dcfSSatish Balay *newtao = tao; 147*a7e14dcfSSatish Balay PetscFunctionReturn(0); 148*a7e14dcfSSatish Balay } 149*a7e14dcfSSatish Balay 150*a7e14dcfSSatish Balay 151*a7e14dcfSSatish Balay #undef __FUNCT__ 152*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolve" 153*a7e14dcfSSatish Balay /*@ 154*a7e14dcfSSatish Balay TaoSolve - Solves an optimization problem min F(x) s.t. l <= x <= u 155*a7e14dcfSSatish Balay 156*a7e14dcfSSatish Balay Collective on TaoSolver 157*a7e14dcfSSatish Balay 158*a7e14dcfSSatish Balay Input Parameters: 159*a7e14dcfSSatish Balay . tao - the TaoSolver context 160*a7e14dcfSSatish Balay 161*a7e14dcfSSatish Balay Notes: 162*a7e14dcfSSatish Balay The user must set up the TaoSolver with calls to TaoSetInitialVector(), 163*a7e14dcfSSatish Balay TaoSetObjectiveRoutine(), 164*a7e14dcfSSatish Balay TaoSetGradientRoutine(), and (if using 2nd order method) TaoSetHessianRoutine(). 165*a7e14dcfSSatish Balay 166*a7e14dcfSSatish Balay Level: beginner 167*a7e14dcfSSatish Balay 168*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSetObjectiveRoutine(), TaoSetGradientRoutine(), TaoSetHessianRoutine() 169*a7e14dcfSSatish Balay @*/ 170*a7e14dcfSSatish Balay PetscErrorCode TaoSolve(TaoSolver tao) 171*a7e14dcfSSatish Balay { 172*a7e14dcfSSatish Balay PetscErrorCode ierr; 173*a7e14dcfSSatish Balay char filename[PETSC_MAX_PATH_LEN]; 174*a7e14dcfSSatish Balay PetscBool flg; 175*a7e14dcfSSatish Balay PetscViewer viewer; 176*a7e14dcfSSatish Balay PetscFunctionBegin; 177*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 178*a7e14dcfSSatish Balay 179*a7e14dcfSSatish Balay ierr = TaoSetUp(tao);CHKERRQ(ierr); 180*a7e14dcfSSatish Balay ierr = TaoResetStatistics(tao); CHKERRQ(ierr); 181*a7e14dcfSSatish Balay if (tao->linesearch) { 182*a7e14dcfSSatish Balay ierr = TaoLineSearchReset(tao->linesearch); CHKERRQ(ierr); 183*a7e14dcfSSatish Balay } 184*a7e14dcfSSatish Balay 185*a7e14dcfSSatish Balay ierr = PetscLogEventBegin(TaoSolver_Solve,tao,0,0,0); CHKERRQ(ierr); 186*a7e14dcfSSatish Balay if (tao->ops->solve){ ierr = (*tao->ops->solve)(tao);CHKERRQ(ierr); } 187*a7e14dcfSSatish Balay ierr = PetscLogEventEnd(TaoSolver_Solve,tao,0,0,0); CHKERRQ(ierr); 188*a7e14dcfSSatish Balay 189*a7e14dcfSSatish Balay 190*a7e14dcfSSatish Balay 191*a7e14dcfSSatish Balay ierr = PetscOptionsGetString(((PetscObject)tao)->prefix,"-tao_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 192*a7e14dcfSSatish Balay if (flg && !PetscPreLoadingOn) { 193*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(((PetscObject)tao)->comm,filename,&viewer);CHKERRQ(ierr); 194*a7e14dcfSSatish Balay ierr = TaoView(tao,viewer);CHKERRQ(ierr); 195*a7e14dcfSSatish Balay ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 196*a7e14dcfSSatish Balay } 197*a7e14dcfSSatish Balay 198*a7e14dcfSSatish Balay 199*a7e14dcfSSatish Balay if (tao->printreason) { 200*a7e14dcfSSatish Balay if (tao->reason > 0) { 201*a7e14dcfSSatish Balay ierr = PetscPrintf(((PetscObject)tao)->comm,"TAO solve converged due to %s\n",TaoSolverTerminationReasons[tao->reason]); CHKERRQ(ierr); 202*a7e14dcfSSatish Balay } else { 203*a7e14dcfSSatish Balay ierr = PetscPrintf(((PetscObject)tao)->comm,"TAO solve did not converge due to %s\n",TaoSolverTerminationReasons[tao->reason]); CHKERRQ(ierr); 204*a7e14dcfSSatish Balay } 205*a7e14dcfSSatish Balay } 206*a7e14dcfSSatish Balay 207*a7e14dcfSSatish Balay 208*a7e14dcfSSatish Balay PetscFunctionReturn(0); 209*a7e14dcfSSatish Balay 210*a7e14dcfSSatish Balay 211*a7e14dcfSSatish Balay } 212*a7e14dcfSSatish Balay 213*a7e14dcfSSatish Balay 214*a7e14dcfSSatish Balay #undef __FUNCT__ 215*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetUp" 216*a7e14dcfSSatish Balay /*@ 217*a7e14dcfSSatish Balay TaoSetUp - Sets up the internal data structures for the later use 218*a7e14dcfSSatish Balay of a Tao solver 219*a7e14dcfSSatish Balay 220*a7e14dcfSSatish Balay Collective on tao 221*a7e14dcfSSatish Balay 222*a7e14dcfSSatish Balay Input Parameters: 223*a7e14dcfSSatish Balay . tao - the TAO context 224*a7e14dcfSSatish Balay 225*a7e14dcfSSatish Balay Notes: 226*a7e14dcfSSatish Balay The user will not need to explicitly call TaoSetUp(), as it will 227*a7e14dcfSSatish Balay automatically be called in TaoSolve(). However, if the user 228*a7e14dcfSSatish Balay desires to call it explicitly, it should come after TaoCreate() 229*a7e14dcfSSatish Balay and any TaoSetSomething() routines, but before TaoSolve(). 230*a7e14dcfSSatish Balay 231*a7e14dcfSSatish Balay Level: advanced 232*a7e14dcfSSatish Balay 233*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve() 234*a7e14dcfSSatish Balay @*/ 235*a7e14dcfSSatish Balay PetscErrorCode TaoSetUp(TaoSolver tao) 236*a7e14dcfSSatish Balay { 237*a7e14dcfSSatish Balay PetscErrorCode ierr; 238*a7e14dcfSSatish Balay PetscFunctionBegin; 239*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao, TAOSOLVER_CLASSID,1); 240*a7e14dcfSSatish Balay if (tao->setupcalled) PetscFunctionReturn(0); 241*a7e14dcfSSatish Balay 242*a7e14dcfSSatish Balay if (!tao->solution) { 243*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Must call TaoSetInitialVector"); 244*a7e14dcfSSatish Balay } 245*a7e14dcfSSatish Balay if (tao->ops->setup) { 246*a7e14dcfSSatish Balay ierr = (*tao->ops->setup)(tao); CHKERRQ(ierr); 247*a7e14dcfSSatish Balay } 248*a7e14dcfSSatish Balay 249*a7e14dcfSSatish Balay tao->setupcalled = PETSC_TRUE; 250*a7e14dcfSSatish Balay PetscFunctionReturn(0); 251*a7e14dcfSSatish Balay } 252*a7e14dcfSSatish Balay 253*a7e14dcfSSatish Balay #undef __FUNCT__ 254*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDestroy" 255*a7e14dcfSSatish Balay /*@ 256*a7e14dcfSSatish Balay TaoDestroy - Destroys the TAO context that was created with 257*a7e14dcfSSatish Balay TaoCreate() 258*a7e14dcfSSatish Balay 259*a7e14dcfSSatish Balay Collective on TaoSolver 260*a7e14dcfSSatish Balay 261*a7e14dcfSSatish Balay Input Parameter: 262*a7e14dcfSSatish Balay . tao - the TaoSolver context 263*a7e14dcfSSatish Balay 264*a7e14dcfSSatish Balay Level: beginner 265*a7e14dcfSSatish Balay 266*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve() 267*a7e14dcfSSatish Balay @*/ 268*a7e14dcfSSatish Balay PetscErrorCode TaoDestroy(TaoSolver *tao) 269*a7e14dcfSSatish Balay { 270*a7e14dcfSSatish Balay PetscErrorCode ierr; 271*a7e14dcfSSatish Balay PetscFunctionBegin; 272*a7e14dcfSSatish Balay if (!*tao) PetscFunctionReturn(0); 273*a7e14dcfSSatish Balay PetscValidHeaderSpecific(*tao,TAOSOLVER_CLASSID,1); 274*a7e14dcfSSatish Balay 275*a7e14dcfSSatish Balay if (--((PetscObject)*tao)->refct > 0) {*tao=0;PetscFunctionReturn(0);} 276*a7e14dcfSSatish Balay 277*a7e14dcfSSatish Balay 278*a7e14dcfSSatish Balay if ((*tao)->ops->destroy) { 279*a7e14dcfSSatish Balay ierr = (*((*tao))->ops->destroy)(*tao); CHKERRQ(ierr); 280*a7e14dcfSSatish Balay } 281*a7e14dcfSSatish Balay ierr = KSPDestroy(&(*tao)->ksp); CHKERRQ(ierr); 282*a7e14dcfSSatish Balay ierr = TaoLineSearchDestroy(&(*tao)->linesearch); CHKERRQ(ierr); 283*a7e14dcfSSatish Balay 284*a7e14dcfSSatish Balay if ((*tao)->ops->convergencedestroy) { 285*a7e14dcfSSatish Balay ierr = (*(*tao)->ops->convergencedestroy)((*tao)->cnvP); CHKERRQ(ierr); 286*a7e14dcfSSatish Balay if ((*tao)->jacobian_state_inv) { 287*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_state_inv); CHKERRQ(ierr); 288*a7e14dcfSSatish Balay (*tao)->jacobian_state_inv = PETSC_NULL; 289*a7e14dcfSSatish Balay } 290*a7e14dcfSSatish Balay } 291*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->solution); CHKERRQ(ierr); 292*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->gradient); CHKERRQ(ierr); 293*a7e14dcfSSatish Balay 294*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->XL); CHKERRQ(ierr); 295*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->XU); CHKERRQ(ierr); 296*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->IL); CHKERRQ(ierr); 297*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->IU); CHKERRQ(ierr); 298*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->DE); CHKERRQ(ierr); 299*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->DI); CHKERRQ(ierr); 300*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->constraints_equality); CHKERRQ(ierr); 301*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->constraints_inequality); CHKERRQ(ierr); 302*a7e14dcfSSatish Balay ierr = VecDestroy(&(*tao)->stepdirection); CHKERRQ(ierr); 303*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->hessian_pre); CHKERRQ(ierr); 304*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->hessian); CHKERRQ(ierr); 305*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_pre); CHKERRQ(ierr); 306*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian); CHKERRQ(ierr); 307*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_state_pre); CHKERRQ(ierr); 308*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_state); CHKERRQ(ierr); 309*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_state_inv); CHKERRQ(ierr); 310*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_design_pre); CHKERRQ(ierr); 311*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_equality); CHKERRQ(ierr); 312*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_equality_pre); CHKERRQ(ierr); 313*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_inequality); CHKERRQ(ierr); 314*a7e14dcfSSatish Balay ierr = MatDestroy(&(*tao)->jacobian_inequality_pre); CHKERRQ(ierr); 315*a7e14dcfSSatish Balay ierr = ISDestroy(&(*tao)->state_is); CHKERRQ(ierr); 316*a7e14dcfSSatish Balay ierr = ISDestroy(&(*tao)->design_is); CHKERRQ(ierr); 317*a7e14dcfSSatish Balay ierr = TaoCancelMonitors(*tao); CHKERRQ(ierr); 318*a7e14dcfSSatish Balay ierr = PetscHeaderDestroy(tao); CHKERRQ(ierr); 319*a7e14dcfSSatish Balay PetscFunctionReturn(0); 320*a7e14dcfSSatish Balay } 321*a7e14dcfSSatish Balay 322*a7e14dcfSSatish Balay #undef __FUNCT__ 323*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFromOptions" 324*a7e14dcfSSatish Balay /*@ 325*a7e14dcfSSatish Balay TaoSetFromOptions - Sets various TaoSolver parameters from user 326*a7e14dcfSSatish Balay options. 327*a7e14dcfSSatish Balay 328*a7e14dcfSSatish Balay Collective on TaoSolver 329*a7e14dcfSSatish Balay 330*a7e14dcfSSatish Balay Input Paremeter: 331*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 332*a7e14dcfSSatish Balay 333*a7e14dcfSSatish Balay options Database Keys: 334*a7e14dcfSSatish Balay + -tao_method <type> - The algorithm that TAO uses (tao_lmvm, tao_nls, etc.) 335*a7e14dcfSSatish Balay . -tao_fatol <fatol> - absolute error tolerance in function value 336*a7e14dcfSSatish Balay . -tao_frtol <frtol> - relative error tolerance in function value 337*a7e14dcfSSatish Balay . -tao_gatol <gatol> - absolute error tolerance for ||gradient|| 338*a7e14dcfSSatish Balay . -tao_grtol <grtol> - relative error tolerance for ||gradient|| 339*a7e14dcfSSatish Balay . -tao_gttol <gttol> - reduction of ||gradient|| relative to initial gradient 340*a7e14dcfSSatish Balay . -tao_max_it <max> - sets maximum number of iterations 341*a7e14dcfSSatish Balay . -tao_max_funcs <max> - sets maximum number of function evaluations 342*a7e14dcfSSatish Balay . -tao_fmin <fmin> - stop if function value reaches fmin 343*a7e14dcfSSatish Balay . -tao_steptol <tol> - stop if trust region radius less than <tol> 344*a7e14dcfSSatish Balay . -tao_trust0 <t> - initial trust region radius 345*a7e14dcfSSatish Balay . -tao_monitor - prints function value and residual at each iteration 346*a7e14dcfSSatish Balay . -tao_smonitor - same as tao_monitor, but truncates very small values 347*a7e14dcfSSatish Balay . -tao_cmonitor - prints function value, residual, and constraint norm at each iteration 348*a7e14dcfSSatish Balay . -tao_view_solution - prints solution vector at each iteration 349*a7e14dcfSSatish Balay . -tao_view_separableobjective - prints separable objective vector at each iteration 350*a7e14dcfSSatish Balay . -tao_view_step - prints step direction vector at each iteration 351*a7e14dcfSSatish Balay . -tao_view_gradient - prints gradient vector at each iteration 352*a7e14dcfSSatish Balay . -tao_draw_solution - graphically view solution vector at each iteration 353*a7e14dcfSSatish Balay . -tao_draw_step - graphically view step vector at each iteration 354*a7e14dcfSSatish Balay . -tao_draw_gradient - graphically view gradient at each iteration 355*a7e14dcfSSatish Balay . -tao_fd_gradient - use gradient computed with finite differences 356*a7e14dcfSSatish Balay . -tao_cancelmonitors - cancels all monitors (except those set with command line) 357*a7e14dcfSSatish Balay . -tao_view - prints information about the TaoSolver after solving 358*a7e14dcfSSatish Balay - -tao_converged_reason - prints the reason TAO stopped iterating 359*a7e14dcfSSatish Balay 360*a7e14dcfSSatish Balay Notes: 361*a7e14dcfSSatish Balay To see all options, run your program with the -help option or consult the 362*a7e14dcfSSatish Balay user's manual. Should be called after TaoCreate() but before TaoSolve() 363*a7e14dcfSSatish Balay 364*a7e14dcfSSatish Balay Level: beginner 365*a7e14dcfSSatish Balay @*/ 366*a7e14dcfSSatish Balay PetscErrorCode TaoSetFromOptions(TaoSolver tao) 367*a7e14dcfSSatish Balay { 368*a7e14dcfSSatish Balay PetscErrorCode ierr; 369*a7e14dcfSSatish Balay const TaoSolverType default_type = "tao_lmvm"; 370*a7e14dcfSSatish Balay const char *prefix; 371*a7e14dcfSSatish Balay char type[256], monfilename[PETSC_MAX_PATH_LEN]; 372*a7e14dcfSSatish Balay PetscViewer monviewer; 373*a7e14dcfSSatish Balay PetscBool flg; 374*a7e14dcfSSatish Balay MPI_Comm comm; 375*a7e14dcfSSatish Balay 376*a7e14dcfSSatish Balay PetscFunctionBegin; 377*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 378*a7e14dcfSSatish Balay ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr); 379*a7e14dcfSSatish Balay ierr = TaoGetOptionsPrefix(tao,&prefix); 380*a7e14dcfSSatish Balay /* So no warnings are given about unused options */ 381*a7e14dcfSSatish Balay ierr = PetscOptionsHasName(prefix,"-tao_ksp_type",&flg); 382*a7e14dcfSSatish Balay ierr = PetscOptionsHasName(prefix,"-tao_pc_type",&flg); 383*a7e14dcfSSatish Balay ierr = PetscOptionsHasName(prefix,"-tao_ls_type",&flg); 384*a7e14dcfSSatish Balay 385*a7e14dcfSSatish Balay 386*a7e14dcfSSatish Balay ierr = PetscObjectOptionsBegin((PetscObject)tao); CHKERRQ(ierr); 387*a7e14dcfSSatish Balay { 388*a7e14dcfSSatish Balay 389*a7e14dcfSSatish Balay 390*a7e14dcfSSatish Balay if (!TaoSolverRegisterAllCalled) { 391*a7e14dcfSSatish Balay ierr = TaoSolverRegisterAll(); CHKERRQ(ierr); 392*a7e14dcfSSatish Balay } 393*a7e14dcfSSatish Balay if (((PetscObject)tao)->type_name) { 394*a7e14dcfSSatish Balay default_type = ((PetscObject)tao)->type_name; 395*a7e14dcfSSatish Balay } 396*a7e14dcfSSatish Balay /* Check for type from options */ 397*a7e14dcfSSatish Balay ierr = PetscOptionsList("-tao_type","Tao Solver type","TaoSetType",TaoSolverList,default_type,type,256,&flg); CHKERRQ(ierr); 398*a7e14dcfSSatish Balay if (flg) { 399*a7e14dcfSSatish Balay ierr = TaoSetType(tao,type); CHKERRQ(ierr); 400*a7e14dcfSSatish Balay } else { 401*a7e14dcfSSatish Balay ierr = PetscOptionsList("-tao_method","Tao Solver type","TaoSetType",TaoSolverList,default_type,type,256,&flg); CHKERRQ(ierr); 402*a7e14dcfSSatish Balay if (flg) { 403*a7e14dcfSSatish Balay ierr = TaoSetType(tao,type); CHKERRQ(ierr); 404*a7e14dcfSSatish Balay } else if (!((PetscObject)tao)->type_name) { 405*a7e14dcfSSatish Balay ierr = TaoSetType(tao,default_type); 406*a7e14dcfSSatish Balay } 407*a7e14dcfSSatish Balay } 408*a7e14dcfSSatish Balay 409*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_view","view TaoSolver info after each minimization has completed","TaoView",PETSC_FALSE,&tao->viewtao,&flg);CHKERRQ(ierr); 410*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_fatol","Stop if solution within","TaoSetTolerances",tao->fatol,&tao->fatol,&flg);CHKERRQ(ierr); 411*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_frtol","Stop if relative solution within","TaoSetTolerances",tao->frtol,&tao->frtol,&flg);CHKERRQ(ierr); 412*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_catol","Stop if constraints violations within","TaoSetConstraintTolerances",tao->catol,&tao->catol,&flg);CHKERRQ(ierr); 413*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_crtol","Stop if relative contraint violations within","TaoSetConstraintTolerances",tao->crtol,&tao->crtol,&flg);CHKERRQ(ierr); 414*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_gatol","Stop if norm of gradient less than","TaoSetTolerances",tao->gatol,&tao->gatol,&flg);CHKERRQ(ierr); 415*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_grtol","Stop if norm of gradient divided by the function value is less than","TaoSetTolerances",tao->grtol,&tao->grtol,&flg);CHKERRQ(ierr); 416*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_gttol","Stop if the norm of the gradient is less than the norm of the initial gradient times tol","TaoSetTolerances",tao->gttol,&tao->gttol,&flg);CHKERRQ(ierr); 417*a7e14dcfSSatish Balay ierr = PetscOptionsInt("-tao_max_it","Stop if iteration number exceeds", 418*a7e14dcfSSatish Balay "TaoSetMaximumIterations",tao->max_it,&tao->max_it, 419*a7e14dcfSSatish Balay &flg);CHKERRQ(ierr); 420*a7e14dcfSSatish Balay ierr = PetscOptionsInt("-tao_max_funcs","Stop if number of function evaluations exceeds","TaoSetMaximumFunctionEvaluations",tao->max_funcs,&tao->max_funcs,&flg); CHKERRQ(ierr); 421*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_fmin","Stop if function less than","TaoSetFunctionLowerBound",tao->fmin,&tao->fmin,&flg); CHKERRQ(ierr); 422*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_steptol","Stop if step size or trust region radius less than","",tao->steptol,&tao->steptol,&flg);CHKERRQ(ierr); 423*a7e14dcfSSatish Balay ierr = PetscOptionsReal("-tao_trust0","Initial trust region radius","TaoSetTrustRegionRadius",tao->trust0,&tao->trust0,&flg);CHKERRQ(ierr); 424*a7e14dcfSSatish Balay 425*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_view_solution","view solution vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 426*a7e14dcfSSatish Balay if (flg) { 427*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 428*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoSolutionMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr); 429*a7e14dcfSSatish Balay } 430*a7e14dcfSSatish Balay 431*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_converged_reason","Print reason for TAO termination","TaoSolve",flg,&flg,PETSC_NULL); CHKERRQ(ierr); 432*a7e14dcfSSatish Balay if (flg) { 433*a7e14dcfSSatish Balay tao->printreason = PETSC_TRUE; 434*a7e14dcfSSatish Balay } 435*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_view_gradient","view gradient vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 436*a7e14dcfSSatish Balay if (flg) { 437*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 438*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoGradientMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr); 439*a7e14dcfSSatish Balay } 440*a7e14dcfSSatish Balay 441*a7e14dcfSSatish Balay 442*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_view_stepdirection","view step direction vector after each iteration","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 443*a7e14dcfSSatish Balay if (flg) { 444*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 445*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoStepDirectionMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr); 446*a7e14dcfSSatish Balay } 447*a7e14dcfSSatish Balay 448*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_view_separableobjective","view separable objective vector after each evaluation","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 449*a7e14dcfSSatish Balay if (flg) { 450*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 451*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoSeparableObjectiveMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy); CHKERRQ(ierr); 452*a7e14dcfSSatish Balay } 453*a7e14dcfSSatish Balay 454*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_monitor","Use the default convergence monitor","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 455*a7e14dcfSSatish Balay if (flg) { 456*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 457*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDefaultMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 458*a7e14dcfSSatish Balay } 459*a7e14dcfSSatish Balay 460*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_smonitor","Use the short convergence monitor","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 461*a7e14dcfSSatish Balay if (flg) { 462*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 463*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDefaultSMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 464*a7e14dcfSSatish Balay } 465*a7e14dcfSSatish Balay 466*a7e14dcfSSatish Balay ierr = PetscOptionsString("-tao_cmonitor","Use the default convergence monitor with constraint norm","TaoSetMonitor","stdout",monfilename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); 467*a7e14dcfSSatish Balay if (flg) { 468*a7e14dcfSSatish Balay ierr = PetscViewerASCIIOpen(comm,monfilename,&monviewer); CHKERRQ(ierr); 469*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDefaultCMonitor,monviewer,(PetscErrorCode (*)(void**))PetscViewerDestroy);CHKERRQ(ierr); 470*a7e14dcfSSatish Balay } 471*a7e14dcfSSatish Balay 472*a7e14dcfSSatish Balay 473*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_cancelmonitors","cancel all monitors and call any registered destroy routines","TaoCancelMonitors",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr); 474*a7e14dcfSSatish Balay if (flg) {ierr = TaoCancelMonitors(tao);CHKERRQ(ierr);} 475*a7e14dcfSSatish Balay 476*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_draw_solution","Plot solution vector at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr); 477*a7e14dcfSSatish Balay if (flg) { 478*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDrawSolutionMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 479*a7e14dcfSSatish Balay } 480*a7e14dcfSSatish Balay 481*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_draw_step","plots step direction at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr); 482*a7e14dcfSSatish Balay if (flg) { 483*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDrawStepMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 484*a7e14dcfSSatish Balay } 485*a7e14dcfSSatish Balay 486*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_draw_gradient","plots gradient at each iteration","TaoSetMonitor",PETSC_FALSE,&flg,PETSC_NULL);CHKERRQ(ierr); 487*a7e14dcfSSatish Balay if (flg) { 488*a7e14dcfSSatish Balay ierr = TaoSetMonitor(tao,TaoDrawGradientMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 489*a7e14dcfSSatish Balay } 490*a7e14dcfSSatish Balay ierr = PetscOptionsBool("-tao_fd_gradient","compute gradient using finite differences","TaoDefaultComputeGradient",PETSC_FALSE,&flg,PETSC_NULL); CHKERRQ(ierr); 491*a7e14dcfSSatish Balay if (flg) { 492*a7e14dcfSSatish Balay ierr = TaoSetGradientRoutine(tao,TaoDefaultComputeGradient,PETSC_NULL); CHKERRQ(ierr); 493*a7e14dcfSSatish Balay } 494*a7e14dcfSSatish Balay ierr = PetscOptionsEList("-tao_subset_type","subset type", "", TAO_SUBSET, TAO_SUBSET_TYPES,TAO_SUBSET[tao->subset_type], &tao->subset_type, 0); CHKERRQ(ierr); 495*a7e14dcfSSatish Balay 496*a7e14dcfSSatish Balay if (tao->ops->setfromoptions) { 497*a7e14dcfSSatish Balay ierr = (*tao->ops->setfromoptions)(tao); CHKERRQ(ierr); 498*a7e14dcfSSatish Balay } 499*a7e14dcfSSatish Balay 500*a7e14dcfSSatish Balay } 501*a7e14dcfSSatish Balay ierr = PetscOptionsEnd(); CHKERRQ(ierr); 502*a7e14dcfSSatish Balay PetscFunctionReturn(0); 503*a7e14dcfSSatish Balay 504*a7e14dcfSSatish Balay } 505*a7e14dcfSSatish Balay 506*a7e14dcfSSatish Balay 507*a7e14dcfSSatish Balay #undef __FUNCT__ 508*a7e14dcfSSatish Balay #define __FUNCT__ "TaoView" 509*a7e14dcfSSatish Balay /*@C 510*a7e14dcfSSatish Balay TaoView - Prints information about the TaoSolver 511*a7e14dcfSSatish Balay 512*a7e14dcfSSatish Balay Collective on TaoSolver 513*a7e14dcfSSatish Balay 514*a7e14dcfSSatish Balay InputParameters: 515*a7e14dcfSSatish Balay + tao - the TaoSolver context 516*a7e14dcfSSatish Balay - viewer - visualization context 517*a7e14dcfSSatish Balay 518*a7e14dcfSSatish Balay Options Database Key: 519*a7e14dcfSSatish Balay . -tao_view - Calls TaoView() at the end of TaoSolve() 520*a7e14dcfSSatish Balay 521*a7e14dcfSSatish Balay Notes: 522*a7e14dcfSSatish Balay The available visualization contexts include 523*a7e14dcfSSatish Balay + PETSC_VIEWER_STDOUT_SELF - standard output (default) 524*a7e14dcfSSatish Balay - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 525*a7e14dcfSSatish Balay output where only the first processor opens 526*a7e14dcfSSatish Balay the file. All other processors send their 527*a7e14dcfSSatish Balay data to the first processor to print. 528*a7e14dcfSSatish Balay 529*a7e14dcfSSatish Balay Level: beginner 530*a7e14dcfSSatish Balay 531*a7e14dcfSSatish Balay .seealso: PetscViewerASCIIOpen() 532*a7e14dcfSSatish Balay @*/ 533*a7e14dcfSSatish Balay PetscErrorCode TaoView(TaoSolver tao, PetscViewer viewer) 534*a7e14dcfSSatish Balay { 535*a7e14dcfSSatish Balay PetscErrorCode ierr; 536*a7e14dcfSSatish Balay PetscBool isascii,isstring; 537*a7e14dcfSSatish Balay const TaoSolverType type; 538*a7e14dcfSSatish Balay PetscFunctionBegin; 539*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 540*a7e14dcfSSatish Balay if (!viewer) { 541*a7e14dcfSSatish Balay ierr = PetscViewerASCIIGetStdout(((PetscObject)tao)->comm,&viewer); CHKERRQ(ierr); 542*a7e14dcfSSatish Balay } 543*a7e14dcfSSatish Balay PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 544*a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,viewer,2); 545*a7e14dcfSSatish Balay 546*a7e14dcfSSatish Balay ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii); CHKERRQ(ierr); 547*a7e14dcfSSatish Balay ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring); CHKERRQ(ierr); 548*a7e14dcfSSatish Balay if (isascii) { 549*a7e14dcfSSatish Balay /*Temporarily check version. Remove check for release*/ 550*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0) 551*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tao,viewer); CHKERRQ(ierr); 552*a7e14dcfSSatish Balay #else 553*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tao,viewer,"TaoSolver"); CHKERRQ(ierr); 554*a7e14dcfSSatish Balay #endif 555*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPushTab(viewer); CHKERRQ(ierr); 556*a7e14dcfSSatish Balay 557*a7e14dcfSSatish Balay if (tao->ops->view) { 558*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPushTab(viewer); CHKERRQ(ierr); 559*a7e14dcfSSatish Balay ierr = (*tao->ops->view)(tao,viewer); CHKERRQ(ierr); 560*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPopTab(viewer); CHKERRQ(ierr); 561*a7e14dcfSSatish Balay } 562*a7e14dcfSSatish Balay if (tao->linesearch) { 563*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0) 564*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->linesearch),viewer); CHKERRQ(ierr); 565*a7e14dcfSSatish Balay #else 566*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->linesearch),viewer,"TaoLineSearch"); CHKERRQ(ierr); 567*a7e14dcfSSatish Balay #endif 568*a7e14dcfSSatish Balay } 569*a7e14dcfSSatish Balay if (tao->ksp) { 570*a7e14dcfSSatish Balay #if (PETSC_VERSION_RELEASE==0) 571*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->ksp),viewer); CHKERRQ(ierr); 572*a7e14dcfSSatish Balay #else 573*a7e14dcfSSatish Balay ierr = PetscObjectPrintClassNamePrefixType((PetscObject)(tao->ksp),viewer,"KSP Solver"); CHKERRQ(ierr); 574*a7e14dcfSSatish Balay #endif 575*a7e14dcfSSatish Balay 576*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total KSP iterations: %D\n",tao->ksp_its); CHKERRQ(ierr); 577*a7e14dcfSSatish Balay } 578*a7e14dcfSSatish Balay if (tao->XL || tao->XU) { 579*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"Active Set subset type: %s\n",TAO_SUBSET[tao->subset_type]); 580*a7e14dcfSSatish Balay } 581*a7e14dcfSSatish Balay 582*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: fatol=%G,",tao->fatol);CHKERRQ(ierr); 583*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," frtol=%G\n",tao->frtol);CHKERRQ(ierr); 584*a7e14dcfSSatish Balay 585*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: gatol=%G,",tao->gatol);CHKERRQ(ierr); 586*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," steptol=%G,",tao->steptol);CHKERRQ(ierr); 587*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," gttol=%G\n",tao->gttol);CHKERRQ(ierr); 588*a7e14dcfSSatish Balay 589*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"Residual in Function/Gradient:=%G\n",tao->residual);CHKERRQ(ierr); 590*a7e14dcfSSatish Balay 591*a7e14dcfSSatish Balay if (tao->cnorm>0 || tao->catol>0 || tao->crtol>0){ 592*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances:");CHKERRQ(ierr); 593*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," catol=%G,",tao->catol);CHKERRQ(ierr); 594*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," crtol=%G\n",tao->crtol);CHKERRQ(ierr); 595*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"Residual in Constraints:=%G\n",tao->cnorm);CHKERRQ(ierr); 596*a7e14dcfSSatish Balay } 597*a7e14dcfSSatish Balay 598*a7e14dcfSSatish Balay if (tao->trust < tao->steptol){ 599*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: steptol=%G\n",tao->steptol);CHKERRQ(ierr); 600*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"Final trust region radius:=%G\n",tao->trust);CHKERRQ(ierr); 601*a7e14dcfSSatish Balay } 602*a7e14dcfSSatish Balay 603*a7e14dcfSSatish Balay if (tao->fmin>-1.e25){ 604*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"convergence tolerances: function minimum=%G\n" 605*a7e14dcfSSatish Balay ,tao->fmin);CHKERRQ(ierr); 606*a7e14dcfSSatish Balay } 607*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"Objective value=%G\n", 608*a7e14dcfSSatish Balay tao->fc);CHKERRQ(ierr); 609*a7e14dcfSSatish Balay 610*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of iterations=%D, ", 611*a7e14dcfSSatish Balay tao->niter);CHKERRQ(ierr); 612*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," (max: %D)\n",tao->max_it);CHKERRQ(ierr); 613*a7e14dcfSSatish Balay 614*a7e14dcfSSatish Balay if (tao->nfuncs>0){ 615*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of function evaluations=%D,", 616*a7e14dcfSSatish Balay tao->nfuncs);CHKERRQ(ierr); 617*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," max: %D\n", 618*a7e14dcfSSatish Balay tao->max_funcs);CHKERRQ(ierr); 619*a7e14dcfSSatish Balay } 620*a7e14dcfSSatish Balay if (tao->ngrads>0){ 621*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of gradient evaluations=%D,", 622*a7e14dcfSSatish Balay tao->ngrads);CHKERRQ(ierr); 623*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," max: %D\n", 624*a7e14dcfSSatish Balay tao->max_funcs);CHKERRQ(ierr); 625*a7e14dcfSSatish Balay } 626*a7e14dcfSSatish Balay if (tao->nfuncgrads>0){ 627*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of function/gradient evaluations=%D,", 628*a7e14dcfSSatish Balay tao->nfuncgrads);CHKERRQ(ierr); 629*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," (max: %D)\n", 630*a7e14dcfSSatish Balay tao->max_funcs);CHKERRQ(ierr); 631*a7e14dcfSSatish Balay } 632*a7e14dcfSSatish Balay if (tao->nhess>0){ 633*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of Hessian evaluations=%D\n", 634*a7e14dcfSSatish Balay tao->nhess);CHKERRQ(ierr); 635*a7e14dcfSSatish Balay } 636*a7e14dcfSSatish Balay /* if (tao->linear_its>0){ 637*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," total Krylov method iterations=%D\n", 638*a7e14dcfSSatish Balay tao->linear_its);CHKERRQ(ierr); 639*a7e14dcfSSatish Balay }*/ 640*a7e14dcfSSatish Balay if (tao->nconstraints>0){ 641*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of constraint function evaluations=%D\n", 642*a7e14dcfSSatish Balay tao->nconstraints);CHKERRQ(ierr); 643*a7e14dcfSSatish Balay } 644*a7e14dcfSSatish Balay if (tao->njac>0){ 645*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"total number of Jacobian evaluations=%D\n", 646*a7e14dcfSSatish Balay tao->njac);CHKERRQ(ierr); 647*a7e14dcfSSatish Balay } 648*a7e14dcfSSatish Balay 649*a7e14dcfSSatish Balay if (tao->reason>0){ 650*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer, "Solution converged: ");CHKERRQ(ierr); 651*a7e14dcfSSatish Balay switch (tao->reason) { 652*a7e14dcfSSatish Balay case TAO_CONVERGED_FATOL: 653*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"estimated f(x)-f(X*) <= fatol\n"); CHKERRQ(ierr); 654*a7e14dcfSSatish Balay break; 655*a7e14dcfSSatish Balay case TAO_CONVERGED_FRTOL: 656*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"estimated |f(x)-f(X*)|/|f(X*)| <= frtol\n"); CHKERRQ(ierr); 657*a7e14dcfSSatish Balay break; 658*a7e14dcfSSatish Balay case TAO_CONVERGED_GATOL: 659*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," ||g(X)|| <= gatol\n"); CHKERRQ(ierr); 660*a7e14dcfSSatish Balay break; 661*a7e14dcfSSatish Balay case TAO_CONVERGED_GRTOL: 662*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," ||g(X)||/|f(X)| <= grtol\n"); CHKERRQ(ierr); 663*a7e14dcfSSatish Balay break; 664*a7e14dcfSSatish Balay case TAO_CONVERGED_GTTOL: 665*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," ||g(X)||/||g(X0)|| <= gttol\n"); CHKERRQ(ierr); 666*a7e14dcfSSatish Balay break; 667*a7e14dcfSSatish Balay case TAO_CONVERGED_STEPTOL: 668*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Steptol -- step size small\n"); CHKERRQ(ierr); 669*a7e14dcfSSatish Balay break; 670*a7e14dcfSSatish Balay case TAO_CONVERGED_MINF: 671*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Minf -- f < fmin\n"); CHKERRQ(ierr); 672*a7e14dcfSSatish Balay break; 673*a7e14dcfSSatish Balay case TAO_CONVERGED_USER: 674*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," User Terminated\n"); CHKERRQ(ierr); 675*a7e14dcfSSatish Balay break; 676*a7e14dcfSSatish Balay default: 677*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"\n"); CHKERRQ(ierr); 678*a7e14dcfSSatish Balay break; 679*a7e14dcfSSatish Balay } 680*a7e14dcfSSatish Balay 681*a7e14dcfSSatish Balay } else { 682*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"Solver terminated: %D",tao->reason);CHKERRQ(ierr); 683*a7e14dcfSSatish Balay switch (tao->reason) { 684*a7e14dcfSSatish Balay case TAO_DIVERGED_MAXITS: 685*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Maximum Iterations\n"); 686*a7e14dcfSSatish Balay CHKERRQ(ierr); 687*a7e14dcfSSatish Balay break; 688*a7e14dcfSSatish Balay case TAO_DIVERGED_NAN: 689*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," NAN or Inf encountered\n"); 690*a7e14dcfSSatish Balay CHKERRQ(ierr); 691*a7e14dcfSSatish Balay break; 692*a7e14dcfSSatish Balay case TAO_DIVERGED_MAXFCN: 693*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Maximum Function Evaluations\n"); 694*a7e14dcfSSatish Balay CHKERRQ(ierr); 695*a7e14dcfSSatish Balay break; 696*a7e14dcfSSatish Balay case TAO_DIVERGED_LS_FAILURE: 697*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Line Search Failure\n"); 698*a7e14dcfSSatish Balay CHKERRQ(ierr); 699*a7e14dcfSSatish Balay break; 700*a7e14dcfSSatish Balay case TAO_DIVERGED_TR_REDUCTION: 701*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Trust Region too small\n"); 702*a7e14dcfSSatish Balay CHKERRQ(ierr); 703*a7e14dcfSSatish Balay break; 704*a7e14dcfSSatish Balay case TAO_DIVERGED_USER: 705*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," User Terminated\n"); 706*a7e14dcfSSatish Balay CHKERRQ(ierr); 707*a7e14dcfSSatish Balay break; 708*a7e14dcfSSatish Balay default: 709*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"\n"); CHKERRQ(ierr); 710*a7e14dcfSSatish Balay break; 711*a7e14dcfSSatish Balay } 712*a7e14dcfSSatish Balay } 713*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPopTab(viewer); CHKERRQ(ierr); 714*a7e14dcfSSatish Balay } else if (isstring) { 715*a7e14dcfSSatish Balay ierr = TaoGetType(tao,&type); CHKERRQ(ierr); 716*a7e14dcfSSatish Balay ierr = PetscViewerStringSPrintf(viewer," %-3.3s",type); CHKERRQ(ierr); 717*a7e14dcfSSatish Balay } 718*a7e14dcfSSatish Balay PetscFunctionReturn(0); 719*a7e14dcfSSatish Balay 720*a7e14dcfSSatish Balay } 721*a7e14dcfSSatish Balay 722*a7e14dcfSSatish Balay #undef __FUNCT__ 723*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetTolerances" 724*a7e14dcfSSatish Balay /*@ 725*a7e14dcfSSatish Balay TaoSetTolerances - Sets parameters used in TAO convergence tests 726*a7e14dcfSSatish Balay 727*a7e14dcfSSatish Balay Logically collective on TaoSolver 728*a7e14dcfSSatish Balay 729*a7e14dcfSSatish Balay Input Parameters: 730*a7e14dcfSSatish Balay + tao - the TaoSolver context 731*a7e14dcfSSatish Balay . fatol - absolute convergence tolerance 732*a7e14dcfSSatish Balay . frtol - relative convergence tolerance 733*a7e14dcfSSatish Balay . gatol - stop if norm of gradient is less than this 734*a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this 735*a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by this factor 736*a7e14dcfSSatish Balay 737*a7e14dcfSSatish Balay Options Database Keys: 738*a7e14dcfSSatish Balay + -tao_fatol <fatol> - Sets fatol 739*a7e14dcfSSatish Balay . -tao_frtol <frtol> - Sets frtol 740*a7e14dcfSSatish Balay . -tao_gatol <gatol> - Sets gatol 741*a7e14dcfSSatish Balay . -tao_grtol <grtol> - Sets grtol 742*a7e14dcfSSatish Balay - -tao_gttol <gttol> - Sets gttol 743*a7e14dcfSSatish Balay 744*a7e14dcfSSatish Balay Stopping Criteria: 745*a7e14dcfSSatish Balay $ f(X) - f(X*) (estimated) <= fatol 746*a7e14dcfSSatish Balay $ |f(X) - f(X*)| (estimated) / |f(X)| <= frtol 747*a7e14dcfSSatish Balay $ ||g(X)|| <= gatol 748*a7e14dcfSSatish Balay $ ||g(X)|| / |f(X)| <= grtol 749*a7e14dcfSSatish Balay $ ||g(X)|| / ||g(X0)|| <= gttol 750*a7e14dcfSSatish Balay 751*a7e14dcfSSatish Balay Notes: 752*a7e14dcfSSatish Balay Use PETSC_DEFAULT to leave one or more tolerances unchanged. 753*a7e14dcfSSatish Balay 754*a7e14dcfSSatish Balay Level: beginner 755*a7e14dcfSSatish Balay 756*a7e14dcfSSatish Balay .seealso: TaoGetTolerances() 757*a7e14dcfSSatish Balay 758*a7e14dcfSSatish Balay @*/ 759*a7e14dcfSSatish Balay PetscErrorCode TaoSetTolerances(TaoSolver tao, PetscReal fatol, PetscReal frtol, PetscReal gatol, PetscReal grtol, PetscReal gttol) 760*a7e14dcfSSatish Balay { 761*a7e14dcfSSatish Balay PetscErrorCode ierr; 762*a7e14dcfSSatish Balay PetscFunctionBegin; 763*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 764*a7e14dcfSSatish Balay 765*a7e14dcfSSatish Balay if (fatol != PETSC_DEFAULT) { 766*a7e14dcfSSatish Balay if (fatol<0) { 767*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative fatol -- ignored."); 768*a7e14dcfSSatish Balay CHKERRQ(ierr); 769*a7e14dcfSSatish Balay } else { 770*a7e14dcfSSatish Balay tao->fatol = PetscMax(0,fatol); 771*a7e14dcfSSatish Balay } 772*a7e14dcfSSatish Balay } 773*a7e14dcfSSatish Balay 774*a7e14dcfSSatish Balay if (frtol != PETSC_DEFAULT) { 775*a7e14dcfSSatish Balay if (frtol<0) { 776*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative frtol -- ignored."); 777*a7e14dcfSSatish Balay CHKERRQ(ierr); 778*a7e14dcfSSatish Balay } else { 779*a7e14dcfSSatish Balay tao->frtol = PetscMax(0,frtol); 780*a7e14dcfSSatish Balay } 781*a7e14dcfSSatish Balay } 782*a7e14dcfSSatish Balay 783*a7e14dcfSSatish Balay if (gatol != PETSC_DEFAULT) { 784*a7e14dcfSSatish Balay if (gatol<0) { 785*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative gatol -- ignored."); 786*a7e14dcfSSatish Balay CHKERRQ(ierr); 787*a7e14dcfSSatish Balay } else { 788*a7e14dcfSSatish Balay tao->gatol = PetscMax(0,gatol); 789*a7e14dcfSSatish Balay } 790*a7e14dcfSSatish Balay } 791*a7e14dcfSSatish Balay 792*a7e14dcfSSatish Balay if (grtol != PETSC_DEFAULT) { 793*a7e14dcfSSatish Balay if (grtol<0) { 794*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative grtol -- ignored."); 795*a7e14dcfSSatish Balay CHKERRQ(ierr); 796*a7e14dcfSSatish Balay } else { 797*a7e14dcfSSatish Balay tao->grtol = PetscMax(0,grtol); 798*a7e14dcfSSatish Balay } 799*a7e14dcfSSatish Balay } 800*a7e14dcfSSatish Balay 801*a7e14dcfSSatish Balay if (gttol != PETSC_DEFAULT) { 802*a7e14dcfSSatish Balay if (gttol<0) { 803*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative gttol -- ignored."); 804*a7e14dcfSSatish Balay CHKERRQ(ierr); 805*a7e14dcfSSatish Balay } else { 806*a7e14dcfSSatish Balay tao->gttol = PetscMax(0,gttol); 807*a7e14dcfSSatish Balay } 808*a7e14dcfSSatish Balay } 809*a7e14dcfSSatish Balay 810*a7e14dcfSSatish Balay PetscFunctionReturn(0); 811*a7e14dcfSSatish Balay } 812*a7e14dcfSSatish Balay 813*a7e14dcfSSatish Balay #undef __FUNCT__ 814*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintTolerances" 815*a7e14dcfSSatish Balay /*@ 816*a7e14dcfSSatish Balay TaoSetConstraintTolerances - Sets contraint tolerance parameters used in TAO 817*a7e14dcfSSatish Balay convergence tests 818*a7e14dcfSSatish Balay 819*a7e14dcfSSatish Balay Logically collective on TaoSolver 820*a7e14dcfSSatish Balay 821*a7e14dcfSSatish Balay Input Parameters: 822*a7e14dcfSSatish Balay + tao - the TaoSolver context 823*a7e14dcfSSatish Balay . catol - absolute constraint tolerance, constraint norm must be less than catol for used for fatol, gatol convergence criteria 824*a7e14dcfSSatish Balay - crtol - relative contraint tolerance, constraint norm must be less than crtol for used for fatol, gatol, gttol convergence criteria 825*a7e14dcfSSatish Balay 826*a7e14dcfSSatish Balay Options Database Keys: 827*a7e14dcfSSatish Balay + -tao_catol <catol> - Sets catol 828*a7e14dcfSSatish Balay - -tao_crtol <crtol> - Sets crtol 829*a7e14dcfSSatish Balay 830*a7e14dcfSSatish Balay Level: intermediate 831*a7e14dcfSSatish Balay 832*a7e14dcfSSatish Balay .seealso: TaoGetTolerances() 833*a7e14dcfSSatish Balay 834*a7e14dcfSSatish Balay @*/ 835*a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintTolerances(TaoSolver tao, PetscReal catol, PetscReal crtol) 836*a7e14dcfSSatish Balay { 837*a7e14dcfSSatish Balay PetscErrorCode ierr; 838*a7e14dcfSSatish Balay PetscFunctionBegin; 839*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 840*a7e14dcfSSatish Balay 841*a7e14dcfSSatish Balay if (catol != PETSC_DEFAULT) { 842*a7e14dcfSSatish Balay if (catol<0) { 843*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative catol -- ignored."); 844*a7e14dcfSSatish Balay CHKERRQ(ierr); 845*a7e14dcfSSatish Balay } else { 846*a7e14dcfSSatish Balay tao->catol = PetscMax(0,catol); 847*a7e14dcfSSatish Balay } 848*a7e14dcfSSatish Balay } 849*a7e14dcfSSatish Balay 850*a7e14dcfSSatish Balay if (crtol != PETSC_DEFAULT) { 851*a7e14dcfSSatish Balay if (crtol<0) { 852*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tried to set negative crtol -- ignored."); 853*a7e14dcfSSatish Balay CHKERRQ(ierr); 854*a7e14dcfSSatish Balay } else { 855*a7e14dcfSSatish Balay tao->crtol = PetscMax(0,crtol); 856*a7e14dcfSSatish Balay } 857*a7e14dcfSSatish Balay } 858*a7e14dcfSSatish Balay 859*a7e14dcfSSatish Balay PetscFunctionReturn(0); 860*a7e14dcfSSatish Balay } 861*a7e14dcfSSatish Balay 862*a7e14dcfSSatish Balay #undef __FUNCT__ 863*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFunctionLowerBound" 864*a7e14dcfSSatish Balay /*@ 865*a7e14dcfSSatish Balay TaoSetFunctionLowerBound - Sets a bound on the solution objective value. 866*a7e14dcfSSatish Balay When an approximate solution with an objective value below this number 867*a7e14dcfSSatish Balay has been found, the solver will terminate. 868*a7e14dcfSSatish Balay 869*a7e14dcfSSatish Balay Logically Collective on TaoSolver 870*a7e14dcfSSatish Balay 871*a7e14dcfSSatish Balay Input Parameters: 872*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 873*a7e14dcfSSatish Balay - fmin - the tolerance 874*a7e14dcfSSatish Balay 875*a7e14dcfSSatish Balay Options Database Keys: 876*a7e14dcfSSatish Balay . -tao_fmin <fmin> - sets the minimum function value 877*a7e14dcfSSatish Balay 878*a7e14dcfSSatish Balay Level: intermediate 879*a7e14dcfSSatish Balay 880*a7e14dcfSSatish Balay .seealso: TaoSetTolerances() 881*a7e14dcfSSatish Balay @*/ 882*a7e14dcfSSatish Balay PetscErrorCode TaoSetFunctionLowerBound(TaoSolver tao,PetscReal fmin) 883*a7e14dcfSSatish Balay { 884*a7e14dcfSSatish Balay PetscFunctionBegin; 885*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 886*a7e14dcfSSatish Balay tao->fmin = fmin; 887*a7e14dcfSSatish Balay PetscFunctionReturn(0); 888*a7e14dcfSSatish Balay } 889*a7e14dcfSSatish Balay 890*a7e14dcfSSatish Balay #undef __FUNCT__ 891*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetFunctionLowerBound" 892*a7e14dcfSSatish Balay /*@ 893*a7e14dcfSSatish Balay TaoGetFunctionLowerBound - Sets a bound on the solution objective value. 894*a7e14dcfSSatish Balay When an approximate solution with an objective value below this number 895*a7e14dcfSSatish Balay has been found, the solver will terminate. 896*a7e14dcfSSatish Balay 897*a7e14dcfSSatish Balay Not collective on TaoSolver 898*a7e14dcfSSatish Balay 899*a7e14dcfSSatish Balay Input Parameters: 900*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 901*a7e14dcfSSatish Balay 902*a7e14dcfSSatish Balay OutputParameters: 903*a7e14dcfSSatish Balay . fmin - the minimum function value 904*a7e14dcfSSatish Balay 905*a7e14dcfSSatish Balay Level: intermediate 906*a7e14dcfSSatish Balay 907*a7e14dcfSSatish Balay .seealso: TaoSetFunctionLowerBound() 908*a7e14dcfSSatish Balay @*/ 909*a7e14dcfSSatish Balay PetscErrorCode TaoGetFunctionLowerBound(TaoSolver tao,PetscReal *fmin) 910*a7e14dcfSSatish Balay { 911*a7e14dcfSSatish Balay PetscFunctionBegin; 912*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 913*a7e14dcfSSatish Balay *fmin = tao->fmin; 914*a7e14dcfSSatish Balay PetscFunctionReturn(0); 915*a7e14dcfSSatish Balay } 916*a7e14dcfSSatish Balay 917*a7e14dcfSSatish Balay 918*a7e14dcfSSatish Balay 919*a7e14dcfSSatish Balay #undef __FUNCT__ 920*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMaximumFunctionEvaluations" 921*a7e14dcfSSatish Balay /*@ 922*a7e14dcfSSatish Balay TaoSetMaximumFunctionEvaluations - Sets a maximum number of 923*a7e14dcfSSatish Balay function evaluations. 924*a7e14dcfSSatish Balay 925*a7e14dcfSSatish Balay Logically Collective on TaoSolver 926*a7e14dcfSSatish Balay 927*a7e14dcfSSatish Balay Input Parameters: 928*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 929*a7e14dcfSSatish Balay - nfcn - the maximum number of function evaluations (>=0) 930*a7e14dcfSSatish Balay 931*a7e14dcfSSatish Balay Options Database Keys: 932*a7e14dcfSSatish Balay . -tao_max_funcs <nfcn> - sets the maximum number of function evaluations 933*a7e14dcfSSatish Balay 934*a7e14dcfSSatish Balay Level: intermediate 935*a7e14dcfSSatish Balay 936*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(), TaoSetMaximumIterations() 937*a7e14dcfSSatish Balay @*/ 938*a7e14dcfSSatish Balay 939*a7e14dcfSSatish Balay PetscErrorCode TaoSetMaximumFunctionEvaluations(TaoSolver tao,PetscInt nfcn) 940*a7e14dcfSSatish Balay { 941*a7e14dcfSSatish Balay PetscInt zero=0; 942*a7e14dcfSSatish Balay PetscFunctionBegin; 943*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 944*a7e14dcfSSatish Balay tao->max_funcs = PetscMax(zero,nfcn); 945*a7e14dcfSSatish Balay PetscFunctionReturn(0); 946*a7e14dcfSSatish Balay } 947*a7e14dcfSSatish Balay 948*a7e14dcfSSatish Balay #undef __FUNCT__ 949*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetMaximumFunctionEvaluations" 950*a7e14dcfSSatish Balay /*@ 951*a7e14dcfSSatish Balay TaoGetMaximumFunctionEvaluations - Sets a maximum number of 952*a7e14dcfSSatish Balay function evaluations. 953*a7e14dcfSSatish Balay 954*a7e14dcfSSatish Balay Not Collective 955*a7e14dcfSSatish Balay 956*a7e14dcfSSatish Balay Input Parameters: 957*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 958*a7e14dcfSSatish Balay 959*a7e14dcfSSatish Balay Output Parameters: 960*a7e14dcfSSatish Balay . nfcn - the maximum number of function evaluations 961*a7e14dcfSSatish Balay 962*a7e14dcfSSatish Balay Level: intermediate 963*a7e14dcfSSatish Balay 964*a7e14dcfSSatish Balay .seealso: TaoSetMaximumFunctionEvaluations(), TaoGetMaximumIterations() 965*a7e14dcfSSatish Balay @*/ 966*a7e14dcfSSatish Balay 967*a7e14dcfSSatish Balay PetscErrorCode TaoGetMaximumFunctionEvaluations(TaoSolver tao,PetscInt *nfcn) 968*a7e14dcfSSatish Balay { 969*a7e14dcfSSatish Balay PetscFunctionBegin; 970*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 971*a7e14dcfSSatish Balay *nfcn = tao->max_funcs; 972*a7e14dcfSSatish Balay PetscFunctionReturn(0); 973*a7e14dcfSSatish Balay } 974*a7e14dcfSSatish Balay 975*a7e14dcfSSatish Balay 976*a7e14dcfSSatish Balay #undef __FUNCT__ 977*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMaximumIterations" 978*a7e14dcfSSatish Balay /*@ 979*a7e14dcfSSatish Balay TaoSetMaximumIterations - Sets a maximum number of iterates. 980*a7e14dcfSSatish Balay 981*a7e14dcfSSatish Balay Logically Collective on TaoSolver 982*a7e14dcfSSatish Balay 983*a7e14dcfSSatish Balay Input Parameters: 984*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 985*a7e14dcfSSatish Balay - maxits - the maximum number of iterates (>=0) 986*a7e14dcfSSatish Balay 987*a7e14dcfSSatish Balay Options Database Keys: 988*a7e14dcfSSatish Balay . -tao_max_it <its> - sets the maximum number of iterations 989*a7e14dcfSSatish Balay 990*a7e14dcfSSatish Balay Level: intermediate 991*a7e14dcfSSatish Balay 992*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(), TaoSetMaximumFunctionEvaluations() 993*a7e14dcfSSatish Balay @*/ 994*a7e14dcfSSatish Balay PetscErrorCode TaoSetMaximumIterations(TaoSolver tao,PetscInt maxits) 995*a7e14dcfSSatish Balay { 996*a7e14dcfSSatish Balay PetscInt zero=0; 997*a7e14dcfSSatish Balay PetscFunctionBegin; 998*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 999*a7e14dcfSSatish Balay tao->max_it = PetscMax(zero,maxits); 1000*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1001*a7e14dcfSSatish Balay } 1002*a7e14dcfSSatish Balay 1003*a7e14dcfSSatish Balay 1004*a7e14dcfSSatish Balay #undef __FUNCT__ 1005*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetMaximumIterations" 1006*a7e14dcfSSatish Balay /*@ 1007*a7e14dcfSSatish Balay TaoGetMaximumIterations - Sets a maximum number of iterates. 1008*a7e14dcfSSatish Balay 1009*a7e14dcfSSatish Balay Not Collective 1010*a7e14dcfSSatish Balay 1011*a7e14dcfSSatish Balay Input Parameters: 1012*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 1013*a7e14dcfSSatish Balay 1014*a7e14dcfSSatish Balay Output Parameters: 1015*a7e14dcfSSatish Balay . maxits - the maximum number of iterates 1016*a7e14dcfSSatish Balay 1017*a7e14dcfSSatish Balay Level: intermediate 1018*a7e14dcfSSatish Balay 1019*a7e14dcfSSatish Balay .seealso: TaoSetMaximumIterations(), TaoGetMaximumFunctionEvaluations() 1020*a7e14dcfSSatish Balay @*/ 1021*a7e14dcfSSatish Balay PetscErrorCode TaoGetMaximumIterations(TaoSolver tao,PetscInt *maxits) 1022*a7e14dcfSSatish Balay { 1023*a7e14dcfSSatish Balay PetscFunctionBegin; 1024*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1025*a7e14dcfSSatish Balay *maxits = tao->max_it; 1026*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1027*a7e14dcfSSatish Balay } 1028*a7e14dcfSSatish Balay 1029*a7e14dcfSSatish Balay #undef __FUNCT__ 1030*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInitialTrustRegionRadius" 1031*a7e14dcfSSatish Balay /*@ 1032*a7e14dcfSSatish Balay TaoSetInitialTrustRegionRadius - Sets the initial trust region radius. 1033*a7e14dcfSSatish Balay 1034*a7e14dcfSSatish Balay Logically collective on TaoSolver 1035*a7e14dcfSSatish Balay 1036*a7e14dcfSSatish Balay Input Parameter: 1037*a7e14dcfSSatish Balay + tao - a TAO optimization solver 1038*a7e14dcfSSatish Balay - radius - the trust region radius 1039*a7e14dcfSSatish Balay 1040*a7e14dcfSSatish Balay Level: intermediate 1041*a7e14dcfSSatish Balay 1042*a7e14dcfSSatish Balay Options Database Key: 1043*a7e14dcfSSatish Balay . -tao_trust0 <t0> - sets initial trust region radius 1044*a7e14dcfSSatish Balay 1045*a7e14dcfSSatish Balay 1046*a7e14dcfSSatish Balay .seealso: TaoGetTrustRegionRadius(), TaoSetTrustRegionTolerance() 1047*a7e14dcfSSatish Balay @*/ 1048*a7e14dcfSSatish Balay PetscErrorCode TaoSetInitialTrustRegionRadius(TaoSolver tao, PetscReal radius) 1049*a7e14dcfSSatish Balay { 1050*a7e14dcfSSatish Balay PetscFunctionBegin; 1051*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1052*a7e14dcfSSatish Balay tao->trust0 = PetscMax(0.0,radius); 1053*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1054*a7e14dcfSSatish Balay } 1055*a7e14dcfSSatish Balay 1056*a7e14dcfSSatish Balay 1057*a7e14dcfSSatish Balay #undef __FUNCT__ 1058*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetInitialTrustRegionRadius" 1059*a7e14dcfSSatish Balay /*@ 1060*a7e14dcfSSatish Balay TaoGetInitialTrustRegionRadius - Sets the initial trust region radius. 1061*a7e14dcfSSatish Balay 1062*a7e14dcfSSatish Balay Not Collective 1063*a7e14dcfSSatish Balay 1064*a7e14dcfSSatish Balay Input Parameter: 1065*a7e14dcfSSatish Balay . tao - a TAO optimization solver 1066*a7e14dcfSSatish Balay 1067*a7e14dcfSSatish Balay Output Parameter: 1068*a7e14dcfSSatish Balay . radius - the trust region radius 1069*a7e14dcfSSatish Balay 1070*a7e14dcfSSatish Balay Level: intermediate 1071*a7e14dcfSSatish Balay 1072*a7e14dcfSSatish Balay .seealso: TaoSetInitialTrustRegionRadius(), TaoGetCurrentTrustRegionRadius() 1073*a7e14dcfSSatish Balay @*/ 1074*a7e14dcfSSatish Balay PetscErrorCode TaoGetInitialTrustRegionRadius(TaoSolver tao, PetscReal *radius) 1075*a7e14dcfSSatish Balay { 1076*a7e14dcfSSatish Balay PetscFunctionBegin; 1077*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1078*a7e14dcfSSatish Balay *radius = tao->trust0; 1079*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1080*a7e14dcfSSatish Balay } 1081*a7e14dcfSSatish Balay 1082*a7e14dcfSSatish Balay #undef __FUNCT__ 1083*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetCurrentTrustRegionRadius" 1084*a7e14dcfSSatish Balay /*@ 1085*a7e14dcfSSatish Balay TaoGetCurrentTrustRegionRadius - Gets the current trust region radius. 1086*a7e14dcfSSatish Balay 1087*a7e14dcfSSatish Balay Not Collective 1088*a7e14dcfSSatish Balay 1089*a7e14dcfSSatish Balay Input Parameter: 1090*a7e14dcfSSatish Balay . tao - a TAO optimization solver 1091*a7e14dcfSSatish Balay 1092*a7e14dcfSSatish Balay Output Parameter: 1093*a7e14dcfSSatish Balay . radius - the trust region radius 1094*a7e14dcfSSatish Balay 1095*a7e14dcfSSatish Balay Level: intermediate 1096*a7e14dcfSSatish Balay 1097*a7e14dcfSSatish Balay .seealso: TaoSetInitialTrustRegionRadius(), TaoGetInitialTrustRegionRadius() 1098*a7e14dcfSSatish Balay @*/ 1099*a7e14dcfSSatish Balay PetscErrorCode TaoGetCurrentTrustRegionRadius(TaoSolver tao, PetscReal *radius) 1100*a7e14dcfSSatish Balay { 1101*a7e14dcfSSatish Balay PetscFunctionBegin; 1102*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1103*a7e14dcfSSatish Balay *radius = tao->trust; 1104*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1105*a7e14dcfSSatish Balay } 1106*a7e14dcfSSatish Balay 1107*a7e14dcfSSatish Balay 1108*a7e14dcfSSatish Balay #undef __FUNCT__ 1109*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetTolerances" 1110*a7e14dcfSSatish Balay /*@ 1111*a7e14dcfSSatish Balay TaoGetTolerances - gets the current values of tolerances 1112*a7e14dcfSSatish Balay 1113*a7e14dcfSSatish Balay Not Collective 1114*a7e14dcfSSatish Balay 1115*a7e14dcfSSatish Balay Input Parameters: 1116*a7e14dcfSSatish Balay . tao - the TaoSolver context 1117*a7e14dcfSSatish Balay 1118*a7e14dcfSSatish Balay Output Parameters: 1119*a7e14dcfSSatish Balay + fatol - absolute convergence tolerance 1120*a7e14dcfSSatish Balay . frtol - relative convergence tolerance 1121*a7e14dcfSSatish Balay . gatol - stop if norm of gradient is less than this 1122*a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this 1123*a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by a this factor 1124*a7e14dcfSSatish Balay 1125*a7e14dcfSSatish Balay Note: 1126*a7e14dcfSSatish Balay PETSC_NULL can be used as an argument if not all tolerances values are needed 1127*a7e14dcfSSatish Balay 1128*a7e14dcfSSatish Balay .seealso TaoSetTolerances() 1129*a7e14dcfSSatish Balay 1130*a7e14dcfSSatish Balay Level: intermediate 1131*a7e14dcfSSatish Balay @*/ 1132*a7e14dcfSSatish Balay PetscErrorCode TaoGetTolerances(TaoSolver tao, PetscReal *fatol, PetscReal *frtol, PetscReal *gatol, PetscReal *grtol, PetscReal *gttol) 1133*a7e14dcfSSatish Balay { 1134*a7e14dcfSSatish Balay PetscFunctionBegin; 1135*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1136*a7e14dcfSSatish Balay if (fatol) *fatol=tao->fatol; 1137*a7e14dcfSSatish Balay if (frtol) *frtol=tao->frtol; 1138*a7e14dcfSSatish Balay if (gatol) *gatol=tao->gatol; 1139*a7e14dcfSSatish Balay if (grtol) *grtol=tao->grtol; 1140*a7e14dcfSSatish Balay if (gttol) *gttol=tao->gttol; 1141*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1142*a7e14dcfSSatish Balay } 1143*a7e14dcfSSatish Balay 1144*a7e14dcfSSatish Balay 1145*a7e14dcfSSatish Balay #undef __FUNCT__ 1146*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetKSP" 1147*a7e14dcfSSatish Balay /*@ 1148*a7e14dcfSSatish Balay TaoGetKSP - Gets the linear solver used by the optimization solver. 1149*a7e14dcfSSatish Balay Application writers should use TaoGetKSP if they need direct access 1150*a7e14dcfSSatish Balay to the PETSc KSP object. 1151*a7e14dcfSSatish Balay 1152*a7e14dcfSSatish Balay Not Collective 1153*a7e14dcfSSatish Balay 1154*a7e14dcfSSatish Balay Input Parameters: 1155*a7e14dcfSSatish Balay . tao - the TAO solver 1156*a7e14dcfSSatish Balay 1157*a7e14dcfSSatish Balay Output Parameters: 1158*a7e14dcfSSatish Balay . ksp - the KSP linear solver used in the optimization solver 1159*a7e14dcfSSatish Balay 1160*a7e14dcfSSatish Balay Level: intermediate 1161*a7e14dcfSSatish Balay 1162*a7e14dcfSSatish Balay @*/ 1163*a7e14dcfSSatish Balay PetscErrorCode TaoGetKSP(TaoSolver tao, KSP *ksp) { 1164*a7e14dcfSSatish Balay PetscFunctionBegin; 1165*a7e14dcfSSatish Balay *ksp = tao->ksp; 1166*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1167*a7e14dcfSSatish Balay } 1168*a7e14dcfSSatish Balay 1169*a7e14dcfSSatish Balay #undef __FUNCT__ 1170*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetLineSearch" 1171*a7e14dcfSSatish Balay /*@ 1172*a7e14dcfSSatish Balay TaoGetLineSearch - Gets the line search used by the optimization solver. 1173*a7e14dcfSSatish Balay Application writers should use TaoGetLineSearch if they need direct access 1174*a7e14dcfSSatish Balay to the TaoLineSearch object. 1175*a7e14dcfSSatish Balay 1176*a7e14dcfSSatish Balay Not Collective 1177*a7e14dcfSSatish Balay 1178*a7e14dcfSSatish Balay Input Parameters: 1179*a7e14dcfSSatish Balay . tao - the TAO solver 1180*a7e14dcfSSatish Balay 1181*a7e14dcfSSatish Balay Output Parameters: 1182*a7e14dcfSSatish Balay . ls - the line search used in the optimization solver 1183*a7e14dcfSSatish Balay 1184*a7e14dcfSSatish Balay Level: intermediate 1185*a7e14dcfSSatish Balay 1186*a7e14dcfSSatish Balay @*/ 1187*a7e14dcfSSatish Balay PetscErrorCode TaoGetLineSearch(TaoSolver tao, TaoLineSearch *ls) { 1188*a7e14dcfSSatish Balay PetscFunctionBegin; 1189*a7e14dcfSSatish Balay *ls = tao->linesearch; 1190*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1191*a7e14dcfSSatish Balay } 1192*a7e14dcfSSatish Balay 1193*a7e14dcfSSatish Balay #undef __FUNCT__ 1194*a7e14dcfSSatish Balay #define __FUNCT__ "TaoAddLineSearchCounts" 1195*a7e14dcfSSatish Balay /*@ 1196*a7e14dcfSSatish Balay TaoAddLineSearchCounts - Adds the number of function evaluations spent 1197*a7e14dcfSSatish Balay in the line search to the running total. 1198*a7e14dcfSSatish Balay 1199*a7e14dcfSSatish Balay Input Parameters: 1200*a7e14dcfSSatish Balay + tao - the TAO solver 1201*a7e14dcfSSatish Balay - ls - the line search used in the optimization solver 1202*a7e14dcfSSatish Balay 1203*a7e14dcfSSatish Balay Level: developer 1204*a7e14dcfSSatish Balay 1205*a7e14dcfSSatish Balay .seealso: TaoLineSearchApply() 1206*a7e14dcfSSatish Balay @*/ 1207*a7e14dcfSSatish Balay PetscErrorCode TaoAddLineSearchCounts(TaoSolver tao) { 1208*a7e14dcfSSatish Balay PetscErrorCode ierr; 1209*a7e14dcfSSatish Balay PetscBool flg; 1210*a7e14dcfSSatish Balay PetscInt nfeval,ngeval,nfgeval; 1211*a7e14dcfSSatish Balay PetscFunctionBegin; 1212*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1213*a7e14dcfSSatish Balay if (tao->linesearch) { 1214*a7e14dcfSSatish Balay ierr = TaoLineSearchIsUsingTaoSolverRoutines(tao->linesearch,&flg); 1215*a7e14dcfSSatish Balay if (flg == PETSC_FALSE) { 1216*a7e14dcfSSatish Balay ierr = TaoLineSearchGetNumberFunctionEvaluations(tao->linesearch,&nfeval, 1217*a7e14dcfSSatish Balay &ngeval,&nfgeval); CHKERRQ(ierr); 1218*a7e14dcfSSatish Balay tao->nfuncs+=nfeval; 1219*a7e14dcfSSatish Balay tao->ngrads+=ngeval; 1220*a7e14dcfSSatish Balay tao->nfuncgrads+=nfgeval; 1221*a7e14dcfSSatish Balay } 1222*a7e14dcfSSatish Balay } 1223*a7e14dcfSSatish Balay 1224*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1225*a7e14dcfSSatish Balay } 1226*a7e14dcfSSatish Balay 1227*a7e14dcfSSatish Balay 1228*a7e14dcfSSatish Balay #undef __FUNCT__ 1229*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetSolutionVector" 1230*a7e14dcfSSatish Balay /*@ 1231*a7e14dcfSSatish Balay TaoGetSolutionVector - Returns the vector with the current TAO solution 1232*a7e14dcfSSatish Balay 1233*a7e14dcfSSatish Balay Not Collective 1234*a7e14dcfSSatish Balay 1235*a7e14dcfSSatish Balay Input Parameter: 1236*a7e14dcfSSatish Balay . tao - the TaoSolver context 1237*a7e14dcfSSatish Balay 1238*a7e14dcfSSatish Balay Output Parameter: 1239*a7e14dcfSSatish Balay . X - the current solution 1240*a7e14dcfSSatish Balay 1241*a7e14dcfSSatish Balay Level: intermediate 1242*a7e14dcfSSatish Balay 1243*a7e14dcfSSatish Balay Note: The returned vector will be the same object that was passed into TaoSetInitialVector() 1244*a7e14dcfSSatish Balay @*/ 1245*a7e14dcfSSatish Balay PetscErrorCode TaoGetSolutionVector(TaoSolver tao, Vec *X) 1246*a7e14dcfSSatish Balay { 1247*a7e14dcfSSatish Balay PetscFunctionBegin; 1248*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1249*a7e14dcfSSatish Balay *X = tao->solution; 1250*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1251*a7e14dcfSSatish Balay } 1252*a7e14dcfSSatish Balay 1253*a7e14dcfSSatish Balay 1254*a7e14dcfSSatish Balay #undef __FUNCT__ 1255*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetGradientVector" 1256*a7e14dcfSSatish Balay /*@ 1257*a7e14dcfSSatish Balay TaoGetGradientVector - Returns the vector with the current TAO gradient 1258*a7e14dcfSSatish Balay 1259*a7e14dcfSSatish Balay Not Collective 1260*a7e14dcfSSatish Balay 1261*a7e14dcfSSatish Balay Input Parameter: 1262*a7e14dcfSSatish Balay . tao - the TaoSolver context 1263*a7e14dcfSSatish Balay 1264*a7e14dcfSSatish Balay Output Parameter: 1265*a7e14dcfSSatish Balay . G - the current solution 1266*a7e14dcfSSatish Balay 1267*a7e14dcfSSatish Balay Level: intermediate 1268*a7e14dcfSSatish Balay @*/ 1269*a7e14dcfSSatish Balay PetscErrorCode TaoGetGradientVector(TaoSolver tao, Vec *G) 1270*a7e14dcfSSatish Balay { 1271*a7e14dcfSSatish Balay PetscFunctionBegin; 1272*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1273*a7e14dcfSSatish Balay *G = tao->gradient; 1274*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1275*a7e14dcfSSatish Balay } 1276*a7e14dcfSSatish Balay 1277*a7e14dcfSSatish Balay 1278*a7e14dcfSSatish Balay #undef __FUNCT__ 1279*a7e14dcfSSatish Balay #define __FUNCT__ "TaoResetStatistics" 1280*a7e14dcfSSatish Balay /*@ 1281*a7e14dcfSSatish Balay TaoResetStatistics - Initialize the statistics used by TAO for all of the solvers. 1282*a7e14dcfSSatish Balay These statistics include the iteration number, residual norms, and convergence status. 1283*a7e14dcfSSatish Balay This routine gets called before solving each optimization problem. 1284*a7e14dcfSSatish Balay 1285*a7e14dcfSSatish Balay Collective on TaoSolver 1286*a7e14dcfSSatish Balay 1287*a7e14dcfSSatish Balay Input Parameters: 1288*a7e14dcfSSatish Balay . solver - the TaoSolver context 1289*a7e14dcfSSatish Balay 1290*a7e14dcfSSatish Balay Level: developer 1291*a7e14dcfSSatish Balay 1292*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve() 1293*a7e14dcfSSatish Balay @*/ 1294*a7e14dcfSSatish Balay PetscErrorCode TaoResetStatistics(TaoSolver tao) 1295*a7e14dcfSSatish Balay { 1296*a7e14dcfSSatish Balay PetscFunctionBegin; 1297*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1298*a7e14dcfSSatish Balay tao->niter = 0; 1299*a7e14dcfSSatish Balay tao->nfuncs = 0; 1300*a7e14dcfSSatish Balay tao->nfuncgrads = 0; 1301*a7e14dcfSSatish Balay tao->ngrads = 0; 1302*a7e14dcfSSatish Balay tao->nhess = 0; 1303*a7e14dcfSSatish Balay tao->njac = 0; 1304*a7e14dcfSSatish Balay tao->nconstraints = 0; 1305*a7e14dcfSSatish Balay tao->ksp_its = 0; 1306*a7e14dcfSSatish Balay tao->reason = TAO_CONTINUE_ITERATING; 1307*a7e14dcfSSatish Balay tao->residual = 0.0; 1308*a7e14dcfSSatish Balay tao->cnorm = 0.0; 1309*a7e14dcfSSatish Balay tao->step = 0.0; 1310*a7e14dcfSSatish Balay tao->lsflag = PETSC_FALSE; 1311*a7e14dcfSSatish Balay if (tao->hist_reset) tao->hist_len=0; 1312*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1313*a7e14dcfSSatish Balay } 1314*a7e14dcfSSatish Balay 1315*a7e14dcfSSatish Balay 1316*a7e14dcfSSatish Balay #undef __FUNCT__ 1317*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConvergenceTest" 1318*a7e14dcfSSatish Balay /*@C 1319*a7e14dcfSSatish Balay TaoSetConvergenceTest - Sets the function that is to be used to test 1320*a7e14dcfSSatish Balay for convergence o fthe iterative minimization solution. The new convergence 1321*a7e14dcfSSatish Balay testing routine will replace TAO's default convergence test. 1322*a7e14dcfSSatish Balay 1323*a7e14dcfSSatish Balay Logically Collective on TaoSolver 1324*a7e14dcfSSatish Balay 1325*a7e14dcfSSatish Balay Input Parameters: 1326*a7e14dcfSSatish Balay + tao - the TaoSolver object 1327*a7e14dcfSSatish Balay . conv - the routine to test for convergence 1328*a7e14dcfSSatish Balay - ctx - [optional] context for private data for the convergence routine 1329*a7e14dcfSSatish Balay (may be PETSC_NULL) 1330*a7e14dcfSSatish Balay 1331*a7e14dcfSSatish Balay Calling sequence of conv: 1332*a7e14dcfSSatish Balay $ PetscErrorCode conv(TaoSolver tao, void *ctx) 1333*a7e14dcfSSatish Balay 1334*a7e14dcfSSatish Balay + tao - the TaoSolver object 1335*a7e14dcfSSatish Balay - ctx - [optional] convergence context 1336*a7e14dcfSSatish Balay 1337*a7e14dcfSSatish Balay Note: The new convergence testing routine should call TaoSetTerminationReason(). 1338*a7e14dcfSSatish Balay 1339*a7e14dcfSSatish Balay Level: advanced 1340*a7e14dcfSSatish Balay 1341*a7e14dcfSSatish Balay .seealso: TaoSetTerminationReason(), TaoGetSolutionStatus(), TaoGetTolerances(), TaoSetMonitor 1342*a7e14dcfSSatish Balay 1343*a7e14dcfSSatish Balay @*/ 1344*a7e14dcfSSatish Balay PetscErrorCode TaoSetConvergenceTest(TaoSolver tao, PetscErrorCode (*conv)(TaoSolver,void*), void *ctx) 1345*a7e14dcfSSatish Balay { 1346*a7e14dcfSSatish Balay PetscFunctionBegin; 1347*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1348*a7e14dcfSSatish Balay (tao)->ops->convergencetest = conv; 1349*a7e14dcfSSatish Balay (tao)->cnvP = ctx; 1350*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1351*a7e14dcfSSatish Balay } 1352*a7e14dcfSSatish Balay 1353*a7e14dcfSSatish Balay #undef __FUNCT__ 1354*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetMonitor" 1355*a7e14dcfSSatish Balay /*@C 1356*a7e14dcfSSatish Balay TaoSetMonitor - Sets an ADDITIONAL function that is to be used at every 1357*a7e14dcfSSatish Balay iteration of the solver to display the iteration's 1358*a7e14dcfSSatish Balay progress. 1359*a7e14dcfSSatish Balay 1360*a7e14dcfSSatish Balay Logically Collective on TaoSolver 1361*a7e14dcfSSatish Balay 1362*a7e14dcfSSatish Balay Input Parameters: 1363*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 1364*a7e14dcfSSatish Balay . mymonitor - monitoring routine 1365*a7e14dcfSSatish Balay - mctx - [optional] user-defined context for private data for the 1366*a7e14dcfSSatish Balay monitor routine (may be PETSC_NULL) 1367*a7e14dcfSSatish Balay 1368*a7e14dcfSSatish Balay Calling sequence of mymonitor: 1369*a7e14dcfSSatish Balay $ int mymonitor(TaoSolver tao,void *mctx) 1370*a7e14dcfSSatish Balay 1371*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 1372*a7e14dcfSSatish Balay - mctx - [optional] monitoring context 1373*a7e14dcfSSatish Balay 1374*a7e14dcfSSatish Balay 1375*a7e14dcfSSatish Balay Options Database Keys: 1376*a7e14dcfSSatish Balay + -tao_monitor - sets TaoDefaultMonitor() 1377*a7e14dcfSSatish Balay . -tao_smonitor - sets short monitor 1378*a7e14dcfSSatish Balay . -tao_cmonitor - same as smonitor plus constraint norm 1379*a7e14dcfSSatish Balay . -tao_view_solution - view solution at each iteration 1380*a7e14dcfSSatish Balay . -tao_view_gradient - view gradient at each iteration 1381*a7e14dcfSSatish Balay . -tao_view_separableobjective - view separable objective function at each iteration 1382*a7e14dcfSSatish Balay - -tao_cancelmonitors - cancels all monitors that have been hardwired into a code by calls to TaoSetMonitor(), but does not cancel those set via the options database. 1383*a7e14dcfSSatish Balay 1384*a7e14dcfSSatish Balay 1385*a7e14dcfSSatish Balay Notes: 1386*a7e14dcfSSatish Balay Several different monitoring routines may be set by calling 1387*a7e14dcfSSatish Balay TaoSetMonitor() multiple times; all will be called in the 1388*a7e14dcfSSatish Balay order in which they were set. 1389*a7e14dcfSSatish Balay 1390*a7e14dcfSSatish Balay Fortran Notes: Only one monitor function may be set 1391*a7e14dcfSSatish Balay 1392*a7e14dcfSSatish Balay Level: intermediate 1393*a7e14dcfSSatish Balay 1394*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoCancelMonitors(), TaoSetDestroyRoutine() 1395*a7e14dcfSSatish Balay @*/ 1396*a7e14dcfSSatish Balay PetscErrorCode TaoSetMonitor(TaoSolver tao, PetscErrorCode (*func)(TaoSolver, void*), void *ctx,PetscErrorCode (*dest)(void**)) 1397*a7e14dcfSSatish Balay { 1398*a7e14dcfSSatish Balay PetscFunctionBegin; 1399*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1400*a7e14dcfSSatish Balay if (tao->numbermonitors >= MAXTAOMONITORS) { 1401*a7e14dcfSSatish Balay SETERRQ1(PETSC_COMM_SELF,1,"Cannot attach another monitor -- max=",MAXTAOMONITORS); 1402*a7e14dcfSSatish Balay } 1403*a7e14dcfSSatish Balay tao->monitor[tao->numbermonitors] = func; 1404*a7e14dcfSSatish Balay tao->monitorcontext[tao->numbermonitors] = ctx; 1405*a7e14dcfSSatish Balay tao->monitordestroy[tao->numbermonitors] = dest; 1406*a7e14dcfSSatish Balay ++tao->numbermonitors; 1407*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1408*a7e14dcfSSatish Balay } 1409*a7e14dcfSSatish Balay 1410*a7e14dcfSSatish Balay #undef __FUNCT__ 1411*a7e14dcfSSatish Balay #define __FUNCT__ "TaoCancelMonitors" 1412*a7e14dcfSSatish Balay /*@ 1413*a7e14dcfSSatish Balay TaoCancelMonitors - Clears all the monitor functions for a TaoSolver object. 1414*a7e14dcfSSatish Balay 1415*a7e14dcfSSatish Balay Logically Collective on TaoSolver 1416*a7e14dcfSSatish Balay 1417*a7e14dcfSSatish Balay Input Parameters: 1418*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 1419*a7e14dcfSSatish Balay 1420*a7e14dcfSSatish Balay Options Database: 1421*a7e14dcfSSatish Balay . -tao_cancelmonitors - cancels all monitors that have been hardwired 1422*a7e14dcfSSatish Balay into a code by calls to TaoSetMonitor(), but does not cancel those 1423*a7e14dcfSSatish Balay set via the options database 1424*a7e14dcfSSatish Balay 1425*a7e14dcfSSatish Balay Notes: 1426*a7e14dcfSSatish Balay There is no way to clear one specific monitor from a TaoSolver object. 1427*a7e14dcfSSatish Balay 1428*a7e14dcfSSatish Balay Level: advanced 1429*a7e14dcfSSatish Balay 1430*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor() 1431*a7e14dcfSSatish Balay @*/ 1432*a7e14dcfSSatish Balay PetscErrorCode TaoCancelMonitors(TaoSolver tao) 1433*a7e14dcfSSatish Balay { 1434*a7e14dcfSSatish Balay PetscInt i; 1435*a7e14dcfSSatish Balay PetscErrorCode ierr; 1436*a7e14dcfSSatish Balay PetscFunctionBegin; 1437*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 1438*a7e14dcfSSatish Balay for (i=0;i<tao->numbermonitors;i++) { 1439*a7e14dcfSSatish Balay if (tao->monitordestroy[i]) { 1440*a7e14dcfSSatish Balay ierr = (*tao->monitordestroy[i])(&tao->monitorcontext[i]); CHKERRQ(ierr); 1441*a7e14dcfSSatish Balay } 1442*a7e14dcfSSatish Balay } 1443*a7e14dcfSSatish Balay tao->numbermonitors=0; 1444*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1445*a7e14dcfSSatish Balay } 1446*a7e14dcfSSatish Balay 1447*a7e14dcfSSatish Balay 1448*a7e14dcfSSatish Balay 1449*a7e14dcfSSatish Balay #undef __FUNCT__ 1450*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultMonitor" 1451*a7e14dcfSSatish Balay /*@C 1452*a7e14dcfSSatish Balay TaoDefaultMonitor - Default routine for monitoring progress of the 1453*a7e14dcfSSatish Balay TaoSolver solvers (default). This monitor prints the function value and gradient 1454*a7e14dcfSSatish Balay norm at each iteration. It can be turned on from the command line using the 1455*a7e14dcfSSatish Balay -tao_monitor option 1456*a7e14dcfSSatish Balay 1457*a7e14dcfSSatish Balay Collective on TaoSolver 1458*a7e14dcfSSatish Balay 1459*a7e14dcfSSatish Balay Input Parameters: 1460*a7e14dcfSSatish Balay + tao - the TaoSolver context 1461*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1462*a7e14dcfSSatish Balay 1463*a7e14dcfSSatish Balay Options Database Keys: 1464*a7e14dcfSSatish Balay . -tao_monitor 1465*a7e14dcfSSatish Balay 1466*a7e14dcfSSatish Balay Level: advanced 1467*a7e14dcfSSatish Balay 1468*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor() 1469*a7e14dcfSSatish Balay @*/ 1470*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultMonitor(TaoSolver tao, void *ctx) 1471*a7e14dcfSSatish Balay { 1472*a7e14dcfSSatish Balay PetscErrorCode ierr; 1473*a7e14dcfSSatish Balay PetscInt its; 1474*a7e14dcfSSatish Balay PetscReal fct,gnorm; 1475*a7e14dcfSSatish Balay PetscViewer viewer; 1476*a7e14dcfSSatish Balay PetscFunctionBegin; 1477*a7e14dcfSSatish Balay if (ctx) { 1478*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1479*a7e14dcfSSatish Balay } else { 1480*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1481*a7e14dcfSSatish Balay } 1482*a7e14dcfSSatish Balay its=tao->niter; 1483*a7e14dcfSSatish Balay fct=tao->fc; 1484*a7e14dcfSSatish Balay gnorm=tao->residual; 1485*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"iter = %3D,",its); CHKERRQ(ierr); 1486*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Function value: %G,",fct); CHKERRQ(ierr); 1487*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Residual: %G \n",gnorm);CHKERRQ(ierr); 1488*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1489*a7e14dcfSSatish Balay } 1490*a7e14dcfSSatish Balay 1491*a7e14dcfSSatish Balay 1492*a7e14dcfSSatish Balay 1493*a7e14dcfSSatish Balay #undef __FUNCT__ 1494*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultSMonitor" 1495*a7e14dcfSSatish Balay /*@C 1496*a7e14dcfSSatish Balay TaoDefaultSMonitor - Default routine for monitoring progress of the 1497*a7e14dcfSSatish Balay solver. Same as TaoDefaultMonitor() except 1498*a7e14dcfSSatish Balay it prints fewer digits of the residual as the residual gets smaller. 1499*a7e14dcfSSatish Balay This is because the later digits are meaningless and are often 1500*a7e14dcfSSatish Balay different on different machines; by using this routine different 1501*a7e14dcfSSatish Balay machines will usually generate the same output. It can be turned on 1502*a7e14dcfSSatish Balay by using the -tao_smonitor option 1503*a7e14dcfSSatish Balay 1504*a7e14dcfSSatish Balay Collective on TaoSolver 1505*a7e14dcfSSatish Balay 1506*a7e14dcfSSatish Balay Input Parameters: 1507*a7e14dcfSSatish Balay + tao - the TaoSolver context 1508*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1509*a7e14dcfSSatish Balay 1510*a7e14dcfSSatish Balay Options Database Keys: 1511*a7e14dcfSSatish Balay . -tao_smonitor 1512*a7e14dcfSSatish Balay 1513*a7e14dcfSSatish Balay Level: advanced 1514*a7e14dcfSSatish Balay 1515*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor() 1516*a7e14dcfSSatish Balay @*/ 1517*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultSMonitor(TaoSolver tao, void *ctx) 1518*a7e14dcfSSatish Balay { 1519*a7e14dcfSSatish Balay PetscErrorCode ierr; 1520*a7e14dcfSSatish Balay PetscInt its; 1521*a7e14dcfSSatish Balay PetscReal fct,gnorm; 1522*a7e14dcfSSatish Balay PetscViewer viewer; 1523*a7e14dcfSSatish Balay PetscFunctionBegin; 1524*a7e14dcfSSatish Balay if (ctx) { 1525*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1526*a7e14dcfSSatish Balay } else { 1527*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1528*a7e14dcfSSatish Balay } 1529*a7e14dcfSSatish Balay its=tao->niter; 1530*a7e14dcfSSatish Balay fct=tao->fc; 1531*a7e14dcfSSatish Balay gnorm=tao->residual; 1532*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"iter = %3D,",its); CHKERRQ(ierr); 1533*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Function value %G,",fct); CHKERRQ(ierr); 1534*a7e14dcfSSatish Balay if (gnorm > 1.e-6) { 1535*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Residual: %G \n",gnorm);CHKERRQ(ierr); 1536*a7e14dcfSSatish Balay } else if (gnorm > 1.e-11) { 1537*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Residual: < 1.0e-6 \n"); CHKERRQ(ierr); 1538*a7e14dcfSSatish Balay } else { 1539*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Residual: < 1.0e-11 \n");CHKERRQ(ierr); 1540*a7e14dcfSSatish Balay } 1541*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1542*a7e14dcfSSatish Balay } 1543*a7e14dcfSSatish Balay 1544*a7e14dcfSSatish Balay 1545*a7e14dcfSSatish Balay #undef __FUNCT__ 1546*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultCMonitor" 1547*a7e14dcfSSatish Balay /*@C 1548*a7e14dcfSSatish Balay TaoDefaultCMonitor - same as TaoDefaultMonitor() except 1549*a7e14dcfSSatish Balay it prints the norm of the constraints function. It can be turned on 1550*a7e14dcfSSatish Balay from the command line using the -tao_cmonitor option 1551*a7e14dcfSSatish Balay 1552*a7e14dcfSSatish Balay Collective on TaoSolver 1553*a7e14dcfSSatish Balay 1554*a7e14dcfSSatish Balay Input Parameters: 1555*a7e14dcfSSatish Balay + tao - the TaoSolver context 1556*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1557*a7e14dcfSSatish Balay 1558*a7e14dcfSSatish Balay Options Database Keys: 1559*a7e14dcfSSatish Balay . -tao_cmonitor 1560*a7e14dcfSSatish Balay 1561*a7e14dcfSSatish Balay Level: advanced 1562*a7e14dcfSSatish Balay 1563*a7e14dcfSSatish Balay .seealso: TaoDefaultMonitor(), TaoSetMonitor() 1564*a7e14dcfSSatish Balay @*/ 1565*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultCMonitor(TaoSolver tao, void *ctx) 1566*a7e14dcfSSatish Balay { 1567*a7e14dcfSSatish Balay PetscErrorCode ierr; 1568*a7e14dcfSSatish Balay PetscInt its; 1569*a7e14dcfSSatish Balay PetscReal fct,gnorm; 1570*a7e14dcfSSatish Balay PetscViewer viewer; 1571*a7e14dcfSSatish Balay 1572*a7e14dcfSSatish Balay PetscFunctionBegin; 1573*a7e14dcfSSatish Balay if (ctx) { 1574*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1575*a7e14dcfSSatish Balay } else { 1576*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1577*a7e14dcfSSatish Balay } 1578*a7e14dcfSSatish Balay its=tao->niter; 1579*a7e14dcfSSatish Balay fct=tao->fc; 1580*a7e14dcfSSatish Balay gnorm=tao->residual; 1581*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer,"iter = %D,",its); CHKERRQ(ierr); 1582*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Function value: %G,",fct); CHKERRQ(ierr); 1583*a7e14dcfSSatish Balay ierr=PetscViewerASCIIPrintf(viewer," Residual: %G ",gnorm);CHKERRQ(ierr); 1584*a7e14dcfSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," Constraint: %G \n",tao->cnorm); CHKERRQ(ierr); 1585*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1586*a7e14dcfSSatish Balay } 1587*a7e14dcfSSatish Balay 1588*a7e14dcfSSatish Balay 1589*a7e14dcfSSatish Balay 1590*a7e14dcfSSatish Balay 1591*a7e14dcfSSatish Balay 1592*a7e14dcfSSatish Balay #undef __FUNCT__ 1593*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolutionMonitor" 1594*a7e14dcfSSatish Balay /*@C 1595*a7e14dcfSSatish Balay TaoSolutionMonitor - Views the solution at each iteration 1596*a7e14dcfSSatish Balay It can be turned on from the command line using the 1597*a7e14dcfSSatish Balay -tao_view_solution option 1598*a7e14dcfSSatish Balay 1599*a7e14dcfSSatish Balay Collective on TaoSolver 1600*a7e14dcfSSatish Balay 1601*a7e14dcfSSatish Balay Input Parameters: 1602*a7e14dcfSSatish Balay + tao - the TaoSolver context 1603*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1604*a7e14dcfSSatish Balay 1605*a7e14dcfSSatish Balay Options Database Keys: 1606*a7e14dcfSSatish Balay . -tao_view_solution 1607*a7e14dcfSSatish Balay 1608*a7e14dcfSSatish Balay Level: advanced 1609*a7e14dcfSSatish Balay 1610*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor() 1611*a7e14dcfSSatish Balay @*/ 1612*a7e14dcfSSatish Balay PetscErrorCode TaoSolutionMonitor(TaoSolver tao, void *ctx) 1613*a7e14dcfSSatish Balay { 1614*a7e14dcfSSatish Balay PetscErrorCode ierr; 1615*a7e14dcfSSatish Balay PetscViewer viewer; 1616*a7e14dcfSSatish Balay PetscFunctionBegin; 1617*a7e14dcfSSatish Balay if (ctx) { 1618*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1619*a7e14dcfSSatish Balay } else { 1620*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1621*a7e14dcfSSatish Balay } 1622*a7e14dcfSSatish Balay ierr = VecView(tao->solution, viewer); CHKERRQ(ierr); 1623*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1624*a7e14dcfSSatish Balay } 1625*a7e14dcfSSatish Balay 1626*a7e14dcfSSatish Balay #undef __FUNCT__ 1627*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGradientMonitor" 1628*a7e14dcfSSatish Balay /*@C 1629*a7e14dcfSSatish Balay TaoGradientMonitor - Views the gradient at each iteration 1630*a7e14dcfSSatish Balay It can be turned on from the command line using the 1631*a7e14dcfSSatish Balay -tao_view_gradient option 1632*a7e14dcfSSatish Balay 1633*a7e14dcfSSatish Balay Collective on TaoSolver 1634*a7e14dcfSSatish Balay 1635*a7e14dcfSSatish Balay Input Parameters: 1636*a7e14dcfSSatish Balay + tao - the TaoSolver context 1637*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1638*a7e14dcfSSatish Balay 1639*a7e14dcfSSatish Balay Options Database Keys: 1640*a7e14dcfSSatish Balay . -tao_view_gradient 1641*a7e14dcfSSatish Balay 1642*a7e14dcfSSatish Balay Level: advanced 1643*a7e14dcfSSatish Balay 1644*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor() 1645*a7e14dcfSSatish Balay @*/ 1646*a7e14dcfSSatish Balay PetscErrorCode TaoGradientMonitor(TaoSolver tao, void *ctx) 1647*a7e14dcfSSatish Balay { 1648*a7e14dcfSSatish Balay PetscErrorCode ierr; 1649*a7e14dcfSSatish Balay PetscViewer viewer; 1650*a7e14dcfSSatish Balay PetscFunctionBegin; 1651*a7e14dcfSSatish Balay if (ctx) { 1652*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1653*a7e14dcfSSatish Balay } else { 1654*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1655*a7e14dcfSSatish Balay } 1656*a7e14dcfSSatish Balay ierr = VecView(tao->gradient, viewer); CHKERRQ(ierr); 1657*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1658*a7e14dcfSSatish Balay } 1659*a7e14dcfSSatish Balay 1660*a7e14dcfSSatish Balay #undef __FUNCT__ 1661*a7e14dcfSSatish Balay #define __FUNCT__ "TaoStepDirectionMonitor" 1662*a7e14dcfSSatish Balay /*@C 1663*a7e14dcfSSatish Balay TaoStepDirectionMonitor - Views the gradient at each iteration 1664*a7e14dcfSSatish Balay It can be turned on from the command line using the 1665*a7e14dcfSSatish Balay -tao_view_gradient option 1666*a7e14dcfSSatish Balay 1667*a7e14dcfSSatish Balay Collective on TaoSolver 1668*a7e14dcfSSatish Balay 1669*a7e14dcfSSatish Balay Input Parameters: 1670*a7e14dcfSSatish Balay + tao - the TaoSolver context 1671*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1672*a7e14dcfSSatish Balay 1673*a7e14dcfSSatish Balay Options Database Keys: 1674*a7e14dcfSSatish Balay . -tao_view_gradient 1675*a7e14dcfSSatish Balay 1676*a7e14dcfSSatish Balay Level: advanced 1677*a7e14dcfSSatish Balay 1678*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor() 1679*a7e14dcfSSatish Balay @*/ 1680*a7e14dcfSSatish Balay PetscErrorCode TaoStepDirectionMonitor(TaoSolver tao, void *ctx) 1681*a7e14dcfSSatish Balay { 1682*a7e14dcfSSatish Balay PetscErrorCode ierr; 1683*a7e14dcfSSatish Balay PetscViewer viewer; 1684*a7e14dcfSSatish Balay PetscFunctionBegin; 1685*a7e14dcfSSatish Balay if (ctx) { 1686*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1687*a7e14dcfSSatish Balay } else { 1688*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1689*a7e14dcfSSatish Balay } 1690*a7e14dcfSSatish Balay ierr = VecView(tao->stepdirection, viewer); CHKERRQ(ierr); 1691*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1692*a7e14dcfSSatish Balay } 1693*a7e14dcfSSatish Balay 1694*a7e14dcfSSatish Balay 1695*a7e14dcfSSatish Balay #undef __FUNCT__ 1696*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawSolutionMonitor" 1697*a7e14dcfSSatish Balay /*@C 1698*a7e14dcfSSatish Balay TaoDrawSolutionMonitor - Plots the solution at each iteration 1699*a7e14dcfSSatish Balay It can be turned on from the command line using the 1700*a7e14dcfSSatish Balay -tao_draw_solution option 1701*a7e14dcfSSatish Balay 1702*a7e14dcfSSatish Balay Collective on TaoSolver 1703*a7e14dcfSSatish Balay 1704*a7e14dcfSSatish Balay Input Parameters: 1705*a7e14dcfSSatish Balay + tao - the TaoSolver context 1706*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1707*a7e14dcfSSatish Balay 1708*a7e14dcfSSatish Balay Options Database Keys: 1709*a7e14dcfSSatish Balay . -tao_draw_solution 1710*a7e14dcfSSatish Balay 1711*a7e14dcfSSatish Balay Level: advanced 1712*a7e14dcfSSatish Balay 1713*a7e14dcfSSatish Balay .seealso: TaoSolutionMonitor(), TaoSetMonitor(), TaoDrawGradientMonitor 1714*a7e14dcfSSatish Balay @*/ 1715*a7e14dcfSSatish Balay PetscErrorCode TaoDrawSolutionMonitor(TaoSolver tao, void *ctx) 1716*a7e14dcfSSatish Balay { 1717*a7e14dcfSSatish Balay PetscErrorCode ierr; 1718*a7e14dcfSSatish Balay PetscViewer viewer = (PetscViewer) ctx; 1719*a7e14dcfSSatish Balay MPI_Comm comm; 1720*a7e14dcfSSatish Balay PetscFunctionBegin; 1721*a7e14dcfSSatish Balay if (!viewer) { 1722*a7e14dcfSSatish Balay ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr); 1723*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_DRAW_(comm); 1724*a7e14dcfSSatish Balay } 1725*a7e14dcfSSatish Balay ierr = VecView(tao->solution, viewer); CHKERRQ(ierr); 1726*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1727*a7e14dcfSSatish Balay } 1728*a7e14dcfSSatish Balay 1729*a7e14dcfSSatish Balay #undef __FUNCT__ 1730*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawGradientMonitor" 1731*a7e14dcfSSatish Balay /*@C 1732*a7e14dcfSSatish Balay TaoDrawGradientMonitor - Plots the gradient at each iteration 1733*a7e14dcfSSatish Balay It can be turned on from the command line using the 1734*a7e14dcfSSatish Balay -tao_draw_gradient option 1735*a7e14dcfSSatish Balay 1736*a7e14dcfSSatish Balay Collective on TaoSolver 1737*a7e14dcfSSatish Balay 1738*a7e14dcfSSatish Balay Input Parameters: 1739*a7e14dcfSSatish Balay + tao - the TaoSolver context 1740*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1741*a7e14dcfSSatish Balay 1742*a7e14dcfSSatish Balay Options Database Keys: 1743*a7e14dcfSSatish Balay . -tao_draw_gradient 1744*a7e14dcfSSatish Balay 1745*a7e14dcfSSatish Balay Level: advanced 1746*a7e14dcfSSatish Balay 1747*a7e14dcfSSatish Balay .seealso: TaoGradientMonitor(), TaoSetMonitor(), TaoDrawSolutionMonitor 1748*a7e14dcfSSatish Balay @*/ 1749*a7e14dcfSSatish Balay PetscErrorCode TaoDrawGradientMonitor(TaoSolver tao, void *ctx) 1750*a7e14dcfSSatish Balay { 1751*a7e14dcfSSatish Balay PetscErrorCode ierr; 1752*a7e14dcfSSatish Balay PetscViewer viewer = (PetscViewer)ctx; 1753*a7e14dcfSSatish Balay MPI_Comm comm; 1754*a7e14dcfSSatish Balay PetscFunctionBegin; 1755*a7e14dcfSSatish Balay if (!viewer) { 1756*a7e14dcfSSatish Balay ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr); 1757*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_DRAW_(comm); 1758*a7e14dcfSSatish Balay } 1759*a7e14dcfSSatish Balay ierr = VecView(tao->gradient, viewer); CHKERRQ(ierr); 1760*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1761*a7e14dcfSSatish Balay } 1762*a7e14dcfSSatish Balay 1763*a7e14dcfSSatish Balay #undef __FUNCT__ 1764*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDrawStepMonitor" 1765*a7e14dcfSSatish Balay /*@C 1766*a7e14dcfSSatish Balay TaoDrawStepMonitor - Plots the step direction at each iteration 1767*a7e14dcfSSatish Balay It can be turned on from the command line using the 1768*a7e14dcfSSatish Balay -tao_draw_step option 1769*a7e14dcfSSatish Balay 1770*a7e14dcfSSatish Balay Collective on TaoSolver 1771*a7e14dcfSSatish Balay 1772*a7e14dcfSSatish Balay Input Parameters: 1773*a7e14dcfSSatish Balay + tao - the TaoSolver context 1774*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1775*a7e14dcfSSatish Balay 1776*a7e14dcfSSatish Balay Options Database Keys: 1777*a7e14dcfSSatish Balay . -tao_draw_step 1778*a7e14dcfSSatish Balay 1779*a7e14dcfSSatish Balay Level: advanced 1780*a7e14dcfSSatish Balay 1781*a7e14dcfSSatish Balay .seealso: TaoSetMonitor(), TaoDrawSolutionMonitor 1782*a7e14dcfSSatish Balay @*/ 1783*a7e14dcfSSatish Balay PetscErrorCode TaoDrawStepMonitor(TaoSolver tao, void *ctx) 1784*a7e14dcfSSatish Balay { 1785*a7e14dcfSSatish Balay PetscErrorCode ierr; 1786*a7e14dcfSSatish Balay PetscViewer viewer = (PetscViewer)(ctx); 1787*a7e14dcfSSatish Balay MPI_Comm comm; 1788*a7e14dcfSSatish Balay PetscFunctionBegin; 1789*a7e14dcfSSatish Balay if (!viewer) { 1790*a7e14dcfSSatish Balay ierr = PetscObjectGetComm((PetscObject)tao,&comm); CHKERRQ(ierr); 1791*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_DRAW_(comm); 1792*a7e14dcfSSatish Balay } 1793*a7e14dcfSSatish Balay ierr = VecView(tao->stepdirection, viewer); CHKERRQ(ierr); 1794*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1795*a7e14dcfSSatish Balay } 1796*a7e14dcfSSatish Balay 1797*a7e14dcfSSatish Balay 1798*a7e14dcfSSatish Balay #undef __FUNCT__ 1799*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSeparableObjectiveMonitor" 1800*a7e14dcfSSatish Balay /*@C 1801*a7e14dcfSSatish Balay TaoSeparableObjectiveMonitor - Views the separable objective function at each iteration 1802*a7e14dcfSSatish Balay It can be turned on from the command line using the 1803*a7e14dcfSSatish Balay -tao_view_separableobjective option 1804*a7e14dcfSSatish Balay 1805*a7e14dcfSSatish Balay Collective on TaoSolver 1806*a7e14dcfSSatish Balay 1807*a7e14dcfSSatish Balay Input Parameters: 1808*a7e14dcfSSatish Balay + tao - the TaoSolver context 1809*a7e14dcfSSatish Balay - ctx - PetscViewer context or PETSC_NULL 1810*a7e14dcfSSatish Balay 1811*a7e14dcfSSatish Balay Options Database Keys: 1812*a7e14dcfSSatish Balay . -tao_view_separableobjective 1813*a7e14dcfSSatish Balay 1814*a7e14dcfSSatish Balay Level: advanced 1815*a7e14dcfSSatish Balay 1816*a7e14dcfSSatish Balay .seealso: TaoDefaultSMonitor(), TaoSetMonitor() 1817*a7e14dcfSSatish Balay @*/ 1818*a7e14dcfSSatish Balay PetscErrorCode TaoSeparableObjectiveMonitor(TaoSolver tao, void *ctx) 1819*a7e14dcfSSatish Balay { 1820*a7e14dcfSSatish Balay PetscErrorCode ierr; 1821*a7e14dcfSSatish Balay PetscViewer viewer; 1822*a7e14dcfSSatish Balay PetscFunctionBegin; 1823*a7e14dcfSSatish Balay if (ctx) { 1824*a7e14dcfSSatish Balay viewer = (PetscViewer)ctx; 1825*a7e14dcfSSatish Balay } else { 1826*a7e14dcfSSatish Balay viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm); 1827*a7e14dcfSSatish Balay } 1828*a7e14dcfSSatish Balay ierr = VecView(tao->sep_objective,viewer); CHKERRQ(ierr); 1829*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1830*a7e14dcfSSatish Balay } 1831*a7e14dcfSSatish Balay 1832*a7e14dcfSSatish Balay #undef __FUNCT__ 1833*a7e14dcfSSatish Balay #define __FUNCT__ "TaoDefaultConvergenceTest" 1834*a7e14dcfSSatish Balay /*@C 1835*a7e14dcfSSatish Balay TaoDefaultConvergenceTest - Determines whether the solver should continue iterating 1836*a7e14dcfSSatish Balay or terminate. 1837*a7e14dcfSSatish Balay 1838*a7e14dcfSSatish Balay Collective on TaoSolver 1839*a7e14dcfSSatish Balay 1840*a7e14dcfSSatish Balay Input Parameters: 1841*a7e14dcfSSatish Balay + tao - the TaoSolver context 1842*a7e14dcfSSatish Balay - dummy - unused dummy context 1843*a7e14dcfSSatish Balay 1844*a7e14dcfSSatish Balay Output Parameter: 1845*a7e14dcfSSatish Balay . reason - for terminating 1846*a7e14dcfSSatish Balay 1847*a7e14dcfSSatish Balay Notes: 1848*a7e14dcfSSatish Balay This routine checks the residual in the optimality conditions, the 1849*a7e14dcfSSatish Balay relative residual in the optimity conditions, the number of function 1850*a7e14dcfSSatish Balay evaluations, and the function value to test convergence. Some 1851*a7e14dcfSSatish Balay solvers may use different convergence routines. 1852*a7e14dcfSSatish Balay 1853*a7e14dcfSSatish Balay Level: developer 1854*a7e14dcfSSatish Balay 1855*a7e14dcfSSatish Balay .seealso: TaoSetTolerances(),TaoGetTerminationReason(),TaoSetTerminationReason() 1856*a7e14dcfSSatish Balay @*/ 1857*a7e14dcfSSatish Balay 1858*a7e14dcfSSatish Balay PetscErrorCode TaoDefaultConvergenceTest(TaoSolver tao,void *dummy) 1859*a7e14dcfSSatish Balay { 1860*a7e14dcfSSatish Balay PetscInt niter=tao->niter, nfuncs=PetscMax(tao->nfuncs,tao->nfuncgrads); 1861*a7e14dcfSSatish Balay PetscInt max_funcs=tao->max_funcs; 1862*a7e14dcfSSatish Balay PetscReal gnorm=tao->residual, gnorm0=tao->gnorm0; 1863*a7e14dcfSSatish Balay PetscReal f=tao->fc, steptol=tao->steptol,trradius=tao->step; 1864*a7e14dcfSSatish Balay PetscReal gatol=tao->gatol,grtol=tao->grtol,gttol=tao->gttol; 1865*a7e14dcfSSatish Balay PetscReal fatol=tao->fatol,frtol=tao->frtol,catol=tao->catol,crtol=tao->crtol; 1866*a7e14dcfSSatish Balay PetscReal fmin=tao->fmin, cnorm=tao->cnorm, cnorm0=tao->cnorm0; 1867*a7e14dcfSSatish Balay PetscReal gnorm2; 1868*a7e14dcfSSatish Balay TaoSolverTerminationReason reason=tao->reason; 1869*a7e14dcfSSatish Balay PetscErrorCode ierr; 1870*a7e14dcfSSatish Balay 1871*a7e14dcfSSatish Balay PetscFunctionBegin; 1872*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao, TAOSOLVER_CLASSID,1); 1873*a7e14dcfSSatish Balay 1874*a7e14dcfSSatish Balay if (reason != TAO_CONTINUE_ITERATING) { 1875*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1876*a7e14dcfSSatish Balay } 1877*a7e14dcfSSatish Balay gnorm2=gnorm*gnorm; 1878*a7e14dcfSSatish Balay 1879*a7e14dcfSSatish Balay if (PetscIsInfOrNanReal(f)) { 1880*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Failed to converged, function value is Inf or NaN\n"); CHKERRQ(ierr); 1881*a7e14dcfSSatish Balay reason = TAO_DIVERGED_NAN; 1882*a7e14dcfSSatish Balay } else if (f <= fmin && cnorm <=catol) { 1883*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to function value %G < minimum function value %G\n", f,fmin); CHKERRQ(ierr); 1884*a7e14dcfSSatish Balay reason = TAO_CONVERGED_MINF; 1885*a7e14dcfSSatish Balay } else if (gnorm2 <= fatol && cnorm <=catol) { 1886*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to estimated f(X) - f(X*) = %G < %G\n",gnorm2,fatol); CHKERRQ(ierr); 1887*a7e14dcfSSatish Balay reason = TAO_CONVERGED_FATOL; 1888*a7e14dcfSSatish Balay } else if (f != 0 && gnorm2 / PetscAbsReal(f)<= frtol && cnorm/PetscMax(cnorm0,1.0) <= crtol) { 1889*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to estimated |f(X)-f(X*)|/f(X) = %G < %G\n",gnorm2/PetscAbsReal(f),frtol); CHKERRQ(ierr); 1890*a7e14dcfSSatish Balay reason = TAO_CONVERGED_FRTOL; 1891*a7e14dcfSSatish Balay } else if (gnorm<= gatol && cnorm <=catol) { 1892*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to residual norm ||g(X)||=%G < %G\n",gnorm,gatol); CHKERRQ(ierr); 1893*a7e14dcfSSatish Balay reason = TAO_CONVERGED_GATOL; 1894*a7e14dcfSSatish Balay } else if ( f!=0 && PetscAbsReal(gnorm/f) <= grtol && cnorm <= crtol) { 1895*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to residual ||g(X)||/|f(X)| =%G < %G\n",gnorm/f,grtol); CHKERRQ(ierr); 1896*a7e14dcfSSatish Balay reason = TAO_CONVERGED_GRTOL; 1897*a7e14dcfSSatish Balay } else if (gnorm0 != 0 && gnorm/gnorm0 <= gttol && cnorm <= crtol) { 1898*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Converged due to relative residual norm ||g(X)||/||g(X0)|| = %G < %G\n",gnorm/gnorm0,gttol); CHKERRQ(ierr); 1899*a7e14dcfSSatish Balay reason = TAO_CONVERGED_GTTOL; 1900*a7e14dcfSSatish Balay } else if (nfuncs > max_funcs){ 1901*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Exceeded maximum number of function evaluations: %D > %D\n", nfuncs,max_funcs); CHKERRQ(ierr); 1902*a7e14dcfSSatish Balay reason = TAO_DIVERGED_MAXFCN; 1903*a7e14dcfSSatish Balay } else if ( tao->lsflag != 0 ){ 1904*a7e14dcfSSatish Balay ierr = PetscInfo(tao,"Tao Line Search failure.\n"); CHKERRQ(ierr); 1905*a7e14dcfSSatish Balay reason = TAO_DIVERGED_LS_FAILURE; 1906*a7e14dcfSSatish Balay } else if (trradius < steptol && niter > 0){ 1907*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Trust region/step size too small: %G < %G\n", trradius,steptol); CHKERRQ(ierr); 1908*a7e14dcfSSatish Balay reason = TAO_CONVERGED_STEPTOL; 1909*a7e14dcfSSatish Balay } else if (niter > tao->max_it) { 1910*a7e14dcfSSatish Balay ierr = PetscInfo2(tao,"Exceeded maximum number of iterations: %D > %D\n",niter,tao->max_it); CHKERRQ(ierr); 1911*a7e14dcfSSatish Balay reason = TAO_DIVERGED_MAXITS; 1912*a7e14dcfSSatish Balay } else { 1913*a7e14dcfSSatish Balay reason = TAO_CONTINUE_ITERATING; 1914*a7e14dcfSSatish Balay } 1915*a7e14dcfSSatish Balay tao->reason = reason; 1916*a7e14dcfSSatish Balay 1917*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1918*a7e14dcfSSatish Balay } 1919*a7e14dcfSSatish Balay 1920*a7e14dcfSSatish Balay #undef __FUNCT__ 1921*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetOptionsPrefix" 1922*a7e14dcfSSatish Balay /*@C 1923*a7e14dcfSSatish Balay TaoSetOptionsPrefix - Sets the prefix used for searching for all 1924*a7e14dcfSSatish Balay TAO options in the database. 1925*a7e14dcfSSatish Balay 1926*a7e14dcfSSatish Balay 1927*a7e14dcfSSatish Balay Logically Collective on TaoSolver 1928*a7e14dcfSSatish Balay 1929*a7e14dcfSSatish Balay Input Parameters: 1930*a7e14dcfSSatish Balay + tao - the TaoSolver context 1931*a7e14dcfSSatish Balay - prefix - the prefix string to prepend to all TAO option requests 1932*a7e14dcfSSatish Balay 1933*a7e14dcfSSatish Balay Notes: 1934*a7e14dcfSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 1935*a7e14dcfSSatish Balay The first character of all runtime options is AUTOMATICALLY the hyphen. 1936*a7e14dcfSSatish Balay 1937*a7e14dcfSSatish Balay For example, to distinguish between the runtime options for two 1938*a7e14dcfSSatish Balay different TAO solvers, one could call 1939*a7e14dcfSSatish Balay .vb 1940*a7e14dcfSSatish Balay TaoSetOptionsPrefix(tao1,"sys1_") 1941*a7e14dcfSSatish Balay TaoSetOptionsPrefix(tao2,"sys2_") 1942*a7e14dcfSSatish Balay .ve 1943*a7e14dcfSSatish Balay 1944*a7e14dcfSSatish Balay This would enable use of different options for each system, such as 1945*a7e14dcfSSatish Balay .vb 1946*a7e14dcfSSatish Balay -sys1_tao_method blmvm -sys1_tao_gtol 1.e-3 1947*a7e14dcfSSatish Balay -sys2_tao_method lmvm -sys2_tao_gtol 1.e-4 1948*a7e14dcfSSatish Balay .ve 1949*a7e14dcfSSatish Balay 1950*a7e14dcfSSatish Balay 1951*a7e14dcfSSatish Balay Level: advanced 1952*a7e14dcfSSatish Balay 1953*a7e14dcfSSatish Balay .seealso: TaoAppendOptionsPrefix(), TaoGetOptionsPrefix() 1954*a7e14dcfSSatish Balay @*/ 1955*a7e14dcfSSatish Balay 1956*a7e14dcfSSatish Balay PetscErrorCode TaoSetOptionsPrefix(TaoSolver tao, const char p[]) 1957*a7e14dcfSSatish Balay { 1958*a7e14dcfSSatish Balay PetscErrorCode ierr; 1959*a7e14dcfSSatish Balay PetscFunctionBegin; 1960*a7e14dcfSSatish Balay ierr = PetscObjectSetOptionsPrefix((PetscObject)tao,p); CHKERRQ(ierr); 1961*a7e14dcfSSatish Balay if (tao->linesearch) { 1962*a7e14dcfSSatish Balay ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,p); CHKERRQ(ierr); 1963*a7e14dcfSSatish Balay } 1964*a7e14dcfSSatish Balay if (tao->ksp) { 1965*a7e14dcfSSatish Balay ierr = KSPSetOptionsPrefix(tao->ksp,p); CHKERRQ(ierr); 1966*a7e14dcfSSatish Balay } 1967*a7e14dcfSSatish Balay PetscFunctionReturn(0); 1968*a7e14dcfSSatish Balay } 1969*a7e14dcfSSatish Balay 1970*a7e14dcfSSatish Balay #undef __FUNCT__ 1971*a7e14dcfSSatish Balay #define __FUNCT__ "TaoAppendOptionsPrefix" 1972*a7e14dcfSSatish Balay /*@C 1973*a7e14dcfSSatish Balay TaoAppendOptionsPrefix - Appends to the prefix used for searching for all 1974*a7e14dcfSSatish Balay TAO options in the database. 1975*a7e14dcfSSatish Balay 1976*a7e14dcfSSatish Balay 1977*a7e14dcfSSatish Balay Logically Collective on TaoSolver 1978*a7e14dcfSSatish Balay 1979*a7e14dcfSSatish Balay Input Parameters: 1980*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 1981*a7e14dcfSSatish Balay - prefix - the prefix string to prepend to all TAO option requests 1982*a7e14dcfSSatish Balay 1983*a7e14dcfSSatish Balay Notes: 1984*a7e14dcfSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 1985*a7e14dcfSSatish Balay The first character of all runtime options is AUTOMATICALLY the hyphen. 1986*a7e14dcfSSatish Balay 1987*a7e14dcfSSatish Balay 1988*a7e14dcfSSatish Balay Level: advanced 1989*a7e14dcfSSatish Balay 1990*a7e14dcfSSatish Balay .seealso: TaoSetOptionsPrefix(), TaoGetOptionsPrefix() 1991*a7e14dcfSSatish Balay @*/ 1992*a7e14dcfSSatish Balay PetscErrorCode TaoAppendOptionsPrefix(TaoSolver tao, const char p[]) 1993*a7e14dcfSSatish Balay { 1994*a7e14dcfSSatish Balay PetscErrorCode ierr; 1995*a7e14dcfSSatish Balay PetscFunctionBegin; 1996*a7e14dcfSSatish Balay ierr = PetscObjectAppendOptionsPrefix((PetscObject)tao,p); CHKERRQ(ierr); 1997*a7e14dcfSSatish Balay if (tao->linesearch) { 1998*a7e14dcfSSatish Balay ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,p); CHKERRQ(ierr); 1999*a7e14dcfSSatish Balay } 2000*a7e14dcfSSatish Balay if (tao->ksp) { 2001*a7e14dcfSSatish Balay ierr = KSPSetOptionsPrefix(tao->ksp,p); CHKERRQ(ierr); 2002*a7e14dcfSSatish Balay } 2003*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2004*a7e14dcfSSatish Balay } 2005*a7e14dcfSSatish Balay 2006*a7e14dcfSSatish Balay #undef __FUNCT__ 2007*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetOptionsPrefix" 2008*a7e14dcfSSatish Balay /*@C 2009*a7e14dcfSSatish Balay TaoGetOptionsPrefix - Gets the prefix used for searching for all 2010*a7e14dcfSSatish Balay TAO options in the database 2011*a7e14dcfSSatish Balay 2012*a7e14dcfSSatish Balay Not Collective 2013*a7e14dcfSSatish Balay 2014*a7e14dcfSSatish Balay Input Parameters: 2015*a7e14dcfSSatish Balay . tao - the TaoSolver context 2016*a7e14dcfSSatish Balay 2017*a7e14dcfSSatish Balay Output Parameters: 2018*a7e14dcfSSatish Balay . prefix - pointer to the prefix string used is returned 2019*a7e14dcfSSatish Balay 2020*a7e14dcfSSatish Balay Notes: On the fortran side, the user should pass in a string 'prefix' of 2021*a7e14dcfSSatish Balay sufficient length to hold the prefix. 2022*a7e14dcfSSatish Balay 2023*a7e14dcfSSatish Balay Level: advanced 2024*a7e14dcfSSatish Balay 2025*a7e14dcfSSatish Balay .seealso: TaoSetOptionsPrefix(), TaoAppendOptionsPrefix() 2026*a7e14dcfSSatish Balay @*/ 2027*a7e14dcfSSatish Balay PetscErrorCode TaoGetOptionsPrefix(TaoSolver tao, const char *p[]) 2028*a7e14dcfSSatish Balay { 2029*a7e14dcfSSatish Balay PetscObjectGetOptionsPrefix((PetscObject)tao,p); 2030*a7e14dcfSSatish Balay return 0; 2031*a7e14dcfSSatish Balay } 2032*a7e14dcfSSatish Balay 2033*a7e14dcfSSatish Balay #undef __FUNCT__ 2034*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaultKSPType" 2035*a7e14dcfSSatish Balay /*@ 2036*a7e14dcfSSatish Balay TaoSetDefaultKSPType - Sets the default KSP type if a KSP object 2037*a7e14dcfSSatish Balay is created. 2038*a7e14dcfSSatish Balay 2039*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2040*a7e14dcfSSatish Balay 2041*a7e14dcfSSatish Balay InputParameters: 2042*a7e14dcfSSatish Balay + tao - the TaoSolver context 2043*a7e14dcfSSatish Balay - ktype - the KSP type TAO will use by default 2044*a7e14dcfSSatish Balay 2045*a7e14dcfSSatish Balay Note: Some solvers may require a particular KSP type and will not work 2046*a7e14dcfSSatish Balay correctly if the default value is changed 2047*a7e14dcfSSatish Balay 2048*a7e14dcfSSatish Balay Options Database Key: 2049*a7e14dcfSSatish Balay - tao_ksp_type 2050*a7e14dcfSSatish Balay 2051*a7e14dcfSSatish Balay Level: advanced 2052*a7e14dcfSSatish Balay @*/ 2053*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultKSPType(TaoSolver tao, KSPType ktype) 2054*a7e14dcfSSatish Balay { 2055*a7e14dcfSSatish Balay const char *prefix=0; 2056*a7e14dcfSSatish Balay char *option=0; 2057*a7e14dcfSSatish Balay size_t n1,n2; 2058*a7e14dcfSSatish Balay PetscErrorCode ierr; 2059*a7e14dcfSSatish Balay PetscFunctionBegin; 2060*a7e14dcfSSatish Balay 2061*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2062*a7e14dcfSSatish Balay ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr); 2063*a7e14dcfSSatish Balay ierr = PetscStrlen(prefix,&n1); 2064*a7e14dcfSSatish Balay ierr = PetscStrlen("_ksp_type",&n2); 2065*a7e14dcfSSatish Balay ierr = PetscMalloc(n1+n2+1,&option); 2066*a7e14dcfSSatish Balay ierr = PetscStrncpy(option,prefix,n1+1); 2067*a7e14dcfSSatish Balay ierr = PetscStrncat(option,"_ksp_type",n2+1); 2068*a7e14dcfSSatish Balay ierr = PetscOptionsSetValue(option,ktype); CHKERRQ(ierr); 2069*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2070*a7e14dcfSSatish Balay } 2071*a7e14dcfSSatish Balay 2072*a7e14dcfSSatish Balay #undef __FUNCT__ 2073*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaulLineSearchType" 2074*a7e14dcfSSatish Balay /*@ 2075*a7e14dcfSSatish Balay TaoSetDefaultLineSearchType - Sets the default LineSearch type if a LineSearch object 2076*a7e14dcfSSatish Balay is created. 2077*a7e14dcfSSatish Balay 2078*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2079*a7e14dcfSSatish Balay 2080*a7e14dcfSSatish Balay InputParameters: 2081*a7e14dcfSSatish Balay + tao - the TaoSolver context 2082*a7e14dcfSSatish Balay - lstype - the line search type TAO will use by default 2083*a7e14dcfSSatish Balay 2084*a7e14dcfSSatish Balay Note: Some solvers may require a particular line search type and will not work 2085*a7e14dcfSSatish Balay correctly if the default value is changed 2086*a7e14dcfSSatish Balay 2087*a7e14dcfSSatish Balay Options Database Key: 2088*a7e14dcfSSatish Balay - tao_ls_type 2089*a7e14dcfSSatish Balay 2090*a7e14dcfSSatish Balay Level: advanced 2091*a7e14dcfSSatish Balay @*/ 2092*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultLineSearchType(TaoSolver tao, TaoLineSearchType lstype) 2093*a7e14dcfSSatish Balay { 2094*a7e14dcfSSatish Balay const char *prefix=0; 2095*a7e14dcfSSatish Balay char *option=0; 2096*a7e14dcfSSatish Balay size_t n1,n2; 2097*a7e14dcfSSatish Balay PetscErrorCode ierr; 2098*a7e14dcfSSatish Balay PetscFunctionBegin; 2099*a7e14dcfSSatish Balay 2100*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2101*a7e14dcfSSatish Balay ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr); 2102*a7e14dcfSSatish Balay ierr = PetscStrlen(prefix,&n1); 2103*a7e14dcfSSatish Balay ierr = PetscStrlen("_ls_type",&n2); 2104*a7e14dcfSSatish Balay ierr = PetscMalloc(n1+n2+1,&option); 2105*a7e14dcfSSatish Balay ierr = PetscStrncpy(option,prefix,n1+1); 2106*a7e14dcfSSatish Balay ierr = PetscStrncat(option,"_ls_type",n2+1); 2107*a7e14dcfSSatish Balay ierr = PetscOptionsSetValue(option,lstype); CHKERRQ(ierr); 2108*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2109*a7e14dcfSSatish Balay } 2110*a7e14dcfSSatish Balay 2111*a7e14dcfSSatish Balay #undef __FUNCT__ 2112*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetDefaultPCType" 2113*a7e14dcfSSatish Balay /*@ 2114*a7e14dcfSSatish Balay TaoSetDefaultPCType - Sets the default PC type if a PC object 2115*a7e14dcfSSatish Balay is created. 2116*a7e14dcfSSatish Balay 2117*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2118*a7e14dcfSSatish Balay 2119*a7e14dcfSSatish Balay InputParameters: 2120*a7e14dcfSSatish Balay + tao - the TaoSolver context 2121*a7e14dcfSSatish Balay - pctype - the preconditioner type TAO will use by default 2122*a7e14dcfSSatish Balay 2123*a7e14dcfSSatish Balay Note: Some solvers may require a particular PC type and will not work 2124*a7e14dcfSSatish Balay correctly if the default value is changed 2125*a7e14dcfSSatish Balay 2126*a7e14dcfSSatish Balay Options Database Key: 2127*a7e14dcfSSatish Balay - tao_pc_type 2128*a7e14dcfSSatish Balay 2129*a7e14dcfSSatish Balay Level: advanced 2130*a7e14dcfSSatish Balay @*/ 2131*a7e14dcfSSatish Balay PetscErrorCode TaoSetDefaultPCType(TaoSolver tao, PCType pctype) 2132*a7e14dcfSSatish Balay { 2133*a7e14dcfSSatish Balay 2134*a7e14dcfSSatish Balay const char *prefix=0; 2135*a7e14dcfSSatish Balay char *option=0; 2136*a7e14dcfSSatish Balay size_t n1,n2; 2137*a7e14dcfSSatish Balay PetscErrorCode ierr; 2138*a7e14dcfSSatish Balay PetscFunctionBegin; 2139*a7e14dcfSSatish Balay 2140*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2141*a7e14dcfSSatish Balay ierr = TaoGetOptionsPrefix(tao,&prefix); CHKERRQ(ierr); 2142*a7e14dcfSSatish Balay ierr = PetscStrlen(prefix,&n1); 2143*a7e14dcfSSatish Balay ierr = PetscStrlen("_pc_type",&n2); 2144*a7e14dcfSSatish Balay ierr = PetscMalloc(n1+n2+1,&option); 2145*a7e14dcfSSatish Balay ierr = PetscStrncpy(option,prefix,n1+1); 2146*a7e14dcfSSatish Balay ierr = PetscStrncat(option,"_pc_type",n2+1); 2147*a7e14dcfSSatish Balay ierr = PetscOptionsSetValue(option,pctype); CHKERRQ(ierr); 2148*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2149*a7e14dcfSSatish Balay } 2150*a7e14dcfSSatish Balay 2151*a7e14dcfSSatish Balay #undef __FUNCT__ 2152*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetType" 2153*a7e14dcfSSatish Balay /*@C 2154*a7e14dcfSSatish Balay TaoSetType - Sets the method for the unconstrained minimization solver. 2155*a7e14dcfSSatish Balay 2156*a7e14dcfSSatish Balay Collective on TaoSolver 2157*a7e14dcfSSatish Balay 2158*a7e14dcfSSatish Balay Input Parameters: 2159*a7e14dcfSSatish Balay + solver - the TaoSolver solver context 2160*a7e14dcfSSatish Balay - type - a known method 2161*a7e14dcfSSatish Balay 2162*a7e14dcfSSatish Balay Options Database Key: 2163*a7e14dcfSSatish Balay + -tao_method <type> - Sets the method; use -help for a list 2164*a7e14dcfSSatish Balay of available methods (for instance, "-tao_method tao_lmvm" or 2165*a7e14dcfSSatish Balay "-tao_method tao_tron") 2166*a7e14dcfSSatish Balay - -tao_type <type> - identical to -tao_method 2167*a7e14dcfSSatish Balay 2168*a7e14dcfSSatish Balay Available methods include: 2169*a7e14dcfSSatish Balay + tao_nls - Newton's method with line search for unconstrained minimization 2170*a7e14dcfSSatish Balay . tao_ntr - Newton's method with trust region for unconstrained minimization 2171*a7e14dcfSSatish Balay . tao_ntl - Newton's method with trust region, line search for unconstrained minimization 2172*a7e14dcfSSatish Balay . tao_lmvm - Limited memory variable metric method for unconstrained minimization 2173*a7e14dcfSSatish Balay . tao_cg - Nonlinear conjugate gradient method for unconstrained minimization 2174*a7e14dcfSSatish Balay . tao_nm - Nelder-Mead algorithm for derivate-free unconstrained minimization 2175*a7e14dcfSSatish Balay . tao_tron - Newton Trust Region method for bound constrained minimization 2176*a7e14dcfSSatish Balay . tao_gpcg - Newton Trust Region method for quadratic bound constrained minimization 2177*a7e14dcfSSatish Balay . tao_blmvm - Limited memory variable metric method for bound constrained minimization 2178*a7e14dcfSSatish Balay + tao_pounders - Model-based algorithm pounder extended for nonlinear least squares 2179*a7e14dcfSSatish Balay 2180*a7e14dcfSSatish Balay Level: intermediate 2181*a7e14dcfSSatish Balay 2182*a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoGetType() 2183*a7e14dcfSSatish Balay 2184*a7e14dcfSSatish Balay @*/ 2185*a7e14dcfSSatish Balay PetscErrorCode TaoSetType(TaoSolver tao, const TaoSolverType type) 2186*a7e14dcfSSatish Balay { 2187*a7e14dcfSSatish Balay PetscErrorCode ierr; 2188*a7e14dcfSSatish Balay PetscErrorCode (*create_xxx)(TaoSolver); 2189*a7e14dcfSSatish Balay PetscBool issame; 2190*a7e14dcfSSatish Balay 2191*a7e14dcfSSatish Balay PetscFunctionBegin; 2192*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2193*a7e14dcfSSatish Balay 2194*a7e14dcfSSatish Balay ierr = PetscObjectTypeCompare((PetscObject)tao,type,&issame); CHKERRQ(ierr); 2195*a7e14dcfSSatish Balay if (issame) PetscFunctionReturn(0); 2196*a7e14dcfSSatish Balay 2197*a7e14dcfSSatish Balay ierr = PetscFunctionListFind(TaoSolverList, type, (void(**)(void))&create_xxx); CHKERRQ(ierr); 2198*a7e14dcfSSatish Balay if (!create_xxx) { 2199*a7e14dcfSSatish Balay SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested TaoSolver type %s",type); 2200*a7e14dcfSSatish Balay } 2201*a7e14dcfSSatish Balay 2202*a7e14dcfSSatish Balay 2203*a7e14dcfSSatish Balay /* Destroy the existing solver information */ 2204*a7e14dcfSSatish Balay if (tao->ops->destroy) { 2205*a7e14dcfSSatish Balay ierr = (*tao->ops->destroy)(tao); CHKERRQ(ierr); 2206*a7e14dcfSSatish Balay } 2207*a7e14dcfSSatish Balay ierr = KSPDestroy(&tao->ksp); CHKERRQ(ierr); 2208*a7e14dcfSSatish Balay ierr = TaoLineSearchDestroy(&tao->linesearch); CHKERRQ(ierr); 2209*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->gradient); CHKERRQ(ierr); 2210*a7e14dcfSSatish Balay ierr = VecDestroy(&tao->stepdirection); CHKERRQ(ierr); 2211*a7e14dcfSSatish Balay 2212*a7e14dcfSSatish Balay tao->ops->setup = 0; 2213*a7e14dcfSSatish Balay tao->ops->solve = 0; 2214*a7e14dcfSSatish Balay tao->ops->view = 0; 2215*a7e14dcfSSatish Balay tao->ops->setfromoptions = 0; 2216*a7e14dcfSSatish Balay tao->ops->destroy = 0; 2217*a7e14dcfSSatish Balay 2218*a7e14dcfSSatish Balay tao->setupcalled = PETSC_FALSE; 2219*a7e14dcfSSatish Balay 2220*a7e14dcfSSatish Balay ierr = (*create_xxx)(tao); CHKERRQ(ierr); 2221*a7e14dcfSSatish Balay ierr = PetscObjectChangeTypeName((PetscObject)tao,type); CHKERRQ(ierr); 2222*a7e14dcfSSatish Balay 2223*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2224*a7e14dcfSSatish Balay 2225*a7e14dcfSSatish Balay } 2226*a7e14dcfSSatish Balay #undef __FUNCT__ 2227*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolverRegister" 2228*a7e14dcfSSatish Balay /*MC 2229*a7e14dcfSSatish Balay TaoSolverRegister - Adds a method to the TAO package for unconstrained minimization. 2230*a7e14dcfSSatish Balay 2231*a7e14dcfSSatish Balay Synopsis: 2232*a7e14dcfSSatish Balay TaoSolverRegister(char *name_solver,char *path,char *name_Create,int (*routine_Create)(TaoSolver)) 2233*a7e14dcfSSatish Balay 2234*a7e14dcfSSatish Balay Not collective 2235*a7e14dcfSSatish Balay 2236*a7e14dcfSSatish Balay Input Parameters: 2237*a7e14dcfSSatish Balay + sname - name of a new user-defined solver 2238*a7e14dcfSSatish Balay - func - routine to Create method context 2239*a7e14dcfSSatish Balay 2240*a7e14dcfSSatish Balay Notes: 2241*a7e14dcfSSatish Balay TaoSolverRegister() may be called multiple times to add several user-defined solvers. 2242*a7e14dcfSSatish Balay 2243*a7e14dcfSSatish Balay Sample usage: 2244*a7e14dcfSSatish Balay .vb 2245*a7e14dcfSSatish Balay TaoSolverRegister("my_solver",MySolverCreate); 2246*a7e14dcfSSatish Balay .ve 2247*a7e14dcfSSatish Balay 2248*a7e14dcfSSatish Balay Then, your solver can be chosen with the procedural interface via 2249*a7e14dcfSSatish Balay $ TaoSetType(tao,"my_solver") 2250*a7e14dcfSSatish Balay or at runtime via the option 2251*a7e14dcfSSatish Balay $ -tao_method my_solver 2252*a7e14dcfSSatish Balay 2253*a7e14dcfSSatish Balay Level: advanced 2254*a7e14dcfSSatish Balay 2255*a7e14dcfSSatish Balay .seealso: TaoSolverRegisterAll(), TaoSolverRegisterDestroy() 2256*a7e14dcfSSatish Balay M*/ 2257*a7e14dcfSSatish Balay PetscErrorCode TaoSolverRegister(const char sname[], PetscErrorCode (*func)(TaoSolver)) 2258*a7e14dcfSSatish Balay { 2259*a7e14dcfSSatish Balay PetscErrorCode ierr; 2260*a7e14dcfSSatish Balay 2261*a7e14dcfSSatish Balay PetscFunctionBegin; 2262*a7e14dcfSSatish Balay ierr = PetscFunctionListAdd(&TaoSolverList,sname, (void (*)(void))func); CHKERRQ(ierr); 2263*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2264*a7e14dcfSSatish Balay } 2265*a7e14dcfSSatish Balay 2266*a7e14dcfSSatish Balay #undef __FUNCT__ 2267*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSolverRegisterDestroy" 2268*a7e14dcfSSatish Balay /*@C 2269*a7e14dcfSSatish Balay TaoSolverRegisterDestroy - Frees the list of minimization solvers that were 2270*a7e14dcfSSatish Balay registered by TaoSolverRegisterDynamic(). 2271*a7e14dcfSSatish Balay 2272*a7e14dcfSSatish Balay Not Collective 2273*a7e14dcfSSatish Balay 2274*a7e14dcfSSatish Balay Level: advanced 2275*a7e14dcfSSatish Balay 2276*a7e14dcfSSatish Balay .seealso: TaoSolverRegisterAll(), TaoSolverRegister() 2277*a7e14dcfSSatish Balay @*/ 2278*a7e14dcfSSatish Balay PetscErrorCode TaoSolverRegisterDestroy(void) 2279*a7e14dcfSSatish Balay { 2280*a7e14dcfSSatish Balay PetscErrorCode ierr; 2281*a7e14dcfSSatish Balay PetscFunctionBegin; 2282*a7e14dcfSSatish Balay ierr = PetscFunctionListDestroy(&TaoSolverList); CHKERRQ(ierr); 2283*a7e14dcfSSatish Balay TaoSolverRegisterAllCalled = PETSC_FALSE; 2284*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2285*a7e14dcfSSatish Balay } 2286*a7e14dcfSSatish Balay #undef __FUNCT__ 2287*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetTerminationReason" 2288*a7e14dcfSSatish Balay /*@ 2289*a7e14dcfSSatish Balay TaoSetTerminationReason - Sets the termination flag on a TaoSolver object 2290*a7e14dcfSSatish Balay 2291*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2292*a7e14dcfSSatish Balay 2293*a7e14dcfSSatish Balay Input Parameters: 2294*a7e14dcfSSatish Balay + tao - the TaoSolver context 2295*a7e14dcfSSatish Balay - reason - one of 2296*a7e14dcfSSatish Balay $ TAO_CONVERGED_ATOL (2), 2297*a7e14dcfSSatish Balay $ TAO_CONVERGED_RTOL (3), 2298*a7e14dcfSSatish Balay $ TAO_CONVERGED_STEPTOL (4), 2299*a7e14dcfSSatish Balay $ TAO_CONVERGED_MINF (5), 2300*a7e14dcfSSatish Balay $ TAO_CONVERGED_USER (6), 2301*a7e14dcfSSatish Balay $ TAO_DIVERGED_MAXITS (-2), 2302*a7e14dcfSSatish Balay $ TAO_DIVERGED_NAN (-4), 2303*a7e14dcfSSatish Balay $ TAO_DIVERGED_MAXFCN (-5), 2304*a7e14dcfSSatish Balay $ TAO_DIVERGED_LS_FAILURE (-6), 2305*a7e14dcfSSatish Balay $ TAO_DIVERGED_TR_REDUCTION (-7), 2306*a7e14dcfSSatish Balay $ TAO_DIVERGED_USER (-8), 2307*a7e14dcfSSatish Balay $ TAO_CONTINUE_ITERATING (0) 2308*a7e14dcfSSatish Balay 2309*a7e14dcfSSatish Balay Level: intermediate 2310*a7e14dcfSSatish Balay 2311*a7e14dcfSSatish Balay @*/ 2312*a7e14dcfSSatish Balay PetscErrorCode TaoSetTerminationReason(TaoSolver tao, TaoSolverTerminationReason reason) 2313*a7e14dcfSSatish Balay { 2314*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2315*a7e14dcfSSatish Balay PetscFunctionBegin; 2316*a7e14dcfSSatish Balay tao->reason = reason; 2317*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2318*a7e14dcfSSatish Balay } 2319*a7e14dcfSSatish Balay 2320*a7e14dcfSSatish Balay #undef __FUNCT__ 2321*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetTerminationReason" 2322*a7e14dcfSSatish Balay /*@ 2323*a7e14dcfSSatish Balay TaoGetTerminationReason - Gets the reason the TaoSolver iteration was stopped. 2324*a7e14dcfSSatish Balay 2325*a7e14dcfSSatish Balay Not Collective 2326*a7e14dcfSSatish Balay 2327*a7e14dcfSSatish Balay Input Parameter: 2328*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 2329*a7e14dcfSSatish Balay 2330*a7e14dcfSSatish Balay Output Parameter: 2331*a7e14dcfSSatish Balay . reason - one of 2332*a7e14dcfSSatish Balay 2333*a7e14dcfSSatish Balay 2334*a7e14dcfSSatish Balay $ TAO_CONVERGED_FATOL (1) f(X)-f(X*) <= fatol 2335*a7e14dcfSSatish Balay $ TAO_CONVERGED_FRTOL (2) |f(X) - f(X*)|/|f(X)| < frtol 2336*a7e14dcfSSatish Balay $ TAO_CONVERGED_GATOL (3) ||g(X)|| < gatol 2337*a7e14dcfSSatish Balay $ TAO_CONVERGED_GRTOL (4) ||g(X)|| / f(X) < grtol 2338*a7e14dcfSSatish Balay $ TAO_CONVERGED_GTTOL (5) ||g(X)|| / ||g(X0)|| < gttol 2339*a7e14dcfSSatish Balay $ TAO_CONVERGED_STEPTOL (6) step size small 2340*a7e14dcfSSatish Balay $ TAO_CONVERGED_MINF (7) F < F_min 2341*a7e14dcfSSatish Balay $ TAO_CONVERGED_USER (8) User defined 2342*a7e14dcfSSatish Balay 2343*a7e14dcfSSatish Balay $ TAO_DIVERGED_MAXITS (-2) its > maxits 2344*a7e14dcfSSatish Balay $ TAO_DIVERGED_NAN (-4) Numerical problems 2345*a7e14dcfSSatish Balay $ TAO_DIVERGED_MAXFCN (-5) fevals > max_funcsals 2346*a7e14dcfSSatish Balay $ TAO_DIVERGED_LS_FAILURE (-6) line search failure 2347*a7e14dcfSSatish Balay $ TAO_DIVERGED_TR_REDUCTION (-7) trust region failure 2348*a7e14dcfSSatish Balay $ TAO_DIVERGED_USER(-8) (user defined) 2349*a7e14dcfSSatish Balay 2350*a7e14dcfSSatish Balay $ TAO_CONTINUE_ITERATING (0) 2351*a7e14dcfSSatish Balay 2352*a7e14dcfSSatish Balay where 2353*a7e14dcfSSatish Balay + X - current solution 2354*a7e14dcfSSatish Balay . X0 - initial guess 2355*a7e14dcfSSatish Balay . f(X) - current function value 2356*a7e14dcfSSatish Balay . f(X*) - true solution (estimated) 2357*a7e14dcfSSatish Balay . g(X) - current gradient 2358*a7e14dcfSSatish Balay . its - current iterate number 2359*a7e14dcfSSatish Balay . maxits - maximum number of iterates 2360*a7e14dcfSSatish Balay . fevals - number of function evaluations 2361*a7e14dcfSSatish Balay - max_funcsals - maximum number of function evaluations 2362*a7e14dcfSSatish Balay 2363*a7e14dcfSSatish Balay Level: intermediate 2364*a7e14dcfSSatish Balay 2365*a7e14dcfSSatish Balay .seealso: TaoSetConvergenceTest(), TaoSetTolerances() 2366*a7e14dcfSSatish Balay 2367*a7e14dcfSSatish Balay @*/ 2368*a7e14dcfSSatish Balay PetscErrorCode TaoGetTerminationReason(TaoSolver tao, TaoSolverTerminationReason *reason) 2369*a7e14dcfSSatish Balay { 2370*a7e14dcfSSatish Balay PetscFunctionBegin; 2371*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2372*a7e14dcfSSatish Balay PetscValidPointer(reason,2); 2373*a7e14dcfSSatish Balay *reason = tao->reason; 2374*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2375*a7e14dcfSSatish Balay } 2376*a7e14dcfSSatish Balay 2377*a7e14dcfSSatish Balay #undef __FUNCT__ 2378*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetSolutionStatus" 2379*a7e14dcfSSatish Balay /*@ 2380*a7e14dcfSSatish Balay TaoGetSolutionStatus - Get the current iterate, objective value, 2381*a7e14dcfSSatish Balay residual, infeasibility, and termination 2382*a7e14dcfSSatish Balay 2383*a7e14dcfSSatish Balay Not Collective 2384*a7e14dcfSSatish Balay 2385*a7e14dcfSSatish Balay Input Parameters: 2386*a7e14dcfSSatish Balay . tao - the TaoSolver context 2387*a7e14dcfSSatish Balay 2388*a7e14dcfSSatish Balay Output Parameters: 2389*a7e14dcfSSatish Balay + iterate - the current iterate number (>=0) 2390*a7e14dcfSSatish Balay . f - the current function value 2391*a7e14dcfSSatish Balay . gnorm - the square of the gradient norm, duality gap, or other measure 2392*a7e14dcfSSatish Balay indicating distance from optimality. 2393*a7e14dcfSSatish Balay . cnorm - the infeasibility of the current solution with regard to the constraints. 2394*a7e14dcfSSatish Balay . xdiff - the step length or trust region radius of the most recent iterate. 2395*a7e14dcfSSatish Balay - reason - The termination reason, which can equal TAO_CONTINUE_ITERATING 2396*a7e14dcfSSatish Balay 2397*a7e14dcfSSatish Balay Level: intermediate 2398*a7e14dcfSSatish Balay 2399*a7e14dcfSSatish Balay Note: 2400*a7e14dcfSSatish Balay TAO returns the values set by the solvers in the routine TaoMonitor(). 2401*a7e14dcfSSatish Balay 2402*a7e14dcfSSatish Balay Note: 2403*a7e14dcfSSatish Balay If any of the output arguments are set to PETSC_NULL, no corresponding value will be returned. 2404*a7e14dcfSSatish Balay 2405*a7e14dcfSSatish Balay 2406*a7e14dcfSSatish Balay .seealso: TaoMonitor(), TaoGetTerminationReason() 2407*a7e14dcfSSatish Balay @*/ 2408*a7e14dcfSSatish Balay PetscErrorCode TaoGetSolutionStatus(TaoSolver tao, PetscInt *its, PetscReal *f, PetscReal *gnorm, PetscReal *cnorm, PetscReal *xdiff, TaoSolverTerminationReason *reason) 2409*a7e14dcfSSatish Balay { 2410*a7e14dcfSSatish Balay PetscFunctionBegin; 2411*a7e14dcfSSatish Balay if (its) *its=tao->niter; 2412*a7e14dcfSSatish Balay if (f) *f=tao->fc; 2413*a7e14dcfSSatish Balay if (gnorm) *gnorm=tao->residual; 2414*a7e14dcfSSatish Balay if (cnorm) *cnorm=tao->cnorm; 2415*a7e14dcfSSatish Balay if (reason) *reason=tao->reason; 2416*a7e14dcfSSatish Balay if (xdiff) *xdiff=tao->step; 2417*a7e14dcfSSatish Balay 2418*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2419*a7e14dcfSSatish Balay 2420*a7e14dcfSSatish Balay } 2421*a7e14dcfSSatish Balay 2422*a7e14dcfSSatish Balay 2423*a7e14dcfSSatish Balay #undef __FUNCT__ 2424*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetType" 2425*a7e14dcfSSatish Balay /*@C 2426*a7e14dcfSSatish Balay TaoGetType - Gets the current TaoSolver algorithm. 2427*a7e14dcfSSatish Balay 2428*a7e14dcfSSatish Balay Not Collective 2429*a7e14dcfSSatish Balay 2430*a7e14dcfSSatish Balay Input Parameter: 2431*a7e14dcfSSatish Balay . tao - the TaoSolver solver context 2432*a7e14dcfSSatish Balay 2433*a7e14dcfSSatish Balay Output Parameter: 2434*a7e14dcfSSatish Balay . type - TaoSolver method 2435*a7e14dcfSSatish Balay 2436*a7e14dcfSSatish Balay Level: intermediate 2437*a7e14dcfSSatish Balay 2438*a7e14dcfSSatish Balay @*/ 2439*a7e14dcfSSatish Balay PetscErrorCode TaoGetType(TaoSolver tao, const TaoSolverType *type) 2440*a7e14dcfSSatish Balay { 2441*a7e14dcfSSatish Balay PetscFunctionBegin; 2442*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2443*a7e14dcfSSatish Balay PetscValidPointer(type,2); 2444*a7e14dcfSSatish Balay *type=((PetscObject)tao)->type_name; 2445*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2446*a7e14dcfSSatish Balay } 2447*a7e14dcfSSatish Balay 2448*a7e14dcfSSatish Balay #undef __FUNCT__ 2449*a7e14dcfSSatish Balay #define __FUNCT__ "TaoMonitor" 2450*a7e14dcfSSatish Balay /*@C 2451*a7e14dcfSSatish Balay TaoMonitor - Monitor the solver and the current solution. This 2452*a7e14dcfSSatish Balay routine will record the iteration number and residual statistics, 2453*a7e14dcfSSatish Balay call any monitors specified by the user, and calls the convergence-check routine. 2454*a7e14dcfSSatish Balay 2455*a7e14dcfSSatish Balay Input Parameters: 2456*a7e14dcfSSatish Balay + tao - the TaoSolver context 2457*a7e14dcfSSatish Balay . its - the current iterate number (>=0) 2458*a7e14dcfSSatish Balay . f - the current objective function value 2459*a7e14dcfSSatish Balay . res - the gradient norm, square root of the duality gap, or other measure 2460*a7e14dcfSSatish Balay indicating distince from optimality. This measure will be recorded and 2461*a7e14dcfSSatish Balay used for some termination tests. 2462*a7e14dcfSSatish Balay . cnorm - the infeasibility of the current solution with regard to the constraints. 2463*a7e14dcfSSatish Balay - steplength - multiple of the step direction added to the previous iterate. 2464*a7e14dcfSSatish Balay 2465*a7e14dcfSSatish Balay Output Parameters: 2466*a7e14dcfSSatish Balay . reason - The termination reason, which can equal TAO_CONTINUE_ITERATING 2467*a7e14dcfSSatish Balay 2468*a7e14dcfSSatish Balay Options Database Key: 2469*a7e14dcfSSatish Balay . -tao_monitor - Use the default monitor, which prints statistics to standard output 2470*a7e14dcfSSatish Balay 2471*a7e14dcfSSatish Balay .seealso TaoGetTerminationReason(), TaoDefaultMonitor(), TaoSetMonitor() 2472*a7e14dcfSSatish Balay 2473*a7e14dcfSSatish Balay Level: developer 2474*a7e14dcfSSatish Balay 2475*a7e14dcfSSatish Balay @*/ 2476*a7e14dcfSSatish Balay PetscErrorCode TaoMonitor(TaoSolver tao, PetscInt its, PetscReal f, PetscReal res, PetscReal cnorm, PetscReal steplength, TaoSolverTerminationReason *reason) 2477*a7e14dcfSSatish Balay { 2478*a7e14dcfSSatish Balay PetscErrorCode ierr; 2479*a7e14dcfSSatish Balay int i; 2480*a7e14dcfSSatish Balay PetscFunctionBegin; 2481*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2482*a7e14dcfSSatish Balay tao->fc = f; 2483*a7e14dcfSSatish Balay tao->residual = res; 2484*a7e14dcfSSatish Balay tao->cnorm = cnorm; 2485*a7e14dcfSSatish Balay tao->step = steplength; 2486*a7e14dcfSSatish Balay tao->niter=its; 2487*a7e14dcfSSatish Balay if (its == 0) { 2488*a7e14dcfSSatish Balay tao->cnorm0 = cnorm; tao->gnorm0 = res; 2489*a7e14dcfSSatish Balay } 2490*a7e14dcfSSatish Balay TaoLogHistory(tao,f,res,cnorm); 2491*a7e14dcfSSatish Balay if (PetscIsInfOrNanReal(f) || PetscIsInfOrNanReal(res)) { 2492*a7e14dcfSSatish Balay SETERRQ(PETSC_COMM_SELF,1, "User provided compute function generated Inf or NaN"); 2493*a7e14dcfSSatish Balay } 2494*a7e14dcfSSatish Balay if (tao->ops->convergencetest) { 2495*a7e14dcfSSatish Balay ierr = (*tao->ops->convergencetest)(tao,tao->cnvP); CHKERRQ(ierr); 2496*a7e14dcfSSatish Balay } 2497*a7e14dcfSSatish Balay for (i=0;i<tao->numbermonitors;i++) { 2498*a7e14dcfSSatish Balay ierr = (*tao->monitor[i])(tao,tao->monitorcontext[i]); CHKERRQ(ierr); 2499*a7e14dcfSSatish Balay } 2500*a7e14dcfSSatish Balay *reason = tao->reason; 2501*a7e14dcfSSatish Balay 2502*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2503*a7e14dcfSSatish Balay 2504*a7e14dcfSSatish Balay } 2505*a7e14dcfSSatish Balay 2506*a7e14dcfSSatish Balay #undef __FUNCT__ 2507*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetHistory" 2508*a7e14dcfSSatish Balay /*@ 2509*a7e14dcfSSatish Balay TaoSetHistory - Sets the array used to hold the convergence history. 2510*a7e14dcfSSatish Balay 2511*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2512*a7e14dcfSSatish Balay 2513*a7e14dcfSSatish Balay Input Parameters: 2514*a7e14dcfSSatish Balay + tao - the TaoSolver solver context 2515*a7e14dcfSSatish Balay . obj - array to hold objective value history 2516*a7e14dcfSSatish Balay . resid - array to hold residual history 2517*a7e14dcfSSatish Balay . cnorm - array to hold constraint violation history 2518*a7e14dcfSSatish Balay . na - size of obj, resid, and cnorm 2519*a7e14dcfSSatish Balay - reset - PetscTrue indicates each new minimization resets the history counter to zero, 2520*a7e14dcfSSatish Balay else it continues storing new values for new minimizations after the old ones 2521*a7e14dcfSSatish Balay 2522*a7e14dcfSSatish Balay Notes: 2523*a7e14dcfSSatish Balay If set, TAO will fill the given arrays with the indicated 2524*a7e14dcfSSatish Balay information at each iteration. If no information is desired 2525*a7e14dcfSSatish Balay for a given array, then PETSC_NULL may be used. 2526*a7e14dcfSSatish Balay 2527*a7e14dcfSSatish Balay This routine is useful, e.g., when running a code for purposes 2528*a7e14dcfSSatish Balay of accurate performance monitoring, when no I/O should be done 2529*a7e14dcfSSatish Balay during the section of code that is being timed. 2530*a7e14dcfSSatish Balay 2531*a7e14dcfSSatish Balay Level: intermediate 2532*a7e14dcfSSatish Balay 2533*a7e14dcfSSatish Balay .seealso: TaoGetHistory() 2534*a7e14dcfSSatish Balay 2535*a7e14dcfSSatish Balay @*/ 2536*a7e14dcfSSatish Balay PetscErrorCode TaoSetHistory(TaoSolver tao, PetscReal *obj, PetscReal *resid, PetscReal *cnorm, PetscInt na,PetscBool reset) 2537*a7e14dcfSSatish Balay { 2538*a7e14dcfSSatish Balay PetscFunctionBegin; 2539*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2540*a7e14dcfSSatish Balay tao->hist_obj = obj; 2541*a7e14dcfSSatish Balay tao->hist_resid = resid; 2542*a7e14dcfSSatish Balay tao->hist_cnorm = cnorm; 2543*a7e14dcfSSatish Balay tao->hist_max = na; 2544*a7e14dcfSSatish Balay tao->hist_reset = reset; 2545*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2546*a7e14dcfSSatish Balay } 2547*a7e14dcfSSatish Balay 2548*a7e14dcfSSatish Balay #undef __FUNCT__ 2549*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetHistory" 2550*a7e14dcfSSatish Balay /*@C 2551*a7e14dcfSSatish Balay TaoGetHistory - Gets the array used to hold the convergence history. 2552*a7e14dcfSSatish Balay 2553*a7e14dcfSSatish Balay Collective on TaoSolver 2554*a7e14dcfSSatish Balay 2555*a7e14dcfSSatish Balay Input Parameter: 2556*a7e14dcfSSatish Balay . tao - the TaoSolver context 2557*a7e14dcfSSatish Balay 2558*a7e14dcfSSatish Balay Output Parameters: 2559*a7e14dcfSSatish Balay + obj - array used to hold objective value history 2560*a7e14dcfSSatish Balay . resid - array used to hold residual history 2561*a7e14dcfSSatish Balay . cnorm - array used to hold constraint violation history 2562*a7e14dcfSSatish Balay - nhist - size of obj, resid, and cnorm (will be less than or equal to na given in TaoSetHistory) 2563*a7e14dcfSSatish Balay 2564*a7e14dcfSSatish Balay 2565*a7e14dcfSSatish Balay Notes: 2566*a7e14dcfSSatish Balay The calling sequence for this routine in Fortran is 2567*a7e14dcfSSatish Balay $ call TaoGetHistory(TaoSolver tao, integer nhist, integer info) 2568*a7e14dcfSSatish Balay 2569*a7e14dcfSSatish Balay This routine is useful, e.g., when running a code for purposes 2570*a7e14dcfSSatish Balay of accurate performance monitoring, when no I/O should be done 2571*a7e14dcfSSatish Balay during the section of code that is being timed. 2572*a7e14dcfSSatish Balay 2573*a7e14dcfSSatish Balay Level: advanced 2574*a7e14dcfSSatish Balay 2575*a7e14dcfSSatish Balay .seealso: TaoSetHistory() 2576*a7e14dcfSSatish Balay 2577*a7e14dcfSSatish Balay @*/ 2578*a7e14dcfSSatish Balay PetscErrorCode TaoGetHistory(TaoSolver tao, PetscReal **obj, PetscReal **resid, PetscReal **cnorm, PetscInt *nhist) 2579*a7e14dcfSSatish Balay { 2580*a7e14dcfSSatish Balay PetscFunctionBegin; 2581*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2582*a7e14dcfSSatish Balay if (obj) *obj = tao->hist_obj; 2583*a7e14dcfSSatish Balay if (cnorm) *cnorm = tao->hist_cnorm; 2584*a7e14dcfSSatish Balay if (resid) *resid = tao->hist_resid; 2585*a7e14dcfSSatish Balay if (nhist) *nhist = tao->hist_len; 2586*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2587*a7e14dcfSSatish Balay } 2588*a7e14dcfSSatish Balay 2589*a7e14dcfSSatish Balay 2590*a7e14dcfSSatish Balay #undef __FUNCT__ 2591*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetApplicationContext" 2592*a7e14dcfSSatish Balay /*@ 2593*a7e14dcfSSatish Balay TaoSetApplicationContext - Sets the optional user-defined context for 2594*a7e14dcfSSatish Balay a solver. 2595*a7e14dcfSSatish Balay 2596*a7e14dcfSSatish Balay Logically Collective on TaoSolver 2597*a7e14dcfSSatish Balay 2598*a7e14dcfSSatish Balay Input Parameters: 2599*a7e14dcfSSatish Balay + tao - the TaoSolver context 2600*a7e14dcfSSatish Balay - usrP - optional user context 2601*a7e14dcfSSatish Balay 2602*a7e14dcfSSatish Balay Level: intermediate 2603*a7e14dcfSSatish Balay 2604*a7e14dcfSSatish Balay .seealso: TaoGetApplicationContext(), TaoSetApplicationContext() 2605*a7e14dcfSSatish Balay @*/ 2606*a7e14dcfSSatish Balay PetscErrorCode TaoSetApplicationContext(TaoSolver tao,void *usrP) 2607*a7e14dcfSSatish Balay { 2608*a7e14dcfSSatish Balay 2609*a7e14dcfSSatish Balay PetscFunctionBegin; 2610*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2611*a7e14dcfSSatish Balay tao->user = usrP; 2612*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2613*a7e14dcfSSatish Balay } 2614*a7e14dcfSSatish Balay 2615*a7e14dcfSSatish Balay #undef __FUNCT__ 2616*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetApplicationContext" 2617*a7e14dcfSSatish Balay /*@ 2618*a7e14dcfSSatish Balay TaoGetApplicationContext - Gets the user-defined context for a 2619*a7e14dcfSSatish Balay TAO solvers. 2620*a7e14dcfSSatish Balay 2621*a7e14dcfSSatish Balay Not Collective 2622*a7e14dcfSSatish Balay 2623*a7e14dcfSSatish Balay Input Parameter: 2624*a7e14dcfSSatish Balay . tao - TaoSolver context 2625*a7e14dcfSSatish Balay 2626*a7e14dcfSSatish Balay Output Parameter: 2627*a7e14dcfSSatish Balay . usrP - user context 2628*a7e14dcfSSatish Balay 2629*a7e14dcfSSatish Balay Level: intermediate 2630*a7e14dcfSSatish Balay 2631*a7e14dcfSSatish Balay .seealso: TaoSetApplicationContext() 2632*a7e14dcfSSatish Balay @*/ 2633*a7e14dcfSSatish Balay PetscErrorCode TaoGetApplicationContext(TaoSolver tao,void *usrP) 2634*a7e14dcfSSatish Balay { 2635*a7e14dcfSSatish Balay PetscFunctionBegin; 2636*a7e14dcfSSatish Balay PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1); 2637*a7e14dcfSSatish Balay *(void**)usrP = tao->user; 2638*a7e14dcfSSatish Balay PetscFunctionReturn(0); 2639*a7e14dcfSSatish Balay } 2640