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)




Reply via email to