From 45f85b0345bbcf934f3d6c107b2f098b5c0fd788 Mon Sep 17 00:00:00 2001 From: Pietro Incardona <i-bird@localhost.localdomain> Date: Fri, 13 May 2016 00:55:08 +0200 Subject: [PATCH] Add missing file --- src/Vector/Vector_util.hpp | 125 +++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/Vector/Vector_util.hpp diff --git a/src/Vector/Vector_util.hpp b/src/Vector/Vector_util.hpp new file mode 100644 index 00000000..87715957 --- /dev/null +++ b/src/Vector/Vector_util.hpp @@ -0,0 +1,125 @@ +/* + * Vector_util.hpp + * + * Created on: Dec 7, 2015 + * Author: i-bird + */ + +#ifndef OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UTIL_HPP_ +#define OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UTIL_HPP_ + +#include "Grid/grid_dist_key.hpp" +#include "Space/Shape/HyperCube.hpp" +#include "util/mul_array_extents.hpp" + +/*! \brief Copy scalar elements + * + * \tparam copy_type Type that should be copied + * \tparam T property id to copy + * \tparam Ev Type of source the Vector + * \tparam sa dimensionality of the array 0 is a scalar + * + */ +template<typename copy_type, typename T, typename Ev, typename Eqs_sys, int sa> +struct copy_ele_sca_array +{ + template<typename Grid> inline static void copy(Grid & grid_dst, const grid_dist_key_dx<Eqs_sys::dims> & key, const Ev & x,size_t lin_id, size_t base_id, size_t gs_size) + { + grid_dst.template get<T::value>(key) = x(lin_id * Eqs_sys::nvar + base_id); + } +}; + +/*! \brief Copy 1D array elements + * + * spacialization in case of 1D array + * + * \tparam copy_type Type that should be copied + * \tparam T property id to copy + * \tparam Ev Type of source the Vector + * + */ +template<typename copy_type, typename T, typename Ev, typename Eqs_sys> +struct copy_ele_sca_array<copy_type,T,Ev,Eqs_sys,1> +{ + template<typename Grid> inline static void copy(Grid & grid_dst, const grid_dist_key_dx<Eqs_sys::dims> & key, const Ev & x,size_t lin_id, size_t base_id, size_t gs_size) + { + for (size_t i = 0 ; i < std::extent<copy_type>::value ; i++) + { + grid_dst.template get<T::value>(key)[i] = x(lin_id * Eqs_sys::nvar + base_id + i); + } + } +}; + + +/*! \brief this class is a functor for "for_each" algorithm + * + * This class is a functor for "for_each" algorithm. For each + * element of the boost::vector the operator() is called. + * Is mainly used to copy from the Vector to the grid target + * \note properties can be scalars or arrays of C++ primitives + * + * \tparam Eqs_sys System of equation information + * \tparam S type of destination grid + * \tparam Ev type of vector + * + */ +template<typename Eqs_sys, typename S, typename Ev> +struct copy_ele +{ + //! destination grid element + const grid_dist_key_dx<Eqs_sys::dims> key; + + //! destination grid + S & grid_dst; + + //! source element inside the vector + size_t lin_id; + + //! counter + size_t prp_id; + + //! It is basically the number of grid points the vector has inside + size_t gs_size; + + //! source vector + const Ev & x; + + /*! \brief constructor + * + * It define the copy parameters. + * + * \param key destination position + * \param grid_dst grid destination + * \param v Source vector + * + */ + inline copy_ele(const grid_dist_key_dx<Eqs_sys::dims> & key, S & grid_dst, const Ev & x, size_t lin_id, size_t gs_size) + :key(key),grid_dst(grid_dst),lin_id(lin_id),prp_id(0),gs_size(gs_size),x(x){}; + + +#ifdef SE_CLASS1 + /*! \brief Constructor + * + * Calling this constructor produce an error. This class store the reference of the object, + * this mean that the object passed must not be a temporal object + * + */ + inline copy_ele(grid_dist_key_dx<Eqs_sys::dims> & key, S & grid_dst, Ev && x) + :key(key),grid_dst(grid_dst),x(x) + {std::cerr << "Error: " <<__FILE__ << ":" << __LINE__ << " Passing a temporal object";}; +#endif + + //! It call the copy function for each property + template<typename T> + inline void operator()(T& t) + { + // This is the type of the object we have to copy + typedef typename boost::mpl::at_c<typename S::value_type::type,T::value>::type copy_type; + + copy_ele_sca_array<copy_type,T,Ev,Eqs_sys,std::is_array<copy_type>::value>::copy(grid_dst,key,x,lin_id,prp_id,gs_size); + prp_id += array_extents<copy_type>::mul(); + } +}; + + +#endif /* OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_UTIL_HPP_ */ -- GitLab