aboutsummaryrefslogtreecommitdiff
path: root/Tools/CodeGen/MoL.m
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/CodeGen/MoL.m')
-rw-r--r--Tools/CodeGen/MoL.m62
1 files changed, 61 insertions, 1 deletions
diff --git a/Tools/CodeGen/MoL.m b/Tools/CodeGen/MoL.m
index a2a64e0..d393327 100644
--- a/Tools/CodeGen/MoL.m
+++ b/Tools/CodeGen/MoL.m
@@ -21,7 +21,7 @@
BeginPackage[
"MoL`",
{"Errors`", "Helpers`", "Kranc`", "CodeGenKranc`", "MapLookup`", "CodeGenCactus`",
- "CodeGen`", "CodeGenC`", "KrancGroups`", "Calculation`"}];
+ "CodeGen`", "CodeGenC`", "KrancGroups`", "Calculation`", "Code`", "Object`"}];
CreateKrancMoLRegister;
CreateMoLBoundariesSource::usage = "";
@@ -37,6 +37,7 @@ MoLUsedFunctions;
MoLProcessGroups;
MoLParameterStructures;
MoLUsedParameters;
+MoLProcessCode;
Begin["`Private`"];
@@ -698,6 +699,65 @@ DefFn[
(* {Name -> "MoL_Num_Constrained_Vars", Type -> "CCTK_INT"} *)
}}];
+Options[MoLProcessCode] = ThornOptions;
+
+DefFn[
+ MoLProcessCode[cIn_Code, opts:OptionsPattern[]] :=
+ Module[
+ {evolvedGroups, nonevolvedGroups, evolvedODEGroups,
+ nonevolvedODEGroups, rhsGroupDefinitions,
+ rhsODEGroupDefinitions, rhsGroups, rhsODEGroups,
+
+ groups, declaredGroups, calcs, odeGroups,
+ c = cIn},
+
+ groups = GetObjectField[c, "Groups"];
+ declaredGroups = GetObjectField[c, "DeclaredGroups"];
+ calcs = GetObjectField[c, "Calculations"];
+ odeGroups = GetObjectField[c, "ODEGroups"];
+
+ groups = MoLProcessGroups[declaredGroups,
+ calcs, groups, GetObjectField[c,"EvolutionTimelevels"]];
+
+ (* Get the different types of group *)
+ evolvedGroups = MoLEvolvedGroups[declaredGroups, calcs, groups];
+ nonevolvedGroups = MoLNonevolvedGroups[declaredGroups, calcs, groups];
+
+ evolvedODEGroups = MoLEvolvedGroups[odeGroups, calcs, groups];
+ nonevolvedODEGroups = MoLNonevolvedGroups[odeGroups, calcs, groups];
+
+ (* Replace the dots in the calculation *)
+ calcs = MoLReplaceDots[calcs];
+
+ rhsGroupDefinitions = MoLRHSGroupDefinitions[groups, evolvedGroups];
+ rhsODEGroupDefinitions = MoLRHSODEGroupDefinitions[groups, evolvedODEGroups];
+
+ (* Add the RHS groups *)
+ groups = Join[groups, rhsGroupDefinitions, rhsODEGroupDefinitions];
+
+ rhsGroups = Map[groupName, rhsGroupDefinitions];
+ rhsODEGroups = Map[groupName, rhsODEGroupDefinitions];
+
+ (* This possibly shouldn't be in MoL but under ODEs instead *)
+ calcs = Map[Append[#, ODEGroups -> Join[odeGroups, rhsODEGroups]] &, calcs];
+
+ declaredGroups = Join[declaredGroups, rhsGroups, odeGroups, rhsODEGroups];
+
+ InfoMessage[Terse, "Creating MoL registration file"];
+ (* TODO: only do this for thorns with evolved variables *)
+
+ c = SetObjectField[c, "Groups", groups];
+ c = SetObjectField[c, "DeclaredGroups", declaredGroups];
+ c = SetObjectField[c, "Calculations", calcs];
+ AppendObjectField[
+ c, "Sources",
+ {Filename -> "RegisterMoL.cc",
+ Contents -> CreateKrancMoLRegister[
+ evolvedGroups, nonevolvedGroups, evolvedODEGroups,
+ nonevolvedODEGroups,
+ Sequence@@(GetObjectField[c,#]& /@
+ {"Groups", "Implementation", "Name"})]}]]];
+
End[];
EndPackage[];