I created a type that I think more or less works:
immutable CartesianSubRange{I<:CartesianIndex}
range::CartesianRange{I}
start::I
stop::I
done::I # one past stop
function CartesianSubRange(range::CartesianRange{I}, start::I, stop::I)
item, done = next(range, stop)
new(range, start, stop, done)
end
end
CartesianSubRange{I<:CartesianIndex}(range::CartesianRange{I}, start::I,
stop::I) =
CartesianSubRange{I}(range, start, stop)
CartesianSubRange{N}(dims::NTuple{N,Int}, start::NTuple{N,Int},
stop::NTuple{N,Int}) =
CartesianSubRange(CartesianRange(dims), CartesianIndex(start),
CartesianIndex(stop))
Base.start(iter::CartesianSubRange) = iter.start
Base.next{I}(iter::CartesianSubRange{I}, state::I) = next(iter.range, state)
Base.done{I}(iter::CartesianSubRange{I}, state::I) = (state == iter.done)
I can now do something like:
@everywhere function SubCycleSimulation(csr::CartesianSubRange)
println(csr.start.I, " - ", csr.stop.I)
for ci in csr
#...
end
return length(csr)
end
dims = (30,34,28,90,44)
cr = CartesianRange(CartesianIndex(dims))
cycle = length(cr)
numSubCycles = nworkers()*10
subCycleLength = div(cycle, numSubCycles)
subRanges = Array{CartesianSubRange}(numSubCycles)
for subCycle = 1:numSubCycles
cyclePosFrom = (subCycle - 1) * subCycleLength + 1
cyclePosTo = (subCycle == numSubCycles) ? cycle : subCycle *
subCycleLength
start = CartesianIndex(ind2sub(dims, cyclePosFrom))
stop = CartesianIndex(ind2sub(dims, cyclePosTo))
subRanges[subCycle] = CartesianSubRange(cr, start, stop)
end
results = pmap(SubCycleSimulation, subRanges)