flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
lattice_constraint.cpp
Go to the documentation of this file.
1#include <algorithm>
2
4#include "rk.hpp"
5#include "logger.hpp"
6
7namespace flexiblesusy {
8
9using namespace std;
10using namespace Eigen;
11using namespace runge_kutta;
12
14{
15 VERBOSE_MSG("registering elementary constraint " << this);
16 f->elementary_constraints.insert(this);
17}
18
20{
21 VERBOSE_MSG("deregistering elementary constraint " << this);
22 f->elementary_constraints.erase(this);
23}
24
26(size_t nrows, size_t T, size_t m, size_t span)
27{
28 VERBOSE_MSG("allocating " << nrows << " rows to " << this <<
29 " at T=" << T << " m=" << m << " span=" << span);
30 for (; nrows; nrows--)
31 rows.push_back(f->ralloc(T, m, span));
32}
33
35{
36 VERBOSE_MSG("freeing " << rows.size() << " rows from " << this);
37 for (auto r: rows) f->rfree(r);
38 rows.clear();
39}
40
42{
43 for (size_t i = 1; i < x.size(); i++) { // x[0] untouched
45 for (size_t n = 0; n < span - 1; n++) {
46 size_t m = mbegin + n;
48 // row order determined by alloc_rows()
49 set_diff(n * (f->efts[T].w->width-1) + i-1, m, i);
50 dxm0i = dxm1i;
51 swap(ddxm0i, ddxm1i); // cheaper than ddxm0i = ddxm1i
52 }
53 }
54}
55
56void Lattice_RGE::calc_dxmi_ddxmi(size_t m, size_t i, Real& dxmi, RVec& ddxmi)
57{
58 for (size_t j = 0; j < x.size(); j++) x[j] = y(m,j)*u(j);
59 dxmi = f->efts[T].w->dx(f->a, &x[0], i);
60 f->efts[T].w->ddx(f->a, &x[0], i, &ddxmi[0]);
61}
62
63void Lattice_RGE::set_diff(size_t r, size_t m, size_t i)
64{
65 A(r,m ,0) = (ddxm0i[0]*(y(m+1,0)-y(m,0))*u(0)-(dxm1i+dxm0i))*u(0)/2;
66 A(r,m+1,0) = (ddxm1i[0]*(y(m+1,0)-y(m,0))*u(0)+(dxm1i+dxm0i))*u(0)/2;
67 z(r) = (y(m,0)*ddxm0i[0] + y(m+1,0)*ddxm1i[0])*u(0);
68 for (size_t j = 1; j < x.size(); j++) {
69 A(r,m ,j) = (ddxm0i[j]*(y(m+1,0)-y(m,0))*u(0)/2+(i==j?1:0))*u(j);
70 A(r,m+1,j) = (ddxm1i[j]*(y(m+1,0)-y(m,0))*u(0)/2-(i==j?1:0))*u(j);
71 z(r) += (y(m,j)*ddxm0i[j] + y(m+1,j)*ddxm1i[j])*u(j);
72 }
73 z(r) *= (y(m+1,0)-y(m,0))*u(0)/2;
74}
75
77{
78 size_t m = mbegin;
79
80 for (size_t j = 0; j < a0.n; j++) {
81 a0.x(j) = y(m+0,j)*u(j);
82 a1.x(j) = y(m+1,j)*u(j);
83 }
84 for (size_t j = 1; j < a0.n; j++) {
85 dx0[j] = f->efts[T].w->dx(f->a, &a0.x(0), j);
86 dx1[j] = f->efts[T].w->dx(f->a, &a1.x(0), j);
87 }
88
89 Real a_M = 0;
90 Real t_M = (1-a_M)*a0.x(0) + a_M*a1.x(0);
91 evolve_to(t_M, a0);
92 evolve_to(t_M, a1);
93
94 for (size_t i = 1; i < a0.n; i++) {
95 size_t r = i - 1;
96 z(r) = a1.x(i) - a0.x(i);
97 for (size_t j = 1; j < a0.n; j++) {
98 A(r,m+0,0) -= a0.D(i,j)*u(0)*dx0[j];
99 A(r,m+1,0) += a1.D(i,j)*u(0)*dx1[j];
100 A(r,m+0,j) = a0.D(i,j)*u(j);
101 A(r,m+1,j) = - a1.D(i,j)*u(j);
102 z(r) += a0.D(i,j) * (u(j)*y(m+0,j) - u(0)*y(m+0,0)*dx0[j])
103 - a1.D(i,j) * (u(j)*y(m+1,j) - u(0)*y(m+1,0)*dx1[j]);
104 }
105 }
106}
107
109const Real EPSTOL = 1.0e-11;
110
111static int close(Real m1, Real m2, Real tol)
112{
113 return fabs(max(m1,m2)-min(m1,m2)) <= tol * max(fabs(m1),fabs(m2));
114}
115
117{
118 Real tol;
119 if (eps < 0.0) tol = TOLERANCE;
120 else if (eps < EPSTOL) tol = EPSTOL;
121 else tol = eps;
122 Real from = a.x(0);
123 for (size_t i = 0; i < a.n; i++)
124 for (size_t j = 0; j < a.n; j++)
125 a.D(i,j) = i==j ? 1 : 0;
126 // from == to with high precision
127 if (close(from, to, EPSTOL)) return 0;
128
129 Real guess = (from - to) * 0.1; //first step size
130 Real hmin = (from - to) * tol * 1.0e-5;
131
132 RowVectorXd ddx(a.n);
134 Adapter db;
135
136 try {
137 integrateOdes(*a.v, from, to, tol, guess, hmin,
138 [=,&ddx,&b,&db](Real, const ArrayXd& xD) -> ArrayXd {
139 b.set(xD, a.n);
140
141 ArrayXd dxD(xD.size());
142 db.set(dxD, b.n);
143
144 for (size_t i = 0; i < db.n; i++) {
145 db.x(i) = f->efts[T].w->dx(f->a, b.x.data(), i);
146
147 f->efts[T].w->ddx(f->a, b.x.data(), i, &ddx[0]);
148 db.D.block(i,0,1,db.n) = ddx * b.D;
149 }
150
151 return dxD;
152 }, odeStepper);
153
154 a.x(0) = to;
155 } catch(Error&) {
156 return 1;
157 }
158 return 0;
159}
160
161} // namespace flexiblesusy
Real & A(size_t r, size_t m, size_t j)
Real y(size_t m, size_t i) const
void set_diff(size_t r, size_t m, size_t i)
void calc_dxmi_ddxmi(size_t m, size_t i, Real &dxmi, RVec &ddxmi)
int evolve_to(Real t_new, Adapter &a, Real eps=-1)
std::vector< RGFlow< Lattice >::EqRow * > rows
void ralloc(size_t nrows, size_t T, size_t m, size_t span)
std::unordered_set< Lattice_constraint * > elementary_constraints
EqRow * ralloc(size_t T, size_t m, size_t span)
#define VERBOSE_MSG(msg)
Definition: logger.hpp:57
Target to(const Source &arg)
Converts an object of type Source to an object of type Target.
Definition: slhaea.h:50
void swap() noexcept
Swaps stdout and stderr descriptors.
void integrateOdes(ArrayType &ystart, double from, double to, double eps, double h1, double hmin, Derivs derivs, Stepper rkqs=runge_kutta::odeStepper< ArrayType, Derivs >, int max_steps=400)
Organises integration of 1st order system of ODEs.
Definition: rk.hpp:158
double odeStepper(ArrayType &y, const ArrayType &dydx, double &x, double htry, double eps, const ArrayType &yscal, Derivs derivs, int &max_step_dir)
organises the variable step-size for Runge-Kutta evolution
Definition: rk.hpp:107
double Real
Definition: mathdefs.hpp:12
std::vector< Real > RVec
static int close(Real m1, Real m2, Real tol)
const Real EPSTOL
underflow accuracy
Integration of ODEs by Runge-Kutta.