int main(int argc, char *argv[]) {
	string dataSheetFileName(argv[1]);
	fstream dataSheet (dataSheetFileName);
	int iBlockSize, jBlockSize, kBlockSize, blockSize; // physical
	dataSheet >> iBlockSize >> jBlockSize >> kBlockSize;
	Capsule *cube = new Capsule(iBlockSize, jBlockSize, kBlockSize);


	for (int i = 0; i < iBlockSize; i++) {
		for (int j = 0; j < jBlockSize; j++) {
			for (int k = 0; k < kBlockSize; k++) {
				int zID = cube->mortonIndex(i, j, k);
				dataSheet >> cube->b_block[zID];
			}
		}
	}
	/*
	for (int i = 0; i < iBlockSize; i++) {
		for (int j = 0; j < jBlockSize; j++) {
			for (int k = 0; k < kBlockSize; k++) {
				int zID =
						i * cube->iPadBlockSize * cube->jPadBlockSize
						+ j * cube->kPadBlockSize + k;
//				cout << i << "\t" << j << "\t" << k << "\t" << zID << endl;
				dataSheet >> cube->b_block[zID];
			}
		}
	}
	 */
	int subCubeSize = atoi(argv[2]);
	int t0 = clock();
	cube->GS_block_interior_update_009(1, subCubeSize);
//	cube->GS_Regular_block_update_02(subCubeSize);
//	cube->GS_Z_block_update_02(subCubeSize);
	int t1 = clock();
//	cout << endl;
//	cout << cube->padBlockSize << endl;
//	cout << oct << cube->iMask<< endl;
//	cout << cube->jMask<< endl;
//	cout << cube->kMask<< endl;
//
//	cout << cube->i_interleave.size() << endl;
//	cout << cube->j_interleave.size() << endl;
//	cout << cube->k_interleave.size() << endl;

	double t = 1.0 * (t1-t0) / CLOCKS_PER_SEC;
	cout << "Time Elapsed, " <<subCubeSize << "," << t << endl;

	delete cube;
	dataSheet.close();
	return 0;
}