flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
two_scale_solver.hpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19#ifndef TWO_SCALE_SOLVER_H
20#define TWO_SCALE_SOLVER_H
21
22#include "rg_flow.hpp"
23
24#include <memory>
25#include <vector>
26
32namespace flexiblesusy {
33
34class Convergence_tester;
35class Initial_guesser;
36class Model;
37class Single_scale_constraint;
38class Single_scale_matching;
39
40class Two_scale;
41class Two_scale_running_precision;
42
60template<>
62public:
63 RGFlow() = default;
64 RGFlow(const RGFlow&) = delete;
65 RGFlow(RGFlow&&) = delete;
66 ~RGFlow() = default;
67 RGFlow& operator=(const RGFlow&) = delete;
68 RGFlow& operator=(RGFlow&&) = delete;
69
71 void add(Single_scale_constraint*, Model*);
73 void add(Single_scale_matching*, Model*, Model*);
75 Model* get_model() const;
77 int number_of_iterations_done() const;
79 void reset();
81 void run_to(double);
83 void set_convergence_tester(Convergence_tester*);
85 void set_running_precision(Two_scale_running_precision*);
87 void set_initial_guesser(Initial_guesser*);
89 void solve();
90
91private:
92 struct Slider {
93 public:
94 virtual ~Slider() {}
95 virtual void clear_problems() {}
96 virtual Model* get_model() = 0;
97 virtual double get_scale() = 0;
98 virtual void slide() {}
99 virtual void set_precision(double) {}
100 };
101
102 struct Constraint_slider : public Slider {
103 public:
105 : model(m), constraint(c) {}
107 virtual void clear_problems() override;
108 virtual Model* get_model() override;
109 virtual double get_scale() override;
110 virtual void slide() override;
111 virtual void set_precision(double) override;
112 private:
115 };
116
117 struct Matching_slider : public Slider {
118 public:
120 : m1(m1_), m2(m2_), matching(mc) {}
121 virtual ~Matching_slider() {}
122 virtual void clear_problems() override;
123 virtual Model* get_model() override;
124 virtual double get_scale() override;
125 virtual void slide() override;
126 virtual void set_precision(double) override;
127 private:
128 Model *m1, *m2;
130 };
131
132 std::vector<std::shared_ptr<Slider> > sliders{};
133 int iteration{0};
134 Convergence_tester* convergence_tester{nullptr};
135 Initial_guesser* initial_guesser{nullptr};
136 Two_scale_running_precision* running_precision_calculator{nullptr};
137 double running_precision{1.0e-3};
138 double scale{0.};
139
140 bool accuracy_goal_reached() const;
141 void check_setup() const;
142 void clear_problems();
143 int get_max_iterations() const;
144 Model* get_model(double) const;
145 double get_precision();
146 void initial_guess();
147 void run_sliders();
148 std::vector<std::shared_ptr<Slider> > sort_sliders() const;
149 void update_running_precision();
150};
151
152} // namespace flexiblesusy
153
154#endif
RGFlow & operator=(RGFlow &&)=delete
RGFlow & operator=(const RGFlow &)=delete
RGFlow(const RGFlow &)=delete
const double mc
Definition: consts.hpp:104
Constraint_slider(Model *m, Single_scale_constraint *c)
Matching_slider(Model *m1_, Model *m2_, Single_scale_matching *mc)