aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2013-09-09 17:25:24 +0200
committerIan Hinder <ian.hinder@aei.mpg.de>2013-09-09 17:28:42 +0200
commit6552e93ce24819fc29ea581b30304e7ce19f69df (patch)
tree46bfb237e5a9f99b3c68e913b1d2634193717b3a
parentcf53696a692a0033e802070ad64128824720be79 (diff)
Collect all parameter information from CreateThorn into a single object
The ParameterDatabase object contains all information about parameters passed to CreateThorn. This is then accessed by the code generation functions in Param.m.
-rw-r--r--Tools/CodeGen/KrancThorn.m34
-rw-r--r--Tools/CodeGen/Param.m200
2 files changed, 191 insertions, 43 deletions
diff --git a/Tools/CodeGen/KrancThorn.m b/Tools/CodeGen/KrancThorn.m
index 8d6f37b..c2ca87f 100644
--- a/Tools/CodeGen/KrancThorn.m
+++ b/Tools/CodeGen/KrancThorn.m
@@ -71,16 +71,13 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
Module[{calcs, declaredGroups, odeGroups, implementation,
inheritedImplementations, includeFiles,
evolutionTimelevels, defaultEvolutionTimelevels,
- realParams, intParams, keywordParams,
- inheritedRealParams, inheritedIntParams, inheritedKeywordParams,
- extendedRealParams, extendedIntParams, extendedKeywordParams,
+ parameters,
configuration,
partialDerivs, coordGroup, evolvedGroups, rhsGroups, nonevolvedGroups,
interface, evolvedGroupDefinitions, rhsGroupDefinitions, thornspec,
evolvedODEGroups, nonevolvedODEGroups,
evolvedODEGroupDefinitions, rhsODEGroupDefinitions, rhsODEGroups,
- allParams, boundarySources, reflectionSymmetries,
- realParamDefs, intParamDefs,
+ boundarySources, reflectionSymmetries,
pDefs, consCalcs, consCalcsIn, consGroups, cakernel,
hostCals, deviceCalcs, incFilenames},
@@ -106,19 +103,9 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
includeFiles = OptionValue[IncludeFiles];
evolutionTimelevels = OptionValue[EvolutionTimelevels]; (* Redundant *)
defaultEvolutionTimelevels = lookupDefault[{opts}, DefaultEvolutionTimelevels, evolutionTimelevels];
- realParams = OptionValue[RealParameters];
- If[OptionValue[ConservationCalculations] =!= {},
- realParams = Join[realParams,ConservationDifferencingRealParameters[]]];
- intParams = OptionValue[IntParameters];
- realParamDefs = MakeFullParamDefs[realParams];
- intParamDefs = MakeFullParamDefs[intParams];
- keywordParams = OptionValue[KeywordParameters];
- inheritedRealParams = OptionValue[InheritedRealParameters];
- inheritedIntParams = OptionValue[InheritedIntParameters];
- inheritedKeywordParams = OptionValue[InheritedKeywordParameters];
- extendedRealParams = OptionValue[ExtendedRealParameters];
- extendedIntParams = OptionValue[ExtendedIntParameters];
- extendedKeywordParams = OptionValue[ExtendedKeywordParameters];
+
+ parameters = ParameterDatabase[opts];
+
partialDerivs = OptionValue[PartialDerivatives];
If[OptionValue[ConservationCalculations] =!= {},
partialDerivs = Join[partialDerivs, ConservationDifferencingOperators[]]];
@@ -224,13 +211,8 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
calcs = Map[Append[#, ODEGroups -> Join[odeGroups, rhsODEGroups]] &, calcs];
(* Construct a source file for each calculation *)
- allParams = Join[Map[ParamName, realParamDefs],
- Map[ParamName, intParamDefs],
- Map[unqualifiedName, inheritedRealParams],
- Map[unqualifiedName, inheritedIntParams],
- Map[unqualifiedName, inheritedKeywordParams]];
- calcs = Map[Append[#, Parameters -> allParams] &, calcs];
+ calcs = Map[Append[#, Parameters -> AllNumericParameters[parameters]] &, calcs];
calcs = Map[If[!lookup[#,UseCaKernel,False], #, If[mapContains[#,ExecuteOn], #, Append[#,ExecuteOn->Device]]] &, calcs];
@@ -250,9 +232,7 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
param = CreateKrancParam[evolvedGroups, nonevolvedGroups,
evolvedODEGroups, nonevolvedODEGroups,
groups, thornName,
- realParamDefs, intParamDefs, keywordParams,
- inheritedRealParams, inheritedIntParams, inheritedKeywordParams,
- extendedRealParams, extendedIntParams, extendedKeywordParams,
+ parameters,
evolutionTimelevels, defaultEvolutionTimelevels,
calcs, opts];
diff --git a/Tools/CodeGen/Param.m b/Tools/CodeGen/Param.m
index 5889b55..c85460f 100644
--- a/Tools/CodeGen/Param.m
+++ b/Tools/CodeGen/Param.m
@@ -19,14 +19,167 @@
*)
BeginPackage["Param`", {"Thorn`", "Errors`", "Helpers`", "MapLookup`", "KrancGroups`",
- "Kranc`", "Jacobian`", "CodeGenParam`"}];
+ "Kranc`", "Jacobian`", "CodeGenParam`",
+ "ConservationCalculation`"}];
CreateKrancParam;
MakeFullParamDefs;
ParamName;
+AllNumericParameters;
+ParameterDatabase;
Begin["`Private`"];
+(* ------------------------------------------------------------------------
+ Parameter Database
+ ------------------------------------------------------------------------ *)
+
+(* We want to collect all parameter definitions together into a single
+object. This forms a "parameter database".
+
+params = {
+ Declared -> {...},
+ Inherited -> {...},
+ Extended -> {...}
+};
+
+How similar is this to what needs to be passed to the param.ccl
+functions? That requires a low-level representation of the parameter
+file from a Cactus point of view. We need a representation from the
+Kranc point of view, which is similar to that of the user.
+Eventually, we might decide to merge these representations, but for
+the moment, let's keep things high-level.
+
+*)
+
+ParameterType = "Real" | "Integer" | "Keyword";
+
+Options[ParameterDatabase] = ThornOptions;
+
+(* ParameterDatabase[implementation_String, OptionsPattern[]] := *)
+(* Module[ *)
+(* {addType, *)
+(* realParams, intParams, keywordParams, *)
+(* inheritedRealParams, inheritedIntParams, inheritedKeywordParams, *)
+(* extendedRealParams, extendedIntParams, extendedKeywordParams, *)
+(* realParamDefs, intParamDefs}, *)
+
+(* addType[def_List, type:ParameterType] := *)
+(* Append[def, "Type" -> type]; *)
+
+(* realParams = OptionValue[RealParameters]; *)
+(* If[OptionValue[ConservationCalculations] =!= {}, *)
+(* realParams = Join[realParams,ConservationDifferencingRealParameters[]]]; *)
+(* intParams = OptionValue[IntParameters]; *)
+
+(* realParamDefs = addType[#,"Real"] & /@ MakeFullParamDefs[realParams]; *)
+(* intParamDefs = addType[#,"Integer"] & /@ MakeFullParamDefs[intParams]; *)
+
+(* keywordParams = addType[#,"Keyword"] & /@ OptionValue[KeywordParameters]; *)
+
+(* inheritedRealParams = addType[#,"Real"] & /@ OptionValue[InheritedRealParameters]; *)
+(* inheritedIntParams = addType[#,"Integer"] & /@ OptionValue[InheritedIntParameters]; *)
+(* inheritedKeywordParams = addType[#,"Keyword"] & /@ *)
+(* OptionValue[InheritedKeywordParameters]; *)
+
+(* extendedRealParams = addType[#,"Real"] & /@ OptionValue[ExtendedRealParameters]; *)
+(* extendedIntParams = addType[#,"Integer"] & /@ OptionValue[ExtendedIntParameters]; *)
+(* extendedKeywordParams = addType[#,"Keyword"] & /@ OptionValue[ExtendedKeywordParameters]; *)
+
+(* declared = Join[intParamDefs, realParamDefs, keywordParams]; *)
+(* inherited = Join[inheritedRealParams, inheritedIntParams, inheritedKeywordParams]; *)
+(* extended = Join[extendedRealParams, extendedIntParams, extendedKeywordParams]; *)
+
+(* {"Declared" -> declared, *)
+(* "Inherited" -> inherited, *)
+(* "Extended" -> extended}]; *)
+
+(* allParameters[pdb_List] := *)
+(* Flatten[pdb, 1]; *)
+
+(* parameterType[p_List] := *)
+(* lookup[p, "Type"]; *)
+
+(* numericParameterNames[pdb_List] := *)
+(* unqualifiedName /@ ParamName /@ *)
+(* Select[allParameters, MemberQ[{"Real", "Integer"}, parameterType[#]] &]; *)
+
+DefFn[ParameterDatabase[OptionsPattern[]] :=
+ Module[
+ {realParams, intParams, keywordParams,
+ inheritedRealParams, inheritedIntParams, inheritedKeywordParams,
+ extendedRealParams, extendedIntParams, extendedKeywordParams,
+ realParamDefs, intParamDefs, allParams},
+
+ realParams = OptionValue[RealParameters];
+ If[OptionValue[ConservationCalculations] =!= {},
+ realParams = Join[realParams,ConservationDifferencingRealParameters[]]];
+ intParams = OptionValue[IntParameters];
+ realParamDefs = MakeFullParamDefs[realParams];
+ intParamDefs = MakeFullParamDefs[intParams];
+ keywordParams = OptionValue[KeywordParameters];
+ inheritedRealParams = OptionValue[InheritedRealParameters];
+ inheritedIntParams = OptionValue[InheritedIntParameters];
+ inheritedKeywordParams = OptionValue[InheritedKeywordParameters];
+ extendedRealParams = OptionValue[ExtendedRealParameters];
+ extendedIntParams = OptionValue[ExtendedIntParameters];
+ extendedKeywordParams = OptionValue[ExtendedKeywordParameters];
+
+ allParams = Join[Map[ParamName, realParamDefs],
+ Map[ParamName, intParamDefs],
+ Map[unqualifiedName, inheritedRealParams],
+ Map[unqualifiedName, inheritedIntParams],
+ Map[unqualifiedName, inheritedKeywordParams]];
+
+ {"Reals" -> realParamDefs,
+ "Integers" -> intParamDefs,
+ "Keywords" -> keywordParams,
+
+ "InheritedReals" -> inheritedRealParams,
+ "InheritedIntegers" -> inheritedIntParams,
+ "InheritedKeywords" -> inheritedKeywordParams,
+
+ "ExtendedReals" -> extendedRealParams,
+ "ExtendedIntegers" -> extendedIntParams,
+ "ExtendedKeywords" -> extendedKeywordParams,
+
+ "AllNumeric" -> allParams}]];
+
+DefFn[AllNumericParameters[pdb_List] :=
+ lookup[pdb, "AllNumeric"]];
+
+DefFn[realParameterDefinitions[pdb_List] :=
+ lookup[pdb, "Reals"]];
+
+DefFn[integerParameterDefinitions[pdb_List] :=
+ lookup[pdb, "Integers"]];
+
+DefFn[keywordParameterDefinitions[pdb_List] :=
+ lookup[pdb, "Keywords"]];
+
+DefFn[inheritedRealParameterNames[pdb_List] :=
+ lookup[pdb, "InheritedReals"]];
+
+DefFn[inheritedIntegerParameterNames[pdb_List] :=
+ lookup[pdb, "InheritedIntegers"]];
+
+DefFn[inheritedKeywordParameterNames[pdb_List] :=
+ lookup[pdb, "InheritedKeywords"]];
+
+DefFn[extendedRealParameterDefinitions[pdb_List] :=
+ lookup[pdb, "ExtendedReals"]];
+
+DefFn[extendedIntegerParameterDefinitions[pdb_List] :=
+ lookup[pdb, "ExtendedIntegers"]];
+
+DefFn[extendedKeywordParameterDefinitions[pdb_List] :=
+ lookup[pdb, "ExtendedKeywords"]];
+
+
+(* ------------------------------------------------------------------------
+ Parameter utility functions
+ ------------------------------------------------------------------------ *)
+
VerifyQualifiedName[name_] :=
If[! StringQ[name] || ! StringMatchQ[name, "*::*"],
ThrowError["Not a name with an implementation:", name]];
@@ -43,6 +196,10 @@ unqualifiedName[name_] :=
colon = First[First[StringPosition[name, ":", 1]]];
Return[StringDrop[name, colon + 1]]];
+(* ------------------------------------------------------------------------
+ Code generation functions
+ ------------------------------------------------------------------------ *)
+
krancParamStruct[definition_, type_, inherited_] :=
Module[{description, name},
name = lookup[definition, Name];
@@ -122,9 +279,7 @@ extendParameters[imp_, reals_, ints_, keywords_] :=
Options[CreateKrancParam] = ThornOptions;
CreateKrancParam[evolvedGroups_, nonevolvedGroups_,
evolvedODEGroups_, nonevolvedODEGroups_, groups_, thornName_,
- reals_, ints_, keywords_,
- inheritedReals_, inheritedInts_, inheritedKeywords_,
- extendedReals_, extendedInts_, extendedKeywords_,
+ parameters_,
evolutionTimelevels_, defaultEvolutionTimelevels_,
calcs_, opts:OptionsPattern[]] :=
Module[{nEvolved, evolvedMoLParam, evolvedGFs,
@@ -228,17 +383,22 @@ CreateKrancParam[evolvedGroups_, nonevolvedGroups_,
Join[{{Name -> "assume_stress_energy_state", Type -> "CCTK_INT"}},
If[OptionValue[UseJacobian], JacobianGenericFDParameters[], {}]]
};
-
- realStructs = Map[krancParamStruct[#, "CCTK_REAL", False] &, reals];
+ realStructs = Map[krancParamStruct[#, "CCTK_REAL", False] &,
+ realParameterDefinitions[parameters]];
verboseStruct = krancParamStruct[{Name -> "verbose", Default -> 0, Steerable -> Always}, "CCTK_INT", False];
- intStructs = Map[krancParamStruct[#, "CCTK_INT", False] &, ints];
+ intStructs = Map[krancParamStruct[#, "CCTK_INT", False] &,
+ integerParameterDefinitions[parameters]];
calcEveryStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_every", Default -> 1, Steerable -> Always}, "CCTK_INT", False] &, calcs];
calcOffsetStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_offset", Default -> 0, Steerable -> Always}, "CCTK_INT", False] &, calcs];
- keywordStructs = Map[krancKeywordParamStruct, keywords];
-
- allInherited = Join[inheritedReals, inheritedInts, inheritedKeywords];
- allExtended = Join[extendedReals, extendedInts, extendedKeywords];
-
+ keywordStructs = Map[krancKeywordParamStruct, keywordParameterDefinitions[parameters]];
+
+ allInherited = Join[inheritedRealParameterNames[parameters],
+ inheritedIntegerParameterNames[parameters],
+ inheritedKeywordParameterNames[parameters]];
+ allExtended = Join[extendedRealParameterDefinitions[parameters],
+ extendedIntegerParameterDefinitions[parameters],
+ extendedKeywordParameterDefinitions[parameters]];
+
implementationNames = Union[Map[implementationFromQualifiedName, allInherited],
Map[implementationFromQualifiedName[lookup[#, Name]] &, allExtended]];
@@ -253,10 +413,18 @@ CreateKrancParam[evolvedGroups_, nonevolvedGroups_,
}
};
- userImplementations = Map[inheritParameters[#, inheritedReals,inheritedInts,inheritedKeywords] &,
- implementationNames];
- userImplementations2 = Map[extendParameters[#, extendedReals,extendedInts,extendedKeywords] &,
- implementationNames];
+ userImplementations = Map[
+ inheritParameters[
+ #,
+ inheritedRealParameterNames[parameters],
+ inheritedIntegerParameterNames[parameters],
+ inheritedKeywordParameterNames[parameters]] &,
+ implementationNames];
+ userImplementations2 =
+ Map[extendParameters[#, extendedRealParameterDefinitions[parameters],
+ extendedIntegerParameterDefinitions[parameters],
+ extendedKeywordParameterDefinitions[parameters]] &,
+ implementationNames];
userImplementations = If[userImplementations=={{}},{},userImplementations];
userImplementations2 = If[userImplementations2=={{}},{},userImplementations2];