comparison index.jl @ 165:9fc9167e9a4c boundary_conditions

Factor out function for geting the region of an index
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 21 May 2019 11:40:21 +0200
parents ce56727e4232
children
comparison
equal deleted inserted replaced
164:6b633624703a 165:9fc9167e9a4c
24 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I)) 24 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I))
25 25
26 Base.Int(I::Index) = I.i 26 Base.Int(I::Index) = I.i
27 27
28 function Index(i::Integer, boundary_width::Integer, dim_size::Integer) 28 function Index(i::Integer, boundary_width::Integer, dim_size::Integer)
29 if 0 < i <= boundary_width 29 return Index{getregion(i,boundary_width,dim_size)}(i)
30 return Index{Lower}(i)
31 elseif boundary_width < i <= dim_size-boundary_width
32 return Index{Interior}(i)
33 elseif dim_size-boundary_width < i <= dim_size
34 return Index{Upper}(i)
35 else
36 error("Bounds error") # TODO: Make this more standard
37 end
38 end 30 end
39 31
40 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t) 32 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
41 33
42 # TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types. 34 # TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types.
50 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim 42 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim
51 regions = map(getrange,gridsize,closuresize,region) 43 regions = map(getrange,gridsize,closuresize,region)
52 return CartesianIndices(regions) 44 return CartesianIndices(regions)
53 end 45 end
54 46
47 function getregion(i::Integer, boundary_width::Integer, dim_size::Integer)
48 if 0 < i <= boundary_width
49 return Lower
50 elseif boundary_width < i <= dim_size-boundary_width
51 return Interior
52 elseif dim_size-boundary_width < i <= dim_size
53 return Upper
54 else
55 error("Bounds error") # TODO: Make this more standard
56 end
57 end
58
55 function getrange(gridsize::Integer, closuresize::Integer, region::DataType) 59 function getrange(gridsize::Integer, closuresize::Integer, region::DataType)
56 if region == Lower 60 if region == Lower
57 r = 1:closuresize 61 r = 1:closuresize
58 elseif region == Interior 62 elseif region == Interior
59 r = (closuresize+1):(gridsize - closuresize) 63 r = (closuresize+1):(gridsize - closuresize)