Skip to content

Commit

Permalink
create EWSB solver interface and put EWSB routines into an implementa…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
Alexander Voigt committed Jul 1, 2015
1 parent 3efd139 commit 2dfd2ca
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 404 deletions.
77 changes: 38 additions & 39 deletions meta/EWSB.m
Expand Up @@ -178,7 +178,8 @@
CConversion`RValueToCFormString[InitialGuessFor[parametersFixedByEWSB[[i]]]] <>
";\n";
];
Return[result];
Parameters`CreateLocalConstRefs[parametersFixedByEWSB] <> "\n" <>
result
];

MakeParameterUnique[(Re|Im)[par_]] :=
Expand Down Expand Up @@ -573,6 +574,18 @@
Return[{Flatten[reducedSolution], freePhases}];
];

GetFreeParameter[Rule[a_,b_]] := b;
GetFreeParameter[RuleDelayed[a_,b_]] := b;
GetFreeParameter[p_] := Print["Error: not a rule: ", p];

GetFixedParameter[Rule[a_,b_]] := a;
GetFixedParameter[RuleDelayed[a_,b_]] := a;
GetFixedParameter[p_] := Print["Error: not a rule: ", p];

(* returns list rhs of rules where the lhs symbols are replaced by unique symbols *)
RemoveFixedParameters[rules_List] :=
(GetFreeParameter /@ rules) /. (Rule[#, Unique[CConversion`ToValidCSymbolString[#]]]& /@ (GetFixedParameter /@ rules));

CreateTreeLevelEwsbSolver[solution_List] :=
Module[{result = "", body = "",
i, par, expr, parStr, oldParStr, reducedSolution,
Expand All @@ -585,24 +598,15 @@
FlexibleSUSY`Sign[p_] :> Global`LOCALINPUT[CConversion`ToValidCSymbol[FlexibleSUSY`Sign[p]]],
FlexibleSUSY`Phase[p_] :> Global`LOCALINPUT[CConversion`ToValidCSymbol[FlexibleSUSY`Phase[p]]]
};
result = Parameters`CreateLocalConstRefsForInputParameters[reducedSolution, "LOCALINPUT"] <> "\n";
(* save old parameters *)
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
expr = reducedSolution[[i,2]];
type = CConversion`CreateCType[CConversion`GetScalarElementType[Parameters`GetType[par]]];
parStr = CConversion`RValueToCFormString[par];
oldParStr = "old_" <> CConversion`ToValidCSymbolString[par];
result = result <>
"const " <> type <>" " <> oldParStr <> " = " <> parStr <> ";\n";
];
result = result <> "\n";
result = Parameters`CreateLocalConstRefs[RemoveFixedParameters[reducedSolution]] <> "\n";
(* write solution *)
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
expr = reducedSolution[[i,2]];
type = CConversion`GetScalarElementType[Parameters`GetType[par]];
result = result <> Parameters`SetParameter[par, expr, type];
result = result <>
"const " <> CConversion`CreateCType[type] <> " " <>
Parameters`SetParameter[par, expr, type];
];
result = result <> "\n";
(* check for errors *)
Expand All @@ -619,13 +623,14 @@
body = "";
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
oldParStr = "old_" <> CConversion`ToValidCSymbolString[par];
body = body <> Parameters`SetParameter[par, oldParStr, None];
parStr = CConversion`ToValidCSymbolString[par];
body = body <> Parameters`SetParameter[par, parStr, "MODEL", None];
];
body = body <> "error = 1;\n";
result = result <>
"if (!is_finite) {\n" <>
"if (is_finite) {\n" <>
IndentText[body] <>
"} else {\n" <>
IndentText["error = 1;"] <> "\n" <>
"}";
,
result = "error = solve_ewsb_iteratively(0);\n";
Expand Down Expand Up @@ -688,16 +693,16 @@
];

CreateNewEWSBRootFinder[] :=
"new Root_finder<number_of_ewsb_equations>(CLASSNAME::tadpole_equations, &params, number_of_ewsb_iterations, ewsb_iteration_precision, ";
"new Root_finder<number_of_ewsb_equations>(CLASSNAME::tadpole_equations, &params, get_number_of_iterations(), get_precision(), ";

CreateEWSBRootFinder[rootFinder_ /; rootFinder === FlexibleSUSY`FPIRelative] :=
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_relative>(CLASSNAME::ewsb_step, &params, number_of_ewsb_iterations, ewsb_iteration_precision)";
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_relative>(CLASSNAME::step, &params, get_number_of_iterations(), get_precision())";

CreateEWSBRootFinder[rootFinder_ /; rootFinder === FlexibleSUSY`FPIAbsolute] :=
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_absolute>(CLASSNAME::ewsb_step, &params, number_of_ewsb_iterations, ewsb_iteration_precision)";
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_absolute>(CLASSNAME::step, &params, get_number_of_iterations(), get_precision())";

CreateEWSBRootFinder[rootFinder_ /; rootFinder === FlexibleSUSY`FPITadpole] :=
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_tadpole>(CLASSNAME::ewsb_step, &params, number_of_ewsb_iterations, fixed_point_iterator::Convergence_tester_tadpole(ewsb_iteration_precision, CLASSNAME::tadpole_equations, &params))";
"new Fixed_point_iterator<number_of_ewsb_equations, fixed_point_iterator::Convergence_tester_tadpole>(CLASSNAME::step, &params, get_number_of_iterations(), fixed_point_iterator::Convergence_tester_tadpole(get_precision(), CLASSNAME::tadpole_equations, &params))";

CreateEWSBRootFinder[rootFinder_ /; rootFinder === FlexibleSUSY`GSLHybrid] :=
CreateNewEWSBRootFinder[] <> "gsl_multiroot_fsolver_hybrid)";
Expand Down Expand Up @@ -726,14 +731,17 @@
WrapPhase[phase_, str_String] :=
"LOCALINPUT(" <> CConversion`ToValidCSymbolString[phase] <> ")*Abs(" <> str <> ")";

SetEWSBSolution[par_, idx_, phase_, func_String] :=
SetEWSBSolution[par_, idx_, phase_, model_String /; model === "", func_String] :=
Parameters`SetParameter[par, WrapPhase[phase, func <> "(" <> ToString[idx-1] <> ")"], None];

SetEWSBSolution[parametersFixedByEWSB_List, freePhases_List, func_String] :=
SetEWSBSolution[par_, idx_, phase_, model_String, func_String] :=
Parameters`SetParameter[par, WrapPhase[phase, func <> "(" <> ToString[idx-1] <> ")"], model, None];

SetEWSBSolution[parametersFixedByEWSB_List, freePhases_List, model_String, func_String] :=
Module[{result = "", i, phase},
For[i = 1, i <= Length[parametersFixedByEWSB], i++,
phase = FindFreePhase[parametersFixedByEWSB[[i]], freePhases];
result = result <> SetEWSBSolution[parametersFixedByEWSB[[i]], i, phase, func];
result = result <> SetEWSBSolution[parametersFixedByEWSB[[i]], i, phase, model, func];
];
result
];
Expand Down Expand Up @@ -768,7 +776,7 @@
];

CreateEwsbSolverWithTadpoles[solution_List, softHiggsMassToTadpoleAssociation_List] :=
Module[{result = "", i, par, expr, parStr, reducedSolution, rules, type},
Module[{result = "", i, par, expr, parStr, reducedSolution, rules, type, ctype},
reducedSolution = solution /.
FlexibleSUSY`tadpole[p_] :> CConversion`ReleaseHoldAt[HoldForm[FlexibleSUSY`tadpole[[p-1]]], {1,2}];
If[reducedSolution =!= {},
Expand All @@ -778,28 +786,19 @@
FlexibleSUSY`Sign[p_] :> Global`LOCALINPUT[CConversion`ToValidCSymbol[FlexibleSUSY`Sign[p]]],
FlexibleSUSY`Phase[p_] :> Global`LOCALINPUT[CConversion`ToValidCSymbol[FlexibleSUSY`Phase[p]]]
};
result = Parameters`CreateLocalConstRefsForInputParameters[reducedSolution, "LOCALINPUT"];
(* define variables for new parameters *)
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
expr = reducedSolution[[i,2]];
type = CConversion`CreateCType[CConversion`GetScalarElementType[Parameters`GetType[par]]];
parStr = CConversion`ToValidCSymbolString[par];
result = result <> type <> " " <> parStr <> ";\n";
];
result = result <> "\n";
result = Parameters`CreateLocalConstRefs[RemoveFixedParameters[reducedSolution]] <> "\n";
(* write solution *)
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
expr = reducedSolution[[i,2]];
type = CConversion`GetScalarElementType[Parameters`GetType[par]];
ctype = CConversion`CreateCType[type];
parStr = CConversion`ToValidCSymbolString[par];
result = result <> parStr <> " = " <>
result = result <> "const " <> ctype <> " " <> parStr <> " = " <>
CConversion`CastTo[CConversion`RValueToCFormString[expr],type] <> ";\n";
];
result = result <> "\n";
(* check for errors *)
result = result <> "const bool is_finite = ";
result = result <> "\n" <> "const bool is_finite = ";
For[i = 1, i <= Length[reducedSolution], i++,
par = reducedSolution[[i,1]];
parStr = CConversion`ToValidCSymbolString[par];
Expand Down
14 changes: 7 additions & 7 deletions meta/FlexibleSUSY.m
Expand Up @@ -752,7 +752,7 @@ corresponding tadpole is real or imaginary (only in models with CP
massCalculationPrototypes = "", massCalculationFunctions = "",
calculateAllMasses = "",
calculateOneLoopTadpoles = "", calculateTwoLoopTadpoles = "",
calculateOneLoopTadpolesNoStruct = "", calculateTwoLoopTadpolesNoStruct = "",
calculateOneLoopTadpolesFromModel = "", calculateTwoLoopTadpolesFromModel = "",
selfEnergyPrototypes = "", selfEnergyFunctions = "",
twoLoopTadpolePrototypes = "", twoLoopTadpoleFunctions = "",
twoLoopSelfEnergyPrototypes = "", twoLoopSelfEnergyFunctions = "",
Expand Down Expand Up @@ -830,11 +830,11 @@ corresponding tadpole is real or imaginary (only in models with CP
higgsToEWSBEqAssociation = CreateHiggsToEWSBEqAssociation[];
oneLoopTadpoles = Cases[nPointFunctions, SelfEnergies`Tadpole[___]];
calculateOneLoopTadpoles = SelfEnergies`FillArrayWithOneLoopTadpoles[higgsToEWSBEqAssociation, "tadpole", "-"];
calculateOneLoopTadpolesNoStruct = SelfEnergies`FillArrayWithOneLoopTadpoles[higgsToEWSBEqAssociation, "tadpole", "+"];
calculateOneLoopTadpolesFromModel = SelfEnergies`FillArrayWithOneLoopTadpoles[higgsToEWSBEqAssociation, "tadpole", "+", "MODEL->"];
If[SARAH`UseHiggs2LoopMSSM === True ||
FlexibleSUSY`UseHiggs2LoopNMSSM === True,
calculateTwoLoopTadpoles = SelfEnergies`FillArrayWithTwoLoopTadpoles[SARAH`HiggsBoson, "tadpole", "-"];
calculateTwoLoopTadpolesNoStruct = SelfEnergies`FillArrayWithTwoLoopTadpoles[SARAH`HiggsBoson, "tadpole", "+"];
calculateTwoLoopTadpolesFromModel = SelfEnergies`FillArrayWithTwoLoopTadpoles[SARAH`HiggsBoson, "tadpole", "+", "MODEL->"];
{thirdGenerationHelperPrototypes, thirdGenerationHelperFunctions} = TreeMasses`CreateThirdGenerationHelpers[];
];
If[SARAH`UseHiggs2LoopSM === True,
Expand Down Expand Up @@ -903,8 +903,8 @@ corresponding tadpole is real or imaginary (only in models with CP
solveEWSBTemporarily = "solve_ewsb_tree_level();";
];
EWSBSolvers = EWSB`CreateEWSBRootFinders[FlexibleSUSY`FSEWSBSolvers];
setEWSBSolution = EWSB`SetEWSBSolution[parametersFixedByEWSB, freePhases, "solver->get_solution"];
fillArrayWithEWSBParameters = EWSB`FillArrayWithParameters["ewsb_parameters", parametersFixedByEWSB];
setEWSBSolution = EWSB`SetEWSBSolution[parametersFixedByEWSB, freePhases, "MODEL", "solver->get_solution"];
fillArrayWithEWSBParameters = EWSB`FillArrayWithParameters["parameters", parametersFixedByEWSB];
solveEwsbWithTadpoles = EWSB`CreateEwsbSolverWithTadpoles[ewsbSolution, softHiggsMasses];
getEWSBParametersFromGSLVector = EWSB`GetEWSBParametersFromGSLVector[parametersFixedByEWSB, freePhases, "x"];
setEWSBParametersFromLocalCopies = EWSB`SetEWSBParametersFromLocalCopies[parametersFixedByEWSB, "model"];
Expand All @@ -927,8 +927,8 @@ corresponding tadpole is real or imaginary (only in models with CP
"@calculateTreeLevelTadpoles@" -> IndentText[calculateTreeLevelTadpoles],
"@calculateOneLoopTadpoles@" -> IndentText[calculateOneLoopTadpoles],
"@calculateTwoLoopTadpoles@" -> IndentText[calculateTwoLoopTadpoles],
"@calculateOneLoopTadpolesNoStruct@" -> IndentText[calculateOneLoopTadpolesNoStruct],
"@calculateTwoLoopTadpolesNoStruct@" -> IndentText[calculateTwoLoopTadpolesNoStruct],
"@calculateOneLoopTadpolesFromModel@" -> IndentText[calculateOneLoopTadpolesFromModel],
"@calculateTwoLoopTadpolesFromModel@" -> IndentText[calculateTwoLoopTadpolesFromModel],
"@clearOutputParameters@" -> IndentText[clearOutputParameters],
"@clearPhases@" -> IndentText[clearPhases],
"@copyDRbarMassesToPoleMasses@" -> IndentText[copyDRbarMassesToPoleMasses],
Expand Down

0 comments on commit 2dfd2ca

Please sign in to comment.