Skip to content

Commit

Permalink
Allow setting and getting coefficients in model class
Browse files Browse the repository at this point in the history
  • Loading branch information
Dylan Harries committed Jan 20, 2017
1 parent 19ebaf8 commit e45be14
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 29 deletions.
19 changes: 9 additions & 10 deletions meta/FlexibleSUSY.m
Expand Up @@ -1494,17 +1494,16 @@ corresponding tadpole is real or imaginary (only in models with CP
];

WriteSemiAnalyticModelClass[semiAnalyticBCs_List, semiAnalyticSolns_List, files_List] :=
Module[{semiAnalyticSolutionsDefs = "", boundaryValuesDefs = "",
calculateCoeffFunctions = "",
setBoundaryValueParameters = ""},
semiAnalyticSolutionsDefs = SemiAnalytic`CreateSemiAnalyticSolutionsDefinitions[semiAnalyticSolns];
boundaryValuesDefs = SemiAnalytic`CreateBoundaryValuesDefinitions[semiAnalyticSolns];
applySemiAnalyticBCs = SemiAnalytic`ApplySemiAnalyticBoundaryConditions[semiAnalyticBCs, semiAnalyticSolns];
Module[{getBoundaryValueParameters = "", setBoundaryValueParameters = "",
getSemiAnalyticCoefficients = "", printSemiAnalyticCoefficients = ""},
getBoundaryValueParameters = SemiAnalytic`GetModelBoundaryValueParameters[semiAnalyticSolns];
setBoundaryValueParameters = SemiAnalytic`SetModelBoundaryValueParameters[semiAnalyticSolns];
WriteOut`ReplaceInFiles[files, { "@semiAnalyticSolutionsDefs@" -> IndentText[WrapLines[semiAnalyticSolutionsDefs]],
"@boundaryValuesDefs@" -> IndentText[WrapLines[boundaryValuesDefs]],
"@calculateCoeffFunctions@" -> calculateCoeffFunctions,
"@setBoundaryValueParameters@" -> IndentText[WrapLines[setBoundaryValueParameters]],
getSemiAnalyticCoefficients = SemiAnalytic`GetModelCoefficients[semiAnalyticSolns];
printSemiAnalyticCoefficients = SemiAnalytic`PrintModelCoefficients[semiAnalyticSolns, "ostr"];
WriteOut`ReplaceInFiles[files, { "@getBoundaryValueParameters@" -> IndentText[WrapLines[getBoundaryValueParameters]],
"@setBoundaryValueParameters@" -> IndentText[WrapLines[setBoundaryValueParameters]],
"@getSemiAnalyticCoefficients@" -> IndentText[WrapLines[getSemiAnalyticCoefficients]],
"@printSemiAnalyticCoefficients@" -> IndentText[WrapLines[printSemiAnalyticCoefficients]],
Sequence @@ GeneralReplacementRules[] }];
];

Expand Down
76 changes: 65 additions & 11 deletions meta/SemiAnalytic.m
Expand Up @@ -35,7 +35,6 @@
CreateBoundaryValuesDefinitions::usage="";
CreateLocalBoundaryValuesDefinitions::usage="";
CreateBoundaryValuesInitialization::usage="";
SetModelBoundaryValueParameters::usage="";
CreateSemiAnalyticCoefficientGetters::usage="";
CreateBoundaryValueGetters::usage="";
CreateBoundaryValueSetters::usage="";
Expand All @@ -52,6 +51,11 @@
EvaluateSemiAnalyticSolutions::usage="";
SaveBoundaryValueParameters::usage="";

GetModelBoundaryValueParameters::usage="";
SetModelBoundaryValueParameters::usage="";
GetModelCoefficients::usage="";
PrintModelCoefficients::usage="";

Begin["`Private`"];

allSemiAnalyticParameters = {};
Expand Down Expand Up @@ -582,18 +586,68 @@
Return[setters];
];

SetBoundaryValueParameter[parameter_String, struct_String] :=
Module[{def = "", body = "", setter = ""},
def = "void set_" <> parameter <> "(" <> parameter <> "_) ";
body = "{ " <> struct <> "set_" <> parameter <> "(" <> parameter <> "_); }\n";
def <> body
GetBoundaryValueFromStruct[parameter_, struct_String] :=
Module[{parStr, type, name, body = "", function},
type = Parameters`GetType[parameter];
parStr = CreateBoundaryValueParameterName[parameter];
name = CConversion`CreateGetterReturnType[type]
<> " CLASSNAME::get_" <> parStr <> "() const {";
body = struct <> "get_" <> parStr <> "();";
name <> " " <> body <> " }\n"
];

SetModelBoundaryValueParameters[solutions_List, struct_String:"semi_analytic_solutions->"] :=
Module[{boundaryValues, setters = ""},
boundaryValues = CreateBoundaryValueParameterName /@ GetBoundaryValueParameters[solutions];
(setters = setters <> SetBoundaryValueParameter[#, struct])& /@ boundaryValues;
Return[setters];
SetBoundaryValueFromStruct[parameter_, struct_String] :=
Module[{parStr, type, name, body = "", function},
type = Parameters`GetType[parameter];
parStr = CreateBoundaryValueParameterName[parameter];
name = "void set_" <> parStr <> "("
<> CConversion`CreateSetterInputType[type]
<> " " <> parStr <> "_) {";
body = struct <> "set_" <> parStr <> "(" <> parStr <> "_);";
name <> " " <> body <> " }\n"
];

GetCoefficientsFromStruct[solution_, struct_String] :=
Module[{i, parameter, type, coeffStrs, name, body = "", functions = ""},
parameter = GetName[solution];
type = Parameters`GetType[parameter];
coeffStrs = CreateCoefficientNames[solution];
For[i = 1, i <= Length[coeffStrs], i++,
name = CConversion`CreateGetterReturnType[type]
<> " get_" <> coeffStrs[[i]] <> "() const {";
body = struct <> "get_" <> coeffStrs[[i]] <> "();";
functions = functions <> name <> " " <> body <> " }\n";
];
Return[functions];
];

GetModelBoundaryValueParameters[solutions_List, struct_String:"solutions."] :=
Module[{boundaryValues, result},
boundaryValues = GetBoundaryValueParameters[solutions];
result = GetBoundaryValueFromStruct[#, struct]& /@ boundaryValues;
StringJoin[result]
];

SetModelBoundaryValueParameters[solutions_List, struct_String:"solutions."] :=
Module[{boundaryValues, result},
boundaryValues = GetBoundaryValueParameters[solutions];
result = GetBoundaryValueFromStruct[#, struct]& /@ boundaryValues;
StringJoin[result]
];

GetModelCoefficients[solutions_List, struct_String:"solutions."] :=
Module[{result},
result = GetCoefficientsFromStruct[#, struct]& /@ solutions;
Utils`StringJoinWithSeparator[result, "\n"]
];

PrintModelCoefficients[solutions_List, streamName_String, struct_String:"solutions."] :=
Module[{coeffs, result = ""},
coeffs = CreateCoefficientParameters[solutions];
result = streamName <> " << input_scale = " <> struct <> "get_input_scale() << '\\n';\n";
result = result <> streamName <> " << output_scale = " <> struct
<> "get_output_scale() << '\\n';\n";
result <> WriteOut`PrintExtraParameters[coeffs, streamName, "COEFFICIENT"]
];

CreateBoundaryValuesDefinitions[solutions_List, createParameters_:CreateBoundaryValueParameters] :=
Expand Down
19 changes: 17 additions & 2 deletions templates/semi_analytic_model.cpp.in
Expand Up @@ -38,7 +38,7 @@ using namespace @ModelName@_info;

#define CLASSNAME @ModelName@<Semi_analytic>

#define COEFFICIENT(parameter,i) parameter##Coeff##i
#define COEFFICIENT(coefficient) solutions.get_##coefficient()
#define INPUTPARAMETER(parameter) model.get_input().parameter
#define MODELPARAMETER(parameter) model.get_##parameter()

Expand Down Expand Up @@ -74,14 +74,29 @@ void CLASSNAME::run_to(double scale, double eps)
void CLASSNAME::print(std::ostream& out) const
{
@ModelName@_mass_eigenstates::print(out);
ostr << "----------------------------------------\n"
"semi-analytic coefficients:\n"
"----------------------------------------\n";
@printSemiAnalyticCoefficients@
}

void CLASSNAME::set_precision(double p)
{
@ModelName@_mass_eigenstates::set_precision(p);
}

@calculateCoeffFunctions@
void CLASSNAME::set_semi_analytic_solutions(const @ModelName@_semi_analytic_solutions& s)
{
solutions = s;
}

void CLASSNAME::calculate_semi_analytic_solutions(double input_scale)
{
solutions->set_input_scale(input_scale);
solutions->set_output_scale(get_scale());
solutions->calculate_coefficients(*this);
solutions->evaluate_solutions(*this);
}

std::ostream& operator<<(std::ostream& ostr, const @ModelName@<Semi_analytic>& model)
{
Expand Down
12 changes: 6 additions & 6 deletions templates/semi_analytic_model.hpp.in
Expand Up @@ -33,6 +33,7 @@

#include "@ModelName@_model.hpp"
#include "@ModelName@_mass_eigenstates.hpp"
#include "@ModelName@_semi_analytic_solutions.hpp"

#include "model.hpp"

Expand Down Expand Up @@ -61,14 +62,13 @@ public:
virtual void print(std::ostream& out = std::cout) const;
virtual void set_precision(double);

@setBoundaryValueParameters@
void calculate_coefficients(double);
void calculate_semi_analytic_solutions(double);

@getBoundaryValueParameters@
@setBoundaryValueParameters@
@getSemiAnalyticCoefficients@
private:
// semi-analytic solution coefficients
@semiAnalyticSolutionsDefs@
// boundary values
@boundaryValuesDefs@
@ModelName@_semi_analytic_solutions solutions{};
};

std::ostream& operator<<(std::ostream&, const @ModelName@<Semi_analytic>&);
Expand Down

0 comments on commit e45be14

Please sign in to comment.