aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Auxiliary/Cactus/KrancNumericalTools/GenericFD/param.ccl11
-rw-r--r--Tools/CodeGen/CalculationFunction.m2
-rw-r--r--Tools/CodeGen/Jacobian.m50
-rw-r--r--Tools/CodeGen/Kranc.m1
-rw-r--r--Tools/CodeGen/TensorTools.m10
5 files changed, 54 insertions, 20 deletions
diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/param.ccl b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/param.ccl
index 430b2da..0348872 100644
--- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/param.ccl
+++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/param.ccl
@@ -37,7 +37,16 @@ CCTK_STRING jacobian_group "Name of group containing Jacobian" STEERABLE=RECOVER
"" :: "String of the form <implementation>::<groupname>"
} ""
-restricted:
+CCTK_STRING jacobian_determinant_group "Name of group containing Jacobian determinant" STEERABLE=RECOVER
+{
+ "" :: "String of the form <implementation>::<groupname>"
+} ""
+
+CCTK_STRING jacobian_inverse_group "Name of group containing Jacobian inverse" STEERABLE=RECOVER
+{
+ "" :: "String of the form <implementation>::<groupname>"
+} ""
+
CCTK_STRING jacobian_derivative_group "Name of group containing Jacobian derivative" STEERABLE=RECOVER
{
"" :: "String of the form <implementation>::<groupname>"
diff --git a/Tools/CodeGen/CalculationFunction.m b/Tools/CodeGen/CalculationFunction.m
index 39bbe57..20f3bc5 100644
--- a/Tools/CodeGen/CalculationFunction.m
+++ b/Tools/CodeGen/CalculationFunction.m
@@ -487,7 +487,7 @@ DefFn[
(* Check that there are no unknown symbols in the calculation *)
allSymbols = calculationSymbols[cleancalc];
knownSymbols = Join[lookupDefault[cleancalc, AllowedSymbols, {}], gfs, shorts, parameters,
- {dx,dy,dz,dt,idx,idy,idz,t, Pi, E, Symbol["i"], Symbol["j"], Symbol["k"], normal1, normal2,
+ {dx,dy,dz,dt,idx,idy,idz,t, usejacobian, Pi, E, Symbol["i"], Symbol["j"], Symbol["k"], normal1, normal2,
normal3, tangentA1, tangentA2, tangentA3, tangentB1, tangentB2, tangentB3},
If[useJacobian, JacobianSymbols[], {}]];
diff --git a/Tools/CodeGen/Jacobian.m b/Tools/CodeGen/Jacobian.m
index e0fd979..1ee48a9 100644
--- a/Tools/CodeGen/Jacobian.m
+++ b/Tools/CodeGen/Jacobian.m
@@ -117,16 +117,30 @@ InsertJacobian[calc_List, opts:OptionsPattern[]] :=
derivatives groups *)
CreateJacobianVariables[] :=
CommentedBlock["Jacobian variable pointers",
- {"bool const use_jacobian = (!CCTK_IsFunctionAliased(\"MultiPatch_GetMap\") || MultiPatch_GetMap(cctkGH) != jacobian_identity_map)\n && strlen(jacobian_group) > 0;\n",
- "if (use_jacobian && strlen(jacobian_derivative_group) == 0)\n",
+ {"bool const use_jacobian = (!CCTK_IsFunctionAliased(\"MultiPatch_GetMap\") || MultiPatch_GetMap(cctkGH) != jacobian_identity_map)\n",
+ " && strlen(jacobian_group) > 0;\n",
+ "bool const usejacobian = use_jacobian;\n",
+ "if (use_jacobian && (strlen(jacobian_determinant_group) == 0 || strlen(jacobian_inverse_group) == 0 || strlen(jacobian_derivative_group) == 0))\n",
"{\n",
- " CCTK_WARN (1, \"GenericFD::jacobian_group and GenericFD::jacobian_derivative_group must both be set to valid group names\");\n",
+ " CCTK_WARN (1, \"GenericFD::jacobian_group, GenericFD::jacobian_determinant_group, GenericFD::jacobian_inverse_group, and GenericFD::jacobian_derivative_group must all be set to valid group names\");\n",
"}\n\n",
"CCTK_REAL const *restrict jacobian_ptrs[9];\n",
"if (use_jacobian) GenericFD_GroupDataPointers(cctkGH, jacobian_group,\n",
" 9, jacobian_ptrs);\n",
"\n",
Table[{"CCTK_REAL const *restrict const J",i,j," = use_jacobian ? jacobian_ptrs[",(i-1)*3+j-1,"] : 0;\n"},{i,1,3},{j,1,3}],
+ "\n",
+ "CCTK_REAL const *restrict jacobian_determinant_ptrs[1];\n",
+ "if (use_jacobian) GenericFD_GroupDataPointers(cctkGH, jacobian_determinant_group,\n",
+ " 1, jacobian_determinant_ptrs);\n",
+ "\n",
+ {"CCTK_REAL const *restrict const detJ = use_jacobian ? jacobian_ptrs[0] : 0;\n"},
+ "\n",
+ "CCTK_REAL const *restrict jacobian_inverse_ptrs[9];\n",
+ "if (use_jacobian) GenericFD_GroupDataPointers(cctkGH, jacobian_inverse_group,\n",
+ " 9, jacobian_inverse_ptrs);\n",
+ "\n",
+ Table[{"CCTK_REAL const *restrict const iJ",i,j," = use_jacobian ? jacobian_inverse_ptrs[",(i-1)*3+j-1,"] : 0;\n"},{i,1,3},{j,1,3}],
"\n",
"CCTK_REAL const *restrict jacobian_derivative_ptrs[18];\n",
"if (use_jacobian) GenericFD_GroupDataPointers(cctkGH, jacobian_derivative_group,\n",
@@ -137,24 +151,31 @@ CommentedBlock["Jacobian variable pointers",
(* List of symbols which should be allowed in a calculation *)
JacobianSymbols[] :=
- Map[Symbol, Join[Flatten[Table[FlattenBlock[{"dJ",i,j,k}],{i,1,3},{j,1,3},{k,j,3}],2],
- Flatten[Table[FlattenBlock[{"J",i,j}],{i,1,3},{j,1,3}],1]]];
+ Map[Symbol, Join[
+ Flatten[Table[FlattenBlock[{"J",i,j}],{i,1,3},{j,1,3}],1],
+ {FlattenBlock[{"detJ"}]},
+ Flatten[Table[FlattenBlock[{"iJ",i,j}],{i,1,3},{j,1,3}],1],
+ Flatten[Table[FlattenBlock[{"dJ",i,j,k}],{i,1,3},{j,1,3},{k,j,3}],2]]];
(* Parameters to inherit from GenericFD *)
JacobianGenericFDParameters[] :=
- {{Name -> "jacobian_group", Type -> "CCTK_STRING"},
- {Name -> "jacobian_derivative_group", Type -> "CCTK_STRING"},
- {Name -> "jacobian_identity_map", Type -> "CCTK_INT"}};
+ {{Name -> "jacobian_group", Type -> "CCTK_STRING"},
+ {Name -> "jacobian_determinant_group", Type -> "CCTK_STRING"},
+ {Name -> "jacobian_inverse_group", Type -> "CCTK_STRING"},
+ {Name -> "jacobian_derivative_group", Type -> "CCTK_STRING"},
+ {Name -> "jacobian_identity_map", Type -> "CCTK_INT"}};
(* The symbols which are used for the Jacobian variables in the
generated source code. These do not have to coincide with the
actual variable names, as the variable pointers are read using
CCTK_VarDataPtr. *)
JacobianGroups[] :=
- {{"unknown::unknown", {Global`J11, Global`J12, Global`J13, Global`J21, Global`J22, Global`J23, Global`J31, Global`J32, Global`J33}},
- {"unknown::unknown", {Global`dJ111, Global`dJ112, Global`dJ113, Global`dJ122, Global`dJ123, Global`dJ133,
- Global`dJ211, Global`dJ212, Global`dJ213, Global`dJ222, Global`dJ223, Global`dJ233,
- Global`dJ311, Global`dJ312, Global`dJ313, Global`dJ322, Global`dJ323, Global`dJ333}}};
+ {{"unknown::unknown", {Global`J11, Global`J12, Global`J13, Global`J21, Global`J22, Global`J23, Global`J31, Global`J32, Global`J33}},
+ {"unknown::unknown", {Global`detJ}},
+ {"unknown::unknown", {Global`iJ11, Global`iJ12, Global`iJ13, Global`iJ21, Global`iJ22, Global`iJ23, Global`iJ31, Global`iJ32, Global`iJ33}},
+ {"unknown::unknown", {Global`dJ111, Global`dJ112, Global`dJ113, Global`dJ122, Global`dJ123, Global`dJ133,
+ Global`dJ211, Global`dJ212, Global`dJ213, Global`dJ222, Global`dJ223, Global`dJ233,
+ Global`dJ311, Global`dJ312, Global`dJ313, Global`dJ322, Global`dJ323, Global`dJ333}}};
JacobianCheckGroups[groups_] :=
Module[{int},
@@ -164,7 +185,10 @@ JacobianCheckGroups[groups_] :=
(* These gridfunctions are only given local variable copies if the use_jacobian variable is true *)
JacobianConditionalGridFunctions[] :=
- {("dJ" ~~ DigitCharacter ~~ DigitCharacter ~~ DigitCharacter) | ("J" ~~ DigitCharacter ~~ DigitCharacter),
+ {("J" ~~ DigitCharacter ~~ DigitCharacter) |
+ ("detJ") |
+ ("iJ" ~~ DigitCharacter ~~ DigitCharacter) |
+ ("dJ" ~~ DigitCharacter ~~ DigitCharacter ~~ DigitCharacter),
"use_jacobian",
None};
diff --git a/Tools/CodeGen/Kranc.m b/Tools/CodeGen/Kranc.m
index 296b2c0..2e35b76 100644
--- a/Tools/CodeGen/Kranc.m
+++ b/Tools/CodeGen/Kranc.m
@@ -30,6 +30,7 @@ BeginPackage["Kranc`"];
kacos, kacosh, kasin, kasinh, katan, katanh, kcopysign, kcos, kcosh, kfabs,
kfmax, kfmin, kisgn, ksqrt, kexp, klog, kpow, ksgn, ksin, ksinh, ktan, ktanh,
dir1, dir2, dir3, dt, dx, dy, dz,
+ usejacobian,
khalf, kthird, ktwothird, kfourthird, keightthird};
(* Helpers.m *)
diff --git a/Tools/CodeGen/TensorTools.m b/Tools/CodeGen/TensorTools.m
index 50d108c..6488625 100644
--- a/Tools/CodeGen/TensorTools.m
+++ b/Tools/CodeGen/TensorTools.m
@@ -92,10 +92,10 @@ connection with TensorTools. The covariant derivative operator will be cd,
the partial derivative operator will be pd, and the Christoffel symbol will
be ch.";
-DefineJacobian::usage = "DefineJacobian[pd, fd, J, dJ] registers a
+DefineJacobian::usage = "DefineJacobian[pd, fd, J, iJ, dJ] registers a
Jacobian with TensorTools. The partial derivative operator will be pd,
-the local partial derivative operator will be fd, and the Jacobian and its
-derivative will be J and dJ.";
+the local partial derivative operator will be fd, and the Jacobian, its
+inverse, and its derivative will be J, iJ, and dJ, respectively.";
ResetJacobians::usage = "ResetJacobians unregisters all Jacobians.";
@@ -988,9 +988,9 @@ LieToPD[x_] :=
jacobians = {};
-DefineJacobian[pd_, fd_, J_, dJ_] :=
+DefineJacobian[pd_, fd_, J_, iJ_, dJ_] :=
Module[{},
- jacobians = Join[jacobians, {{pd, fd, J, dJ}}]];
+ jacobians = Join[jacobians, {{pd, fd, J, iJ, dJ}}]];
ResetJacobians := Module[{}, jacobians = {}];