void RGFlow<Two_scale>::run_up() { VERBOSE_MSG("> running tower up (iteration " << iteration << ") ..."); const size_t number_of_models = models.size(); for (size_t m = 0; m < number_of_models; ++m) { TModel* model = models[m]; model->model->set_precision(get_precision()); VERBOSE_MSG("> \tselecting model " << model->model->name()); // apply all constraints const size_t n_upwards_constraints = model->upwards_constraints.size(); for (size_t c = 0; c < n_upwards_constraints; ++c) { Constraint<Two_scale>* constraint = model->upwards_constraints[c]; const double scale = constraint->get_scale(); VERBOSE_MSG("> \t\tselecting constraint " << c << " at scale " << scale); VERBOSE_MSG("> \t\t\trunning model to scale " << scale); if (model->model->run_to(scale)) throw NonPerturbativeRunningError(scale); VERBOSE_MSG("> \t\t\tapplying constraint"); constraint->apply(); } // apply matching condition if this is not the last model if (m != number_of_models - 1) { VERBOSE_MSG("> \tmatching to model " << models[m + 1]->model->name()); Matching<Two_scale>* mc = model->matching_condition; mc->match_low_to_high_scale_model(); } } VERBOSE_MSG("> running up finished"); }
void RGFlow<Two_scale>::apply_lowest_constraint() { if (models.empty()) return; TModel* model = models[0]; model_at_this_scale = model->model; if (model->downwards_constraints.empty()) return; Constraint<Two_scale>* constraint = model->downwards_constraints.back(); const double scale = constraint->get_scale(); VERBOSE_MSG("| selecting constraint 0 at scale " << scale); VERBOSE_MSG("| \trunning model " << model->model->name() << " to scale " << scale); if (model->model->run_to(scale)) throw NonPerturbativeRunningError(scale); VERBOSE_MSG("| \tapplying constraint"); constraint->apply(); }
void RGFlow<Two_scale>::run_down() { assert(models.size() > 0 && "model size must not be zero"); VERBOSE_MSG("< running tower down ..."); const size_t number_of_models = models.size(); for (long m = number_of_models - 1; m >= 0; --m) { TModel* model = models[m]; VERBOSE_MSG("< \tselecting model " << model->model->name()); // apply all constraints: // If m is the last model, do not apply the highest constraint, // because it was already appied when we ran up. const size_t c_begin = (m + 1 == (long)number_of_models ? 1 : 0); const size_t c_end = model->downwards_constraints.size(); for (size_t c = c_begin; c < c_end; ++c) { Constraint<Two_scale>* constraint = model->downwards_constraints[c]; const double scale = constraint->get_scale(); VERBOSE_MSG("< \t\tselecting constraint " << c << " at scale " << scale); VERBOSE_MSG("< \t\t\trunning model to scale " << scale); if (model->model->run_to(scale)) throw NonPerturbativeRunningError(scale); // If m is the lowest energy model, do not apply the lowest // constraint, because it will be applied when we run up next // time. if (m != 0 || c + 1 != c_end) { VERBOSE_MSG("< \t\t\tapplying constraint"); constraint->apply(); } } // apply matching condition if this is not the first model if (m > 0) { Matching<Two_scale>* mc = models[m - 1]->matching_condition; VERBOSE_MSG("< \tmatching to model " << models[m - 1]->model->name()); mc->match_high_to_low_scale_model(); } } VERBOSE_MSG("< running down finished"); }