Skip to content

Commit

Permalink
Save boundary values in constraint
Browse files Browse the repository at this point in the history
  • Loading branch information
Dylan Harries committed Jan 8, 2017
1 parent 8c7991f commit 7bb2cb3
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 7 deletions.
18 changes: 14 additions & 4 deletions meta/FlexibleSUSY.m
Expand Up @@ -819,7 +819,7 @@ FlexibleSUSY model file (FlexibleSUSY.m).

WriteSemiAnalyticConstraintClass[condition_, settings_List, scaleFirstGuess_,
{minimumScale_, maximumScale_},
mustSetSemiAnalyticBCs_, files_List] :=
mustSetSemiAnalyticBCs_, semiAnalyticSolns_List, files_List] :=
Module[{applyConstraint = "", calculateScale, scaleGuess,
restrictScale,
temporarySetting = "", temporaryResetting = "",
Expand All @@ -833,7 +833,8 @@ FlexibleSUSY model file (FlexibleSUSY.m).
semiAnalyticConstraint = "",
setSemiAnalyticConstraint = "",
clearSemiAnalyticConstraint = "",
updateSemiAnalyticConstraint = ""},
updateSemiAnalyticConstraint = "",
saveBoundaryValueParameters = ""},
Constraint`SetBetaFunctions[GetBetaFunctions[]];
applyConstraint = Constraint`ApplyConstraints[settings];
calculateScale = Constraint`CalculateScale[condition, "scale"];
Expand Down Expand Up @@ -878,6 +879,7 @@ FlexibleSUSY model file (FlexibleSUSY.m).
<> "_soft_parameters_constraint* sc) { soft_constraint = sc; }\n";
clearSemiAnalyticConstraint = "soft_constraint = nullptr;\n";
updateSemiAnalyticConstraint = "if (soft_constraint) soft_constraint.set_boundary_scale(scale);\n";
saveBoundaryValueParameters = SemiAnalytic`SaveBoundaryValueParameters[semiAnalyticSolns];
];
WriteOut`ReplaceInFiles[files,
{ "@applyConstraint@" -> IndentText[WrapLines[applyConstraint]],
Expand Down Expand Up @@ -911,6 +913,7 @@ FlexibleSUSY model file (FlexibleSUSY.m).
"@setSemiAnalyticConstraint@" -> IndentText[setSemiAnalyticConstraint],
"@clearSemiAnalyticConstraint@" -> IndentText[clearSemiAnalyticConstraint],
"@updateSemiAnalyticConstraint@" -> IndentText[updateSemiAnalyticConstraint],
"@saveBoundaryValueParameters@" -> IndentText[WrapLines[saveBoundaryValueParameters]],
Sequence @@ GeneralReplacementRules[]
} ];
];
Expand Down Expand Up @@ -1442,20 +1445,23 @@ corresponding tadpole is real or imaginary (only in models with CP
WriteSemiAnalyticModelClass[semiAnalyticBCs_List, semiAnalyticSolns_List, files_List] :=
Module[{semiAnalyticSolutionsDefs = "", semiAnalyticSolutionsInit = "",
boundaryValuesDefs = "", boundaryValuesInit = "",
applySemiAnalyticBCs = "", calculateParameterValues = "", calculateCoeffFunctions = ""},
applySemiAnalyticBCs = "", calculateParameterValues = "", calculateCoeffFunctions = "",
setBoundaryValueParameters = ""},
semiAnalyticSolutionsDefs = SemiAnalytic`CreateSemiAnalyticSolutionsDefinitions[semiAnalyticSolns];
semiAnalyticSolutionsInit = SemiAnalytic`CreateSemiAnalyticSolutionsInitialization[semiAnalyticSolns];
boundaryValuesDefs = SemiAnalytic`CreateBoundaryValuesDefinitions[semiAnalyticSolns];
boundaryValuesInit = SemiAnalytic`CreateBoundaryValuesInitialization[semiAnalyticSolns];
applySemiAnalyticBCs = SemiAnalytic`ApplySemiAnalyticBoundaryConditions[semiAnalyticBCs, semiAnalyticSolns];
calculateParameterValues = SemiAnalytic`EvaluateSemiAnalyticSolutions[semiAnalyticSolns];
setBoundaryValueParameters = SemiAnalytic`SetBoundaryValueParameters[semiAnalyticSolns];
WriteOut`ReplaceInFiles[files, { "@semiAnalyticSolutionsDefs@" -> IndentText[WrapLines[semiAnalyticSolutionsDefs]],
"@semiAnalyticSolutionsInit@" -> IndentText[WrapLines[semiAnalyticSolutionsInit]],
"@boundaryValuesDefs@" -> IndentText[WrapLines[boundaryValuesDefs]],
"@boundaryValuesInit@" -> IndentText[WrapLines[boundaryValuesInit]],
"@applySemiAnalyticBCs@" -> IndentText[WrapLines[applySemiAnalyticBCs]],
"@calculateParameterValues@" -> IndentText[WrapLines[calculateParameterValues]],
"@calculateCoeffFunctions@" -> calculateCoeffFunctions,
"@setBoundaryValueParameters@" -> IndentText[WrapLines[setBoundaryValueParameters]],
Sequence @@ GeneralReplacementRules[] }];
];

Expand Down Expand Up @@ -3023,6 +3029,7 @@ corresponding tadpole is real or imaginary (only in models with CP
FlexibleSUSY`HighScaleInput}];

semiAnalyticSolns = SemiAnalytic`GetSemiAnalyticSolutions[semiAnalyticBCs];
Parameters`AddExtraParameters[SemiAnalytic`CreateBoundaryValueParameters[semiAnalyticSolns]];

(* construct additional semi-analytic constraint from user-defined constraints *)
Which[SemiAnalytic`IsSemiAnalyticConstraintScale[FlexibleSUSY`HighScaleInput],
Expand Down Expand Up @@ -3073,6 +3080,7 @@ corresponding tadpole is real or imaginary (only in models with CP
FlexibleSUSY`HighScaleFirstGuess,
{FlexibleSUSY`HighScaleMinimum, FlexibleSUSY`HighScaleMaximum},
SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`HighScaleInput],
semiAnalyticSolns,
{{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"}],
Expand All @@ -3087,6 +3095,7 @@ corresponding tadpole is real or imaginary (only in models with CP
FlexibleSUSY`SUSYScaleFirstGuess,
{FlexibleSUSY`SUSYScaleMinimum, FlexibleSUSY`SUSYScaleMaximum},
SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`SUSYScaleInput],
semiAnalyticSolns,
{{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"}],
Expand All @@ -3101,6 +3110,7 @@ corresponding tadpole is real or imaginary (only in models with CP
FlexibleSUSY`LowScaleFirstGuess,
{FlexibleSUSY`LowScaleMinimum, FlexibleSUSY`LowScaleMaximum},
SemiAnalytic`IsSemiAnalyticConstraint[FlexibleSUSY`LowScaleInput],
semiAnalyticSolns,
{{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"}],
Expand All @@ -3110,7 +3120,7 @@ corresponding tadpole is real or imaginary (only in models with CP
Print["Creating class for semi-analytic constraint ..."];
WriteSemiAnalyticConstraintClass[semiAnalyticScale, {},
semiAnalyticScaleGuess,
{semiAnalyticScaleMinimum, semiAnalyticScaleMaximum}, False,
{semiAnalyticScaleMinimum, semiAnalyticScaleMaximum}, False, semiAnalyticSolns,
{{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"}],
Expand Down
54 changes: 53 additions & 1 deletion meta/SemiAnalytic.m
Expand Up @@ -23,14 +23,18 @@

GetSemiAnalyticSolutions::usage="Constructs the semi-analytic
solutions implied by the given list of boundary conditions.";
CreateBoundaryValueParameters::usage="Creates new parameters
representing the boundary values.";

CreateSemiAnalyticSolutionsDefinitions::usage="";
CreateSemiAnalyticSolutionsInitialization::usage="";
CreateBoundaryValuesDefinitions::usage="";
CreateBoundaryValuesInitialization::usage="";
SetBoundaryValueParameters::usage="";

ApplySemiAnalyticBoundaryConditions::usage="";
EvaluateSemiAnalyticSolutions::usage="";
SaveBoundaryValueParameters::usage="";

Begin["`Private`"];

Expand Down Expand Up @@ -475,8 +479,13 @@
ReplacePart[settings, Rule[#[[1]], Sequence @@ #[[2]]] & /@ replacements]
];

CreateBoundaryValueParameter[parameter_] := Symbol[CConversion`ToValidCSymbolString[parameter] <> "Basis"];

CreateBoundaryValueParameters[solutions_List] :=
{CreateBoundaryValueParameter[#], Parameters`GetType[#]}& /@ (GetBoundaryValueParameters[solutions]);

GetBoundaryValueParameterName[par_] :=
"basis_" <> CConversion`ToValidCSymbolString[par];
CConversion`ToValidCSymbolString[CreateBoundaryValueParameter[par]];

CreateCoefficientNames[solution_SemiAnalyticSolution] :=
Module[{par, basis, basisSize, i},
Expand Down Expand Up @@ -531,6 +540,20 @@
Return[def];
];

CreateBoundaryValueSetter[parameter_] :=
Module[{basisParStr, type},
basisParStr = GetBoundaryValueParameterName[parameter];
type = Parameters`GetType[parameter];
CConversion`CreateInlineSetter[basisParStr, type]
];

SetBoundaryValueParameters[solutions_List] :=
Module[{boundaryValues, result = ""},
boundaryValues = GetBoundaryValueParameters[solutions];
(result = result <> CreateBoundaryValueSetter[#])& /@ boundaryValues;
Return[result];
];

ApplySettingLocally[{parameter_, value_}, modelPrefix_String] :=
Which[Parameters`IsModelParameter[parameter],
Parameters`SetParameter[parameter, value, modelPrefix],
Expand Down Expand Up @@ -575,6 +598,35 @@
setBoundaryValues <> result
];

SaveBoundaryValueParameter[parameter_, modelPrefix_String:"model->"] :=
Module[{basisPar = CreateBoundaryValueParameter[parameter],
parStr = CConversion`ToValidCSymbolString[parameter],
macro, value},
Which[Parameters`IsModelParameter[parameter],
macro = "MODELPARAMETER",
Parameters`IsInputParameter[parameter],
macro = "INPUTPARAMETER",
Parameters`IsExtraParameter[parameter],
macro = "EXTRAPARAMETER",
Parameters`IsOutputParameter[parameter],
macro = "MODELPARAMETER",
Parameters`IsPhase[parameter],
macro = "PHASE",
True,
Print["Error: unrecognized parameter ", parameter];
Quit[1];
];
value = macro <> "(" <> parStr <> ")";
Parameters`SetParameter[basisPar, value, modelPrefix]
];

SaveBoundaryValueParameters[solutions_List] :=
Module[{boundaryValueParameters, result = ""},
boundaryValueParameters = GetBoundaryValueParameters[solutions];
(result = result <> SaveBoundaryValueParameter[#])& /@ boundaryValueParameters;
Return[result];
];

DependsAtMostOn[num_?NumericQ, pars_List] := True;
DependsAtMostOn[True, pars_List] := True;
DependsAtMostOn[False, pars_List] := True;
Expand Down
3 changes: 2 additions & 1 deletion templates/semi_analytic_high_scale_constraint.cpp.in
Expand Up @@ -36,6 +36,7 @@
#include <cstring>

#define DERIVEDPARAMETER(p) model->p()
#define EXTRAPARAMETER(p) model->get_##p()
#define INPUTPARAMETER(p) model->get_input().p
#define MODELPARAMETER(p) model->get_##p()
#define PHASE(p) model->get_##p()
Expand Down Expand Up @@ -73,7 +74,7 @@ void @ModelName@_high_scale_constraint<Semi_analytic>::apply()
update_scale();

@applyConstraint@

@saveBoundaryValueParameters@
check_non_perturbative();

@temporaryResetting@
Expand Down
3 changes: 2 additions & 1 deletion templates/semi_analytic_low_scale_constraint.cpp.in
Expand Up @@ -37,6 +37,7 @@
namespace flexiblesusy {

#define DERIVEDPARAMETER(p) model->p()
#define EXTRAPARAMETER(p) model->get_##p()
#define INPUTPARAMETER(p) model->get_input().p
#define MODELPARAMETER(p) model->get_##p()
#define PHASE(p) model->get_##p()
Expand Down Expand Up @@ -84,7 +85,7 @@ void @ModelName@_low_scale_constraint<Semi_analytic>::apply()
calculate_DRbar_gauge_couplings();

@applyConstraint@

@saveBoundaryValueParameters@
if (model->get_thresholds())
qedqcd.setPoleMW(recalculate_mw_pole(qedqcd.displayPoleMW()));

Expand Down
1 change: 1 addition & 0 deletions templates/semi_analytic_model.hpp.in
Expand Up @@ -59,6 +59,7 @@ public:
virtual void print(std::ostream& out = std::cout) const;
virtual void set_precision(double);

@setBoundaryValueParameters@
void calculate_coefficients(double);

private:
Expand Down
2 changes: 2 additions & 0 deletions templates/semi_analytic_susy_scale_constraint.cpp.in
Expand Up @@ -34,6 +34,7 @@
namespace flexiblesusy {

#define DERIVEDPARAMETER(p) model->p()
#define EXTRAPARAMETER(p) model->get_##p()
#define INPUTPARAMETER(p) model->get_input().p
#define MODELPARAMETER(p) model->get_##p()
#define PHASE(p) model->get_##p()
Expand Down Expand Up @@ -74,6 +75,7 @@ void @ModelName@_susy_scale_constraint<Semi_analytic>::apply()

// apply user-defined susy scale constraints
@applyConstraint@
@saveBoundaryValueParameters@
@temporaryResetting@
}

Expand Down

0 comments on commit 7bb2cb3

Please sign in to comment.