From 09cece59b66be1dbfb6b3f28bb9ad10abcd36ad3 Mon Sep 17 00:00:00 2001 From: "David M. Koppelman" Date: Wed, 9 Mar 2016 16:23:56 -0600 Subject: [PATCH] Chemora: Correctly compute STENCIL and EXTERIOR attributes for EDL code. Patch by Steve Brandt. --- Tools/CodeGen/Calculation.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Tools/CodeGen/Calculation.m b/Tools/CodeGen/Calculation.m index beb6f5fe..d633c220 100644 --- a/Tools/CodeGen/Calculation.m +++ b/Tools/CodeGen/Calculation.m @@ -134,13 +134,21 @@ Error["Internal error: Invalid stencil size"]]; MatchQ[stencilSize, {0,0,0}]]]; +CombineStencils[{i1_,j1_,k1_},I3D[i2_,j2_,k2_]] := + {Max[i1,Abs[i2]],Max[j1,Abs[j2]],Max[k1,Abs[k2]]}; +CombineStencils[arg1_,{}] := arg1; +CombineStencils[arg1_,{arg2_,arg3___}] := + CombineStencils[CombineStencils[arg1,arg2],{arg3}]; + DefFn[ CalculationStencilSize[calc_List] := Module[ - {pddefs, eqs, stencilSize}, + {pddefs, eqs, stencilSize, explicit, name, i, j, k}, pddefs = lookup[calc, PartialDerivatives, {}]; eqs = lookup[calc, Equations]; + explicit = {}; + calc /. I3D[name_,i_?NumberQ,j_?NumberQ,k_?NumberQ] :> (AppendTo[explicit,I3D[i,j,k]];I3D[name,i,j,k]); stencilSize = StencilSize[pddefs, eqs, "not needed", {} (*ZeroDimensions*), lookupDefault[calc, IntParameters, {}]]; @@ -150,6 +158,7 @@ If[!VectorQ[stencilSize], stencilSize = MapThread[Max,Map[Last,stencilSize[[2]]]]]; (* TODO: decide what to do about stencil sizes that depend on runtime parameters *) + stencilSize = CombineStencils[stencilSize,explicit]; stencilSize]]; DefFn[