PETSC_EXTERN PetscErrorCode TaoCreate_BLMVM(Tao tao) { TAO_BLMVM *blmP; const char *morethuente_type = TAOLINESEARCHMT; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetup_BLMVM; tao->ops->solve = TaoSolve_BLMVM; tao->ops->view = TaoView_BLMVM; tao->ops->setfromoptions = TaoSetFromOptions_BLMVM; tao->ops->destroy = TaoDestroy_BLMVM; tao->ops->computedual = TaoComputeDual_BLMVM; ierr = PetscNewLog(tao,&blmP);CHKERRQ(ierr); blmP->H0 = NULL; tao->data = (void*)blmP; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 2000; if (!tao->max_funcs_changed) tao->max_funcs = 4000; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, morethuente_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_GPCG(Tao tao) { TAO_GPCG *gpcg; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetup_GPCG; tao->ops->solve = TaoSolve_GPCG; tao->ops->view = TaoView_GPCG; tao->ops->setfromoptions = TaoSetFromOptions_GPCG; tao->ops->destroy = TaoDestroy_GPCG; tao->ops->computedual = TaoComputeDual_GPCG; ierr = PetscNewLog(tao,&gpcg);CHKERRQ(ierr); tao->data = (void*)gpcg; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it=500; if (!tao->max_funcs_changed) tao->max_funcs = 100000; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->fatol_changed) tao->fatol=1e-6; if (!tao->frtol_changed) tao->frtol=1e-6; if (!tao->gatol_changed) tao->grtol=1e-6; if (!tao->grtol_changed) tao->grtol=1e-6; #else if (!tao->fatol_changed) tao->fatol=1e-12; if (!tao->frtol_changed) tao->frtol=1e-12; if (!tao->gatol_changed) tao->grtol=1e-12; if (!tao->grtol_changed) tao->grtol=1e-12; #endif /* Initialize pointers and variables */ gpcg->n=0; gpcg->maxgpits = 8; gpcg->pg_ftol = 0.1; gpcg->gp_iterates=0; /* Cumulative number */ gpcg->total_gp_its = 0; /* Initialize pointers and variables */ gpcg->n_bind=0; gpcg->n_free = 0; gpcg->n_upper=0; gpcg->n_lower=0; gpcg->subset_type = TAO_SUBSET_MASK; gpcg->Hsub=NULL; gpcg->Hsub_pre=NULL; ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPSetType(tao->ksp,KSPNASH);CHKERRQ(ierr); ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, TAOLINESEARCHGPCG);CHKERRQ(ierr); ierr = TaoLineSearchSetObjectiveAndGradientRoutine(tao->linesearch, GPCGObjectiveAndGradient, tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_SSFLS(Tao tao) { TAO_SSLS *ssls; PetscErrorCode ierr; const char *armijo_type = TAOLINESEARCHARMIJO; PetscFunctionBegin; ierr = PetscNewLog(tao,&ssls);CHKERRQ(ierr); tao->data = (void*)ssls; tao->ops->solve=TaoSolve_SSFLS; tao->ops->setup=TaoSetUp_SSFLS; tao->ops->view=TaoView_SSLS; tao->ops->setfromoptions = TaoSetFromOptions_SSLS; tao->ops->destroy = TaoDestroy_SSFLS; ssls->delta = 1e-10; ssls->rho = 2.1; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm,&tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,armijo_type);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr); /* Linesearch objective and objectivegradient routines are set in solve routine */ ierr = KSPCreate(((PetscObject)tao)->comm,&tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp,tao->hdr.prefix);CHKERRQ(ierr); /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 2000; if (!tao->max_funcs_changed) tao->max_funcs = 4000; if (!tao->fatol_changed) tao->fatol = 0; if (!tao->frtol_changed) tao->frtol = 0; if (!tao->gttol_changed) tao->gttol = 0; if (!tao->grtol_changed) tao->grtol = 0; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->gatol_changed) tao->gatol = 1.0e-6; if (!tao->fmin_changed) tao->fmin = 1.0e-4; #else if (!tao->gatol_changed) tao->gatol = 1.0e-16; if (!tao->fmin_changed) tao->fmin = 1.0e-8; #endif PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_TRON(Tao tao) { TAO_TRON *tron; PetscErrorCode ierr; const char *morethuente_type = TAOLINESEARCHMT; PetscFunctionBegin; tao->ops->setup = TaoSetup_TRON; tao->ops->solve = TaoSolve_TRON; tao->ops->view = TaoView_TRON; tao->ops->setfromoptions = TaoSetFromOptions_TRON; tao->ops->destroy = TaoDestroy_TRON; tao->ops->computedual = TaoComputeDual_TRON; ierr = PetscNewLog(tao,&tron);CHKERRQ(ierr); tao->data = (void*)tron; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 50; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->steptol_changed) tao->steptol = 1.0e-6; #else if (!tao->steptol_changed) tao->steptol = 1.0e-12; #endif if (!tao->trust0_changed) tao->trust0 = 1.0; /* Initialize pointers and variables */ tron->n = 0; tron->maxgpits = 3; tron->pg_ftol = 0.001; tron->eta1 = 1.0e-4; tron->eta2 = 0.25; tron->eta3 = 0.50; tron->eta4 = 0.90; tron->sigma1 = 0.5; tron->sigma2 = 2.0; tron->sigma3 = 4.0; tron->gp_iterates = 0; /* Cumulative number */ tron->total_gp_its = 0; tron->n_free = 0; tron->DXFree=NULL; tron->R=NULL; tron->X_New=NULL; tron->G_New=NULL; tron->Work=NULL; tron->Free_Local=NULL; tron->H_sub=NULL; tron->Hpre_sub=NULL; tao->subset_type = TAO_SUBSET_SUBVEC; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,morethuente_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPSetType(tao->ksp,KSPSTCG);CHKERRQ(ierr); PetscFunctionReturn(0); }