Ah, now I get what you're trying to do. Glad you figured it out!
Best,
--Tim
On Sunday, February 14, 2016 01:01:07 AM Greg Plowman wrote:
> 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)