aboutsummaryrefslogtreecommitdiff
path: root/Tools/CodeGen/Jacobian.m
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2011-05-24 19:37:47 +0200
committerIan Hinder <ian.hinder@aei.mpg.de>2011-05-25 11:23:20 +0200
commitb56e3c5fcf0ff63f1b59890fe843482feba4964c (patch)
tree489f80def373554eebf6db5eb5252540785770af /Tools/CodeGen/Jacobian.m
parentbfba9bad6d1628e9880ced2aee809584e45e2b5b (diff)
Make multiplication by Jacobian selectable at run-time
Use of the Jacobian is determined by the user setting the jacobian_group parameter. Also provide a parameter jacobian_identity_map which the user can set to a Carpet map which does not require the Jacobian, in which case the Jacobian will not be applied.
Diffstat (limited to 'Tools/CodeGen/Jacobian.m')
-rw-r--r--Tools/CodeGen/Jacobian.m13
1 files changed, 8 insertions, 5 deletions
diff --git a/Tools/CodeGen/Jacobian.m b/Tools/CodeGen/Jacobian.m
index 59a57f9..8ebd243 100644
--- a/Tools/CodeGen/Jacobian.m
+++ b/Tools/CodeGen/Jacobian.m
@@ -38,7 +38,7 @@ JacobianQ[opts:OptionsPattern[]] :=
jacobianShorthand[d:(deriv_[var_, i_])] :=
Module[{},
derivToJacDeriv[d] ->
- Sum[Symbol["J"<>ToString[j]<>ToString[i]] deriv[var, j], {j, 1 3}]
+ IfThen["use_jacobian", Sum[Symbol["J"<>ToString[j]<>ToString[i]] deriv[var, j], {j, 1 3}], deriv[var, i]]
];
(* Assign a shorthand containing the Jacobian multiplied by the passed
@@ -47,8 +47,9 @@ jacobianShorthand[d:(deriv_[var_, i_,j_])] :=
Module[{ip,jp},
{ip,jp} = Sort[{i,j}]; (* dJ is symmetric in the last two indices *)
derivToJacDeriv[d] ->
- Sum[Symbol["dJ"<>ToString[a]<>ToString[ip]<>ToString[jp]] deriv[var, a], {a, 1 3}] +
- Sum[Symbol["J"<>ToString[a]<>ToString[i]] Symbol["J"<>ToString[b]<>ToString[j]] deriv[var, a, b], {a, 1 3}, {b, 1, 3}]
+ IfThen["use_jacobian", Sum[Symbol["dJ"<>ToString[a]<>ToString[ip]<>ToString[jp]] deriv[var, a], {a, 1 3}] +
+ Sum[Symbol["J"<>ToString[a]<>ToString[i]] Symbol["J"<>ToString[b]<>ToString[j]] deriv[var, a, b], {a, 1 3}, {b, 1, 3}],
+ deriv[var, i, j]]
];
(* Convert a 1st derivative to a Jacobian-multiplied derivative *)
@@ -81,7 +82,8 @@ InsertJacobian[calc_List, opts:OptionsPattern[]] :=
derivatives groups *)
CreateJacobianVariables[] :=
CommentedBlock["Jacobian variable pointers",
- {"if (strlen(jacobian_group) == 0 || strlen(jacobian_derivative_group) == 0)\n",
+ {"bool 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",
"{\n",
" CCTK_WARN (1, \"GenericFD::jacobian_group and GenericFD::jacobian_derivative_group must both be set to valid group names\");\n",
"}\n\n",
@@ -106,7 +108,8 @@ JacobianSymbols[] :=
(* Parameters to inherit from GenericFD *)
JacobianGenericFDParameters[] :=
{{Name -> "jacobian_group", Type -> "CCTK_STRING"},
- {Name -> "jacobian_derivative_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