From 2614736b0497df5fc473703c495476251e75d507 Mon Sep 17 00:00:00 2001 From: Dylan Harries Date: Mon, 19 Dec 2016 15:17:38 +1030 Subject: [PATCH] Store boundary values in model class --- meta/FlexibleSUSY.m | 7 ++++++- meta/SemiAnalytic.m | 22 ++++++++++++++++++++++ templates/semi_analytic_model.cpp.in | 8 ++++++++ templates/semi_analytic_model.hpp.in | 6 ++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/meta/FlexibleSUSY.m b/meta/FlexibleSUSY.m index aea47413b..806ab1ff5 100644 --- a/meta/FlexibleSUSY.m +++ b/meta/FlexibleSUSY.m @@ -1277,11 +1277,16 @@ corresponding tadpole is real or imaginary (only in models with CP WriteOut`ReplaceInFiles[files, { Sequence @@ GeneralReplacementRules[] }]; WriteSemiAnalyticModelClass[semiAnalyticBCs_List, semiAnalyticSolns_List, files_List] := - Module[{semiAnalyticSolutionsDefs = "", semiAnalyticSolutionsInit = ""}, + Module[{semiAnalyticSolutionsDefs = "", semiAnalyticSolutionsInit = "", + boundaryValuesDefs = "", boundaryValuesInit = ""}, semiAnalyticSolutionsDefs = SemiAnalytic`CreateSemiAnalyticSolutionsDefinitions[semiAnalyticSolns]; semiAnalyticSolutionsInit = SemiAnalytic`CreateSemiAnalyticSolutionsInitialization[semiAnalyticSolns]; + boundaryValuesDefs = SemiAnalytic`CreateBoundaryValuesDefinitions[semiAnalyticSolns]; + boundaryValuesInit = SemiAnalytic`CreateBoundaryValuesInitialization[semiAnalyticSolns]; WriteOut`ReplaceInFiles[files, { "@semiAnalyticSolutionsDefs@" -> IndentText[WrapLines[semiAnalyticSolutionsDefs]], "@semiAnalyticSolutionsInit@" -> IndentText[WrapLines[semiAnalyticSolutionsInit]], + "@boundaryValuesDefs@" -> IndentText[WrapLines[boundaryValuesDefs]], + "@boundaryValuesInit@" -> IndentText[WrapLines[boundaryValuesInit]], Sequence @@ GeneralReplacementRules[] }]; ]; diff --git a/meta/SemiAnalytic.m b/meta/SemiAnalytic.m index 8c0499e4a..f3b718524 100644 --- a/meta/SemiAnalytic.m +++ b/meta/SemiAnalytic.m @@ -20,6 +20,8 @@ CreateSemiAnalyticSolutionsDefinitions::usage=""; CreateSemiAnalyticSolutionsInitialization::usage=""; +CreateBoundaryValuesDefinitions::usage=""; +CreateBoundaryValuesInitialization::usage=""; Begin["`Private`"]; @@ -203,6 +205,7 @@ {_, _}, rules = GetBoundaryValueFromSetting[noTemp[[i,1]], noTemp[[i,2]]]; finalRules = Last[(finalRules = Utils`AppendOrReplaceInList[finalRules, #, test])& /@ rules];, + (* @todo intermediate boundary values can be added to a list of extra parameters *) FlexibleSUSY`FSMinimize[__], fixedPars = Constraint`FindFixedParametersFromConstraint[{noTemp[[i]]}]; boundaryValues = Symbol[CConversion`ToValidCSymbolString[#] <> "MinSol"]& /@ fixedPars; @@ -461,6 +464,25 @@ Return[def]; ]; +GetBoundaryValueParameters[solutions_List] := + DeleteDuplicates[Flatten[(Parameters`FindAllParameters[GetBasis[#]])& /@ solutions]]; + +CreateBoundaryValuesDefinitions[solutions_List] := + Module[{boundaryValues, defns}, + boundaryValues = GetBoundaryValueParameters[solutions]; + defns = (CConversion`CreateCType[Parameters`GetType[#]] + <> " basis_" <> CConversion`ToValidCSymbolString[#])& /@ boundaryValues; + Utils`StringJoinWithSeparator[defns, ";\n"] <> ";\n" + ]; + +CreateBoundaryValuesInitialization[solutions_List] := + Module[{boundaryValues, def = ""}, + boundaryValues = GetBoundaryValueParameters[solutions]; + (def = def <> "," <> CConversion`CreateDefaultConstructor["basis_" <> CConversion`ToValidCSymbolString[#], + Parameters`GetType[#]])& /@ boundaryValues; + Return[def]; + ]; + DependsAtMostOn[num_?NumericQ, pars_List] := True; DependsAtMostOn[True, pars_List] := True; DependsAtMostOn[False, pars_List] := True; diff --git a/templates/semi_analytic_model.cpp.in b/templates/semi_analytic_model.cpp.in index bd8308269..81e50fc1f 100644 --- a/templates/semi_analytic_model.cpp.in +++ b/templates/semi_analytic_model.cpp.in @@ -41,6 +41,7 @@ using namespace @ModelName@_info; CLASSNAME::@ModelName@(const @ModelName@_input_parameters& input_) : @ModelName@_mass_eigenstates(input_) @semiAnalyticSolutionsInit@ +@boundaryValuesInit@ { } @@ -78,6 +79,13 @@ void CLASSNAME::set_precision(double p) @ModelName@_mass_eigenstates::set_precision(p); } +void CLASSNAME::set_model_parameters_to_boundary_values(@ModelName@_soft_parameters& model) const +{ +@applySemiAnalyticBCs@ +} + +@calculateCoeffFunctions@ + std::ostream& operator<<(std::ostream& ostr, const @ModelName@& model) { model.print(ostr); diff --git a/templates/semi_analytic_model.hpp.in b/templates/semi_analytic_model.hpp.in index 47fe3b662..96baf3210 100644 --- a/templates/semi_analytic_model.hpp.in +++ b/templates/semi_analytic_model.hpp.in @@ -59,9 +59,15 @@ public: virtual void print(std::ostream& out = std::cout) const; virtual void set_precision(double); + void calculate_coefficients(double); + private: // semi-analytic solution coefficients @semiAnalyticSolutionsDefs@ + // boundary values +@boundaryValuesDefs@ + + void set_parameters_to_boundary_values(@ModelName@_soft_parameters&) const; }; std::ostream& operator<<(std::ostream&, const @ModelName@&);