Lines Matching defs:tao
2 #include <../src/tao/bound/impls/bnk/bnk.h>
11 static PetscErrorCode TaoBNKComputeSubHessian(Tao tao)
13 TAO_BNK *bnk = (TAO_BNK *)tao->data;
19 PetscCall(MatCreateSubMatrix(tao->hessian, bnk->inactive_idx, bnk->inactive_idx, MAT_INITIAL_MATRIX, &bnk->H_inactive));
20 if (tao->hessian == tao->hessian_pre) {
24 PetscCall(MatCreateSubMatrix(tao->hessian_pre, bnk->inactive_idx, bnk->inactive_idx, MAT_INITIAL_MATRIX, &bnk->Hpre_inactive));
28 PetscCall(PetscObjectReference((PetscObject)tao->hessian));
29 bnk->H_inactive = tao->hessian;
30 PetscCall(PetscObjectReference((PetscObject)tao->hessian_pre));
31 bnk->Hpre_inactive = tao->hessian_pre;
39 PetscErrorCode TaoBNKInitialize(Tao tao, PetscInt initType, PetscBool *needH)
41 TAO_BNK *bnk = (TAO_BNK *)tao->data;
54 PetscCall(TaoComputeVariableBounds(tao));
55 PetscCall(TaoSetVariableBounds(bnk->bncg, tao->XL, tao->XU));
56 if (tao->bounded) PetscCall(TaoLineSearchSetVariableBounds(tao->linesearch, tao->XL, tao->XU));
59 PetscCall(TaoBoundSolution(tao->solution, tao->XL, tao->XU, 0.0, &nDiff, tao->solution));
62 PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &bnk->f, bnk->unprojected_gradient));
63 PetscCall(TaoBNKEstimateActiveSet(tao, bnk->as_type));
64 PetscCall(VecCopy(bnk->unprojected_gradient, tao->gradient));
65 if (bnk->active_idx) PetscCall(VecISSet(tao->gradient, bnk->active_idx, 0.0));
66 PetscCall(TaoGradientNorm(tao, tao->gradient, NORM_2, &bnk->gnorm));
69 PetscCall(VecFischer(tao->solution, bnk->unprojected_gradient, tao->XL, tao->XU, bnk->W));
71 PetscCheck(!PetscIsInfOrNanReal(bnk->f) && !PetscIsInfOrNanReal(resnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
72 PetscCall(TaoLogConvergenceHistory(tao, bnk->f, resnorm, 0.0, tao->ksp_its));
73 PetscCall(TaoMonitor(tao, tao->niter, bnk->f, resnorm, 0.0, 1.0));
74 PetscUseTypeMethod(tao, convergencetest, tao->cnvP);
75 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
97 PetscCall(VecSet(tao->stepdirection, 0.0));
100 PetscCall(KSPGetPC(tao->ksp, &pc));
106 PetscCall(VecGetLocalSize(tao->solution, &n));
107 PetscCall(VecGetSize(tao->solution, &N));
109 PetscCall(MatLMVMAllocate(bnk->M, tao->solution, bnk->unprojected_gradient));
111 PetscCheck(sym_set && is_symmetric, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_INCOMP, "LMVM matrix in the LMVM preconditioner must be symmetric.");
121 PetscCall(PetscObjectHasFunction((PetscObject)tao->ksp, "KSPCGSetRadius_C", &kspTR));
126 tao->trust = tao->trust0;
132 tao->trust = tao->trust0;
139 PetscCall((*bnk->computehessian)(tao));
140 PetscCall(TaoBNKEstimateActiveSet(tao, BNK_AS_NONE));
141 PetscCall(TaoBNKComputeSubHessian(tao));
147 PetscCall(VecCopy(tao->solution, bnk->Xold));
148 PetscCall(VecAXPY(tao->solution, -tao->trust / bnk->gnorm, tao->gradient));
149 PetscCall(TaoBoundSolution(tao->solution, tao->XL, tao->XU, 0.0, &nDiff, tao->solution));
151 PetscCall(VecCopy(tao->solution, bnk->W));
154 PetscCall(TaoComputeObjective(tao, tao->solution, &ftrial));
155 PetscCheck(!PetscIsInfOrNanReal(bnk->f), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
156 PetscCall(VecCopy(bnk->Xold, tao->solution));
162 sigma = -tao->trust / bnk->gnorm;
179 prered = tao->trust * (bnk->gnorm - 0.5 * tao->trust * prered / (bnk->gnorm * bnk->gnorm));
187 tau_1 = bnk->theta_i * bnk->gnorm * tao->trust / (bnk->theta_i * bnk->gnorm * tao->trust + (1.0 - bnk->theta_i) * prered - actred);
188 tau_2 = bnk->theta_i * bnk->gnorm * tao->trust / (bnk->theta_i * bnk->gnorm * tao->trust - (1.0 + bnk->theta_i) * prered + actred);
194 max_radius = PetscMax(max_radius, tao->trust);
205 max_radius = PetscMax(max_radius, tao->trust);
231 tao->trust = tau * tao->trust;
237 PetscCall(VecCopy(tao->solution, bnk->Xold));
238 PetscCall(VecAXPY(tao->solution, sigma, tao->gradient));
239 PetscCall(TaoBoundSolution(tao->solution, tao->XL, tao->XU, 0.0, &nDiff, tao->solution));
240 PetscCall(VecCopy(tao->solution, tao->stepdirection));
241 PetscCall(VecAXPY(tao->stepdirection, -1.0, bnk->Xold));
242 PetscCall(TaoComputeGradient(tao, tao->solution, bnk->unprojected_gradient));
243 PetscCall(TaoBNKEstimateActiveSet(tao, bnk->as_type));
244 PetscCall(VecCopy(bnk->unprojected_gradient, tao->gradient));
245 if (bnk->active_idx) PetscCall(VecISSet(tao->gradient, bnk->active_idx, 0.0));
247 PetscCall(TaoGradientNorm(tao, tao->gradient, NORM_2, &bnk->gnorm));
250 PetscCall(VecFischer(tao->solution, bnk->unprojected_gradient, tao->XL, tao->XU, bnk->W));
252 PetscCheck(!PetscIsInfOrNanReal(resnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
253 PetscCall(TaoLogConvergenceHistory(tao, bnk->f, resnorm, 0.0, tao->ksp_its));
254 PetscCall(TaoMonitor(tao, tao->niter, bnk->f, resnorm, 0.0, 1.0));
255 PetscUseTypeMethod(tao, convergencetest, tao->cnvP);
256 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
261 tao->trust = PetscMax(tao->trust, max_radius);
264 tao->trust = PetscMax(tao->trust, bnk->min_radius);
265 tao->trust = PetscMin(tao->trust, bnk->max_radius);
270 tao->trust = 0.0;
279 PetscErrorCode TaoBNKComputeHessian(Tao tao)
281 TAO_BNK *bnk = (TAO_BNK *)tao->data;
285 PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre));
287 if (bnk->M) PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
289 PetscCall(TaoBNKComputeSubHessian(tao));
295 PetscErrorCode TaoBNKEstimateActiveSet(Tao tao, PetscInt asType)
297 TAO_BNK *bnk = (TAO_BNK *)tao->data;
305 PetscCall(VecWhichInactive(tao->XL, tao->solution, bnk->unprojected_gradient, tao->XU, PETSC_TRUE, &bnk->inactive_idx));
307 PetscCall(ISComplementVec(bnk->inactive_idx, tao->solution, &bnk->active_idx));
317 if (tao->hessian) PetscCall(MatAssembled(tao->hessian, &hessComputed));
318 if (hessComputed) PetscCall(MatHasOperation(tao->hessian, MATOP_GET_DIAGONAL, &diagExists));
321 PetscCall(MatGetDiagonal(tao->hessian, bnk->Xwork));
332 PetscCall(TaoEstimateActiveBounds(tao->solution, tao->XL, tao->XU, bnk->unprojected_gradient, bnk->W, bnk->Xwork, bnk->as_step, &bnk->as_tol, &bnk->active_lower, &bnk->active_upper, &bnk->active_fixed, &bnk->active_idx, &bnk->inactive_idx));
344 PetscErrorCode TaoBNKBoundStep(Tao tao, PetscInt asType, Vec step)
346 TAO_BNK *bnk = (TAO_BNK *)tao->data;
354 PetscCall(TaoBoundStep(tao->solution, tao->XL, tao->XU, bnk->active_lower, bnk->active_upper, bnk->active_fixed, 1.0, step));
369 PetscErrorCode TaoBNKTakeCGSteps(Tao tao, PetscBool *terminate)
371 TAO_BNK *bnk = (TAO_BNK *)tao->data;
381 tao->nfuncs += bnk->bncg->nfuncs;
382 tao->nfuncgrads += bnk->bncg->nfuncgrads;
383 tao->ngrads += bnk->bncg->ngrads;
384 tao->nhess += bnk->bncg->nhess;
391 PetscCall(TaoBNKEstimateActiveSet(tao, bnk->as_type));
399 PetscErrorCode TaoBNKComputeStep(Tao tao, PetscBool shift, KSPConvergedReason *ksp_reason, PetscInt *step_type)
401 TAO_BNK *bnk = (TAO_BNK *)tao->data;
411 PetscCall(VecSet(tao->stepdirection, 0.0));
412 PetscCall(TaoBNKBoundStep(tao, bnk->as_type, tao->stepdirection));
418 PetscCall(PetscObjectTypeCompare((PetscObject)tao->hessian, MATLMVM, &is_lmvm));
420 PetscCall(MatShift(tao->hessian, bnk->pert));
428 tao->ksp_its = 0;
429 PetscCall(VecSet(tao->stepdirection, 0.0));
431 PetscCall(KSPReset(tao->ksp));
432 PetscCall(KSPResetFromOptions(tao->ksp));
435 PetscCall(KSPSetOperators(tao->ksp, bnk->H_inactive, bnk->Hpre_inactive));
439 PetscCall(VecGetSubVector(tao->stepdirection, bnk->inactive_idx, &bnk->X_inactive));
442 bnk->X_inactive = tao->stepdirection;
444 PetscCall(KSPCGSetRadius(tao->ksp, tao->trust));
445 PetscCall(KSPSolve(tao->ksp, bnk->G_inactive, bnk->X_inactive));
446 PetscCall(KSPGetIterationNumber(tao->ksp, &kspits));
447 tao->ksp_its += kspits;
448 tao->ksp_tot_its += kspits;
449 PetscCall(PetscObjectHasFunction((PetscObject)tao->ksp, "KSPCGGetNormD_C", &kspTR));
451 PetscCall(KSPCGGetNormD(tao->ksp, &bnk->dnorm));
453 if (0.0 == tao->trust) {
456 tao->trust = bnk->dnorm;
459 tao->trust = PetscMax(tao->trust, bnk->min_radius);
460 tao->trust = PetscMin(tao->trust, bnk->max_radius);
464 tao->trust = tao->trust0;
467 tao->trust = PetscMax(tao->trust, bnk->min_radius);
468 tao->trust = PetscMin(tao->trust, bnk->max_radius);
470 PetscCall(KSPCGSetRadius(tao->ksp, tao->trust));
471 PetscCall(KSPSolve(tao->ksp, bnk->G_inactive, bnk->X_inactive));
472 PetscCall(KSPGetIterationNumber(tao->ksp, &kspits));
473 tao->ksp_its += kspits;
474 tao->ksp_tot_its += kspits;
475 PetscCall(KSPCGGetNormD(tao->ksp, &bnk->dnorm));
477 PetscCheck(bnk->dnorm != 0.0, PetscObjectComm((PetscObject)tao), PETSC_ERR_PLIB, "Initial direction zero");
484 PetscCall(VecRestoreSubVector(tao->stepdirection, bnk->inactive_idx, &bnk->X_inactive));
487 PetscCall(VecScale(tao->stepdirection, -1.0));
488 PetscCall(TaoBNKBoundStep(tao, bnk->as_type, tao->stepdirection));
491 PetscCall(KSPGetConvergedReason(tao->ksp, ksp_reason));
514 PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
523 PetscErrorCode TaoBNKRecomputePred(Tao tao, Vec S, PetscReal *prered)
525 TAO_BNK *bnk = (TAO_BNK *)tao->data;
530 PetscCall(VecGetSubVector(tao->stepdirection, bnk->inactive_idx, &bnk->X_inactive));
534 bnk->X_inactive = tao->stepdirection;
544 PetscCall(VecRestoreSubVector(tao->stepdirection, bnk->inactive_idx, &bnk->X_inactive));
557 PetscErrorCode TaoBNKSafeguardStep(Tao tao, KSPConvergedReason ksp_reason, PetscInt *stepType)
559 TAO_BNK *bnk = (TAO_BNK *)tao->data;
566 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gdx));
575 PetscCall(PetscObjectTypeCompare((PetscObject)tao->ksp, KSPGLTR, &is_gltr));
577 PetscCall(KSPGLTRGetMinEig(tao->ksp, &e_min));
588 PetscCall(VecCopy(tao->gradient, tao->stepdirection));
592 PetscCall(MatSolve(bnk->M, bnk->unprojected_gradient, tao->stepdirection));
597 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gdx));
606 PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
607 PetscCall(MatSolve(bnk->M, bnk->unprojected_gradient, tao->stepdirection));
621 PetscCall(VecScale(tao->stepdirection, -1.0));
622 PetscCall(TaoBNKBoundStep(tao, bnk->as_type, tao->stepdirection));
637 PetscCall(PetscObjectTypeCompare((PetscObject)tao->ksp, KSPGLTR, &is_gltr));
639 PetscCall(KSPGLTRGetMinEig(tao->ksp, &e_min));
660 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gdx));
665 PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
666 PetscCall(MatSolve(bnk->M, tao->gradient, tao->stepdirection));
667 PetscCall(VecScale(tao->stepdirection, -1.0));
668 PetscCall(TaoBNKBoundStep(tao, bnk->as_type, tao->stepdirection));
690 PetscErrorCode TaoBNKPerformLineSearch(Tao tao, PetscInt *stepType, PetscReal *steplen, TaoLineSearchConvergedReason *reason)
692 TAO_BNK *bnk = (TAO_BNK *)tao->data;
699 PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &bnk->f, bnk->unprojected_gradient, tao->stepdirection, steplen, &ls_reason));
700 PetscCall(TaoAddLineSearchCounts(tao));
705 PetscCall(VecCopy(bnk->Xold, tao->solution));
717 PetscCall(PetscObjectTypeCompare((PetscObject)tao->ksp, KSPGLTR, &is_gltr));
719 PetscCall(KSPGLTRGetMinEig(tao->ksp, &e_min));
730 PetscCall(VecCopy(bnk->unprojected_gradient, tao->stepdirection));
734 PetscCall(MatSolve(bnk->M, bnk->unprojected_gradient, tao->stepdirection));
737 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gdx));
743 PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
744 PetscCall(MatSolve(bnk->M, bnk->unprojected_gradient, tao->stepdirection));
765 PetscCall(MatLMVMUpdate(bnk->M, tao->solution, bnk->unprojected_gradient));
766 PetscCall(MatSolve(bnk->M, bnk->unprojected_gradient, tao->stepdirection));
773 PetscCall(VecScale(tao->stepdirection, -1.0));
774 PetscCall(TaoBNKBoundStep(tao, bnk->as_type, tao->stepdirection));
777 PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &bnk->f, bnk->unprojected_gradient, tao->stepdirection, steplen, &ls_reason));
778 PetscCall(TaoAddLineSearchCounts(tao));
792 PetscErrorCode TaoBNKUpdateTrustRadius(Tao tao, PetscReal prered, PetscReal actred, PetscInt updateType, PetscInt stepType, PetscBool *accept)
794 TAO_BNK *bnk = (TAO_BNK *)tao->data;
806 PetscCall(TaoLineSearchGetStepLength(tao->linesearch, &step));
809 tao->trust = bnk->omega1 * PetscMin(bnk->dnorm, tao->trust);
812 tao->trust = bnk->omega2 * PetscMin(bnk->dnorm, tao->trust);
816 tao->trust = bnk->omega3 * PetscMin(bnk->dnorm, tao->trust);
818 tao->trust = PetscMax(bnk->omega3 * bnk->dnorm, tao->trust);
822 tao->trust = PetscMax(bnk->omega4 * bnk->dnorm, tao->trust);
825 tao->trust = PetscMax(bnk->omega5 * bnk->dnorm, tao->trust);
829 tao->trust = bnk->omega1 * PetscMin(bnk->dnorm, tao->trust);
839 tao->trust = bnk->alpha1 * PetscMin(tao->trust, bnk->dnorm);
842 tao->trust = bnk->alpha1 * PetscMin(tao->trust, bnk->dnorm);
852 tao->trust = bnk->alpha1 * PetscMin(tao->trust, bnk->dnorm);
857 if (bnk->dnorm == tao->trust) {
860 tao->trust = bnk->alpha2 * tao->trust;
863 tao->trust = bnk->alpha3 * tao->trust;
866 tao->trust = bnk->alpha4 * tao->trust;
869 tao->trust = bnk->alpha5 * tao->trust;
877 tao->trust = bnk->alpha1 * PetscMin(bnk->dnorm, tao->trust);
887 tao->trust = bnk->gamma1 * PetscMin(tao->trust, bnk->dnorm);
890 tao->trust = bnk->gamma1 * PetscMin(tao->trust, bnk->dnorm);
898 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gdx));
908 tao->trust = PetscMax(tao->trust, bnk->gamma3 * bnk->dnorm);
910 tao->trust = PetscMax(tao->trust, bnk->gamma4 * bnk->dnorm);
912 tao->trust = PetscMax(tao->trust, tau_max * bnk->dnorm);
918 tao->trust = bnk->gamma2 * PetscMin(tao->trust, bnk->dnorm);
920 tao->trust = PetscMax(tao->trust, bnk->gamma3 * bnk->dnorm);
922 tao->trust = tau_max * PetscMin(tao->trust, bnk->dnorm);
924 tao->trust = PetscMax(tao->trust, tau_max * bnk->dnorm);
929 tao->trust = bnk->gamma2 * PetscMin(tao->trust, bnk->dnorm);
931 tao->trust = bnk->gamma1 * PetscMin(tao->trust, bnk->dnorm);
933 tao->trust = bnk->gamma1 * PetscMin(tao->trust, bnk->dnorm);
935 tao->trust = tau_1 * PetscMin(tao->trust, bnk->dnorm);
937 tao->trust = tau_2 * PetscMin(tao->trust, bnk->dnorm);
939 tao->trust = tau_max * PetscMin(tao->trust, bnk->dnorm);
946 tao->trust = bnk->gamma1 * PetscMin(bnk->dnorm, tao->trust);
951 tao->trust = PetscMin(tao->trust, bnk->max_radius);
952 tao->trust = PetscMax(tao->trust, bnk->min_radius);
956 PetscErrorCode TaoBNKAddStepCounts(Tao tao, PetscInt stepType)
958 TAO_BNK *bnk = (TAO_BNK *)tao->data;
980 PetscErrorCode TaoSetUp_BNK(Tao tao)
982 TAO_BNK *bnk = (TAO_BNK *)tao->data;
985 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient));
986 if (!tao->stepdirection) PetscCall(VecDuplicate(tao->solution, &tao->stepdirection));
987 if (!bnk->W) PetscCall(VecDuplicate(tao->solution, &bnk->W));
988 if (!bnk->Xold) PetscCall(VecDuplicate(tao->solution, &bnk->Xold));
989 if (!bnk->Gold) PetscCall(VecDuplicate(tao->solution, &bnk->Gold));
990 if (!bnk->Xwork) PetscCall(VecDuplicate(tao->solution, &bnk->Xwork));
991 if (!bnk->Gwork) PetscCall(VecDuplicate(tao->solution, &bnk->Gwork));
992 if (!bnk->unprojected_gradient) PetscCall(VecDuplicate(tao->solution, &bnk->unprojected_gradient));
993 if (!bnk->unprojected_gradient_old) PetscCall(VecDuplicate(tao->solution, &bnk->unprojected_gradient_old));
994 if (!bnk->Diag_min) PetscCall(VecDuplicate(tao->solution, &bnk->Diag_min));
995 if (!bnk->Diag_max) PetscCall(VecDuplicate(tao->solution, &bnk->Diag_max));
1008 PetscCall(PetscObjectReference((PetscObject)tao->gradient));
1010 bnk->bncg->gradient = tao->gradient;
1011 PetscCall(PetscObjectReference((PetscObject)tao->stepdirection));
1013 bnk->bncg->stepdirection = tao->stepdirection;
1014 PetscCall(TaoSetSolution(bnk->bncg, tao->solution));
1017 PetscCall(TaoSetTolerances(bnk->bncg, tao->gatol, tao->grtol, tao->gttol));
1018 PetscCall(TaoSetFunctionLowerBound(bnk->bncg, tao->fmin));
1019 PetscCall(TaoSetConvergenceTest(bnk->bncg, tao->ops->convergencetest, tao->cnvP));
1020 PetscCall(TaoSetObjective(bnk->bncg, tao->ops->computeobjective, tao->user_objP));
1021 PetscCall(TaoSetGradient(bnk->bncg, NULL, tao->ops->computegradient, tao->user_gradP));
1022 PetscCall(TaoSetObjectiveAndGradient(bnk->bncg, NULL, tao->ops->computeobjectiveandgradient, tao->user_objgradP));
1023 PetscCall(PetscObjectCopyFortranFunctionPointers((PetscObject)tao, (PetscObject)bnk->bncg));
1040 PetscErrorCode TaoDestroy_BNK(Tao tao)
1042 TAO_BNK *bnk = (TAO_BNK *)tao->data;
1062 PetscCall(KSPDestroy(&tao->ksp));
1063 PetscCall(PetscFree(tao->data));
1067 PetscErrorCode TaoSetFromOptions_BNK(Tao tao, PetscOptionItems PetscOptionsObject)
1069 TAO_BNK *bnk = (TAO_BNK *)tao->data;
1126 PetscCall(TaoSetOptionsPrefix(bnk->bncg, ((PetscObject)tao)->prefix));
1130 PetscCall(KSPSetOptionsPrefix(tao->ksp, ((PetscObject)tao)->prefix));
1131 PetscCall(KSPAppendOptionsPrefix(tao->ksp, "tao_bnk_"));
1132 PetscCall(KSPSetFromOptions(tao->ksp));
1136 PetscErrorCode TaoView_BNK(Tao tao, PetscViewer viewer)
1138 TAO_BNK *bnk = (TAO_BNK *)tao->data;
1231 PetscErrorCode TaoCreate_BNK(Tao tao)
1239 tao->ops->setup = TaoSetUp_BNK;
1240 tao->ops->view = TaoView_BNK;
1241 tao->ops->setfromoptions = TaoSetFromOptions_BNK;
1242 tao->ops->destroy = TaoDestroy_BNK;
1245 PetscCall(TaoParametersInitialize(tao));
1246 PetscObjectParameterSetDefault(tao, max_it, 50);
1247 PetscObjectParameterSetDefault(tao, trust0, 100.0);
1249 tao->data = (void *)bnk;
1330 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &bnk->bncg));
1331 PetscCall(PetscObjectIncrementTabLevel((PetscObject)bnk->bncg, (PetscObject)tao, 1));
1335 PetscCall(TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch));
1336 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->linesearch, (PetscObject)tao, 1));
1337 PetscCall(TaoLineSearchSetType(tao->linesearch, TAOLINESEARCHMT));
1338 PetscCall(TaoLineSearchUseTaoRoutines(tao->linesearch, tao));
1341 PetscCall(KSPCreate(((PetscObject)tao)->comm, &tao->ksp));
1342 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->ksp, (PetscObject)tao, 1));
1343 PetscCall(KSPSetType(tao->ksp, KSPSTCG));
1344 PetscCall(KSPGetPC(tao->ksp, &pc));