#ifndef RTS_REALFIELD_H #define RTS_REALFIELD_H #include "../visualization/colormap.h" #include "../envi/envi.h" #include "../math/rect.h" #include "../cuda/devices.h" #include "cublas_v2.h" #include namespace stim{ //multiply R = X * Y template __global__ void gpu_realfield_multiply(T* R, T* X, T* Y, unsigned int r0, unsigned int r1){ int iu = blockIdx.x * blockDim.x + threadIdx.x; int iv = blockIdx.y * blockDim.y + threadIdx.y; //make sure that the thread indices are in-bounds if(iu >= r0 || iv >= r1) return; //compute the index into the field int i = iv*r0 + iu; //calculate and store the result R[i] = X[i] * Y[i]; } template class realfield{ P* X[N]; //an array of N gpu pointers for each field component int R[2]; //resolution of the slice rect

shape; void process_filename(std::string name, std::string &prefix, std::string &postfix, std::string &ext, unsigned int &digits) { std::stringstream ss(name); std::string item; std::vector elems; while(std::getline(ss, item, '.')) //split the string at the '.' character (filename and extension) { elems.push_back(item); } prefix = elems[0]; //prefix contains the filename (with wildcard '?' characters) ext = elems[1]; //file extension (ex. .bmp, .png) ext = std::string(".") + ext; //add a period back into the extension size_t i0 = prefix.find_first_of("?"); //find the positions of the first and last wildcard ('?'') size_t i1 = prefix.find_last_of("?"); postfix = prefix.substr(i1+1); prefix = prefix.substr(0, i0); digits = i1 - i0 + 1; //compute the number of wildcards } void init() { for(unsigned int n=0; n(vec

(-1, -1, 0), vec

(-1, 1, 0), vec

(1, 1, 0)); //default geometry clear(); //zero the field //std::cout<<"realfield CONSTRUCTOR"<(X[n], filename, R[0], R[1], vmin, vmax, cmap); } void toImages(std::string filename, bool global_max = true, stim::colormapType cmap = stim::cmBrewer) { std::string prefix, postfix, extension; unsigned int digits; process_filename(filename, prefix, postfix, extension, digits); //process the filename for wild cards cublasStatus_t stat; cublasHandle_t handle; //create a CUBLAS handle stat = cublasCreate(&handle); if(stat != CUBLAS_STATUS_SUCCESS) { std::cout<<"CUBLAS Error: initialization failed"< maxAll) //if maxVal is larger, update the maxAll variable maxAll = maxVal[n]; } cublasDestroy(handle); //destroy the CUBLAS handle P outputMax = abs(maxAll); //maximum value used for each output image for(int n=0; n operator* (const realfield & rhs){ int maxThreads = stim::maxThreadsPerBlock(); //compute the optimal block size int SQRT_BLOCK = (int)std::sqrt((float)maxThreads); //create one thread for each detector pixel dim3 dimBlock(SQRT_BLOCK, SQRT_BLOCK); dim3 dimGrid((R[0] + SQRT_BLOCK -1)/SQRT_BLOCK, (R[1] + SQRT_BLOCK - 1)/SQRT_BLOCK); //create a scalar field to store the result realfield result(R[0], R[1]); for(int n=0; n>> (result.X[n], X[n], rhs.X[n], R[0], R[1]); return result; } ///copy constructor realfield(const realfield &rhs) { //first make a shallow copy R[0] = rhs.R[0]; R[1] = rhs.R[1]; for(unsigned int n=0; n