aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Examples/Wave.m216
-rw-r--r--Examples/wave.par67
-rw-r--r--Tools/CodeGen/CactusBoundary.m10
-rw-r--r--Tools/CodeGen/CalculationFunction.m28
-rw-r--r--Tools/CodeGen/CodeGen.m6
-rw-r--r--Tools/CodeGen/Differencing.m8
-rw-r--r--Tools/CodeGen/Helpers.m6
-rw-r--r--Tools/CodeGen/Interface.m140
-rw-r--r--Tools/CodeGen/Kranc.m95
-rw-r--r--Tools/CodeGen/KrancGroups.m11
-rw-r--r--Tools/CodeGen/KrancThorn.m538
-rw-r--r--Tools/CodeGen/Param.m248
-rw-r--r--Tools/CodeGen/Schedule.m161
-rw-r--r--Tools/CodeGen/TensorTools.m9
-rw-r--r--Tools/CodeGen/Thorn.m41
15 files changed, 587 insertions, 997 deletions
diff --git a/Examples/Wave.m b/Examples/Wave.m
deleted file mode 100644
index 0c19475..0000000
--- a/Examples/Wave.m
+++ /dev/null
@@ -1,216 +0,0 @@
-
-Get["KrancThorn`"];
-SetEnhancedTimes[False];
-
-(********************************************************)
-(* Derivatives *)
-(********************************************************)
-
-derivatives =
-{
- PDstandard2nd[i_] -> StandardCenteredDifferenceOperator[1,1,i],
- PDstandard2nd[i_, i_] -> StandardCenteredDifferenceOperator[2,1,i],
- PDstandard2nd[i_, j_] -> StandardCenteredDifferenceOperator[1,1,i] StandardCenteredDifferenceOperator[1,1,j],
-
- PDstandard4th[i_] -> StandardCenteredDifferenceOperator[1,2,i],
- PDstandard4th[i_, i_] -> StandardCenteredDifferenceOperator[2,2,i],
- PDstandard4th[i_, j_] -> StandardCenteredDifferenceOperator[1,2,i] StandardCenteredDifferenceOperator[1,2,j],
-
- PDonesided2nd[1] -> dir[1] (-shift[1]^(2 dir[1]) + 4 shift[1]^dir[1] - 3 )/(2 spacing[1]),
- PDonesided2nd[2] -> dir[2] (-shift[2]^(2 dir[2]) + 4 shift[2]^dir[2] - 3 )/(2 spacing[2]),
- PDonesided2nd[3] -> dir[3] (-shift[3]^(2 dir[3]) + 4 shift[3]^dir[3] - 3 )/(2 spacing[3]),
-
- Diss2nd[] -> - diss Sum[spacing[i]^3 (DPlus[i] DMinus[i])^2, {i, 1, 3}],
- Diss4th[] -> diss Sum[spacing[i]^5 (DPlus[i] DMinus[i])^3, {i, 1, 3}],
-
- PDzero[i_] -> DZero[i],
- PDzero[i_, j_] -> DZero[i] DZero[j],
-
- PDplus[i_] -> DPlus[i]
-};
-
-Map[DefineTensor, {norm, dir}];
-
-zerodims = {};
-
-PD = PDstandard2nd;
-PDnorm = PDplus;
-
-evolvedGroup = {"evolved", {phi, pi}};
-normGroup = {"norms", {VL2, VDP, EL2}};
-exactGroup = {"exact", {phiExact, piExact}};
-errorGroup = {"errors", {phiError, piError}};
-
-groups = {evolvedGroup, normGroup, exactGroup, errorGroup};
-
-wp = {Name -> periodicity, Default -> 1};
-wa = {Name -> amplitude, Default -> 1};
-
-nNorm = Sqrt[n1^2+n2^2+n3^2];
-nX = n1 x + n2 y + n3 z;
-
-(* Sine wave exact solution *)
-
-exactSineCalc =
-{
- Name -> "wave_exact_sine",
- Before -> {"import_exact"},
- ConditionalOnKeyword -> {"initial_data", "sine"},
- Schedule -> {"AT INITIAL before import_exact","AT POSTSTEP before calc_errors"},
- Shorthands -> {piconst},
- Equations ->
- {
- piconst -> N[Pi,20],
- phiExact -> amplitude Sin[2 piconst / periodicity (nX - nNorm t)],
- piExact -> -2 piconst / periodicity nNorm amplitude Cos[2 piconst / periodicity (nX - nNorm t)]
- }
-}
-
-(* Radial profile of exact Gaussian solution *)
-f[x_] := x^3 Exp[-x^2/nSigma^2];
-
-exactGaussianCalc =
-{
- Name -> "wave_exact_gaussian",
- Before -> {"import_exact"},
- ConditionalOnKeyword -> {"initial_data", "gaussian"},
- Schedule -> {"AT INITIAL before import_exact","AT POSTSTEP before calc_errors"},
- Shorthands -> {piconst,rEps},
- Equations ->
- {
- rEps -> (r^4+(10^(-6))^4)^(1/4),
-
- phiExact -> (f[t+t0+r] - f[t+t0-r]) / rEps,
- piExact -> (D[f[t+t0+r],t] - D[f[t+t0-r],t]) / rEps
- }
-}
-
-(* Import the exact solution as the initial data *)
-
-importerEquations =
-{
- phi -> phiExact,
- pi -> piExact
-};
-
-importerCalc =
-{
- Name -> "wave_import_exact",
- Schedule -> {"at INITIAL as import_exact"},
- Equations -> importerEquations
-}
-
-(* The evolution equations *)
-
-evolveEquations =
-{
- dot[phi] -> pi,
- dot[pi] -> PD[phi,li,ui]
-}
-
-evolveCalc =
-{
- Name -> "wave_evolve",
- Schedule -> {"in MoL_CalcRHS as evolve"},
- Where -> Interior,
- Equations -> evolveEquations
-}
-
-(* Evaluate the errors *)
-
-errorEquations =
-{
- phiError -> phi - phiExact,
- piError -> pi - piExact
-}
-
-errorCalc =
-{
- Name -> "wave_calc_errors",
- Schedule -> {"at ANALYSIS as calc_errors"},
- Equations -> errorEquations
-}
-
-(* Evaluate the norms *)
-
-normEquations =
-{
- VL2squared -> phi^2 + pi^2,
- VL2 -> Sqrt[VL2squared],
- VDPsquared -> pi^2 + PDnorm[phi,li] PDnorm[phi,ui],
- VDP -> Sqrt[VDPsquared],
- EL2squared -> phiError^2 + piError^2,
- EL2 -> Sqrt[EL2squared]
-}
-
-normCalc =
-{
- Name -> "wave_calc_norm",
- Where -> Interior,
- Schedule -> {"at ANALYSIS as calc_norm"},
- Shorthands -> {VL2squared, VDPsquared, EL2squared},
- Equations -> normEquations
-}
-
-(**************************************************************************************)
-(* Boundary conditions *)
-(**************************************************************************************)
-
-boundaryParam =
-{
- Name -> "boundary_condition",
- Default -> "radiative",
- AllowedValues -> {"none", "radiative"}
-};
-
-boundaryCalc =
-{
- Name -> "wave_boundary",
- Schedule -> {"in MoL_RHSBoundaries"},
- ConditionalOnKeyword -> {"boundary_condition", "radiative"},
- Where -> Boundary,
- Shorthands -> {norm[ui], dir[ui]},
- Equations ->
- {
- norm1 -> -x/r,
- norm2 -> -y/r,
- norm3 -> -z/r,
-
- dir[ui] -> Sign[norm[ui]],
-
- (* \partial_t u = - (u - u_0) / r - \partial_r u
- for u_0 some background solution. In this case, Minkowski in Cartesian
- coordinates. *)
-
- dot[phi] -> -(phi - 0) / r + norm[ui] PDonesided2nd[phi, li],
- dot[pi] -> -(pi - 0) / r + norm[ui] PDonesided2nd[pi, li]
- }
-};
-
-(* Construct the thorn *)
-
-calculations = {exactSineCalc, exactGaussianCalc, importerCalc, evolveCalc, errorCalc, normCalc, boundaryCalc};
-
-declaredGroups = Map[groupName, {evolvedGroup, exactGroup, errorGroup,
- normGroup}];
-
-idParam =
-{
- Name -> "initial_data",
- Default -> "gaussian",
- AllowedValues -> {"gaussian", "sine"}
-};
-
-keywordParameters =
-{
- idParam,
- boundaryParam
-};
-
-CreateKrancThornTT[groups, ".", "Wave",
- Calculations -> calculations,
- DeclaredGroups -> declaredGroups,
- PartialDerivatives -> derivatives,
- ZeroDimensions -> zerodims,
- KeywordParameters -> keywordParameters,
- RealParameters -> {wp, wa, {Name -> n1, Default -> 1}, n2, n3, nSigma, r0, t0, x0}]
diff --git a/Examples/wave.par b/Examples/wave.par
deleted file mode 100644
index e28a05c..0000000
--- a/Examples/wave.par
+++ /dev/null
@@ -1,67 +0,0 @@
-
-Cactus::cctk_final_time = 1
-Cactus::terminate = "time"
-
-ActiveThorns = "IOUtil Carpet CarpetLib CarpetSlab CoordBase CoordBase SymBase CartGrid3D Slab CarpetIOBasic CarpetIOASCII Wave Time MoL Periodic Boundary GenericFD CarpetReduce LoopControl"
-
-CoordBase::domainsize = minmax
-
-CoordBase::boundary_size_x_lower = 1
-CoordBase::boundary_size_y_lower = 1
-CoordBase::boundary_size_z_lower = 1
-CoordBase::boundary_shiftout_x_lower = 1
-CoordBase::boundary_shiftout_y_lower = 1
-CoordBase::boundary_shiftout_z_lower = 1
-
-CoordBase::boundary_size_x_upper = 1
-CoordBase::boundary_size_y_upper = 1
-CoordBase::boundary_size_z_upper = 1
-CoordBase::boundary_shiftout_x_upper = 0
-CoordBase::boundary_shiftout_y_upper = 0
-CoordBase::boundary_shiftout_z_upper = 0
-
-CartGrid3D::type = "coordbase"
-CartGrid3D::domain = "full"
-CartGrid3D::avoid_origin = "no"
-
-CoordBase::xmin = 0
-CoordBase::ymin = 0
-CoordBase::zmin = 0
-CoordBase::xmax = 1
-CoordBase::ymax = 1
-CoordBase::zmax = 1
-CoordBase::dx = 0.05
-CoordBase::dy = 0.05
-CoordBase::dz = 0.05
-
-driver::ghost_size = 1
-Carpet::domain_from_coordbase = "yes"
-Carpet::poison_new_timelevels = "yes"
-Carpet::check_for_poison = "no"
-Carpet::poison_value = 113
-
-Carpet::max_refinement_levels = 1
-Carpet::prolongation_order_space = 3
-Carpet::prolongation_order_time = 2
-Carpet::init_each_timelevel = no
-Carpet::print_timestats_every = 0
-
-Periodic::periodic = yes
-
-Time::dtfac = 0.5
-
-MethodOfLines::ode_method = "RK4"
-MethodOfLines::MoL_NaN_Check = "no"
-MethodOfLines::initial_data_is_crap = "yes"
-MethodOfLines::MoL_Intermediate_Steps = 4
-MethodOfLines::MoL_Num_Scratch_Levels = 1
-
-IO::out_dir = $parfile
-
-CarpetIOBasic::outInfo_every = 1
-CarpetIOBasic::outInfo_vars = ""
-
-IOASCII::out1D_every = 1
-IOASCII::out1D_vars = "Wave::phi Wave::phiExact"
-Wave::initial_data = "sine"
-Wave::evolved_bound = "none"
diff --git a/Tools/CodeGen/CactusBoundary.m b/Tools/CodeGen/CactusBoundary.m
index 090151c..8c8b81a 100644
--- a/Tools/CodeGen/CactusBoundary.m
+++ b/Tools/CodeGen/CactusBoundary.m
@@ -32,8 +32,14 @@
*)
-BeginPackage["CactusBoundary`", {"CodeGen`", "Thorn`",
- "MapLookup`", "KrancGroups`", "Errors`", "Helpers`", "Kranc`"}];
+BeginPackage["sym`"];
+
+{};
+
+EndPackage[];
+
+BeginPackage["CactusBoundary`", {"CodeGen`", "sym`", "Thorn`",
+ "MapLookup`", "KrancGroups`", "Errors`", "Helpers`"}];
GetInheritedImplementations::usage = "";
GetIncludeFiles::usage = "";
diff --git a/Tools/CodeGen/CalculationFunction.m b/Tools/CodeGen/CalculationFunction.m
index 3d86503..9f10c55 100644
--- a/Tools/CodeGen/CalculationFunction.m
+++ b/Tools/CodeGen/CalculationFunction.m
@@ -18,9 +18,19 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
-BeginPackage["CalculationFunction`", {"CodeGen`",
+BeginPackage["sym`"];
+
+{GridFunctions, Shorthands, Equations, t, DeclarationIncludes,
+LoopPreIncludes, GroupImplementations, PartialDerivatives, NoSimplify,
+Boundary, Interior, InteriorNoSync, Where, AddToStencilWidth,
+Everywhere, normal1, normal2, normal3, INV, SQR, CUB, QAD, dot, pow,
+exp, dx, dy, dz, idx, idy, idz}
+
+EndPackage[];
+
+BeginPackage["CalculationFunction`", {"CodeGen`", "sym`",
"MapLookup`", "KrancGroups`", "Differencing`", "Errors`",
- "Helpers`", "Kranc`"}];
+ "Helpers`"}];
CreateCalculationFunction::usage = "";
VerifyCalculation::usage = "";
@@ -230,7 +240,7 @@ assignVariableFromExpression[dest_, expr_, declare_] :=
Module[{tSym, type, cleanExpr, code},
tSym = Unique[];
type = If[StringMatchQ[ToString[dest], "dir*"], "int", "CCTK_REAL_VEC"];
- cleanExpr = ReplacePowers[expr] /. Kranc`t -> tSym;
+ cleanExpr = ReplacePowers[expr] /. sym`t -> tSym;
If[SOURCELANGUAGE == "C",
code = If[declare, type <> " ", ""] <> ToString[dest] <> " = " <>
@@ -328,7 +338,7 @@ CreateCalculationFunction[calc_, debug_, useCSE_, opts:OptionsPattern[]] :=
Module[{gfs, allSymbols, knownSymbols,
shorts, eqs, parameters,
functionName, dsUsed, groups, pddefs, cleancalc, eqLoop, where,
- addToStencilWidth, pDefs, haveCondTextuals, condTextuals},
+ addToStencilWidth, pDefs},
cleancalc = removeUnusedShorthands[calc];
shorts = lookupDefault[cleancalc, Shorthands, {}];
@@ -340,7 +350,6 @@ CreateCalculationFunction[calc_, debug_, useCSE_, opts:OptionsPattern[]] :=
where = lookupDefault[cleancalc, Where, Everywhere];
addToStencilWidth = lookupDefault[cleancalc, AddToStencilWidth, 0];
pDefs = lookup[cleancalc, PreDefinitions];
- haveCondTextuals = mapContains[cleancalc, ConditionalOnTextuals];
VerifyCalculation[cleancalc];
@@ -380,13 +389,6 @@ CreateCalculationFunction[calc_, debug_, useCSE_, opts:OptionsPattern[]] :=
ThrowError["The following shorthands are already declared as grid functions:",
Intersection[shorts, gfs]]];
- (* check that the passed in textual condition makes sense *)
- If[haveCondTextuals,
- condTextuals = lookup[cleancalc, ConditionalOnTextuals];
- If[! MatchQ[condTextuals, {_String ...}],
- ThrowError["ConditionalOnTextuals entry in calculation expected to be of the form {string, ...}, but was ", condTextuals, "Calculation is ", calc]];
- ];
-
(* Check that there are no unknown symbols in the calculation *)
allSymbols = calculationSymbols[cleancalc];
knownSymbols = Join[lookupDefault[cleancalc, AllowedSymbols, {}], gfs, shorts, parameters,
@@ -413,8 +415,6 @@ CreateCalculationFunction[calc_, debug_, useCSE_, opts:OptionsPattern[]] :=
ConditionalOnParameterTextual["cctk_iteration % " <> functionName <> "_calc_every != " <>
functionName <> "_calc_offset", "return;\n"],
- If[haveCondTextuals, Map[ConditionalOnParameterTextual["!(" <> # <> ")", "return;\n"] &,condTextuals], {}],
-
CommentedBlock["Include user-supplied include files",
Map[IncludeFile, lookupDefault[cleancalc, DeclarationIncludes, {}]]],
diff --git a/Tools/CodeGen/CodeGen.m b/Tools/CodeGen/CodeGen.m
index 2eccf18..d45fea9 100644
--- a/Tools/CodeGen/CodeGen.m
+++ b/Tools/CodeGen/CodeGen.m
@@ -19,8 +19,12 @@
along with Kranc; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
+BeginPackage["sym`"];
+{INV, SQR, CUB, QAD, exp, pow, fmax, fmin, dx, dy, dz, khalf, kthird, ktwothird, kfourthird, keightthird};
-BeginPackage["CodeGen`", {"Errors`", "Kranc`"}];
+EndPackage[];
+
+BeginPackage["CodeGen`", {"sym`", "Errors`"}];
SOURCELANGUAGE::usage = "global variable == \"C\" or \"Fortran\" determines language
for code generation";
diff --git a/Tools/CodeGen/Differencing.m b/Tools/CodeGen/Differencing.m
index 828ec3e..92da771 100644
--- a/Tools/CodeGen/Differencing.m
+++ b/Tools/CodeGen/Differencing.m
@@ -125,7 +125,13 @@ point. Should be checked by someone competent!
*)
-BeginPackage["Differencing`", {"CodeGen`", "Kranc`", "MapLookup`",
+BeginPackage["sym`"];
+
+{Name, Definitions, shift, spacing, SBPDerivative};
+
+EndPackage[];
+
+BeginPackage["Differencing`", {"CodeGen`", "sym`", "MapLookup`",
"LinearAlgebra`MatrixManipulation`", "Errors`"}];
CreateDifferencingHeader::usage = "";
diff --git a/Tools/CodeGen/Helpers.m b/Tools/CodeGen/Helpers.m
index 563c514..ecc4dae 100644
--- a/Tools/CodeGen/Helpers.m
+++ b/Tools/CodeGen/Helpers.m
@@ -18,8 +18,12 @@
along with Kranc; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
+BeginPackage["sym`"];
+{dummy};
-BeginPackage["Helpers`", {"Kranc`"}];
+EndPackage[];
+
+BeginPackage["Helpers`", {"sym`"}];
TensorName::usage = "get the base name of a tensor object, i.e. TensorName[g[la, lb]] -> TensorName";
diff --git a/Tools/CodeGen/Interface.m b/Tools/CodeGen/Interface.m
deleted file mode 100644
index 29c198f..0000000
--- a/Tools/CodeGen/Interface.m
+++ /dev/null
@@ -1,140 +0,0 @@
-
-(* Copyright 2004 Sascha Husa, Ian Hinder, Christiane Lechner
-
- This file is part of Kranc.
-
- Kranc is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- Kranc is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Kranc; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*)
-
-BeginPackage["Interface`", {"Thorn`", "KrancGroups`", "MapLookup`", "Errors`", "Helpers`", "Kranc`"}];
-
-CreateKrancInterface;
-
-Begin["`Private`"];
-
-(* --------------------------------------------------------------------------
- Interface and variable definitions
- -------------------------------------------------------------------------- *)
-
-nonevolvedGroupInterfaceStructure[group_] :=
-{
- Name -> groupName[group],
- VariableType -> "CCTK_REAL",
- Timelevels -> NonevolvedTimelevels[group],
- GridType -> "GF",
- Comment -> groupName[group],
- Visibility -> "public",
- Tags -> Join[GroupTags[group]],
- Variables -> groupVariables[group]
-}
-
-evolvedGroupInterfaceStructure[group_, timelevels_] :=
-{
- Name -> groupName[group],
- VariableType -> "CCTK_REAL",
- Timelevels -> timelevels,
- GridType -> "GF",
- Comment -> groupName[group],
- Visibility -> "public",
- Tags -> GroupTags[group],
- Variables -> groupVariables[group]
-}
-
-rhsGroupInterfaceStructure[group_, timelevels_] :=
-{
- Name -> groupName[group],
- VariableType -> "CCTK_REAL",
- Timelevels -> timelevels,
- GridType -> "GF",
- Comment -> groupName[group],
- Visibility -> "public",
- Tags -> GroupTags[group],
- Variables -> groupVariables[group]
-}
-
-
-Options[CreateKrancInterface] = ThornOptions;
-
-CreateKrancInterface[nonevolvedGroups_, evolvedGroups_, rhsGroups_, groups_,
- implementation_, inheritedImplementations_,
- includeFiles_, opts:OptionsPattern[]] :=
-
- Module[{registerEvolved, (*registerConstrained,*)
- nonevolvedGroupStructures, evolvedGroupStructures, rhsGroupStructures,
- groupStructures, interface},
- VerifyGroupNames[nonevolvedGroups];
- VerifyGroupNames[evolvedGroups];
- VerifyGroupNames[rhsGroups];
- VerifyGroups[groups];
- VerifyString[implementation];
- VerifyStringList[inheritedImplementations];
- VerifyStringList[includeFiles];
- (* These are the aliased functions that are USED by this thorn from other thorns *)
- registerEvolved =
- {
- Name -> "MoLRegisterEvolved",
- Type -> "CCTK_INT",
- ArgString -> "CCTK_INT IN EvolvedIndex, CCTK_INT IN RHSIndex"
- };
-
- (*
- registerConstrained =
- {
- Name -> "MoLRegisterConstrained",
- Type -> "CCTK_INT",
- ArgString -> "CCTK_INT IN ConstrainedIndex"
- };
- *)
-
- diffCoeff =
- {
- Name -> "Diff_coeff",
- Type -> "SUBROUTINE",
- ArgString -> "CCTK_POINTER_TO_CONST IN cctkGH, CCTK_INT IN dir, CCTK_INT IN nsize, CCTK_INT OUT ARRAY imin, CCTK_INT OUT ARRAY imax, CCTK_REAL OUT ARRAY q, CCTK_INT IN table_handle"
- };
-
-
- (* For each group declared in this thorn, we need an entry in the
- interface file. Each evolved group needs an associated rhs
- group, but these are constructed at a higher level and are
- listed in the nonevolved groups. *)
- nonevolvedGroupStructures =
- Map[nonevolvedGroupInterfaceStructure[groupFromName[#, groups]] &,
- nonevolvedGroups];
-
- evolvedGroupStructures =
- Map[evolvedGroupInterfaceStructure[groupFromName[#, groups],
- OptionValue[EvolutionTimelevels]] &, evolvedGroups];
-
- rhsGroupStructures =
- Map[rhsGroupInterfaceStructure[groupFromName[#, groups],
- OptionValue[EvolutionTimelevels]] &, rhsGroups];
-
- groupStructures = Join[nonevolvedGroupStructures,
- evolvedGroupStructures, rhsGroupStructures];
-
- interface = CreateInterface[implementation, inheritedImplementations,
- Join[includeFiles, {CactusBoundary`GetIncludeFiles[]},
- If[OptionValue[UseLoopControl], {"loopcontrol.h"}, {}]],
- groupStructures,
- UsesFunctions ->
- Join[{registerEvolved, (*registerConstrained,*) diffCoeff},
- CactusBoundary`GetUsedFunctions[]]];
- Return[interface]];
-
-
-End[];
-
-EndPackage[];
diff --git a/Tools/CodeGen/Kranc.m b/Tools/CodeGen/Kranc.m
deleted file mode 100644
index fd07c53..0000000
--- a/Tools/CodeGen/Kranc.m
+++ /dev/null
@@ -1,95 +0,0 @@
-
-(* Copyright 2004 Sascha Husa, Ian Hinder, Christiane Lechner
-
- This file is part of Kranc.
-
- Kranc is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- Kranc is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Kranc; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*)
-
-BeginPackage["Kranc`"];
-
-(* CodeGen.m *)
-
-{INV, SQR, CUB, QAD, exp, pow, fmax, fmin, dx, dy, dz, khalf, kthird, ktwothird, kfourthird, keightthird};
-
-(* Helpers.m *)
-
-dummy;
-
-(* CalculationFunction.m *)
-
-{GridFunctions, Shorthands, Equations, t, DeclarationIncludes,
-LoopPreIncludes, GroupImplementations, PartialDerivatives, NoSimplify,
-Boundary, Interior, InteriorNoSync, Where, AddToStencilWidth,
-Everywhere, normal1, normal2, normal3, INV, SQR, CUB, QAD, dot, pow,
-exp, dx, dy, dz, idx, idy, idz}
-
-{ConditionalOnKeyword, ConditionalOnKeywords, CollectList, Interior,
-InteriorNoSync, Boundary, BoundaryWithGhosts, Where, PreDefinitions,
-AllowedSymbols, Parameters, ConditionalOnTextuals};
-
-(* Differencing.m *)
-
-{Name, Definitions, shift, spacing, SBPDerivative};
-
-(* KrancThorn.m *)
-
-ThornOptions =
- {Calculations -> {},
- DeclaredGroups -> {},
- Implementation -> None,
- InheritedImplementations -> {},
- EvolutionTimelevels -> 3,
- DefaultEvolutionTimelevels -> None,
- RealParameters -> {},
- IntParameters -> {},
- KeywordParameters -> {},
- InheritedRealParameters -> {},
- InheritedIntParameters -> {},
- InheritedKeywordParameters -> {},
- ExtendedRealParameters -> {},
- ExtendedIntParameters -> {},
- ExtendedKeywordParameters -> {},
- PartialDerivatives -> {},
- ReflectionSymmetries -> {},
- ZeroDimensions -> {},
- UseLoopControl -> False,
- UseCSE -> False,
- ProhibitAssignmentToGridFunctionsRead -> False,
- IncludeFiles -> {}};
-
-(* Thorn.m *)
-
-{AccumulatorBase, ThornImplementation, Name, Type, Extend, Default,
-Comment, Range, Implementation, Group, SchedulePoint, Language,
-SynchronizedGroups, StorageGroups, Timelevels, MaxTimelevels,
-VariableType, GridType,
-Visibility, Variables, Implementations, Value, AllowedValues,
-UsedParameters, Description, ExtendedParameters, NewParameters,
-Directory, Configuration, Interface, Param, Schedule, Sources, Makefile,
-Filename,
-Contents, ThornName, BaseImplementation, EvolvedGFs, PrimitiveGFs,
-Groups, Calculation, GridFunctions, Shorthands, Equations, Parameter,
-Value, UsesFunctions, ArgString, Conditional, Conditionals, D1, D2, D3, D11, D22,
-D33, D21, D31, D32, Textual, TriggerGroups, Include, RHSGroups, Tags,
-Steerable, Never, Always, Recover};
-
-{ExcisionGFs};
-
-(* TensorTools.m *)
-
-{D1, D2, D3, D11, D22, D33, D21, D31, D32, D12, D13, D23, dot, Eps, Zero3}
-
-EndPackage[];
diff --git a/Tools/CodeGen/KrancGroups.m b/Tools/CodeGen/KrancGroups.m
index 05ebdea..a4a65eb 100644
--- a/Tools/CodeGen/KrancGroups.m
+++ b/Tools/CodeGen/KrancGroups.m
@@ -24,8 +24,12 @@
(* Manipulate Kranc group structures *)
(****************************************************************************)
+BeginPackage["sym`"];
+{Timelevels}
+EndPackage[];
+
BeginPackage["KrancGroups`",
- {"Kranc`", "Errors`", "MapLookup`"}];
+ {"sym`", "Errors`", "MapLookup`"}];
CreateGroup;
groupsFromGFs::usage = "";
@@ -51,7 +55,6 @@ SetGroupName;
AddGroupExtra;
GroupTimelevels;
allGroupVariables;
-NonevolvedTimelevels;
Begin["`Private`"];
@@ -104,10 +107,6 @@ GroupTimelevels[g_] :=
extras = Drop[g, 2];
lookupDefault[extras, Timelevels, False]];
-NonevolvedTimelevels[group_] :=
- Module[{tls = GroupTimelevels[group]},
- If[ tls === False, 1, tls]];
-
groupName[g_] := First[g];
diff --git a/Tools/CodeGen/KrancThorn.m b/Tools/CodeGen/KrancThorn.m
index 5d54836..67c4a3c 100644
--- a/Tools/CodeGen/KrancThorn.m
+++ b/Tools/CodeGen/KrancThorn.m
@@ -24,10 +24,42 @@
(* Generate Cactus Thorns from a high-level interface *)
(****************************************************************************)
-BeginPackage["KrancThorn`", {"CodeGen`", "Thorn`",
+BeginPackage["sym`"];
+
+ThornOptions =
+ {Calculations -> {},
+ DeclaredGroups -> {},
+ Implementation -> None,
+ InheritedImplementations -> {},
+ EvolutionTimelevels -> 3,
+ DefaultEvolutionTimelevels -> None,
+ RealParameters -> {},
+ IntParameters -> {},
+ KeywordParameters -> {},
+ InheritedRealParameters -> {},
+ InheritedIntParameters -> {},
+ InheritedKeywordParameters -> {},
+ ExtendedRealParameters -> {},
+ ExtendedIntParameters -> {},
+ ExtendedKeywordParameters -> {},
+ PartialDerivatives -> {},
+ ReflectionSymmetries -> {},
+ ZeroDimensions -> {},
+ UseLoopControl -> False,
+ UseCSE -> False,
+ ProhibitAssignmentToGridFunctionsRead -> False,
+ IncludeFiles -> {}};
+
+{ConditionalOnKeyword, ConditionalOnKeywords, CollectList, Interior,
+InteriorNoSync, Boundary, BoundaryWithGhosts, Where, PreDefinitions,
+AllowedSymbols, Parameters};
+
+EndPackage[];
+
+BeginPackage["KrancThorn`", {"CodeGen`", "sym`", "Thorn`",
"MapLookup`", "KrancGroups`", "Differencing`",
"CalculationFunction`", "Errors`", "Helpers`", "CactusBoundary`",
- "TensorTools`", "Param`", "Schedule`", "Interface`", "Kranc`"}];
+ "TensorTools`"}];
CreateKrancThorn::usage = "Construct a Kranc thorn";
CreateKrancThornTT::usage = "Construct a Kranc thorn using TensorTools";
@@ -35,10 +67,6 @@ CreateGroupFromTensor::usage = "";
Begin["`Private`"];
-(* --------------------------------------------------------------------------
- Utility functions
- -------------------------------------------------------------------------- *)
-
VerifyGroups[gs_] :=
If[!ListQ[gs],
ThrowError["Not a list of group definitions: ", gs],
@@ -75,10 +103,6 @@ Module[{used, unrecognized},
replaceDots[x_] :=
x /. (dot[y_] :> Symbol[ToString[y] <> "rhs"]);
-(* --------------------------------------------------------------------------
- Thorn generation (main entry point for non-tensorial thorns)
- -------------------------------------------------------------------------- *)
-
Options[CreateKrancThorn] = ThornOptions;
CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[]] :=
@@ -112,8 +136,8 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
defaultEvolutionTimelevels = lookupDefault[{opts}, DefaultEvolutionTimelevels, evolutionTimelevels];
realParams = OptionValue[RealParameters];
intParams = OptionValue[IntParameters];
- realParamDefs = MakeFullParamDefs[realParams];
- intParamDefs = MakeFullParamDefs[intParams];
+ realParamDefs = makeFullParamDefs[realParams];
+ intParamDefs = makeFullParamDefs[intParams];
keywordParams = OptionValue[KeywordParameters];
inheritedRealParams = OptionValue[InheritedRealParameters];
inheritedIntParams = OptionValue[InheritedIntParameters];
@@ -125,7 +149,7 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
reflectionSymmetries = OptionValue[ReflectionSymmetries];
useCSE = OptionValue[UseCSE];
- coordGroup = {"grid::coordinates", {Kranc`x,Kranc`y,Kranc`z,Kranc`r}};
+ coordGroup = {"grid::coordinates", {sym`x,sym`y,sym`z,sym`r}};
groups = Join[groupsOrig, {coordGroup}];
includeFiles = Join[includeFiles, {"GenericFD.h", "Symmetry.h", "Vectors.hh", "sbp_calc_coeffs.h"}];
@@ -163,17 +187,17 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
(* Construct the configuration file *)
InfoMessage[Terse, "Creating configuration file"];
- configuration = CreateConfiguration[opts];
+ configuration = createKrancConfiguration[opts];
(* Construct the interface file *)
InfoMessage[Terse, "Creating interface file"];
- interface = CreateKrancInterface[nonevolvedGroups,
+ interface = createKrancInterface[nonevolvedGroups,
evolvedGroups, rhsGroups, groups,
implementation, inheritedImplementations, includeFiles, opts];
(* Construct the param file *)
InfoMessage[Terse, "Creating param file"];
- param = CreateKrancParam[evolvedGroups, nonevolvedGroups, groups, thornName,
+ param = createKrancParam[evolvedGroups, nonevolvedGroups, groups, thornName,
realParamDefs, intParamDefs, keywordParams,
inheritedRealParams, inheritedIntParams, inheritedKeywordParams,
extendedRealParams, extendedIntParams, extendedKeywordParams,
@@ -182,7 +206,7 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
(* Construct the schedule file *)
InfoMessage[Terse, "Creating schedule file"];
- schedule = CreateKrancScheduleFile[calcs, groups, evolvedGroups,
+ schedule = createKrancScheduleFile[calcs, groups, evolvedGroups,
rhsGroups, nonevolvedGroups, thornName,
evolutionTimelevels];
@@ -211,16 +235,14 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
ext = CodeGen`SOURCESUFFIX;
(* Construct a source file for each calculation *)
- allParams = Join[Map[ParamName, realParamDefs],
- Map[ParamName, intParamDefs],
+ allParams = Join[Map[paramName, realParamDefs],
+ Map[paramName, intParamDefs],
Map[unqualifiedName, inheritedRealParams],
Map[unqualifiedName, inheritedIntParams],
Map[unqualifiedName, inheritedKeywordParams]];
InfoMessage[Terse, "Creating calculation source files"];
- calcSources = Map[CreateSetterSource[
- {Join[#, {Parameters -> allParams, PartialDerivatives -> partialDerivs}]},
- False, useCSE, {}, opts] &, calcs];
+ calcSources = Map[CreateSetterSourceWrapper[#, allParams, partialDerivs, useCSE, opts] &, calcs];
calcFilenames = Map[lookup[#, Name] <> ext &, calcs];
(* Makefile *)
@@ -246,10 +268,6 @@ CreateKrancThorn[groupsOrig_, parentDirectory_, thornName_, opts:OptionsPattern[
InfoMessage[Terse, "Creating thorn"];
CreateThorn[thornspec]];
-(* --------------------------------------------------------------------------
- Functions related to calculations
- -------------------------------------------------------------------------- *)
-
CalculationEvolvedVars[calc_] :=
Module[{eqs, evolved, lhss},
VerifyNewCalculation[calc];
@@ -282,6 +300,470 @@ extractNonevolvedGroups[declaredGroups_, calcs_, groups_] :=
Return[nonevolvedGroups]];
+nonevolvedGroupInterfaceStructure[group_] :=
+{
+ Name -> groupName[group],
+ VariableType -> "CCTK_REAL",
+ Timelevels -> nonevolvedTimelevels[group],
+ GridType -> "GF",
+ Comment -> groupName[group],
+ Visibility -> "public",
+ Tags -> Join[GroupTags[group]],
+ Variables -> groupVariables[group]
+}
+
+evolvedGroupInterfaceStructure[group_, timelevels_] :=
+{
+ Name -> groupName[group],
+ VariableType -> "CCTK_REAL",
+ Timelevels -> timelevels,
+ GridType -> "GF",
+ Comment -> groupName[group],
+ Visibility -> "public",
+ Tags -> GroupTags[group],
+ Variables -> groupVariables[group]
+}
+
+rhsGroupInterfaceStructure[group_, timelevels_] :=
+{
+ Name -> groupName[group],
+ VariableType -> "CCTK_REAL",
+ Timelevels -> timelevels,
+ GridType -> "GF",
+ Comment -> groupName[group],
+ Visibility -> "public",
+ Tags -> GroupTags[group],
+ Variables -> groupVariables[group]
+}
+
+nonevolvedTimelevels[group_] :=
+ Module[{tls = GroupTimelevels[group]},
+ If[ tls === False, 1, tls]];
+
+createKrancConfiguration[opts:OptionsPattern[]] :=
+ Module[{configuration},
+ configuration = CreateConfiguration[opts];
+ Return[configuration]];
+
+Options[createKrancInterface] = ThornOptions;
+
+createKrancInterface[nonevolvedGroups_, evolvedGroups_, rhsGroups_, groups_,
+ implementation_, inheritedImplementations_,
+ includeFiles_, opts:OptionsPattern[]] :=
+
+ Module[{registerEvolved, (*registerConstrained,*)
+ nonevolvedGroupStructures, evolvedGroupStructures, rhsGroupStructures,
+ groupStructures, interface},
+ VerifyGroupNames[nonevolvedGroups];
+ VerifyGroupNames[evolvedGroups];
+ VerifyGroupNames[rhsGroups];
+ VerifyGroups[groups];
+ VerifyString[implementation];
+ VerifyStringList[inheritedImplementations];
+ VerifyStringList[includeFiles];
+ (* These are the aliased functions that are USED by this thorn from other thorns *)
+ registerEvolved =
+ {
+ Name -> "MoLRegisterEvolved",
+ Type -> "CCTK_INT",
+ ArgString -> "CCTK_INT IN EvolvedIndex, CCTK_INT IN RHSIndex"
+ };
+
+ (*
+ registerConstrained =
+ {
+ Name -> "MoLRegisterConstrained",
+ Type -> "CCTK_INT",
+ ArgString -> "CCTK_INT IN ConstrainedIndex"
+ };
+ *)
+
+ diffCoeff =
+ {
+ Name -> "Diff_coeff",
+ Type -> "SUBROUTINE",
+ ArgString -> "CCTK_POINTER_TO_CONST IN cctkGH, CCTK_INT IN dir, CCTK_INT IN nsize, CCTK_INT OUT ARRAY imin, CCTK_INT OUT ARRAY imax, CCTK_REAL OUT ARRAY q, CCTK_INT IN table_handle"
+ };
+
+
+ (* For each group declared in this thorn, we need an entry in the
+ interface file. Each evolved group needs an associated rhs
+ group, but these are constructed at a higher level and are
+ listed in the nonevolved groups. *)
+ nonevolvedGroupStructures =
+ Map[nonevolvedGroupInterfaceStructure[groupFromName[#, groups]] &,
+ nonevolvedGroups];
+
+ evolvedGroupStructures =
+ Map[evolvedGroupInterfaceStructure[groupFromName[#, groups],
+ OptionValue[EvolutionTimelevels]] &, evolvedGroups];
+
+ rhsGroupStructures =
+ Map[rhsGroupInterfaceStructure[groupFromName[#, groups],
+ OptionValue[EvolutionTimelevels]] &, rhsGroups];
+
+ groupStructures = Join[nonevolvedGroupStructures,
+ evolvedGroupStructures, rhsGroupStructures];
+
+ interface = CreateInterface[implementation, inheritedImplementations,
+ Join[includeFiles, {CactusBoundary`GetIncludeFiles[]},
+ If[OptionValue[UseLoopControl], {"loopcontrol.h"}, {}]],
+ groupStructures,
+ UsesFunctions ->
+ Join[{registerEvolved, (*registerConstrained,*) diffCoeff},
+ CactusBoundary`GetUsedFunctions[]]];
+ Return[interface]];
+
+VerifyQualifiedName[name_] :=
+ If[! StringQ[name] || ! StringMatchQ[name, "*::*"],
+ ThrowError["Not a name with an implementation:", name]];
+
+implementationFromQualifiedName[name_] :=
+ Module[{colon},
+ VerifyQualifiedName[name];
+ colon = First[First[StringPosition[name, ":", 1]]];
+ StringDrop[name, colon - 1 - StringLength[name]]];
+
+unqualifiedName[name_] :=
+ Module[{colon},
+ VerifyQualifiedName[name];
+ colon = First[First[StringPosition[name, ":", 1]]];
+ Return[StringDrop[name, colon + 1]]];
+
+krancParamStruct[definition_, type_, inherited_] :=
+ Module[{description, name},
+ name = lookup[definition, Name];
+ description = lookupDefault[definition, Description, name];
+ Join[
+ {Name -> name,
+ Type -> type,
+ Description -> description,
+ Default -> lookup[definition, Default],
+ Visibility -> "restricted"},
+ If[inherited,
+ {},
+ {AllowedValues -> {{Value -> "*:*", Description -> ""}}}]]];
+
+krancParamStructExtended[definition_, type_] :=
+ Module[{allowedValues, description, name},
+ name = unqualifiedName[lookup[definition, Name]];
+ description = lookupDefault[definition, Description, name];
+ allowedValues = lookup[definition, AllowedValues];
+ {Name -> name,
+ Type -> type,
+ Description -> description,
+ Default -> "",
+ Visibility -> "restricted",
+ AllowedValues -> Map[{Value -> #, Description -> ""} &, allowedValues]}];
+
+krancKeywordParamStruct[struct_] :=
+{
+ Name -> lookup[struct, Name],
+ Type -> "KEYWORD",
+ Default -> lookup[struct, Default],
+ Description -> lookupDefault[struct, Description, lookup[struct, Name]],
+ Visibility -> lookupDefault[struct, Visibility, "private"],
+ AllowedValues -> Map[{Value -> #, Description -> #} &, lookup[struct, AllowedValues]]
+};
+
+makeFullParamDefs[params_] :=
+ Module[{p},
+ p = Map[If[!ListQ[#], {Name -> #, Default -> 0}, #] &, params];
+ p];
+
+paramName[paramDef_] :=
+ lookup[paramDef, Name];
+
+inheritParameters[imp_, reals_, ints_, keywords_] :=
+ Module[{theseReals, theseInts, theseKeywords, theseRealsNoImp, theseIntsNoImp, theseKeywordsNoImp, realStructs, intStructs, keywordStructs},
+ theseReals = Select[reals, implementationFromQualifiedName[#] == imp &];
+ theseInts = Select[ints, implementationFromQualifiedName[#] == imp &];
+ theseKeywords = Select[keywords, implementationFromQualifiedName[#] == imp &];
+ theseRealsNoImp = makeFullParamDefs[Map[unqualifiedName, theseReals]];
+ theseIntsNoImp = makeFullParamDefs[Map[unqualifiedName, theseInts]];
+ theseKeywordsNoImp = makeFullParamDefs[Map[unqualifiedName, theseKeywords]];
+ realStructs = Map[krancParamStruct[#, "CCTK_REAL", True] &, theseRealsNoImp];
+ intStructs = Map[krancParamStruct[#, "CCTK_INT", True] &, theseIntsNoImp];
+ keywordStructs = Map[krancParamStruct[#, "CCTK_KEYWORD", True] &, theseKeywordsNoImp];
+ If[(Length[theseReals] + Length[theseInts] + Length[theseKeywords]) > 0,
+ Return[{Name -> imp, UsedParameters -> Join[realStructs, intStructs, keywordStructs]}],
+ Return[{}]]];
+
+extendParameters[imp_, reals_, ints_, keywords_] :=
+ Module[{theseReals, theseInts, theseKeywords, realStructs, intStructs, keywordStructs},
+ theseReals = Select[reals, implementationFromQualifiedName[lookup[#, Name]] == imp &];
+ theseInts = Select[ints, implementationFromQualifiedName[lookup[#, Name]] == imp &];
+ theseKeywords = Select[keywords, implementationFromQualifiedName[lookup[#, Name]] == imp &];
+ realStructs = Map[krancParamStructExtended[#, "CCTK_REAL"] &, theseReals];
+ intStructs = Map[krancParamStructExtended[#, "CCTK_INT"] &, theseInts];
+ keywordStructs = Map[krancParamStructExtended[#, "CCTK_KEYWORD"] &, theseKeywords];
+ If[(Length[theseReals] + Length[theseInts] + Length[theseKeywords]) > 0,
+ Return[{Name -> imp, ExtendedParameters -> Join[realStructs, intStructs, keywordStructs]}],
+ Return[{}]]];
+
+createKrancParam[evolvedGroups_, nonevolvedGroups_, groups_, thornName_,
+ reals_, ints_, keywords_,
+ inheritedReals_, inheritedInts_, inheritedKeywords_,
+ extendedReals_, extendedInts_, extendedKeywords_,
+ evolutionTimelevels_, defaultEvolutionTimelevels_,
+ calcs_] :=
+ Module[{nEvolved, evolvedMoLParam, evolvedGFs,
+ (*constrainedMoLParam,*) genericfdStruct, realStructs, intStructs,
+ allInherited, allExtended, implementationNames, molImplementation,
+ userImplementations, implementations, params, paramspec, param,
+ verboseStruct, calcOffsetStructs, calcEveryStructs},
+
+ (* reals and ints are symbols containing parameter names. The
+ inherited ones have implementation names as well *)
+
+ evolvedGFs = variablesFromGroups[evolvedGroups, groups];
+
+ nEvolved = Length[variablesFromGroups[evolvedGroups, groups]];
+(* nPrimitive = Length[variablesFromGroups[nonevolvedGroups, groups]];*)
+(* nPrimitive = Length[getConstrainedVariables[evolvedGroups, groups]];*)
+
+ evolvedMoLParam =
+ {
+ Name -> thornName <> "_MaxNumEvolvedVars",
+ Type -> "CCTK_INT",
+ Default -> nEvolved,
+ Description -> "Number of evolved variables used by this thorn",
+ Visibility -> "restricted",
+ AccumulatorBase -> "MethodofLines::MoL_Num_Evolved_Vars",
+ AllowedValues -> {{Value -> ToString[nEvolved] <> ":" <> ToString[nEvolved] ,
+ Description -> "Number of evolved variables used by this thorn"}}
+ };
+
+ (*
+ constrainedMoLParam =
+ {
+ Name -> thornName <> "_MaxNumConstrainedVars",
+ Type -> "CCTK_INT",
+ Default -> nPrimitive,
+ Description -> "Number of constrained variables used by this thorn",
+ Visibility -> "restricted",
+ AccumulatorBase -> "MethodofLines::MoL_Num_Constrained_Vars",
+ AllowedValues -> {{Value -> ToString[nPrimitive] <> ":" <> ToString[nPrimitive] ,
+ Description -> "Number of constrained variables used by this thorn"}}
+ };
+ *)
+
+ timelevelsParam =
+ {
+ Name -> "timelevels",
+ Type -> "CCTK_INT",
+ Default -> defaultEvolutionTimelevels,
+ Description -> "Number of active timelevels",
+ Visibility -> "restricted",
+ AllowedValues -> {{Value -> ToString[0] <> ":" <> ToString[evolutionTimelevels],
+ Description -> ""}}
+ };
+
+ rhsTimelevelsParam =
+ {
+ Name -> "rhs_timelevels",
+ Type -> "CCTK_INT",
+ Default -> 1,
+ Description -> "Number of active RHS timelevels",
+ Visibility -> "restricted",
+ AllowedValues -> {{Value -> ToString[0] <> ":" <> ToString[evolutionTimelevels],
+ Description -> ""}}
+ };
+
+ genericfdStruct =
+ {
+ Name -> "GenericFD",
+ UsedParameters ->
+ {{Name -> "stencil_width", Type -> "CCTK_INT"},
+ {Name -> "stencil_width_x", Type -> "CCTK_INT"},
+ {Name -> "stencil_width_y", Type -> "CCTK_INT"},
+ {Name -> "stencil_width_z", Type -> "CCTK_INT"},
+ {Name -> "boundary_width", Type -> "CCTK_INT"}}
+ };
+
+ realStructs = Map[krancParamStruct[#, "CCTK_REAL", False] &, reals];
+ verboseStruct = krancParamStruct[{Name -> "verbose", Default -> 0}, "CCTK_INT", False];
+ intStructs = Map[krancParamStruct[#, "CCTK_INT", False] &, ints];
+ calcEveryStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_every", Default -> 1}, "CCTK_INT", False] &, calcs];
+ calcOffsetStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_offset", Default -> 0}, "CCTK_INT", False] &, calcs];
+ keywordStructs = Map[krancKeywordParamStruct, keywords];
+
+ allInherited = Join[inheritedReals, inheritedInts, inheritedKeywords];
+ allExtended = Join[extendedReals, extendedInts, extendedKeywords];
+
+ implementationNames = Union[Map[implementationFromQualifiedName, allInherited],
+ Map[implementationFromQualifiedName[lookup[#, Name]] &, allExtended]];
+
+ molImplementation =
+ {
+ Name -> "MethodOfLines",
+ UsedParameters ->
+ {
+ {Name -> "MoL_Num_Evolved_Vars", Type -> "CCTK_INT"}
+ (* {Name -> "MoL_Num_Constrained_Vars", Type -> "CCTK_INT"} *)
+ }
+ };
+
+ userImplementations = Map[inheritParameters[#, inheritedReals,inheritedInts,inheritedKeywords] &,
+ implementationNames];
+ userImplementations2 = Map[extendParameters[#, extendedReals,extendedInts,extendedKeywords] &,
+ implementationNames];
+
+ userImplementations = If[userImplementations=={{}},{},userImplementations];
+ userImplementations2 = If[userImplementations2=={{}},{},userImplementations2];
+
+ implementations = Join[userImplementations, userImplementations2, {genericfdStruct, molImplementation}];
+ params = Join[{verboseStruct}, realStructs, intStructs, keywordStructs, {evolvedMoLParam, (*constrainedMoLParam,*) timelevelsParam, rhsTimelevelsParam},
+ calcEveryStructs, calcOffsetStructs,
+ CactusBoundary`GetParameters[evolvedGFs, evolvedGroups]];
+
+ paramspec = {Implementations -> implementations,
+ NewParameters -> params};
+
+ param = CreateParam[paramspec];
+ Return[param]
+ ];
+
+simpleGroupStruct[groupName_, timelevels_] :=
+{
+ Group -> groupName,
+ Timelevels -> timelevels
+};
+
+evolvedGroupStruct[groupName_, timelevels_, maxtimelevels_] :=
+{
+ Group -> groupName,
+ Timelevels -> timelevels,
+ MaxTimelevels -> "timelevels"
+};
+
+rhsGroupStruct[groupName_, timelevels_, maxtimelevels_] :=
+{
+ Group -> groupName,
+ Timelevels -> timelevels,
+ MaxTimelevels -> "rhs_timelevels"
+};
+
+groupsSetInCalc[calc_, groups_] :=
+ Module[{gfs, eqs, lhss, gfsInLHS, lhsGroupNames},
+ gfs = allGroupVariables[groups];
+ eqs = lookup[calc, Equations];
+ lhss = Map[First, eqs];
+ gfsInLHS = Union[Cases[lhss, _ ? (MemberQ[gfs,#] &), Infinity]];
+
+ lhsGroupNames = containingGroups[gfsInLHS, groups];
+ Return[lhsGroupNames]
+ ];
+
+(* Each calculation can be scheduled at multiple points, so this
+ function returns a LIST of schedule structures for each calculation
+ *)
+scheduleCalc[calc_, groups_] :=
+ Module[{points, conditional, conditionals, keywordConditional, keywordConditionals, triggered, keyword, value, keywordvaluepairs, groupsToSync},
+ conditional = mapContains[calc, ConditionalOnKeyword];
+ conditionals = mapContains[calc, ConditionalOnKeywords];
+ triggered = mapContains[calc, TriggerGroups];
+ If[conditional,
+ keywordConditional = lookup[calc, ConditionalOnKeyword];
+ If[! MatchQ[keywordConditional, {lhs_String, rhs_String}],
+ ThrowError["ConditionalOnKeyword entry in calculation expected to be of the form {parameter, value}, but was ", keywordConditional, "Calculation is ", calc]];
+
+ keyword = keywordConditional[[1]];
+ value = keywordConditional[[2]];
+ ];
+ If[conditionals,
+ keywordConditionals = lookup[calc, ConditionalOnKeywords];
+ If[! MatchQ[keywordConditionals, {{_, _} ...}],
+ ThrowError["ConditionalOnKeywords entry in calculation expected to be of the form {{parameter, value}}, but was ", keywordConditionals, "Calculation is ", calc]];
+
+ keywordvaluepairs =
+ Map[# /. {keyword_, value_} -> {Parameter -> keyword, Value -> value} &,
+ keywordConditionals];
+ ];
+
+ groupsToSync = If[lookupDefault[calc, Where, Everywhere] === Interior ||
+ lookupDefault[calc, Where, Everywhere] === Boundary,
+ groupsSetInCalc[calc, groups],
+ {}];
+
+ Map[
+ Join[
+ {
+ Name -> lookup[calc, Name],
+ SchedulePoint -> #,
+ SynchronizedGroups -> If[StringMatchQ[#, "*MoL_CalcRHS*", IgnoreCase -> True] || StringMatchQ[#, "*MoL_RHSBoundaries*", IgnoreCase -> True],
+ {},
+ groupsToSync],
+ Language -> CodeGen`SOURCELANGUAGE,
+ Comment -> lookup[calc, Name]
+ },
+ If[triggered, {TriggerGroups -> lookup[calc, TriggerGroups]},
+ {}],
+ If[conditional, {Conditional -> {Parameter -> keyword, Value -> value}},
+ {}],
+ If[conditionals, {Conditionals -> keywordvaluepairs},
+ {}]
+ ] &,
+ lookup[calc, Schedule]]];
+
+createKrancScheduleFile[calcs_, groups_, evolvedGroups_, rhsGroups_, nonevolvedGroups_, thornName_,
+ evolutionTimelevels_] :=
+ Module[{scheduledCalcs, scheduledStartup, scheduleMoLRegister, globalStorageGroups, scheduledFunctions, schedule},
+
+ scheduledCalcs = Flatten[Map[scheduleCalc[#, groups] &, calcs], 1];
+
+ scheduledStartup =
+ {
+ Name -> thornName <> "_Startup",
+ SchedulePoint -> "at STARTUP",
+ Language -> "C",
+ Options -> "meta",
+ Comment -> "create banner"
+ };
+
+ scheduleMoLRegister =
+ {
+ Name -> thornName <> "_RegisterVars",
+ SchedulePoint -> "in MoL_Register",
+ Language -> "C",
+ Options -> "meta",
+ Comment -> "Register Variables for MoL"
+ };
+
+ scheduleRegisterSymmetries =
+ {
+ Name -> thornName <> "_RegisterSymmetries",
+ SchedulePoint -> "in SymmetryRegister",
+ Language -> "C",
+ Options -> "meta",
+ Comment -> "register symmetries"
+ };
+
+ globalStorageGroups = Join[Map[simpleGroupStruct[#, nonevolvedTimelevels[groupFromName[#, groups]]] &, nonevolvedGroups],
+ Map[evolvedGroupStruct[#, evolutionTimelevels, evolutionTimelevels] &, evolvedGroups],
+ Map[rhsGroupStruct[#, evolutionTimelevels, evolutionTimelevels] &, rhsGroups]];
+
+ scheduledFunctions =
+ Join[{scheduledStartup, scheduleMoLRegister, scheduleRegisterSymmetries},
+ scheduledCalcs, CactusBoundary`GetScheduledFunctions[thornName, evolvedGroups]];
+
+ schedule = CreateSchedule[globalStorageGroups,
+ CactusBoundary`GetScheduledGroups[thornName], scheduledFunctions];
+
+ Return[schedule]];
+
+Options[CreateSetterSourceWrapper] = ThornOptions;
+
+CreateSetterSourceWrapper[calc_, parameters_, derivs_, useCSE_, opts:OptionsPattern[]] :=
+ Module[{modCalc},
+ modCalc = Join[calc,
+ {Parameters -> parameters},
+ {PartialDerivatives -> derivs}];
+
+ source = CreateSetterSource[{modCalc}, False, useCSE,
+ If[OptionValue[UseLoopControl], {"loopcontrol.h"}, {}], opts];
+ Return[source]];
+
(* FIXME: This is still not quite right. We only want to have those variables that
we set as constrained, but I don't think this can hurt.*)
@@ -309,9 +791,7 @@ createKrancMoLRegister[evolvedGroupNames_, nonevolvedGroupNames_, groups_, imple
molregister = CreateMoLRegistrationSource[molspec, False];
Return[molregister]];
-(* --------------------------------------------------------------------------
- Tensors
- -------------------------------------------------------------------------- *)
+(* Tensorial wrapper *)
CreateKrancThornTT[groups_, parentDirectory_, thornName_, opts___] :=
Module[{calcs, expCalcs, expGroups, options, derivs, expDerivs, reflectionSymmetries, declaredGroups},
diff --git a/Tools/CodeGen/Param.m b/Tools/CodeGen/Param.m
deleted file mode 100644
index 7821f40..0000000
--- a/Tools/CodeGen/Param.m
+++ /dev/null
@@ -1,248 +0,0 @@
-
-(* Copyright 2004 Sascha Husa, Ian Hinder, Christiane Lechner
-
- This file is part of Kranc.
-
- Kranc is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- Kranc is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Kranc; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*)
-
-BeginPackage["Param`", {"Thorn`", "Errors`", "Helpers`", "MapLookup`", "KrancGroups`", "Kranc`"}];
-
-CreateKrancParam;
-MakeFullParamDefs;
-ParamName;
-
-Begin["`Private`"];
-
-VerifyQualifiedName[name_] :=
- If[! StringQ[name] || ! StringMatchQ[name, "*::*"],
- ThrowError["Not a name with an implementation:", name]];
-
-implementationFromQualifiedName[name_] :=
- Module[{colon},
- VerifyQualifiedName[name];
- colon = First[First[StringPosition[name, ":", 1]]];
- StringDrop[name, colon - 1 - StringLength[name]]];
-
-unqualifiedName[name_] :=
- Module[{colon},
- VerifyQualifiedName[name];
- colon = First[First[StringPosition[name, ":", 1]]];
- Return[StringDrop[name, colon + 1]]];
-
-krancParamStruct[definition_, type_, inherited_] :=
- Module[{description, name},
- name = lookup[definition, Name];
- description = lookupDefault[definition, Description, name];
- Join[
- {Name -> name,
- Type -> type,
- Description -> description,
- Default -> lookup[definition, Default],
- Visibility -> "restricted"},
- If[mapContains[definition, Steerable],
- {Steerable -> lookup[definition, Steerable]},
- {}],
- If[inherited,
- {},
- {AllowedValues -> {{Value -> "*:*", Description -> ""}}}]]];
-
-krancParamStructExtended[definition_, type_] :=
- Module[{allowedValues, description, name},
- name = unqualifiedName[lookup[definition, Name]];
- description = lookupDefault[definition, Description, name];
- allowedValues = lookup[definition, AllowedValues];
- {Name -> name,
- Type -> type,
- Description -> description,
- Default -> "",
- Visibility -> "restricted",
- AllowedValues -> Map[{Value -> #, Description -> ""} &, allowedValues]}];
-
-krancKeywordParamStruct[struct_] :=
-{
- Name -> lookup[struct, Name],
- Type -> "KEYWORD",
- Default -> lookup[struct, Default],
- Description -> lookupDefault[struct, Description, lookup[struct, Name]],
- Visibility -> lookupDefault[struct, Visibility, "private"],
- AllowedValues -> Map[{Value -> #, Description -> #} &, lookup[struct, AllowedValues]]
-};
-
-MakeFullParamDefs[params_] :=
- Module[{p},
- p = Map[If[!ListQ[#], {Name -> #, Default -> 0}, #] &, params];
- p];
-
-ParamName[paramDef_] :=
- lookup[paramDef, Name];
-
-inheritParameters[imp_, reals_, ints_, keywords_] :=
- Module[{theseReals, theseInts, theseKeywords, theseRealsNoImp, theseIntsNoImp, theseKeywordsNoImp, realStructs, intStructs, keywordStructs},
- theseReals = Select[reals, implementationFromQualifiedName[#] == imp &];
- theseInts = Select[ints, implementationFromQualifiedName[#] == imp &];
- theseKeywords = Select[keywords, implementationFromQualifiedName[#] == imp &];
- theseRealsNoImp = MakeFullParamDefs[Map[unqualifiedName, theseReals]];
- theseIntsNoImp = MakeFullParamDefs[Map[unqualifiedName, theseInts]];
- theseKeywordsNoImp = MakeFullParamDefs[Map[unqualifiedName, theseKeywords]];
- realStructs = Map[krancParamStruct[#, "CCTK_REAL", True] &, theseRealsNoImp];
- intStructs = Map[krancParamStruct[#, "CCTK_INT", True] &, theseIntsNoImp];
- keywordStructs = Map[krancParamStruct[#, "CCTK_KEYWORD", True] &, theseKeywordsNoImp];
- If[(Length[theseReals] + Length[theseInts] + Length[theseKeywords]) > 0,
- Return[{Name -> imp, UsedParameters -> Join[realStructs, intStructs, keywordStructs]}],
- Return[{}]]];
-
-extendParameters[imp_, reals_, ints_, keywords_] :=
- Module[{theseReals, theseInts, theseKeywords, realStructs, intStructs, keywordStructs},
- theseReals = Select[reals, implementationFromQualifiedName[lookup[#, Name]] == imp &];
- theseInts = Select[ints, implementationFromQualifiedName[lookup[#, Name]] == imp &];
- theseKeywords = Select[keywords, implementationFromQualifiedName[lookup[#, Name]] == imp &];
- realStructs = Map[krancParamStructExtended[#, "CCTK_REAL"] &, theseReals];
- intStructs = Map[krancParamStructExtended[#, "CCTK_INT"] &, theseInts];
- keywordStructs = Map[krancParamStructExtended[#, "CCTK_KEYWORD"] &, theseKeywords];
- If[(Length[theseReals] + Length[theseInts] + Length[theseKeywords]) > 0,
- Return[{Name -> imp, ExtendedParameters -> Join[realStructs, intStructs, keywordStructs]}],
- Return[{}]]];
-
-CreateKrancParam[evolvedGroups_, nonevolvedGroups_, groups_, thornName_,
- reals_, ints_, keywords_,
- inheritedReals_, inheritedInts_, inheritedKeywords_,
- extendedReals_, extendedInts_, extendedKeywords_,
- evolutionTimelevels_, defaultEvolutionTimelevels_,
- calcs_] :=
- Module[{nEvolved, evolvedMoLParam, evolvedGFs,
- (*constrainedMoLParam,*) genericfdStruct, realStructs, intStructs,
- allInherited, allExtended, implementationNames, molImplementation,
- userImplementations, implementations, params, paramspec, param,
- verboseStruct, calcOffsetStructs, calcEveryStructs},
-
- (* reals and ints are symbols containing parameter names. The
- inherited ones have implementation names as well *)
-
- evolvedGFs = variablesFromGroups[evolvedGroups, groups];
-
- nEvolved = Length[variablesFromGroups[evolvedGroups, groups]];
-(* nPrimitive = Length[variablesFromGroups[nonevolvedGroups, groups]];*)
-(* nPrimitive = Length[getConstrainedVariables[evolvedGroups, groups]];*)
-
- evolvedMoLParam =
- {
- Name -> thornName <> "_MaxNumEvolvedVars",
- Type -> "CCTK_INT",
- Default -> nEvolved,
- Description -> "Number of evolved variables used by this thorn",
- Visibility -> "restricted",
- AccumulatorBase -> "MethodofLines::MoL_Num_Evolved_Vars",
- AllowedValues -> {{Value -> ToString[nEvolved] <> ":" <> ToString[nEvolved] ,
- Description -> "Number of evolved variables used by this thorn"}}
- };
-
- (*
- constrainedMoLParam =
- {
- Name -> thornName <> "_MaxNumConstrainedVars",
- Type -> "CCTK_INT",
- Default -> nPrimitive,
- Description -> "Number of constrained variables used by this thorn",
- Visibility -> "restricted",
- AccumulatorBase -> "MethodofLines::MoL_Num_Constrained_Vars",
- AllowedValues -> {{Value -> ToString[nPrimitive] <> ":" <> ToString[nPrimitive] ,
- Description -> "Number of constrained variables used by this thorn"}}
- };
- *)
-
- timelevelsParam =
- {
- Name -> "timelevels",
- Type -> "CCTK_INT",
- Default -> defaultEvolutionTimelevels,
- Description -> "Number of active timelevels",
- Visibility -> "restricted",
- AllowedValues -> {{Value -> ToString[0] <> ":" <> ToString[evolutionTimelevels],
- Description -> ""}}
- };
-
- rhsTimelevelsParam =
- {
- Name -> "rhs_timelevels",
- Type -> "CCTK_INT",
- Default -> 1,
- Description -> "Number of active RHS timelevels",
- Visibility -> "restricted",
- AllowedValues -> {{Value -> ToString[0] <> ":" <> ToString[evolutionTimelevels],
- Description -> ""}}
- };
-
- genericfdStruct =
- {
- Name -> "GenericFD",
- UsedParameters ->
- {{Name -> "stencil_width", Type -> "CCTK_INT"},
- {Name -> "stencil_width_x", Type -> "CCTK_INT"},
- {Name -> "stencil_width_y", Type -> "CCTK_INT"},
- {Name -> "stencil_width_z", Type -> "CCTK_INT"},
- {Name -> "boundary_width", Type -> "CCTK_INT"}}
- };
-
- realStructs = Map[krancParamStruct[#, "CCTK_REAL", False] &, reals];
- verboseStruct = krancParamStruct[{Name -> "verbose", Default -> 0}, "CCTK_INT", False];
- intStructs = Map[krancParamStruct[#, "CCTK_INT", False] &, ints];
- calcEveryStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_every", Default -> 1}, "CCTK_INT", False] &, calcs];
- calcOffsetStructs = Map[krancParamStruct[{Name -> lookup[#, Name] <> "_calc_offset", Default -> 0}, "CCTK_INT", False] &, calcs];
- keywordStructs = Map[krancKeywordParamStruct, keywords];
-
- allInherited = Join[inheritedReals, inheritedInts, inheritedKeywords];
- allExtended = Join[extendedReals, extendedInts, extendedKeywords];
-
- implementationNames = Union[Map[implementationFromQualifiedName, allInherited],
- Map[implementationFromQualifiedName[lookup[#, Name]] &, allExtended]];
-
- molImplementation =
- {
- Name -> "MethodOfLines",
- UsedParameters ->
- {
- {Name -> "MoL_Num_Evolved_Vars", Type -> "CCTK_INT"}
- (* {Name -> "MoL_Num_Constrained_Vars", Type -> "CCTK_INT"} *)
- }
- };
-
- userImplementations = Map[inheritParameters[#, inheritedReals,inheritedInts,inheritedKeywords] &,
- implementationNames];
- userImplementations2 = Map[extendParameters[#, extendedReals,extendedInts,extendedKeywords] &,
- implementationNames];
-
- userImplementations = If[userImplementations=={{}},{},userImplementations];
- userImplementations2 = If[userImplementations2=={{}},{},userImplementations2];
-
- implementations = Join[userImplementations, userImplementations2, {genericfdStruct, molImplementation}];
- params = Join[{verboseStruct}, realStructs, intStructs, keywordStructs, {evolvedMoLParam, (*constrainedMoLParam,*) timelevelsParam, rhsTimelevelsParam},
- calcEveryStructs, calcOffsetStructs,
- CactusBoundary`GetParameters[evolvedGFs, evolvedGroups]];
-
- paramspec = {Implementations -> implementations,
- NewParameters -> params};
-
-(* Print["paramspec = ", paramspec];*)
-
- param = CreateParam[paramspec];
- Return[param]
- ];
-
-
-
-End[];
-
-EndPackage[];
diff --git a/Tools/CodeGen/Schedule.m b/Tools/CodeGen/Schedule.m
deleted file mode 100644
index 98105de..0000000
--- a/Tools/CodeGen/Schedule.m
+++ /dev/null
@@ -1,161 +0,0 @@
-
-(* Copyright 2004 Sascha Husa, Ian Hinder, Christiane Lechner
-
- This file is part of Kranc.
-
- Kranc is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- Kranc is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Kranc; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*)
-
-BeginPackage["Schedule`", {"Thorn`", "KrancGroups`", "MapLookup`", "Errors`", "Helpers`", "Kranc`"}];
-
-CreateKrancScheduleFile;
-
-Begin["`Private`"];
-
-(* --------------------------------------------------------------------------
- Scheduling
- -------------------------------------------------------------------------- *)
-
-simpleGroupStruct[groupName_, timelevels_] :=
-{
- Group -> groupName,
- Timelevels -> timelevels
-};
-
-evolvedGroupStruct[groupName_, timelevels_, maxtimelevels_] :=
-{
- Group -> groupName,
- Timelevels -> timelevels,
- MaxTimelevels -> "timelevels"
-};
-
-rhsGroupStruct[groupName_, timelevels_, maxtimelevels_] :=
-{
- Group -> groupName,
- Timelevels -> timelevels,
- MaxTimelevels -> "rhs_timelevels"
-};
-
-groupsSetInCalc[calc_, groups_] :=
- Module[{gfs, eqs, lhss, gfsInLHS, lhsGroupNames},
- gfs = allGroupVariables[groups];
- eqs = lookup[calc, Equations];
- lhss = Map[First, eqs];
- gfsInLHS = Union[Cases[lhss, _ ? (MemberQ[gfs,#] &), Infinity]];
-
- lhsGroupNames = containingGroups[gfsInLHS, groups];
- Return[lhsGroupNames]
- ];
-
-(* Each calculation can be scheduled at multiple points, so this
- function returns a LIST of schedule structures for each calculation
- *)
-scheduleCalc[calc_, groups_] :=
- Module[{points, conditional, conditionals, keywordConditional, keywordConditionals, triggered, keyword, value, keywordvaluepairs, groupsToSync},
- conditional = mapContains[calc, ConditionalOnKeyword];
- conditionals = mapContains[calc, ConditionalOnKeywords];
- triggered = mapContains[calc, TriggerGroups];
- If[conditional,
- keywordConditional = lookup[calc, ConditionalOnKeyword];
- If[! MatchQ[keywordConditional, {lhs_String, rhs_String}],
- ThrowError["ConditionalOnKeyword entry in calculation expected to be of the form {parameter, value}, but was ", keywordConditional, "Calculation is ", calc]];
-
- keyword = keywordConditional[[1]];
- value = keywordConditional[[2]];
- ];
- If[conditionals,
- keywordConditionals = lookup[calc, ConditionalOnKeywords];
- If[! MatchQ[keywordConditionals, {{_, _} ...}],
- ThrowError["ConditionalOnKeywords entry in calculation expected to be of the form {{parameter, value}}, but was ", keywordConditionals, "Calculation is ", calc]];
-
- keywordvaluepairs =
- Map[# /. {keyword_, value_} -> {Parameter -> keyword, Value -> value} &,
- keywordConditionals];
- ];
-
- groupsToSync = If[lookupDefault[calc, Where, Everywhere] === Interior ||
- lookupDefault[calc, Where, Everywhere] === Boundary,
- groupsSetInCalc[calc, groups],
- {}];
-
- Map[
- Join[
- {
- Name -> lookup[calc, Name],
- SchedulePoint -> #,
- SynchronizedGroups -> If[StringMatchQ[#, "*MoL_CalcRHS*", IgnoreCase -> True] || StringMatchQ[#, "*MoL_RHSBoundaries*", IgnoreCase -> True],
- {},
- groupsToSync],
- Language -> CodeGen`SOURCELANGUAGE,
- Comment -> lookup[calc, Name]
- },
- If[triggered, {TriggerGroups -> lookup[calc, TriggerGroups]},
- {}],
- If[conditional, {Conditional -> {Parameter -> keyword, Value -> value}},
- {}],
- If[conditionals, {Conditionals -> keywordvaluepairs},
- {}]
- ] &,
- lookup[calc, Schedule]]];
-
-CreateKrancScheduleFile[calcs_, groups_, evolvedGroups_, rhsGroups_, nonevolvedGroups_, thornName_,
- evolutionTimelevels_] :=
- Module[{scheduledCalcs, scheduledStartup, scheduleMoLRegister, globalStorageGroups, scheduledFunctions, schedule},
-
- scheduledCalcs = Flatten[Map[scheduleCalc[#, groups] &, calcs], 1];
-
- scheduledStartup =
- {
- Name -> thornName <> "_Startup",
- SchedulePoint -> "at STARTUP",
- Language -> "C",
- Options -> "meta",
- Comment -> "create banner"
- };
-
- scheduleMoLRegister =
- {
- Name -> thornName <> "_RegisterVars",
- SchedulePoint -> "in MoL_Register",
- Language -> "C",
- Options -> "meta",
- Comment -> "Register Variables for MoL"
- };
-
- scheduleRegisterSymmetries =
- {
- Name -> thornName <> "_RegisterSymmetries",
- SchedulePoint -> "in SymmetryRegister",
- Language -> "C",
- Options -> "meta",
- Comment -> "register symmetries"
- };
-
- globalStorageGroups = Join[Map[simpleGroupStruct[#, NonevolvedTimelevels[groupFromName[#, groups]]] &, nonevolvedGroups],
- Map[evolvedGroupStruct[#, evolutionTimelevels, evolutionTimelevels] &, evolvedGroups],
- Map[rhsGroupStruct[#, evolutionTimelevels, evolutionTimelevels] &, rhsGroups]];
-
- scheduledFunctions =
- Join[{scheduledStartup, scheduleMoLRegister, scheduleRegisterSymmetries},
- scheduledCalcs, CactusBoundary`GetScheduledFunctions[thornName, evolvedGroups]];
-
- schedule = CreateSchedule[globalStorageGroups,
- CactusBoundary`GetScheduledGroups[thornName], scheduledFunctions];
-
- Return[schedule]];
-
-End[];
-
-EndPackage[];
diff --git a/Tools/CodeGen/TensorTools.m b/Tools/CodeGen/TensorTools.m
index e05188c..ec099ea 100644
--- a/Tools/CodeGen/TensorTools.m
+++ b/Tools/CodeGen/TensorTools.m
@@ -18,11 +18,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
*)
-BeginPackage["TensorTools`", {"Errors`", "MapLookup`", "Kranc`"}];
+(* Place these symbols in the sym context *)
+BeginPackage["sym`"];
+{D1, D2, D3, D11, D22, D33, D21, D31, D32, D12, D13, D23, dot, Eps, Zero3}
+EndPackage[];
+
+BeginPackage["TensorTools`", {"Errors`", "MapLookup`"}];
(* Cause the sym context to be added to the context of anyone loading
this package *)
-(*$ContextPath = Join[{"sym`"}, $ContextPath]; *)
+$ContextPath = Join[{"sym`"}, $ContextPath];
(* Define usage messages for these functions. Mentioning them here
adds them to the TensorTools context *)
diff --git a/Tools/CodeGen/Thorn.m b/Tools/CodeGen/Thorn.m
index ea9721c..d9ebe6b 100644
--- a/Tools/CodeGen/Thorn.m
+++ b/Tools/CodeGen/Thorn.m
@@ -23,7 +23,31 @@
(* This package provides a set of functions to create the various
parts of a Cactus thorn and assemble them. *)
-BeginPackage["Thorn`", "CodeGen`", "CalculationFunction`", "MapLookup`", "KrancGroups`", "Helpers`", "Errors`", "Kranc`"];
+BeginPackage["sym`"];
+
+(* These symbols are used in this file. Whenever this package is
+ used, the symbols will be added into the sym` context. You will
+ need to make sure the sym` context is on your ContextPath to use
+ the symbols without the sym` prefix. *)
+
+{AccumulatorBase, ThornImplementation, Name, Type, Extend, Default,
+Comment, Range, Implementation, Group, SchedulePoint, Language,
+SynchronizedGroups, StorageGroups, Timelevels, MaxTimelevels,
+VariableType, GridType,
+Visibility, Variables, Implementations, Value, AllowedValues,
+UsedParameters, Description, ExtendedParameters, NewParameters,
+Directory, Configuration, Interface, Param, Schedule, Sources, Makefile,
+Filename,
+Contents, ThornName, BaseImplementation, EvolvedGFs, PrimitiveGFs,
+Groups, Calculation, GridFunctions, Shorthands, Equations, Parameter,
+Value, UsesFunctions, ArgString, Conditional, Conditionals, D1, D2, D3, D11, D22,
+D33, D21, D31, D32, Textual, TriggerGroups, Include, RHSGroups, Tags};
+
+{ExcisionGFs};
+
+EndPackage[];
+
+BeginPackage["Thorn`", "CodeGen`", "CalculationFunction`", "MapLookup`", "KrancGroups`", "Helpers`"];
(* These functions are externally visible, and comprise the public
interface to this package. *)
@@ -45,7 +69,7 @@ CreatePrecompMacros::usage = "";
CreateStartupFile::usage = "";
(* Ensure that we can refer to symbols without the `sym prefix *)
-(*$ContextPath = Join[{"sym`"}, $ContextPath];*)
+$ContextPath = Join[{"sym`"}, $ContextPath];
Begin["`Private`"];
@@ -155,14 +179,6 @@ parameterBlock[spec_] :=
If[mapContains[spec, AccumulatorBase],
{" ACCUMULATOR-BASE=", lookup[spec, AccumulatorBase]},
{}],
-
- If[mapContains[spec, Steerable],
- {" STEERABLE=",Switch[lookup[spec, Steerable],
- Never,"NEVER",
- Always,"ALWAYS",
- Recover, "RECOVER",
- _,ThrowError["Unknown 'Steerable' entry in parameter " <> ToString[lookup[spec, Name]] <> ": " <> ToString[lookup[spec, Steerable]]]]},
- {}],
"\n",
SuffixedCBlock[
@@ -481,8 +497,6 @@ calculationMacros[] :=
CodeGen representation of a source file that defines a function for
each Calculation. *)
-Options[CreateSetterSource] = ThornOptions;
-
CreateSetterSource[calcs_, debug_, useCSE_, include_,
opts:OptionsPattern[]] :=
Module[{},
@@ -503,8 +517,7 @@ CreateSetterSource[calcs_, debug_, useCSE_, include_,
],
Map[IncludeFile, Join[{"cctk.h", "cctk_Arguments.h", "cctk_Parameters.h",
- (*"precomputations.h",*) "GenericFD.h", "Differencing.h", "Vectors.hh"}, include,
- If[OptionValue[UseLoopControl], {"loopcontrol.h"}, {}]]],
+ (*"precomputations.h",*) "GenericFD.h", "Differencing.h", "Vectors.hh"}, include]],
calculationMacros[],
(* For each function structure passed, create the function and