Skip to content

Commit

Permalink
Add pointer to semi-analytic constraint
Browse files Browse the repository at this point in the history
for the purposes of updating the scale at which
the boundary conditions are imposed.
  • Loading branch information
Dylan Harries committed Jan 4, 2017
1 parent f4b5c54 commit 0015056
Show file tree
Hide file tree
Showing 8 changed files with 165 additions and 17 deletions.
134 changes: 134 additions & 0 deletions meta/FlexibleSUSY.m
Expand Up @@ -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<Semi_analytic>* 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,
Expand Down Expand Up @@ -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"}],
Expand Down
33 changes: 19 additions & 14 deletions meta/SemiAnalytic.m
Expand Up @@ -7,6 +7,8 @@
SemiAnalyticSolution[parameter, {basis}]";

CheckSemiAnalyticBoundaryConditions::usage="";
IsSemiAnalyticSetting::usage="";
IsSemiAnalyticConstraint::usage="";
SelectSemiAnalyticConstraint::usage="";

SetSemiAnalyticParameters::usage="";
Expand Down Expand Up @@ -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]
];

Expand Down
2 changes: 2 additions & 0 deletions templates/semi_analytic_high_scale_constraint.cpp.in
Expand Up @@ -103,6 +103,7 @@ void @ModelName@_high_scale_constraint<Semi_analytic>::clear()
scale = 0.;
initial_scale_guess = 0.;
model = nullptr;
@clearSemiAnalyticConstraint@
}

void @ModelName@_high_scale_constraint<Semi_analytic>::initialize()
Expand Down Expand Up @@ -137,4 +138,5 @@ void @ModelName@_high_scale_constraint<Semi_analytic>::update_scale()
}

@restrictScale@
@updateSemiAnalyticConstraint@
}
3 changes: 2 additions & 1 deletion templates/semi_analytic_high_scale_constraint.hpp.in
Expand Up @@ -49,7 +49,7 @@ public:
@ModelName@<Semi_analytic>* get_model() const { return model; }
void initialize();
void set_scale(double s) { scale = s; }

@setSemiAnalyticConstraint@
protected:
void update_scale();
bool check_non_perturbative();
Expand All @@ -58,6 +58,7 @@ private:
double scale{0.};
double initial_scale_guess{0.};
@ModelName@<Semi_analytic>* model{nullptr};
@semiAnalyticConstraint@
};

} // namespace flexiblesusy
Expand Down
2 changes: 2 additions & 0 deletions templates/semi_analytic_low_scale_constraint.cpp.in
Expand Up @@ -111,6 +111,7 @@ void @ModelName@_low_scale_constraint<Semi_analytic>::clear()
new_g2 = 0.;
new_g3 = 0.;
self_energy_w_at_mw = 0.;
@clearSemiAnalyticConstraint@
}

void @ModelName@_low_scale_constraint<Semi_analytic>::initialize()
Expand Down Expand Up @@ -141,6 +142,7 @@ void @ModelName@_low_scale_constraint<Semi_analytic>::update_scale()

@calculateScale@
@restrictScale@
@updateSemiAnalyticConstraint@
}

void @ModelName@_low_scale_constraint<Semi_analytic>::calculate_threshold_corrections()
Expand Down
3 changes: 2 additions & 1 deletion templates/semi_analytic_low_scale_constraint.hpp.in
Expand Up @@ -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.};
Expand All @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions templates/semi_analytic_susy_scale_constraint.cpp.in
Expand Up @@ -96,6 +96,7 @@ void @ModelName@_susy_scale_constraint<Semi_analytic>::clear()
initial_scale_guess = 0.;
model = nullptr;
qedqcd = softsusy::QedQcd();
@clearSemiAnalyticConstraint@
}

void @ModelName@_susy_scale_constraint<Semi_analytic>::initialize()
Expand All @@ -114,6 +115,7 @@ void @ModelName@_susy_scale_constraint<Semi_analytic>::update_scale()

@calculateScale@
@restrictScale@
@updateSemiAnalyticConstraint@
}

} // namespace flexiblesusy
3 changes: 2 additions & 1 deletion templates/semi_analytic_susy_scale_constraint.hpp.in
Expand Up @@ -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();

Expand All @@ -60,6 +60,7 @@ private:
double initial_scale_guess{0.};
@ModelName@<Semi_analytic>* model{nullptr};
softsusy::QedQcd qedqcd{};
@semiAnalyticConstraint@
};

} // namespace flexiblesusy
Expand Down

0 comments on commit 0015056

Please sign in to comment.