 		int sw = (k & 1);
 		int shft_rd = 32*((shft_wr+1) & 1);
 
-		if (tid <= (32-k-1) && tid >= k)
+		if (tid <= (31-k) && tid >= k)
 		{
 			temper[tid + (32*sw)] = fo * (temper[tid+shft-1] + temper[tid+shft+1]) + (1-2.*fo) * temper[tid+shft];
 		}


	//Initialize temper. Kind of an unrolled for loop.  This is actually at
	//Timestep 0.
	temper[13] = sL[0];
	temper[14] = sL[1];
	temper[15] = sR[0];
	temper[16] = sR[1];
	// k needs to first insert the right and left into the temper and then put the timestep in between them.
	for (unsigned int k = 15; k>0; k--)
	{
		// This tells you if the current row is the first or second.
		int shft_wr = (k & 1);
		// Read and write are opposite rows.
		int shft_rd = 32*((shft_wr+1) & 1);
		if (BlockIdx.x > 0)
		{
			if (tid <= (32-k-1) && tid <= k)
			{
				temper[tid + (32*shft_wr)] = fo * (temper[tid+shft_rd-1] + temper[tid+shft_rd+1]) + (1-2.*fo) * temper[tid+shft_rd];
			}
		}
		//Split part
		else
		{

		}
		
		__syncthreads();

		//Now there is only to handle the insertion and read out.
	}


}

__global__ void downTriangle(REAL *IC, REAL *right, REAL *left)
{

	//Now temper needs to accommodate a longer row by 2, one on each side.
	//since it has two rows that's 4 extra floats.  The last row will still be
	//32 numbers long.
	__shared__ REAL temper[68];
	__shared__ REAL sR[32];
	__shared__ REAL sL[32];
	// Maybe __shared__ REAL end_c[32;]

	unsigned int gid = blockDim.x * blockIdx.x + threadIdx.x; //Global Thread ID
	unsigned int tid = threadIdx.x;
