 	}
 	
 	// transfer final temperature values back
-	CUDA_SAFE_CALL (cudaMemcpy (temp, temp_d, size_temp * sizeof(Real), cudaMemcpyDeviceToHost));
+	CUDA_SAFE_CALL (cudaMemcpy (temp_red, temp_red_d, size_temp * sizeof(Real), cudaMemcpyDeviceToHost));
+	CUDA_SAFE_CALL (cudaMemcpy (temp_black, temp_red_d, size_temp * sizeof(Real), cudaMemcpyDeviceToHost));
 	
 	// free device memory
 	CUDA_SAFE_CALL (cudaFree(aP_d));

	uint it_max = 1e6;
	
	// allocate memory
	Real *aP, *aW, *aE, *aS, *aN, *b, *temp, *temp_old;
	
	// arrays of coefficients
	aP = (Real *) calloc (size, sizeof(Real));

	///////////////////////////////////////
	// coalescing
	dim3 dimBlock (1, BLOCK_SIZE);
	dim3 dimGrid (NUM, NUM / (2 * BLOCK_SIZE));
	///////////////////////////////////////
	
	Real *bl_norm_L2, *bl_norm_L2_d;
