diff --git a/meta/FlexibleSUSY.m b/meta/FlexibleSUSY.m index 09b043ab3..0917a6990 100644 --- a/meta/FlexibleSUSY.m +++ b/meta/FlexibleSUSY.m @@ -2283,7 +2283,8 @@ corresponding tadpole is real or imaginary (only in models with CP extraSLHAOutputBlocks, effectiveCouplings ={}, extraVertices = {}, vertexRules, vertexRuleFileName, effectiveCouplingsFileName, Lat$massMatrices, spectrumGeneratorFiles = {}, spectrumGeneratorInputFile, - semiAnalyticBCs, semiAnalyticSolns}, + semiAnalyticBCs, semiAnalyticSolns, semiAnalyticScale, semiAnalyticScaleGuess, + semiAnalyticScaleMinimum, semiAnalyticScaleMaximum}, (* check if SARAH`Start[] was called *) If[!ValueQ[Model`Name], Print["Error: Model`Name is not defined. Did you call SARAH`Start[\"Model\"]?"]; @@ -3020,7 +3021,32 @@ corresponding tadpole is real or imaginary (only in models with CP semiAnalyticBCs = SemiAnalytic`SelectSemiAnalyticConstraint[{FlexibleSUSY`LowScaleInput, FlexibleSUSY`SUSYScaleInput, FlexibleSUSY`HighScaleInput}]; + semiAnalyticSolns = SemiAnalytic`GetSemiAnalyticSolutions[semiAnalyticBCs]; + + (* construct additional semi-analytic constraint from user-defined constraints *) + Which[SemiAnalytic`IsSemiAnalyticConstraintScale[FlexibleSUSY`HighScaleInput], + semiAnalyticScale = FlexibleSUSY`HighScale; + semiAnalyticScaleGuess = FlexibleSUSY`HighScaleFirstGuess; + semiAnalyticScaleMinimum = FlexibleSUSY`HighScaleMinimum; + semiAnalyticScaleMaximum = FlexibleSUSY`HighScaleMaximum;, + SemiAnalytic`IsSemiAnalyticConstraintScale[FlexibleSUSY`SUSYScaleInput], + semiAnalyticScale = FlexibleSUSY`SUSYScale; + semiAnalyticScaleGuess = FlexibleSUSY`SUSYScaleFirstGuess; + semiAnalyticScaleMinimum = FlexibleSUSY`SUSYScaleMinimum; + semiAnalyticScaleMaximum = FlexibleSUSY`SUSYScaleMaximum;, + SemiAnalytic`IsSemiAnalyticConstraintScale[FlexibleSUSY`LowScaleInput], + semiAnalyticScale = FlexibleSUSY`LowScale; + semiAnalyticScaleGuess = FlexibleSUSY`LowScaleFirstGuess; + semiAnalyticScaleMinimum = FlexibleSUSY`LowScaleMinimum; + semiAnalyticScaleMaximum = FlexibleSUSY`LowScaleMaximum;, + True, + semiAnalyticScale = FlexibleSUSY`SUSYScale; + semiAnalyticScaleGuess = FlexibleSUSY`SUSYScaleFirstGuess; + semiAnalyticScaleMinimum = FlexibleSUSY`SUSYScaleMinimum; + semiAnalyticScaleMaximum = FlexibleSUSY`SUSYScaleMaximum; + ]; + Print["Creating classes for convergence testers ..."]; WriteConvergenceTesterClass[Complement[Parameters`GetModelParameters[], SemiAnalytic`GetSemiAnalyticParameters[]], {{FileNameJoin[{$flexiblesusyTemplateDir, "susy_convergence_tester.hpp.in"}], @@ -3081,6 +3107,16 @@ corresponding tadpole is real or imaginary (only in models with CP FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_low_scale_constraint.cpp"}]} }]; + Print["Creating class for semi-analytic constraint ..."]; + WriteSemiAnalyticConstraintClass[semiAnalyticScale, {}, + semiAnalyticScaleGuess, + {semiAnalyticScaleMinimum, semiAnalyticScaleMaximum}, False, + {{FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_soft_parameters_constraint.hpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_soft_parameters_constraint.hpp"}]}, + {FileNameJoin[{$flexiblesusyTemplateDir, "semi_analytic_soft_parameters_constraint.cpp.in"}], + FileNameJoin[{FSOutputDir, FlexibleSUSY`FSModelName <> "_semi_analytic_soft_parameters_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 67e66fcea..539570001 100644 --- a/meta/SemiAnalytic.m +++ b/meta/SemiAnalytic.m @@ -10,6 +10,8 @@ IsSemiAnalyticSetting::usage=""; IsBasisParameterSetting::usage=""; IsSemiAnalyticConstraint::usage=""; +IsSemiAnalyticConstraintScale::usage="Returns True if given constraint +corresponds to the scale at which the semi-analytic solutions are evaluated."; SelectSemiAnalyticConstraint::usage=""; SetSemiAnalyticParameters::usage=""; @@ -148,6 +150,8 @@ RemoveUnusedSettings[result] ]; +IsSemiAnalyticConstraintScale[settings_List] := MemberQ[settings, FlexibleSUSY`FSSolveEWSBFor[___]]; + SelectParametersWithMassDimension[parameters_List, dim_?IntegerQ] := Module[{allParameters}, allParameters = Parameters`GetModelParametersWithMassDimension[dim];