Exemplo n.º 1
0
 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);
 };
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
void 
dynVCLVec<T>::setRange(int start, int end){
    viennacl::range temp_r(start-1, end);
    r = temp_r;
    begin = start;
    last = end;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
        // 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            
        }
Exemplo n.º 6
0
 // 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;
 }
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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);
}
Exemplo n.º 9
0
 // 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;
 }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
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;
}
Exemplo n.º 12
0
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;
}
Exemplo n.º 13
0
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;
}
Exemplo n.º 14
0
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;
}
Exemplo n.º 15
0
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;
}
Exemplo n.º 16
0
 // 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;
}