gridZ = arange(0, nz, dtype='float64')
grid  = gridX, gridY, gridZ

###### Flow preparations ####################################################

# constant start velocity uLB in x direction for the lower half
delimiter = fromfunction(lambda x, y, z: (z*2 + sin(x/10)*3 + sin(y/10)*3 < nzl),  (nx, ny, nz))
vel = fromfunction(lambda d, x, y, z: (1-d)*(2-d)*uLB*2,  (3, nx, ny, nz))
vel[0, delimiter] = 0;

fin = equilibrium(1.0, vel)

os.chdir(outputFolder)

savingOptions = (saveEveryN, skipFirstN, grid, prefix)
###### Main time loop ##########################################################
for time in range(maxIterations):

    (rho, u) = getMacroValues(fin)
    #minRho = amin(rho)
    #print minRho

    #fpost = BGKCollide(fin, rho, u, omega)
    fpost = cumulantCollide(fin, rho, u, omega)

    fin = stream(fpost)

    visualize(rho, u, time, *savingOptions)

os.chdir(workingFolder)
    (rho, u) = getMacroValues(fin)

    predensity = sum(rho)
    preVelX = sum(u[0,:,:])
    preVelY = sum(u[1,:,:])

    print amin(rho)
    feq = equilibrium(rho, u)

    # Collision step.
    #fpost = BGKCollide(fin, feq, omega)
    fpost = cumulantCollide(fin, rho, u, omega)
    #fpost = cumulantCollideAll(fin, rho, u, omega, omega, omega, omega)
    #fpost = centralMomentSRT(fin, feq, u, omega)

    (rho, u) = getMacroValues(fpost)

    deltaRho = sum(rho) - predensity
    deltaVelX = sum(u[0,:,:]) - preVelX
    deltaVelY = sum(u[0,:,:]) - preVelY
    maxRho = amax(rho)
    minRho = amin(rho)
    #print minRho

    # Streaming step
    fin = stream(fpost)

    visualize(u, rho, time, *plottingData)

os.chdir(workingFolder)