dynVCLVec(const int size_in, T scalar, const int ctx_id){ viennacl::context ctx; // explicitly pull context for thread safe forking ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); // A.switch_memory_context(ctx); // A = viennacl::scalar_vector<T>(size_in, scalar, ctx); // A = static_cast<viennacl::vector_base<T> >(A); viennacl::vector_base<T> A = viennacl::vector_base<T>(size_in, ctx); viennacl::linalg::vector_assign(A, scalar); size = size_in; // ptr = &A; begin = 1; last = size_in; viennacl::range temp_r(begin-1, last); r = temp_r; // shptr.reset(&A, [](decltype(&A) p) { // std::cout << "Call delete from lambda...\n"; // // delete p; // }); shared = false; shared_type = 0; shptr = std::make_shared<viennacl::vector_base<T> >(A); };
dynVCLVec(viennacl::matrix_range<viennacl::matrix<T> > &mat, const int ctx_id) { viennacl::context ctx; // explicitly pull context for thread safe forking ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); viennacl::vector_base<T> A = viennacl::vector_base<T>(mat.size1() * mat.size2(), ctx); viennacl::matrix_base<T> dummy(A.handle(), mat.size1(), 0, 1, mat.size1(), //row layout mat.size2(), 0, 1, mat.size2(), //column layout true); // row-major dummy = mat; // shared = true; size = A.size(); begin = 1; last = size; // ptr = &A; viennacl::range temp_r(0, size); r = temp_r; shared = false; shared_type = 0; shptr = std::make_shared<viennacl::vector_base<T> >(A); }
void dynVCLVec<T>::setRange(int start, int end){ viennacl::range temp_r(start-1, end); r = temp_r; begin = start; last = end; }
dynVCLVec<T>::dynVCLVec(SEXP A_, int device_flag) { Eigen::Matrix<T, Eigen::Dynamic, 1> Am; Am = Rcpp::as<Eigen::Matrix<T, Eigen::Dynamic, 1> >(A_); // define device type to use if(device_flag == 0){ //use only GPUs long id = 0; viennacl::ocl::set_context_device_type(id, viennacl::ocl::gpu_tag()); viennacl::ocl::switch_context(id); }else{ // use only CPUs long id = 1; viennacl::ocl::set_context_device_type(id, viennacl::ocl::cpu_tag()); viennacl::ocl::switch_context(id); } int K = Am.size(); A = viennacl::vector<T>(K); viennacl::copy(Am, A); size = K; begin = 1; last = size; ptr = &A; viennacl::range temp_r(0, K); r = temp_r; }
// dynVCLVec(viennacl::vector_range<viennacl::vector_base<T> > vec, int ctx_id){ // viennacl::context ctx; // // // explicitly pull context for thread safe forking // ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); // // A.switch_memory_context(ctx); // A = vec; // // size = A.size(); // begin = 1; // last = size; // ptr = &A; // viennacl::range temp_r(0, size); // r = temp_r; // } dynVCLVec(SEXP A_, int ctx_id) { #ifdef UNDEF Eigen::Matrix<T, Eigen::Dynamic, 1> Am; Am = Rcpp::as<Eigen::Matrix<T, Eigen::Dynamic, 1> >(A_); int K = Am.size(); viennacl::context ctx; // explicitly pull context for thread safe forking ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); // std::cout << "about to initialize" << std::endl; viennacl::vector_base<T> A = viennacl::vector_base<T>(K, ctx); // std::cout << "initialized vector" << std::endl; viennacl::fast_copy(Am.data(), Am.data() + Am.size(), A.begin()); // viennacl::fast_copy(Am.begin(), Am.end(), A.begin()); // std::cout << "copied" << std::endl; size = A.size(); begin = 1; last = size; // ptr = &A; viennacl::range temp_r(0, size); r = temp_r; shared = false; shared_type = 0; shptr = std::make_shared<viennacl::vector_base<T> >(A); #endif }
// dynVCLVec(viennacl::vector_base<T> *vec) : ptr(vec){ // // A = vec; // // size = vec->size(); // begin = 1; // last = size; // viennacl::range temp_r(0, size); // r = temp_r; // shptr = std::make_shared<viennacl::vector_base<T> >(A); // } dynVCLVec(viennacl::matrix<T> *mat) : ptr_matrix(mat) { shared = true; shared_type = 0; size = mat->internal_size(); begin = 1; last = size; viennacl::range temp_r(0, size); r = temp_r; }
dynVCLVec<T>::dynVCLVec(Rcpp::XPtr<dynVCLVec<T> > dynVec) { size = dynVec->length(); begin = dynVec->start(); last = dynVec->end(); ptr = dynVec->getPtr(); viennacl::range temp_r(begin-1, last); r = temp_r; }
Rcpp::List RadiusSearch(Rcpp::NumericMatrix query_, Rcpp::NumericMatrix ref_, double radius, int max_neighbour, std::string build, int cores, int checks) { const std::size_t n_dim = query_.ncol(); const std::size_t n_query = query_.nrow(); const std::size_t n_ref = ref_.nrow(); // Column major to row major arma::mat query(n_dim, n_query); { arma::mat temp_q(query_.begin(), n_query, n_dim, false); query = arma::trans(temp_q); } flann::Matrix<double> q_flann(query.memptr(), n_query, n_dim); arma::mat ref(n_dim, n_ref); { arma::mat temp_r(ref_.begin(), n_ref, n_dim, false); ref = arma::trans(temp_r); } flann::Matrix<double> ref_flann(ref.memptr(), n_ref, n_dim); // Setting the flann index params flann::IndexParams params; if (build == "kdtree") { params = flann::KDTreeSingleIndexParams(1); } else if (build == "kmeans") { params = flann::KMeansIndexParams(2, 10, flann::FLANN_CENTERS_RANDOM, 0.2); } else if (build == "linear") { params = flann::LinearIndexParams(); } // Perform the radius search flann::Index<flann::L2<double> > index(ref_flann, params); index.buildIndex(); std::vector< std::vector<int> > indices_flann(n_query, std::vector<int>(max_neighbour)); std::vector< std::vector<double> > dists_flann(n_query, std::vector<double>(max_neighbour)); flann::SearchParams search_params; search_params.cores = cores; search_params.checks = checks; search_params.max_neighbors = max_neighbour; index.radiusSearch(q_flann, indices_flann, dists_flann, radius, search_params); return Rcpp::List::create(Rcpp::Named("indices") = indices_flann, Rcpp::Named("distances") = dists_flann); }
// margin - true = rows, false = cols dynVCLVec(viennacl::matrix<T> *mat, const bool margin, int start) : ptr_matrix(mat) { shared = true; if(margin){ shared_type = 1; size = mat->size2(); }else{ shared_type = 2; size = mat->size1(); // viennacl::vector_base<T> A = viennacl::vector_base<T>(ptr_matrix->handle(), ptr_matrix->size1(), begin, ptr_matrix->internal_size2()); // ptr = &A; } begin = start; last = size; viennacl::range temp_r(0, size); r = temp_r; }
dynVCLVec(viennacl::vector_base<T> vec, int ctx_id) { // viennacl::context ctx; // // // // explicitly pull context for thread safe forking // ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); // // A.switch_memory_context(ctx); viennacl::vector_base<T> A = vec; size = A.size(); begin = 1; last = size; // ptr = &A; viennacl::range temp_r(0, size); r = temp_r; shared = false; shared_type = 0; shptr = std::make_shared<viennacl::vector_base<T> >(A); }
vector3 ViscositySmoothKernel::getLaplacian(vector3 *r_i, vector3 *r_j, float h_size) { //r_i表示产生作用的粒子位置 //r_j表示当前粒子位置 vector3 temp_r(r_i->x - r_j->x, r_i->y - r_j->y, r_i->z - r_j->z); float r_len = temp_r.length(); float result; if(r_len >= 0 && r_len <= h_size) { //result = (45*(h-r)/(PAI*h^6)) result = (float)(45*(h_size - r_len)/(PAI*pow(h_size, 6))); } else { result = 0; } temp_r = (temp_r.normalize())*result; return temp_r; }
vector3 Poly6SmoothKernel::getValue(vector3 *r_i, vector3 *r_j, float h_size) { //r_i表示产生作用的粒子位置 //r_j表示当前粒子位置 vector3 temp_r(r_i->x - r_j->x, r_i->y - r_j->y, r_i->z - r_j->z); float r_len = temp_r.length(); float result; if(r_len >= 0 && r_len <= h_size) { //result = (315/(64*PAI*h^9))*(h^2 - r^2)^3) result = (float)((4.921875*pow((pow(h_size, 2) - pow(r_len, 2)),3))/(PAI*pow(h_size, 9))); } else { result = 0; } temp_r = (temp_r.normalize())*result; return temp_r; }
dynVCLVec<T>::dynVCLVec(int size_in, int device_flag) { // define device type to use if(device_flag == 0){ //use only GPUs long id = 0; viennacl::ocl::set_context_device_type(id, viennacl::ocl::gpu_tag()); viennacl::ocl::switch_context(id); }else{ // use only CPUs long id = 1; viennacl::ocl::set_context_device_type(id, viennacl::ocl::cpu_tag()); viennacl::ocl::switch_context(id); } A = viennacl::zero_vector<T>(size_in); begin = 1; last = size_in; ptr = &A; viennacl::range temp_r(begin-1, last); r = temp_r; }
vector3 ViscositySmoothKernel::getGrads(vector3 *r_i, vector3 *r_j, float h_size) { //r_i表示产生作用的粒子位置 //r_j表示当前粒子位置 vector3 temp_r(r_i->x - r_j->x, r_i->y - r_j->y, r_i->z - r_j->z); float r_len = temp_r.length(); float result; if(r_len >= 0 && r_len <= h_size) { //result = (15*(-3*r^2/(2*h^3) + 2*r/h^2 - h/(2*r^2))/(2*PAI*h^3)) result = (float)(7.5*(-3*r_len*r_len/(2*pow(h_size, 3)) + 2*r_len/(h_size*h_size) - h_size/(2*r_len*r_len))/(PAI*pow(h_size, 3))); } else { result = 0; } temp_r = (temp_r.normalize())*result; return temp_r; }
vector3 Poly6SmoothKernel::getLaplacian(vector3 *r_i, vector3 *r_j, float h_size) { //r_i表示产生作用的粒子位置 //r_j表示当前粒子位置 vector3 temp_r(r_i->x - r_j->x, r_i->y - r_j->y, r_i->z - r_j->z); float r_len = temp_r.length(); float result; if(r_len >= 0 && r_len <= h_size) { //result = (315/(64*PAI*h^9))*(-6)*(h^2 - r^2)*(h^2 + 3*r^2)) result = (float)((-29.53125*(h_size*h_size - r_len*r_len)* (h_size*h_size + 3*r_len*r_len))/(PAI*pow(h_size, 9))); } else { result = 0; } temp_r = (temp_r.normalize())*result; return temp_r; }
// dynVCLVec(Eigen::Matrix<T, Eigen::Dynamic,1> &A_); // dynVCLVec(Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1> > &A_, int size_); dynVCLVec(const int size_in, const int ctx_id) { viennacl::context ctx; // explicitly pull context for thread safe forking ctx = viennacl::context(viennacl::ocl::get_context(static_cast<long>(ctx_id))); viennacl::vector_base<T> A = viennacl::vector_base<T>(size_in, ctx); // A = viennacl::zero_vector<T>(size_in, ctx); // A = static_cast<viennacl::vector_base<T> >(A); viennacl::linalg::vector_assign(A, (T)(0)); begin = 1; last = size_in; // ptr = &A; viennacl::range temp_r(begin-1, last); r = temp_r; shared = false; shared_type = 0; shptr = std::make_shared<viennacl::vector_base<T> >(A); }
mat Wavefunction::Jastrow_Gradient_Ratio(const mat &r, const int &number_particles, const double &beta) { mat Jastrow_Gradient_Radio = zeros(number_particles, dimension); rowvec r_12_vec(3); rowvec temp_r(3); double r_12, arg, Spin_variable; double bb; for (uint i = 0; i < number_particles; i++) { for (uint j = 0; j < i; j++) { temp_r(0)=0; temp_r(1) =0; temp_r(2)=0; r_12_vec = r.row(i) - r.row(j); r_12 = 0; for (uint k = 0; k < dimension; k++) { r_12 += r_12_vec(k) * r_12_vec(k); } r_12 = sqrt(r_12); //Finner spin variablen /* if (((i < number_particles/2) && (j < number_particles/2)) || ((i > number_particles/2) && (j > number_particles/2))) { Spin_variable = 1.0/4; } else { Spin_variable = 1.0/2; } */ Spin_variable = seta(i,j,number_particles); bb = 1+beta*r_12; //bb = number_atoms * bb; //number_atoms brukes av TEKNISKE grunner arg = Spin_variable / (bb*bb); Jastrow_Gradient_Radio.row(i) += arg * r_12_vec / r_12; } for (uint j = i+1; j < number_particles; j++) { r_12_vec = r.row(i) - r.row(j); r_12 = 0; for (uint k = 0; k < dimension; k++) { r_12 += r_12_vec(k) * r_12_vec(k); } r_12 = sqrt(r_12); //Finner spin variablen /* if (((i < number_particles/2) && (j < number_particles/2)) || ((i > number_particles/2) && (j > number_particles/2))) { Spin_variable = 1.0/4; } else { Spin_variable = 1.0/2; } */ Spin_variable = seta(i,j,number_particles); bb = 1+beta*r_12; //bb = number_atoms * bb; //number_atoms brukes av TEKNISKE grunner arg = Spin_variable / (bb*bb); Jastrow_Gradient_Radio.row(i) += r_12_vec*arg/r_12; } } return Jastrow_Gradient_Radio; }