From e45be14b30d67651c9f483f8551f01e64d2d6a7b Mon Sep 17 00:00:00 2001 From: Dylan Harries Date: Fri, 20 Jan 2017 17:34:40 +1030 Subject: [PATCH] Allow setting and getting coefficients in model class --- meta/FlexibleSUSY.m | 19 ++++--- meta/SemiAnalytic.m | 76 ++++++++++++++++++++++++---- templates/semi_analytic_model.cpp.in | 19 ++++++- templates/semi_analytic_model.hpp.in | 12 ++--- 4 files changed, 97 insertions(+), 29 deletions(-) diff --git a/meta/FlexibleSUSY.m b/meta/FlexibleSUSY.m index 09c7e9a24..c19f309e6 100644 --- a/meta/FlexibleSUSY.m +++ b/meta/FlexibleSUSY.m @@ -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[] }]; ]; diff --git a/meta/SemiAnalytic.m b/meta/SemiAnalytic.m index 2f623710b..aa91f6fd6 100644 --- a/meta/SemiAnalytic.m +++ b/meta/SemiAnalytic.m @@ -35,7 +35,6 @@ CreateBoundaryValuesDefinitions::usage=""; CreateLocalBoundaryValuesDefinitions::usage=""; CreateBoundaryValuesInitialization::usage=""; -SetModelBoundaryValueParameters::usage=""; CreateSemiAnalyticCoefficientGetters::usage=""; CreateBoundaryValueGetters::usage=""; CreateBoundaryValueSetters::usage=""; @@ -52,6 +51,11 @@ EvaluateSemiAnalyticSolutions::usage=""; SaveBoundaryValueParameters::usage=""; +GetModelBoundaryValueParameters::usage=""; +SetModelBoundaryValueParameters::usage=""; +GetModelCoefficients::usage=""; +PrintModelCoefficients::usage=""; + Begin["`Private`"]; allSemiAnalyticParameters = {}; @@ -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] := diff --git a/templates/semi_analytic_model.cpp.in b/templates/semi_analytic_model.cpp.in index 66826c2db..227bbc434 100644 --- a/templates/semi_analytic_model.cpp.in +++ b/templates/semi_analytic_model.cpp.in @@ -38,7 +38,7 @@ using namespace @ModelName@_info; #define CLASSNAME @ModelName@ -#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() @@ -74,6 +74,10 @@ 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) @@ -81,7 +85,18 @@ 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@& model) { diff --git a/templates/semi_analytic_model.hpp.in b/templates/semi_analytic_model.hpp.in index a510f1906..9662817de 100644 --- a/templates/semi_analytic_model.hpp.in +++ b/templates/semi_analytic_model.hpp.in @@ -33,6 +33,7 @@ #include "@ModelName@_model.hpp" #include "@ModelName@_mass_eigenstates.hpp" +#include "@ModelName@_semi_analytic_solutions.hpp" #include "model.hpp" @@ -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@&);