From 00150568ef58c058424849836164758a387bb55c Mon Sep 17 00:00:00 2001 From: Dylan Harries Date: Wed, 4 Jan 2017 15:46:51 +1030 Subject: [PATCH] Add pointer to semi-analytic constraint for the purposes of updating the scale at which the boundary conditions are imposed. --- meta/FlexibleSUSY.m | 134 ++++++++++++++++++ meta/SemiAnalytic.m | 33 +++-- ...semi_analytic_high_scale_constraint.cpp.in | 2 + ...semi_analytic_high_scale_constraint.hpp.in | 3 +- .../semi_analytic_low_scale_constraint.cpp.in | 2 + .../semi_analytic_low_scale_constraint.hpp.in | 3 +- ...semi_analytic_susy_scale_constraint.cpp.in | 2 + ...semi_analytic_susy_scale_constraint.hpp.in | 3 +- 8 files changed, 165 insertions(+), 17 deletions(-) diff --git a/meta/FlexibleSUSY.m b/meta/FlexibleSUSY.m index 7fc7c112d..cf7f1c0f8 100644 --- a/meta/FlexibleSUSY.m +++ b/meta/FlexibleSUSY.m @@ -817,6 +817,104 @@ FlexibleSUSY model file (FlexibleSUSY.m). } ]; ]; +WriteSemiAnalyticConstraintClass[condition_, settings_List, scaleFirstGuess_, + {minimumScale_, maximumScale_}, + mustSetSemiAnalyticBCs_, files_List] := + Module[{applyConstraint = "", calculateScale, scaleGuess, + restrictScale, + temporarySetting = "", temporaryResetting = "", + setDRbarYukawaCouplings, + calculateDRbarMasses, + calculateDeltaAlphaEm, calculateDeltaAlphaS, + calculateGaugeCouplings, + calculateThetaW, + recalculateMWPole, + checkPerturbativityForDimensionlessParameters = "", + semiAnalyticConstraint = "", + setSemiAnalyticConstraint = "", + clearSemiAnalyticConstraint = "", + updateSemiAnalyticConstraint = ""}, + Constraint`SetBetaFunctions[GetBetaFunctions[]]; + applyConstraint = Constraint`ApplyConstraints[settings]; + calculateScale = Constraint`CalculateScale[condition, "scale"]; + scaleGuess = Constraint`CalculateScale[scaleFirstGuess, "initial_scale_guess"]; + restrictScale = Constraint`RestrictScale[{minimumScale, maximumScale}]; + temporarySetting = Constraint`SetTemporarily[settings]; + temporaryResetting = Constraint`ResetTemporarily[settings]; + calculateDeltaAlphaEm = ThresholdCorrections`CalculateDeltaAlphaEm[FlexibleSUSY`FSRenormalizationScheme]; + calculateDeltaAlphaS = ThresholdCorrections`CalculateDeltaAlphaS[FlexibleSUSY`FSRenormalizationScheme]; + calculateThetaW = ThresholdCorrections`CalculateThetaW[FSWeakMixingAngleOptions,SARAH`SupersymmetricModel]; + calculateGaugeCouplings = ThresholdCorrections`CalculateGaugeCouplings[]; + recalculateMWPole = ThresholdCorrections`RecalculateMWPole[FSWeakMixingAngleOptions]; + setDRbarYukawaCouplings = { + ThresholdCorrections`SetDRbarYukawaCouplingTop[settings], + ThresholdCorrections`SetDRbarYukawaCouplingBottom[settings], + ThresholdCorrections`SetDRbarYukawaCouplingElectron[settings] + }; + calculateDRbarMasses = { + LoopMasses`CallCalculateDRbarMass["Up Quark" , "Up-Quarks" , 1, "upQuarksDRbar", "qedqcd.displayMass(softsusy::mUp)" ], + LoopMasses`CallCalculateDRbarMass["Charmed Quark" , "Up-Quarks" , 2, "upQuarksDRbar", "qedqcd.displayMass(softsusy::mCharm)" ], + LoopMasses`CallCalculateDRbarMass["Top Quark" , "Up-Quarks" , 3, "upQuarksDRbar", "qedqcd.displayPoleMt()" ], + LoopMasses`CallCalculateDRbarMass["Down Quark" , "Down-Quarks", 1, "downQuarksDRbar", "qedqcd.displayMass(softsusy::mDown)" ], + LoopMasses`CallCalculateDRbarMass["Strange Quark" , "Down-Quarks", 2, "downQuarksDRbar", "qedqcd.displayMass(softsusy::mStrange)" ], + LoopMasses`CallCalculateDRbarMass["Bottom Quark" , "Down-Quarks", 3, "downQuarksDRbar", "qedqcd.displayMass(softsusy::mBottom)" ], + LoopMasses`CallCalculateDRbarMass["Electron" , "Leptons" , 1, "downLeptonsDRbar", "qedqcd.displayMass(softsusy::mElectron)"], + LoopMasses`CallCalculateDRbarMass["Muon" , "Leptons" , 2, "downLeptonsDRbar", "qedqcd.displayMass(softsusy::mMuon)" ], + LoopMasses`CallCalculateDRbarMass["Tau" , "Leptons" , 3, "downLeptonsDRbar", "qedqcd.displayMass(softsusy::mTau)" ], + LoopMasses`CallCalculateDRbarMass["Electron Neutrino", "Neutrinos" , 1, "neutrinoDRbar", "qedqcd.displayNeutrinoPoleMass(1)" ], + LoopMasses`CallCalculateDRbarMass["Muon Neutrino" , "Neutrinos" , 2, "neutrinoDRbar", "qedqcd.displayNeutrinoPoleMass(2)" ], + LoopMasses`CallCalculateDRbarMass["Tau Neutrino" , "Neutrinos" , 3, "neutrinoDRbar", "qedqcd.displayNeutrinoPoleMass(3)" ] + }; + If[FSCheckPerturbativityOfDimensionlessParameters, + checkPerturbativityForDimensionlessParameters = + Constraint`CheckPerturbativityForParameters[ + Parameters`GetModelParametersWithMassDimension[0], + FlexibleSUSY`FSPerturbativityThreshold + ]; + ]; + If[mustSetSemiAnalyticBCs, + semiAnalyticConstraint = FlexibleSUSY`FSModelName <> "_soft_parameters_constraint* soft_constraint{nullptr};\n"; + setSemiAnalyticConstraint = "void set_soft_parameters_constraint(" <> FlexibleSUSY`FSModelName + <> "_soft_parameters_constraint* sc) { soft_constraint = sc; }\n"; + clearSemiAnalyticConstraint = "soft_constraint = nullptr;\n"; + updateSemiAnalyticConstraint = "if (soft_constraint) soft_constraint.set_boundary_scale(scale);\n"; + ]; + WriteOut`ReplaceInFiles[files, + { "@applyConstraint@" -> IndentText[WrapLines[applyConstraint]], + "@calculateScale@" -> IndentText[WrapLines[calculateScale]], + "@scaleGuess@" -> IndentText[WrapLines[scaleGuess]], + "@restrictScale@" -> IndentText[WrapLines[restrictScale]], + "@temporarySetting@" -> IndentText[WrapLines[temporarySetting]], + "@temporaryResetting@" -> IndentText[WrapLines[temporaryResetting]], + "@calculateGaugeCouplings@" -> IndentText[WrapLines[calculateGaugeCouplings]], + "@calculateDeltaAlphaEm@" -> IndentText[WrapLines[calculateDeltaAlphaEm]], + "@calculateDeltaAlphaS@" -> IndentText[WrapLines[calculateDeltaAlphaS]], + "@calculateThetaW@" -> IndentText[WrapLines[calculateThetaW]], + "@recalculateMWPole@" -> IndentText[WrapLines[recalculateMWPole]], + "@calculateDRbarMassUp@" -> IndentText[IndentText[calculateDRbarMasses[[1]]]], + "@calculateDRbarMassCharm@" -> IndentText[IndentText[calculateDRbarMasses[[2]]]], + "@calculateDRbarMassTop@" -> IndentText[IndentText[calculateDRbarMasses[[3]]]], + "@calculateDRbarMassDown@" -> IndentText[IndentText[calculateDRbarMasses[[4]]]], + "@calculateDRbarMassStrange@" -> IndentText[IndentText[calculateDRbarMasses[[5]]]], + "@calculateDRbarMassBottom@" -> IndentText[IndentText[calculateDRbarMasses[[6]]]], + "@calculateDRbarMassElectron@"-> IndentText[IndentText[calculateDRbarMasses[[7]]]], + "@calculateDRbarMassMuon@" -> IndentText[IndentText[calculateDRbarMasses[[8]]]], + "@calculateDRbarMassTau@" -> IndentText[IndentText[calculateDRbarMasses[[9]]]], + "@calculateDRbarMassElectronNeutrino@"-> IndentText[IndentText[calculateDRbarMasses[[10]]]], + "@calculateDRbarMassMuonNeutrino@" -> IndentText[IndentText[calculateDRbarMasses[[11]]]], + "@calculateDRbarMassTauNeutrino@" -> IndentText[IndentText[calculateDRbarMasses[[12]]]], + "@setDRbarUpQuarkYukawaCouplings@" -> IndentText[WrapLines[setDRbarYukawaCouplings[[1]]]], + "@setDRbarDownQuarkYukawaCouplings@" -> IndentText[WrapLines[setDRbarYukawaCouplings[[2]]]], + "@setDRbarElectronYukawaCouplings@" -> IndentText[WrapLines[setDRbarYukawaCouplings[[3]]]], + "@checkPerturbativityForDimensionlessParameters@" -> IndentText[checkPerturbativityForDimensionlessParameters], + "@semiAnalyticConstraint@" -> IndentText[semiAnalyticConstraint], + "@setSemiAnalyticConstraint@" -> IndentText[setSemiAnalyticConstraint], + "@clearSemiAnalyticConstraint@" -> IndentText[clearSemiAnalyticConstraint], + "@updateSemiAnalyticConstraint@" -> IndentText[updateSemiAnalyticConstraint], + Sequence @@ GeneralReplacementRules[] + } ]; + ]; + WriteInitialGuesserClass[lowScaleGuess_List, susyScaleGuess_List, highScaleGuess_List, files_List] := Module[{initialGuessAtLowScale, initialGuessAtLowScaleGaugeCouplings = "", initialGuessAtHighScale, setDRbarYukawaCouplings, @@ -2942,6 +3040,42 @@ corresponding tadpole is real or imaginary (only in models with CP } ]; + Print["Creating class for high-scale constraint ..."]; + WriteSemiAnalyticConstraintClass[FlexibleSUSY`HighScale, + Select[FlexibleSUSY`HighScaleInput, !SemiAnalytic`IsSemiAnalyticSetting[#]&], + FlexibleSUSY`HighScaleFirstGuess, + {FlexibleSUSY`HighScaleMinimum, FlexibleSUSY`HighScaleMaximum}, + SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`HighScaleInput], + {{FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_high_scale_constraint.hpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_high_scale_constraint.hpp"}]}, + {FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_high_scale_constraint.cpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_high_scale_constraint.cpp"}]} + }]; + + Print["Creating class for susy-scale constraint ..."]; + WriteSemiAnalyticConstraintClass[FlexibleSUSY`SUSYScale, + Select[FlexibleSUSY`SUSYScaleInput, !SemiAnalytic`IsSemiAnalyticSetting[#]&], + FlexibleSUSY`SUSYScaleFirstGuess, + {FlexibleSUSY`SUSYScaleMinimum, FlexibleSUSY`SUSYScaleMaximum}, + SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`SUSYScaleInput], + {{FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_susy_scale_constraint.hpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_susy_scale_constraint.hpp"}]}, + {FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_susy_scale_constraint.cpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_susy_scale_constraint.cpp"}]} + }]; + + Print["Creating class for low-scale constraint ..."]; + WriteSemiAnalyticConstraintClass[FlexibleSUSY`LowScale, + Select[FlexibleSUSY`LowScaleInput, !SemiAnalytic`IsSemiAnalyticSetting[#]&], + FlexibleSUSY`LowScaleFirstGuess, + {FlexibleSUSY`LowScaleMinimum, FlexibleSUSY`LowScaleMaximum}, + SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`LowScaleInput], + {{FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_low_scale_constraint.hpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_low_scale_constraint.hpp"}]}, + {FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_low_scale_constraint.cpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_low_scale_constraint.cpp"}]} + }]; + Print["Creating class for semi-analytic model ..."]; WriteSemiAnalyticModelClass[semiAnalyticBCs, semiAnalyticSolns, {{FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_model.hpp.in"}], diff --git a/meta/SemiAnalytic.m b/meta/SemiAnalytic.m index 6f6081a5a..efd94d5db 100644 --- a/meta/SemiAnalytic.m +++ b/meta/SemiAnalytic.m @@ -7,6 +7,8 @@ SemiAnalyticSolution[parameter, {basis}]"; CheckSemiAnalyticBoundaryConditions::usage=""; +IsSemiAnalyticSetting::usage=""; +IsSemiAnalyticConstraint::usage=""; SelectSemiAnalyticConstraint::usage=""; SetSemiAnalyticParameters::usage=""; @@ -112,23 +114,26 @@ True ]; -RemoveUnusedSettings[constraints_List] := - Module[{isUsed}, - isUsed[setting_] := Intersection[Constraint`FindFixedParametersFromConstraint[{setting}], - allSemiAnalyticParameters] =!= {}; - Select[constraints, isUsed[#]&] +IsSemiAnalyticSetting[setting_] := + Intersection[Constraint`FindFixedParametersFromConstraint[{setting}], + allSemiAnalyticParameters] =!= {}; + +RemoveUnusedSettings[constraints_List] := Select[constraints, IsSemiAnalyticSetting]; + +IsSemiAnalyticConstraint[constraint_] := + Module[{sortedPars, fixedPars}, + sortedPars = Sort[allSemiAnalyticParameters]; + fixedPars = Sort[Intersection[sortedPars, + Constraint`FindFixedParametersFromConstraint[constraint]]]; + fixedPars =!= {} && fixedPars === sortedPars ]; SelectSemiAnalyticConstraint[constraints_List] := - Module[{i, sortedPars, fixedPars, result = {}}, - sortedPars = Sort[allSemiAnalyticParameters]; - For[i = 1, i <= Length[constraints], i++, - fixedPars = Sort[Intersection[sortedPars, - Constraint`FindFixedParametersFromConstraint[constraints[[i]]]]]; - If[fixedPars =!= {} && fixedPars === sortedPars, - result = constraints[[i]]; - ]; - ]; + Module[{validConstraints, result = {}}, + validConstraints = Select[constraints, IsSemiAnalyticConstraint]; + If[Length[validConstraints] >= 1, + result = validConstraints[[1]]; + ]; RemoveUnusedSettings[result] ]; diff --git a/templates/semi_analytic_high_scale_constraint.cpp.in b/templates/semi_analytic_high_scale_constraint.cpp.in index b21953bc9..f87607f2f 100644 --- a/templates/semi_analytic_high_scale_constraint.cpp.in +++ b/templates/semi_analytic_high_scale_constraint.cpp.in @@ -103,6 +103,7 @@ void @ModelName@_high_scale_constraint::clear() scale = 0.; initial_scale_guess = 0.; model = nullptr; +@clearSemiAnalyticConstraint@ } void @ModelName@_high_scale_constraint::initialize() @@ -137,4 +138,5 @@ void @ModelName@_high_scale_constraint::update_scale() } @restrictScale@ +@updateSemiAnalyticConstraint@ } diff --git a/templates/semi_analytic_high_scale_constraint.hpp.in b/templates/semi_analytic_high_scale_constraint.hpp.in index 774b253de..0d7bb7ad9 100644 --- a/templates/semi_analytic_high_scale_constraint.hpp.in +++ b/templates/semi_analytic_high_scale_constraint.hpp.in @@ -49,7 +49,7 @@ public: @ModelName@* get_model() const { return model; } void initialize(); void set_scale(double s) { scale = s; } - +@setSemiAnalyticConstraint@ protected: void update_scale(); bool check_non_perturbative(); @@ -58,6 +58,7 @@ private: double scale{0.}; double initial_scale_guess{0.}; @ModelName@* model{nullptr}; +@semiAnalyticConstraint@ }; } // namespace flexiblesusy diff --git a/templates/semi_analytic_low_scale_constraint.cpp.in b/templates/semi_analytic_low_scale_constraint.cpp.in index 6a65e933d..836225d0c 100644 --- a/templates/semi_analytic_low_scale_constraint.cpp.in +++ b/templates/semi_analytic_low_scale_constraint.cpp.in @@ -111,6 +111,7 @@ void @ModelName@_low_scale_constraint::clear() new_g2 = 0.; new_g3 = 0.; self_energy_w_at_mw = 0.; +@clearSemiAnalyticConstraint@ } void @ModelName@_low_scale_constraint::initialize() @@ -141,6 +142,7 @@ void @ModelName@_low_scale_constraint::update_scale() @calculateScale@ @restrictScale@ +@updateSemiAnalyticConstraint@ } void @ModelName@_low_scale_constraint::calculate_threshold_corrections() diff --git a/templates/semi_analytic_low_scale_constraint.hpp.in b/templates/semi_analytic_low_scale_constraint.hpp.in index 1b951ddce..a01f633b3 100644 --- a/templates/semi_analytic_low_scale_constraint.hpp.in +++ b/templates/semi_analytic_low_scale_constraint.hpp.in @@ -53,7 +53,7 @@ public: const softsusy::QedQcd& get_sm_parameters() const { return qeqqcd; } void set_sm_parameters(const softsusy::QedQcd& qedqcd_) { qedqcd = qedqcd_; } void set_threshold_corrections_loop_order(unsigned); ///< threshold corrections loop order - +@setSemiAnalyticConstraint@ private: double scale{0.}; double initial_scale_guess{0.}; @@ -72,6 +72,7 @@ private: double new_g3{0.}; double self_energy_w_at_mw{0.}; unsigned threshold_corrections_loop_order{1}; ///< threshold corrections loop order +@semiAnalyticConstraint@ double calculate_theta_w(double); void calculate_threshold_corrections(); diff --git a/templates/semi_analytic_susy_scale_constraint.cpp.in b/templates/semi_analytic_susy_scale_constraint.cpp.in index d2e32431f..d04b5a501 100644 --- a/templates/semi_analytic_susy_scale_constraint.cpp.in +++ b/templates/semi_analytic_susy_scale_constraint.cpp.in @@ -96,6 +96,7 @@ void @ModelName@_susy_scale_constraint::clear() initial_scale_guess = 0.; model = nullptr; qedqcd = softsusy::QedQcd(); +@clearSemiAnalyticConstraint@ } void @ModelName@_susy_scale_constraint::initialize() @@ -114,6 +115,7 @@ void @ModelName@_susy_scale_constraint::update_scale() @calculateScale@ @restrictScale@ +@updateSemiAnalyticConstraint@ } } // namespace flexiblesusy diff --git a/templates/semi_analytic_susy_scale_constraint.hpp.in b/templates/semi_analytic_susy_scale_constraint.hpp.in index 9e7407e7f..b012809f9 100644 --- a/templates/semi_analytic_susy_scale_constraint.hpp.in +++ b/templates/semi_analytic_susy_scale_constraint.hpp.in @@ -51,7 +51,7 @@ public: void initialize(); const softsusy::QedQcd& get_sm_parameters() const { return qedqcd; } void set_sm_parameters(const softsusy::QedQcd& qedqcd_) { qedqcd = qedqcd_; } - +@setSemiAnalyticConstraint@ protected: void update_scale(); @@ -60,6 +60,7 @@ private: double initial_scale_guess{0.}; @ModelName@* model{nullptr}; softsusy::QedQcd qedqcd{}; +@semiAnalyticConstraint@ }; } // namespace flexiblesusy