diff stencil.jl @ 8:433008d3b7d3

Move stencil to its own file
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 17 Dec 2018 14:30:59 +0100
parents
children 64530c07165b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stencil.jl	Mon Dec 17 14:30:59 2018 +0100
@@ -0,0 +1,33 @@
+struct Stencil
+    range::NTuple{2,Int}
+    weights::Vector # TBD: Should this be a tuple?
+    function Stencil(range, weights)
+        width = range[2]-range[1]+1
+        if width != length(weights)
+            error("The width and the number of weights must be the same")
+        end
+        new(range, weights)
+    end
+end
+
+function flip(s::Stencil)
+    range = (-s.range[2], -s.range[1])
+    s = Stencil(range, s.weights[end:-1:1])
+end
+
+# Provides index into the Stencil based on offset for the root element
+function Base.getindex(s::Stencil, i::Int)
+    if s.range[1] <= i <= s.range[2]
+        return s.weights[1 + i - s.range[1]]
+    else
+        return 0
+    end
+end
+
+function apply(s::Stencil, v::AbstractVector, i::Int)
+    w = zero(v[0])
+    for j ∈ i+(s.range[1]:s.range[2])
+        w += v[j]
+    end
+    return w
+end