From 4179f2e9ecf10e520afe02bc4ea4cbff56695357 Mon Sep 17 00:00:00 2001 From: Dylan Harries Date: Tue, 7 Feb 2017 17:25:27 +1030 Subject: [PATCH] Add test checking that two-scale solution is a fixed point of the semi-analytic iteration --- ...CMSSMSemiAnalytic_consistent_solutions.cpp | 237 +++++++++++++++--- 1 file changed, 204 insertions(+), 33 deletions(-) diff --git a/test/test_CMSSMSemiAnalytic_consistent_solutions.cpp b/test/test_CMSSMSemiAnalytic_consistent_solutions.cpp index 8d74ae7b4..7d3ea32a8 100644 --- a/test/test_CMSSMSemiAnalytic_consistent_solutions.cpp +++ b/test/test_CMSSMSemiAnalytic_consistent_solutions.cpp @@ -5,16 +5,66 @@ #define private public -#include "test_CMSSMSemiAnalytic.hpp" +#include "CMSSMSemiAnalytic_input_parameters.hpp" +#include "CMSSMSemiAnalytic_slha_io.hpp" +#include "CMSSMSemiAnalytic_semi_analytic_ewsb_solver.hpp" #include "CMSSMSemiAnalytic_semi_analytic_spectrum_generator.hpp" +#include "CMSSMSemiAnalytic_semi_analytic_susy_convergence_tester.hpp" #include "CMSSM_input_parameters.hpp" #include "CMSSM_slha_io.hpp" #include "CMSSM_two_scale_ewsb_solver.hpp" #include "CMSSM_two_scale_spectrum_generator.hpp" +#include "two_scale_running_precision.hpp" +#include "two_scale_solver.hpp" + using namespace flexiblesusy; +template +NewModel copy_parameters_from_model(const OldModel& old_model) +{ + NewModel new_model; + + new_model.set_loops(old_model.get_loops()); + new_model.set_scale(old_model.get_scale()); + new_model.set_ewsb_loop_order(old_model.get_ewsb_loop_order()); + new_model.set_thresholds(old_model.get_thresholds()); + + new_model.set_Yu(old_model.get_Yu()); + new_model.set_Yd(old_model.get_Yd()); + new_model.set_Ye(old_model.get_Ye()); + + new_model.set_g1(old_model.get_g1()); + new_model.set_g2(old_model.get_g2()); + new_model.set_g3(old_model.get_g3()); + + new_model.set_Mu(old_model.get_Mu()); + + new_model.set_vd(old_model.get_vd()); + new_model.set_vu(old_model.get_vu()); + + new_model.set_TYu(old_model.get_TYu()); + new_model.set_TYd(old_model.get_TYd()); + new_model.set_TYe(old_model.get_TYe()); + + new_model.set_mHd2(old_model.get_mHd2()); + new_model.set_mHu2(old_model.get_mHu2()); + new_model.set_BMu(old_model.get_BMu()); + + new_model.set_mq2(old_model.get_mq2()); + new_model.set_mu2(old_model.get_mu2()); + new_model.set_md2(old_model.get_md2()); + new_model.set_ml2(old_model.get_ml2()); + new_model.set_me2(old_model.get_me2()); + + new_model.set_MassB(old_model.get_MassB()); + new_model.set_MassWB(old_model.get_MassWB()); + new_model.set_MassG(old_model.get_MassG()); + + return new_model; +} + CMSSM_input_parameters initialize_two_scale_input( double m0Sq, const CMSSMSemiAnalytic_input_parameters& semi_analytic_input) { @@ -33,51 +83,45 @@ CMSSM initialize_two_scale_model( const CMSSMSemiAnalytic& semi_analytic_model, const CMSSMSemiAnalytic_input_parameters& semi_analytic_input) { - CMSSM two_scale_model; - - two_scale_model.set_loops(semi_analytic_model.get_loops()); - two_scale_model.set_scale(semi_analytic_model.get_scale()); - two_scale_model.set_ewsb_loop_order(semi_analytic_model.get_ewsb_loop_order()); - two_scale_model.set_thresholds(semi_analytic_model.get_thresholds()); + CMSSM two_scale_model + = copy_parameters_from_model >(semi_analytic_model); two_scale_model.set_input_parameters( initialize_two_scale_input(semi_analytic_model.get_m0Sq(), semi_analytic_input)); - two_scale_model.set_Yu(semi_analytic_model.get_Yu()); - two_scale_model.set_Yd(semi_analytic_model.get_Yd()); - two_scale_model.set_Ye(semi_analytic_model.get_Ye()); - - two_scale_model.set_g1(semi_analytic_model.get_g1()); - two_scale_model.set_g2(semi_analytic_model.get_g2()); - two_scale_model.set_g3(semi_analytic_model.get_g3()); + two_scale_model.calculate_DRbar_masses(); - two_scale_model.set_Mu(semi_analytic_model.get_Mu()); + return two_scale_model; +} - two_scale_model.set_vd(semi_analytic_model.get_vd()); - two_scale_model.set_vu(semi_analytic_model.get_vu()); +CMSSMSemiAnalytic_input_parameters initialize_semi_analytic_input( + double MuInput, const CMSSM_input_parameters& two_scale_input) +{ + CMSSMSemiAnalytic_input_parameters input; - two_scale_model.set_TYu(semi_analytic_model.get_TYu()); - two_scale_model.set_TYd(semi_analytic_model.get_TYd()); - two_scale_model.set_TYe(semi_analytic_model.get_TYe()); + input.m12 = two_scale_input.m12; + input.Azero = two_scale_input.Azero; + input.TanBeta = two_scale_input.TanBeta; + input.MuInput = MuInput; - two_scale_model.set_mHd2(semi_analytic_model.get_mHd2()); - two_scale_model.set_mHu2(semi_analytic_model.get_mHu2()); - two_scale_model.set_BMu(semi_analytic_model.get_BMu()); + return input; +} - two_scale_model.set_mq2(semi_analytic_model.get_mq2()); - two_scale_model.set_mu2(semi_analytic_model.get_mu2()); - two_scale_model.set_md2(semi_analytic_model.get_md2()); - two_scale_model.set_ml2(semi_analytic_model.get_ml2()); - two_scale_model.set_me2(semi_analytic_model.get_me2()); +CMSSMSemiAnalytic initialize_semi_analytic_model( + const CMSSM& two_scale_model, + const CMSSM_input_parameters& two_scale_input) +{ + CMSSMSemiAnalytic semi_analytic_model + = copy_parameters_from_model >(two_scale_model); - two_scale_model.set_MassB(semi_analytic_model.get_MassB()); - two_scale_model.set_MassWB(semi_analytic_model.get_MassWB()); - two_scale_model.set_MassG(semi_analytic_model.get_MassG()); + semi_analytic_model.set_input_parameters( + initialize_semi_analytic_input(two_scale_model.get_Mu(), + two_scale_input)); - two_scale_model.calculate_DRbar_masses(); + semi_analytic_model.calculate_DRbar_masses(); - return two_scale_model; + return semi_analytic_model; } template @@ -189,6 +233,69 @@ CMSSM run_single_two_scale_iteration(const CMSSM& model, c return next_model; } +CMSSMSemiAnalytic run_single_semi_analytic_iteration(const CMSSMSemiAnalytic& model, const CMSSMSemiAnalytic_scales& scales) +{ + CMSSMSemiAnalytic next_model(model); + + CMSSMSemiAnalytic_semi_analytic_solutions& solutions( + next_model.get_semi_analytic_solutions()); + + CMSSMSemiAnalytic_ewsb_solver ewsb_solver; + ewsb_solver.set_semi_analytic_solutions(&solutions); + next_model.set_ewsb_solver(&ewsb_solver); + + CMSSMSemiAnalytic_high_scale_constraint high_scale_constraint; + CMSSMSemiAnalytic_susy_scale_constraint susy_scale_constraint; + CMSSMSemiAnalytic_low_scale_constraint low_scale_constraint; + CMSSMSemiAnalytic_soft_parameters_constraint soft_constraint; + + high_scale_constraint.set_model(&next_model); + susy_scale_constraint.set_model(&next_model); + low_scale_constraint.set_model(&next_model); + soft_constraint.set_model(&next_model); + + softsusy::QedQcd qedqcd; + qedqcd.to(qedqcd.displayPoleMZ()); + + susy_scale_constraint.set_sm_parameters(qedqcd); + low_scale_constraint.set_sm_parameters(qedqcd); + soft_constraint.set_sm_parameters(qedqcd); + + high_scale_constraint.set_soft_parameters_constraint(&soft_constraint); + + high_scale_constraint.initialize(); + susy_scale_constraint.initialize(); + low_scale_constraint.initialize(); + soft_constraint.initialize(); + + high_scale_constraint.scale = scales.HighScale; + susy_scale_constraint.scale = scales.SUSYScale; + low_scale_constraint.scale = scales.LowScale; + soft_constraint.scale = scales.SUSYScale; + + CMSSMSemiAnalytic_susy_convergence_tester convergence_tester( + &next_model, 1.0e-4); + + Two_scale_increasing_precision running_precision(10.0, 1.0e-4); + + // apply constraints once + RGFlow inner_solver; + inner_solver.reset(); + inner_solver.set_convergence_tester(&convergence_tester); + inner_solver.set_running_precision(&running_precision); + + inner_solver.add(&low_scale_constraint, &next_model); + inner_solver.add(&high_scale_constraint, &next_model); + inner_solver.add(&susy_scale_constraint, &next_model); + + inner_solver.solve(); + + next_model.run_to(scales.SUSYScale); + soft_constraint.apply(); + + return next_model; +} + std::vector initialize_semi_analytic_inputs() { std::vector inputs{4}; @@ -216,6 +323,19 @@ std::vector initialize_semi_analytic_inputs( return inputs; } +std::vector initialize_two_scale_inputs() +{ + std::vector inputs{1}; + + inputs[0].m0 = 125.; + inputs[0].m12 = 500.; + inputs[0].TanBeta = 10.; + inputs[0].SignMu = 1; + inputs[0].Azero = 0.; + + return inputs; +} + BOOST_AUTO_TEST_CASE( test_semi_analytic_to_two_scale ) { const double precision = 1.0e-4; @@ -266,3 +386,54 @@ BOOST_AUTO_TEST_CASE( test_semi_analytic_to_two_scale ) BOOST_CHECK_LT(mass_rel_diff, test_precision); } } + +BOOST_AUTO_TEST_CASE( test_two_scale_to_semi_analytic ) +{ + const double precision = 1.0e-4; + + const std::vector two_scale_inputs( + initialize_two_scale_inputs()); + + for (const auto& two_scale_input: two_scale_inputs) { + softsusy::QedQcd qedqcd; + + CMSSM_spectrum_generator spectrum_generator; + spectrum_generator.set_precision_goal(precision); + spectrum_generator.set_max_iterations(0); + spectrum_generator.set_calculate_sm_masses(0); + + spectrum_generator.run(qedqcd, two_scale_input); + + const auto& two_scale_problems = spectrum_generator.get_problems(); + + BOOST_CHECK_EQUAL(two_scale_problems.have_problem(), false); + + const double high_scale = spectrum_generator.get_high_scale(); + const double susy_scale = spectrum_generator.get_susy_scale(); + const double low_scale = spectrum_generator.get_low_scale(); + + const CMSSM two_scale_model = spectrum_generator.get_model(); + + CMSSMSemiAnalytic_scales scales; + scales.HighScale = high_scale; + scales.SUSYScale = susy_scale; + scales.LowScale = low_scale; + + const CMSSMSemiAnalytic semi_analytic_model( + initialize_semi_analytic_model(two_scale_model, two_scale_input)); + + const CMSSMSemiAnalytic single_iteration_model = + run_single_semi_analytic_iteration(semi_analytic_model, scales); + + // check that the originally found solution is an (approximate) + // fixed point of the semi-analytic iteration as well + const double susy_pars_rel_diff = max_susy_parameters_rel_diff( + semi_analytic_model, single_iteration_model); + const double mass_rel_diff = max_mass_rel_diff( + semi_analytic_model, single_iteration_model); + + const double test_precision = 20. * precision; + BOOST_CHECK_LT(susy_pars_rel_diff, test_precision); + BOOST_CHECK_LT(mass_rel_diff, test_precision); + } +}