aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Tools/CodeGen/Differencing.m26
1 files changed, 26 insertions, 0 deletions
diff --git a/Tools/CodeGen/Differencing.m b/Tools/CodeGen/Differencing.m
index 60e4b80..499fe81 100644
--- a/Tools/CodeGen/Differencing.m
+++ b/Tools/CodeGen/Differencing.m
@@ -141,6 +141,8 @@ shift::usage = "";
spacing::usage = "";
ComponentDerivativeOperatorStencilWidth::usage = "";
CheckStencil::usage = "";
+StencilSize::usage = "";
+
GridFunctionDerivativeToDef;
Begin["`Private`"];
@@ -265,6 +267,30 @@ DefFn[
name, zeroDims]},
{value, lookup[p, AllowedValues]}]]]]];
+(* It would be good to refactor StencilSize and CheckStencil as much
+ of the logic is repeated *)
+DefFn[
+ StencilSize[derivOps_, eqs_, name_, zeroDims_] :=
+ Module[{gfds, rgzList, rgz},
+ gfds = Map[GridFunctionDerivativesInExpression[{#}, eqs, zeroDims] &, derivOps];
+ rgzList = MapThread[If[Length[#2] > 0, DerivativeOperatorStencilWidth[#1,zeroDims], {0,0,0}] &, {derivOps, gfds}];
+ If[Length[rgzList] === 0, Return[{0,0,0}]];
+ rgz = Map[Max, Transpose[rgzList]]]];
+
+DefFn[
+ StencilSize[derivOps_, eqs_, name_, zeroDims_, intParams_] :=
+ Module[{psUsed, p},
+ psUsed = parametersUsedInOps[derivOps, intParams];
+ If[Length[psUsed] > 1, Throw["Too many parameters in partial derivatives"]];
+ If[psUsed === {},
+ StencilSize[derivOps,eqs,name,zeroDims],
+ p = psUsed[[1]];
+ {getParamName[p],
+ Table[{value,
+ StencilSize[derivOps/.getParamName[p]->value, eqs,
+ name, zeroDims]},
+ {value, lookup[p, AllowedValues]}]}]]];
+
(*************************************************************)
(* Misc *)
(*************************************************************)