changeset 96:0743e1247384 cell_based_test

Add Index type for keeping track of regions
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 05 Feb 2019 14:57:02 +0100
parents 9d53ecca34f7
children 8324c82c2dfb
files index.jl sbp.jl
diffstat 2 files changed, 40 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/index.jl	Tue Feb 05 14:57:02 2019 +0100
@@ -0,0 +1,39 @@
+abstract type Region end
+struct Interior <: Region end
+struct Lower    <: Region end
+struct Upper    <: Region end
+
+struct Index{R<:Region, T<:Integer}
+    i::T
+
+    Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
+    Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i)
+    Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i)
+    Index(t::Tuple{T, DataType}) where {R<:Region,T<:Integer} = Index{t[2],T}(t[1]) # TBD: This is not very specific in what types are allowed in t[2]. Can this be fixed?
+end
+
+# Index(R::Type{<:Region}) = Index{R}
+
+## Vill kunna skriva
+## IndexTupleType(Int, (Lower, Interior))
+Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T}
+IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...}
+
+Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i
+Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I))
+
+Base.Int(I::Index) = I.i
+
+function Index(i::Integer, boundary_width::Integer, dim_size::Integer)
+    if 0 < i <= boundary_width
+        return Index{Lower}(i)
+    elseif boundary_width < i <= dim_size-boundary_width
+        return Index{Interior}(i)
+    elseif dim_size-boundary_width < i <= dim_size
+        return Index{Upper}(i)
+    else
+        error("Bounds error") # TODO: Make this more standard
+    end
+end
+
+IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
--- a/sbp.jl	Mon Feb 04 17:51:36 2019 +0100
+++ b/sbp.jl	Tue Feb 05 14:57:02 2019 +0100
@@ -1,4 +1,5 @@
 module sbp
+include("index.jl")
 include("grid.jl")
 include("stencil.jl")
 include("sbpD2.jl")