diff index.jl @ 103:a274d6384e91 cell_based_test

Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 07 Feb 2019 17:15:26 +0100
parents 50273f745f05
children ebddd2a3a520
line wrap: on
line diff
--- a/index.jl	Wed Feb 06 09:09:55 2019 +0100
+++ b/index.jl	Thu Feb 07 17:15:26 2019 +0100
@@ -38,3 +38,25 @@
 end
 
 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
+
+function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim
+    return regionindices(gridsize, ntuple(x->closuresize,Dim), region)
+end
+
+function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim
+    regions = map(getunitrange,gridsize,closuresize,region)
+    return CartesianIndices(regions)
+end
+
+function getunitrange(gridsize::Integer, closuresize::Integer, region::R) where R
+    if region == Lower
+        r = 1:closuresize
+    elseif region == Interior
+        r = (closuresize+1):(gridsize - closuresize)
+    elseif region == Upper
+        r = (gridsize - closuresize + 1):gridsize
+    else
+        error("Unspecified region")
+    end
+    return r
+end