Skip to content

Commit

Permalink
Add function to set semi-analytic parameters to their boundary values
Browse files Browse the repository at this point in the history
  • Loading branch information
Dylan Harries committed Dec 20, 2016
1 parent 3888f68 commit 34b8734
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
6 changes: 5 additions & 1 deletion meta/FlexibleSUSY.m
Expand Up @@ -1278,15 +1278,19 @@ corresponding tadpole is real or imaginary (only in models with CP

WriteSemiAnalyticModelClass[semiAnalyticBCs_List, semiAnalyticSolns_List, files_List] :=
Module[{semiAnalyticSolutionsDefs = "", semiAnalyticSolutionsInit = "",
boundaryValuesDefs = "", boundaryValuesInit = ""},
boundaryValuesDefs = "", boundaryValuesInit = "",
applySemiAnalyticBCs = "", calculateCoeffFunctions = ""},
semiAnalyticSolutionsDefs = SemiAnalytic`CreateSemiAnalyticSolutionsDefinitions[semiAnalyticSolns];
semiAnalyticSolutionsInit = SemiAnalytic`CreateSemiAnalyticSolutionsInitialization[semiAnalyticSolns];
boundaryValuesDefs = SemiAnalytic`CreateBoundaryValuesDefinitions[semiAnalyticSolns];
boundaryValuesInit = SemiAnalytic`CreateBoundaryValuesInitialization[semiAnalyticSolns];
applySemiAnalyticBCs = SemiAnalytic`ApplySemiAnalyticBoundaryConditions[semiAnalyticBCs, semiAnalyticSolns];
WriteOut`ReplaceInFiles[files, { "@semiAnalyticSolutionsDefs@" -> IndentText[WrapLines[semiAnalyticSolutionsDefs]],
"@semiAnalyticSolutionsInit@" -> IndentText[WrapLines[semiAnalyticSolutionsInit]],
"@boundaryValuesDefs@" -> IndentText[WrapLines[boundaryValuesDefs]],
"@boundaryValuesInit@" -> IndentText[WrapLines[boundaryValuesInit]],
"@applySemiAnalyticBCs@" -> IndentText[WrapLines[applySemiAnalyticBCs]],
"@calculateCoeffFunctions@" -> calculateCoeffFunctions,
Sequence @@ GeneralReplacementRules[] }];
];

Expand Down
37 changes: 35 additions & 2 deletions meta/SemiAnalytic.m
Expand Up @@ -23,6 +23,8 @@
CreateBoundaryValuesDefinitions::usage="";
CreateBoundaryValuesInitialization::usage="";

ApplySemiAnalyticBoundaryConditions::usage="";

Begin["`Private`"];

allSemiAnalyticParameters = {};
Expand Down Expand Up @@ -452,6 +454,9 @@
ReplacePart[settings, Rule[#[[1]], Sequence @@ #[[2]]] & /@ replacements]
];

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

CreateCoefficientNames[solution_SemiAnalyticSolution] :=
Module[{par, basis, basisSize, i},
par = CConversion`ToValidCSymbolString[GetName[solution]];
Expand Down Expand Up @@ -493,18 +498,46 @@
Module[{boundaryValues, defns},
boundaryValues = GetBoundaryValueParameters[solutions];
defns = (CConversion`CreateCType[Parameters`GetType[#]]
<> " basis_" <> CConversion`ToValidCSymbolString[#])& /@ boundaryValues;
<> GetBoundaryValueParameterName[#])& /@ boundaryValues;
Utils`StringJoinWithSeparator[defns, ";\n"] <> ";\n"
];

CreateBoundaryValuesInitialization[solutions_List] :=
Module[{boundaryValues, def = ""},
boundaryValues = GetBoundaryValueParameters[solutions];
(def = def <> "," <> CConversion`CreateDefaultConstructor["basis_" <> CConversion`ToValidCSymbolString[#],
(def = def <> "," <> CConversion`CreateDefaultConstructor[GetBoundaryValueParameterName[#],
Parameters`GetType[#]])& /@ boundaryValues;
Return[def];
];

ApplySettingLocally[{parameter_, value_}] :=
Which[Parameters`IsModelParameter[parameter],
Parameters`SetParameter[parameter, value],
Parameters`IsInputParameter[parameter],
Parameters`SetInputParameter[parameter, value, "INPUTPARAMETER"],
Parameters`IsPhase[parameter],
Parameters`SetPhase[parameter, value, modelPrefix],
True,
Print["Error: ", parameter, " is neither a model nor an input parameter!"];
""
];

ApplySemiAnalyticBoundaryConditions[settings_List, solutions_List] :=
Module[{noMacros, boundaryValues, parameters, i,
setBoundaryValues = "", result = ""},
(* replace implicit constraints with placeholder values *)
noMacros = ReplaceImplicitConstraints[settings];
(* @todo handle temporary settings properly *)
noMacros = DeleteCases[noMacros, {FlexibleSUSY`Temporary[_], _}];
boundaryValues = GetBoundaryValueParameters[solutions];
parameters = Select[Parameters`FindAllParameters[#[[2]]& /@ noMacros], !MemberQ[boundaryValues, #]&];
setBoundaryValues = ("const auto " <> CConversion`ToValidCSymbolString[#]
<> " = " <> GetBoundaryValueParameterName[#] <> ";\n")& /@ boundaryValues;
(result = result <> ApplySettingLocally[#])& /@ settings;
Print["result = ", result];
Parameters`CreateLocalConstRefs[parameters] <> StringJoin[setBoundaryValues] <> result
];

DependsAtMostOn[num_?NumericQ, pars_List] := True;
DependsAtMostOn[True, pars_List] := True;
DependsAtMostOn[False, pars_List] := True;
Expand Down

0 comments on commit 34b8734

Please sign in to comment.