 	// RHS
 	b = (Real *) calloc (size, sizeof(Real));
 	
-	// temperature
-	temp = (Real *) calloc (size_temp, sizeof(Real));
-	temp_old = (Real *) calloc (size_temp, sizeof(Real));
+	// temperature arrays
+	temp_red = (Real *) calloc (size_temp, sizeof(Real));
+	temp_black = (Real *) calloc (size_temp, sizeof(Real));
 	
 	// set coefficients
 	fill_coeffs (NUM, NUM, th_cond, dx, dy, width, TN, aP, aW, aE, aS, aN, b);
 	
 	for (uint i = 0; i < size_temp; ++i) {
-		temp[i] = 0.0;
-		temp_old[i] = 0.0;
+		temp_red[i] = 0.0;
+		temp_black[i] = 0.0;
 	}
 	
 	// set device

	
	// number of cells in x and y directions
	// including unused boundary cells
	uint num_rows = NUM + 2;
	uint num_cols = NUM + 2;
	uint size_temp = num_rows * num_cols;
	uint size = NUM * NUM;

	CUDA_SAFE_CALL (cudaMemcpy (aS_d, aS, size * sizeof(Real), cudaMemcpyHostToDevice));
	CUDA_SAFE_CALL (cudaMemcpy (aN_d, aN, size * sizeof(Real), cudaMemcpyHostToDevice));
	CUDA_SAFE_CALL (cudaMemcpy (b_d, b, size * sizeof(Real), cudaMemcpyHostToDevice));
	CUDA_SAFE_CALL (cudaMemcpy (temp_red_d, temp_red, size_temp * sizeof(Real), cudaMemcpyHostToDevice));
	CUDA_SAFE_CALL (cudaMemcpy (temp_black_d, temp_black, size_temp * sizeof(Real), cudaMemcpyHostToDevice));
	
	// block and grid dimensions
	
