#include #include #include #include "DKSImageReconstruction.h" struct voxelPosition { float x; float y; float z; }; void initImage(float *image, int size) { for (int i = 0; i < size; i++) image[i] = (float)rand() / RAND_MAX; } void initPosition(voxelPosition *voxel, int N) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { int idx = i * N * N + j * N + k; if (k == 0) voxel[idx].x = 0.0; else voxel[idx].x = voxel[idx - 1].x + 0.1; if (j == 0) voxel[idx].y = 0.0; else voxel[idx].y = voxel[idx - N].y + 0.1; if (i == 0) voxel[idx].z = 0.0; else voxel[idx].z = voxel[idx - N * N].z + 0.1; } } } } void printPosition(voxelPosition *voxel, int size) { for (int i = 0; i < size; i++) std::cout << voxel[i].x << "\t"; std::cout << std::endl; for (int i = 0; i < size; i++) std::cout << voxel[i].y << "\t"; std::cout << std::endl; for (int i = 0; i < size; i++) std::cout << voxel[i].z << "\t"; std::cout << std::endl; } #define DIAMETER 2.0 bool select_source(voxelPosition *image_tmp, voxelPosition source_temp, int id) { float distance_x = pow(image_tmp[id].x-source_temp.x,2); float distance_y = pow(image_tmp[id].y-source_temp.y,2); float distance_z = pow(image_tmp[id].z-source_temp.z,2); float distance = sqrt(distance_x + distance_y + distance_z); if ( distance < DIAMETER*0.5 ) { return true; } else return false; } void calculate_source(float *image_space , voxelPosition *image_geometry, voxelPosition source, int total_voxels, float *average, float *std) { int number_selected_maximum = 10000; float *select; select = new float[number_selected_maximum]; for (int j=0;j(total, ierr); image_position = base.allocateMemory(total, ierr); source_position = base.allocateMemory(total, ierr); davg = base.allocateMemory(total, ierr); dstd = base.allocateMemory(total, ierr); base.writeData(image_space, image, total); base.writeData(image_position, geometry, total); base.writeData(source_position, geometry, total); gettimeofday(&timeStart, NULL); base.callCalculateSource(image_space, image_position, source_position, davg, dstd, DIAMETER, total, total); base.readData(davg, avg, total); base.readData(dstd, stdev, total); gettimeofday(&timeEnd, NULL); ttotal = ( (timeEnd.tv_sec - timeStart.tv_sec) * 1000000 + (timeEnd.tv_usec - timeStart.tv_usec)) * 1e-6; base.freeMemory(image_space, total); base.freeMemory(image_position, total); base.freeMemory(source_position, total); base.freeMemory(dstd, total); base.freeMemory(davg, total); avgavg = 0; avgstdev = 0; for (int i = 0; i < total; i++) { avgavg += avg[i] / total; avgstdev += stdev[i] / total; } std::cout << "Average: " << avgavg << ", stddev: " << avgstdev << ", time : " << ttotal<< std::endl; return N; }