12#include <gsl/gsl_min.h>
13#include <gsl/gsl_roots.h>
14#include <gsl/gsl_sf_gamma.h>
15#include <gsl/gsl_sf_bessel.h>
16#include <boost/bind/bind.hpp>
17using namespace boost::placeholders;
21 potentialcoefficientspar(35,0.),
22 mySUSY(static_cast<const
SUSY&> (SM_i))
52 gslpp::vector<double>
S(10,0.);
54 gslpp::vector<double> minimavector(3,0.);
55 minimavector(0)=-807192.888;
56 minimavector(1)=807260.056;
57 minimavector(2)=-803413.309;
66 int NofMinima=lengthofminima/3;
68 gslpp::vector<double> deeperminima(lengthofminima+NofMinima,0.), dV(3,0.);
71 double x1, x2, x3, Vmin;
73 for(i=0;i<NofMinima;i++)
76 x2=minimavector(3*i+1);
77 x3=minimavector(3*i+2);
79 std::cout <<
"Vmin = " << Vmin << std::endl;
86 deeperminima(4*n)=minimavector(3*i);
87 deeperminima(4*n+1)=minimavector(3*i+1);
88 deeperminima(4*n+2)=minimavector(3*i+2);
89 deeperminima(4*n+3)=Vmin;
94 std::cout <<
"2." << std::endl;
102 x1=deeperminima(4*i);
103 x2=deeperminima(4*i+1);
104 x3=deeperminima(4*i+2);
105 Vmin=deeperminima(4*i+3);
110 gslpp::vector<double> linearpath(steps,0.);
111 gslpp::vector<double> V(steps,0.);
114 double distance=x1*x1+x2*x2+x3*x3;
115 double stepsize=distance/double(steps-1);
119 linearpath(k)=stepsize*k;
141 std::cout <<
"2.1.1" << std::endl;
148 double min = 1.0e-12;
152 while(fabs(pos1-pos2) >
min)
163 pos = 0.5*(pos1+pos2);
169 std::cout <<
"2.1.2" << std::endl;
172 int iter = 0, max_iter = 100;
173 const gsl_min_fminimizer_type *T;
174 gsl_min_fminimizer *
s;
177 std::cout <<
"pos =" << pos << std::endl;
184 T = gsl_min_fminimizer_brent;
185 s = gsl_min_fminimizer_alloc(T);
186 gsl_min_fminimizer_set(
s, &F, m, a, b);
190 status = gsl_min_fminimizer_iterate(
s);
191 m = gsl_min_fminimizer_x_minimum(
s);
192 std::cout <<
"m =" << m << std::endl;
193 a = gsl_min_fminimizer_x_lower(
s);
194 b = gsl_min_fminimizer_x_upper(
s);
195 status = gsl_min_test_interval(a, b, 0.0, 1.0e-3);
196 }
while(status == GSL_CONTINUE && iter<max_iter);
197 gsl_min_fminimizer_free(
s);
199 if(barriertop<=0.0 || barriertop>=pos)
201 throw std::runtime_error(
"Error in Metastability.cpp: Potential barrier top outside the barrier range!");
205 if(barrierheight<=0.0)
207 throw std::runtime_error(
"Error in Metastability.cpp: No potential barrier!");
209 double rscale = barriertop/sqrt(6.0*barrierheight);
213 double x = -log(pos);
216 double rmin = 1.e-4*rscale;
217 double rmax = 1.e4*rscale;
219 double drmin = 0.01*rmin;
221 double delta_phi = distance;
222 double delta_phi_cutoff = 1.e-2 * delta_phi;
223 double epsabs[2] = {fabs(delta_phi)*1.e-4 , fabs(delta_phi/rscale)*1.e-4};
224 double epsfrac[2] = {1.e-4 , 1.e-4};
226 double eps = distance*1.e-3;
227 gslpp::vector<double> inconds(3,0.);
230 double delta_phi0 = distance - exp(-x)*delta_phi;
231 double sdp = delta_phi0/distance;
233 double dV_at_delta_phi0 = (
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0-2.0*eps)*x1/distance, (delta_phi0-2.0*eps)*x2/distance, (delta_phi0-2.0*eps)*x3/distance)
234 -8.0*
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0-eps)*x1/distance, (delta_phi0-eps)*x2/distance, (delta_phi0-eps)*x3/distance)
235 +8.0*
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0+eps)*x1/distance, (delta_phi0+eps)*x2/distance, (delta_phi0+eps)*x3/distance)
236 -
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0+2.0*eps)*x1/distance, (delta_phi0+2.0*eps)*x2/distance, (delta_phi0+2.0*eps)*x3/distance) ) / (12.0*eps);
238 double d2V_at_phi0 = (-
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0-2.0*eps)*x1/distance, (delta_phi0-2.0*eps)*x2/distance, (delta_phi0-2.0*eps)*x3/distance)
239 +16.0*
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0-eps)*x1/distance, (delta_phi0-eps)*x2/distance, (delta_phi0-eps)*x3/distance)
241 +16.0*
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0+eps)*x1/distance, (delta_phi0+eps)*x2/distance, (delta_phi0+eps)*x3/distance)
242 -
mySUSYScalarPotential->
potential(potentialcoefficients, (delta_phi0+2.0*eps)*x1/distance, (delta_phi0+2.0*eps)*x2/distance, (delta_phi0+2.0*eps)*x3/distance) ) / (12.0*eps*eps);
244 inconds =
InitialConditions(delta_phi0, rmin, delta_phi_cutoff, distance, dV_at_delta_phi0, d2V_at_phi0);
245 if(!std::isfinite(inconds(0)) || !std::isfinite(x))
251 gslpp::vector<double> r_y(4,0.);
252 r_y =
integrateProfile(inconds(0), inconds(1), inconds(2), dr0, epsfrac, epsabs, drmin, rmax, distance);
291 gslpp::vector<double> r(rlength,0.);
292 gslpp::vector<double> phi(rlength,0.);
293 gslpp::vector<double> dphi(rlength,0.);
295 double VphiMin_i =
deformedV(phi(rlength));
297 double integral = 0.0;
298 for(
int j=1;j<rlength;j++)
300 integral += (r(j)-r(j-1))*(
Simpsonintegrand(r(j-1),phi(j-1),dphi(j-1),VphiMin_i)
301 +4.0*
Simpsonintegrand((r(j)+r(j-1))/2.0,(phi(j)+phi(j-1))/2.0,(dphi(j)+dphi(j-1))/2.0,VphiMin_i)
315 return (0.5*dphi*dphi +
deformedV(phi)-VphiMin_i) * 2.0*M_PI*M_PI*r*r*r;
341gslpp::vector<double>
FindAction::InitialConditions(
double delta_phi0,
double rmin,
double delta_phi_cutoff,
double distance,
double dV_at_delta_phi0,
double d2V_at_phi0)
343 double phi0 = distance + delta_phi0;
344 double dV = dV_at_delta_phi0;
345 double d2V = d2V_at_phi0;
346 gslpp::vector<double> exsol(2,0.);
348 double phi_r0=exsol(0);
349 double dphi_r0=exsol(1);
351 gslpp::vector<double> inc(3,0.);
356 if(fabs(phi_r0)<fabs(delta_phi_cutoff) || dphi_r0*delta_phi0>0)
360 while(std::isfinite(r))
365 if(fabs(exsol(0))>fabs(delta_phi_cutoff))
380 int iter = 0, max_iter = 100;
381 const gsl_root_fsolver_type *T;
384 double x_lo = rlast, x_hi = r;
385 T = gsl_root_fsolver_brent;
386 s = gsl_root_fsolver_alloc (T);
387 gsl_root_fsolver_set (
s, &F, x_lo, x_hi);
391 status = gsl_root_fsolver_iterate (
s);
392 r2 = gsl_root_fsolver_root (
s);
393 x_lo = gsl_root_fsolver_x_lower (
s);
394 x_hi = gsl_root_fsolver_x_upper (
s);
395 status = gsl_root_test_interval (x_lo, x_hi,
398 while (status == GSL_CONTINUE && iter < max_iter);
399 gsl_root_fsolver_free (
s);
412 gslpp::vector<double> phi_dphi(2,0.);
416 double curv = sqrt(fabs(d2V));
417 double curv_r = curv*r;
425 double s = (d2V>0) ? 1.0 : -1.0;
427 for(
int k=1;k<=4;k++)
429 add_to_phi = pow(0.5*curv_r,2.0*k-2.0) * pow(
s,k) / (gsl_sf_gamma(k+1)*gsl_sf_gamma(k+1+nu));
431 dphi += add_to_phi * (2.0*k);
433 phi *= 0.25 * gsl_sf_gamma(nu+1) * r*r * dV *
s;
434 dphi *= 0.25 * gsl_sf_gamma(nu+1) * r * dV *
s;
439 phi = (gsl_sf_gamma(nu+1)*pow(0.5*curv_r,-nu) *gsl_sf_bessel_In(
int(nu),curv_r)-1.0) * dV/d2V;
440 dphi = -nu*(pow(0.5*curv_r,-nu) / r) * gsl_sf_bessel_In(
int(nu), curv_r);
441 dphi += pow(0.5*curv_r,-nu) * 0.5*curv * (gsl_sf_bessel_In(
int(nu)-1, curv_r)+gsl_sf_bessel_In(
int(nu)+1, curv_r));
442 dphi *= gsl_sf_gamma(nu+1) * dV/d2V;
447 phi = (gsl_sf_gamma(nu+1)*pow(0.5*curv_r,-nu) * gsl_sf_bessel_Jn(
int(nu), curv_r)-1.0) * dV/d2V;
448 dphi = -nu*(pow(0.5*curv_r,-nu) / r) * gsl_sf_bessel_Jn(
int(nu), curv_r);
449 dphi += pow(0.5*curv_r,-nu) * 0.5*curv * (gsl_sf_bessel_Jn(
int(nu)-1, curv_r)-gsl_sf_bessel_Jn(
int(nu)+1, curv_r));
450 dphi *= gsl_sf_gamma(nu+1) * dV/d2V;
458gslpp::vector<double>
FindAction::integrateProfile(
double r0,
double y01,
double y02,
double dr0,
double epsfrac[2],
double epsabs[2],
double drmin,
double rmax,
double distance)
462 gslpp::vector<double> dydr0(2,0.);
463 dydr0 =
dY(y01, y02, r0);
471 gslpp::vector<double> ret_values(4,0.);
475 gslpp::vector<double> r_y_drnext(4,0.);
483 double r1 = r_y_drnext(0);
484 double y11 = y01+r_y_drnext(1);
485 double y12 = y02+r_y_drnext(2);
487 gslpp::vector<double> dydr1 =
dY(y11,y12,r1);
491 throw std::runtime_error(
"r > rmax");
495 throw std::runtime_error(
"dr < drmin");
505 else if ( y12*(y01-distance) > 0 || (y11-distance)*(y01-distance) < 0 )
551 gslpp::vector<double> values(2,0.);
562int dYfunc(
double r,
const double y[],
double ODE[],
void *flags)
564 gslpp::vector<double> dYvalues(2,0.);
571int dYJac(
double r,
const double y[],
double *dfdy,
double dfdt[],
void *order)
double Simpsonintegrand(double r, double phi, double dphi, double VphiMin_i)
double invertedpotential(double x)
gslpp::vector< double > potentialcoefficientspar
gslpp::vector< double > ExactSolution(double r, double phi0, double dV, double d2V)
gslpp::vector< double > dY(double y1, double y2, double r)
gslpp::vector< double > InitialConditions(double delta_phi0, double rmin, double delta_phi_cutoff, double distance, double dV_at_delta_phi0, double d2V_at_phi0)
~FindAction()
FindAction destructor.
FindAction(const StandardModel &SM_i)
FindAction constructor.
gsl_function convertToGslFunctionS(const F &f)
double deformedV(double phi)
SUSYScalarPotential * mySUSYScalarPotential
double delta_phi_cutoffpar
gslpp::vector< double > integrateProfile(double r0, double y01, double y02, double dr0, double epsfrac[2], double epsabs[2], double drmin, double rmax, double distance)
A class for the form factor in .
A base class for SUSY models.
double potential(gslpp::vector< double > coefficients, double field1, double field2, double field3)
gslpp::vector< double > coefficients()
gslpp::vector< double > potentialderivative(gslpp::vector< double > coefficients, double field1, double field2, double field3)
A model class for the Standard Model.
A class for a model prediction of an observable.
double min
The bin minimum.