8 #ifndef SRC_VTKWRITER_GRIDS_UTIL_HPP_ 
    9 #define SRC_VTKWRITER_GRIDS_UTIL_HPP_ 
   11 #include "util/util_debug.hpp" 
   12 #include "is_vtk_writable.hpp" 
   13 #include "byteswap_portable.hpp" 
   19 template<
typename ele_g, 
bool has_attributes>
 
   33         return ele_g::value_type::value_type::attributes::name[i] + oprp;
 
   42 template<
typename ele_g>
 
   56         if (i >= prop_names.size())
 
   58             return std::string(
"attr" + std::to_string(i) + oprp);
 
   62             return prop_names.get(i) + oprp;
 
   73 template<
unsigned int i, 
typename ele_g, 
bool has_attributes> std::string get_point_property_header_impl(
const std::string & oprp, 
const openfpm::vector<std::string> & prop_names)
 
   78     typedef typename boost::mpl::at<typename ele_g::value_type::value_type::type,boost::mpl::int_<i>>::type ctype;
 
   82     if (std::rank<ctype>::value == 1)
 
   84         if (std::extent<ctype>::value <= 3)
 
   87             std::string type = getType<typename std::remove_all_extents<ctype>::type>();
 
   92                 std::cerr << 
"Error " << __FILE__ << 
":" << __LINE__ << 
" the type " << demangle(
typeid(ctype).name()) << 
" is not supported by vtk\n";
 
  102         std::string type = getType<typename std::remove_all_extents<ctype>::type>();
 
  105         if (type.size() == 0)
 
  111                 type = getType<typename vtk_type<ctype,is_custom_vtk_writable<ctype>::value>::type >();
 
  127         v_out += 
"LOOKUP_TABLE default\n";
 
  140 template<
unsigned int dim, 
typename T>
 
  145     template<
typename vector, 
typename iterator, 
typename I> 
static void write(std::string & v_out, vector & vg, 
size_t k, iterator & it, file_type ft)
 
  148         if (ft == file_type::ASCII)
 
  151             for (
size_t i1 = 0 ; i1 < vtk_dims<T>::value ; i1++)
 
  153                 v_out += std::to_string(vg.get(k).g.get_o(it.get()).
template get<I::value>().get_vtk(i1)) + 
" ";
 
  163             typedef decltype(vg.get(k).g.get_o(it.get()).
template get<I::value>().get_vtk(0)) ctype_;
 
  164             typedef typename std::remove_reference<ctype_>::type ctype;
 
  167             for (
size_t i1 = 0 ; i1 < vtk_dims<T>::value ; i1++)
 
  169                 typename is_vtk_writable<ctype>::base tmp = vg.get(k).g.get_o(it.get()).
template get<I::value>().get_vtk(i1);
 
  170                 tmp = swap_endian_lt(tmp);
 
  171                 v_out.append((
const char *)&tmp,
sizeof(tmp));
 
  175                 typename is_vtk_writable<ctype>::base zero = 0.0;
 
  176                 zero = swap_endian_lt(zero);
 
  177                 v_out.append((
const char *)&zero,
sizeof(zero));
 
  201     template<
typename vector, 
typename iterator, 
typename I> 
static void write(std::string & v_out, vector & vg, 
size_t k, iterator & it, file_type ft)
 
  203         typedef decltype(vg.get(k).g.get_o(it.get()).
template get<I::value>()) ctype_;
 
  204         typedef typename std::remove_reference<ctype_>::type ctype;
 
  206         if (ft == file_type::ASCII)
 
  209             v_out += std::to_string(vg.get(k).g.get_o(it.get()).
template get<I::value>()) + 
"\n";
 
  213             typename is_vtk_writable<ctype>::base tmp = vg.get(k).g.get_o(it.get()).
template get<I::value>();
 
  214             tmp = swap_endian_lt(tmp);
 
  215             v_out.append((
const char *)&tmp,
sizeof(tmp));
 
  230 template<
typename I, 
typename ele_g, 
typename St, 
typename T, 
bool is_writable>
 
  244         size_t sz = v_out.size();
 
  247         v_out += get_point_property_header_impl<I::value,ele_g,has_attributes<typename ele_g::value_type::value_type>::value>(
"",prop_names);
 
  250         if (v_out.size() != sz)
 
  254             for (
size_t k = 0 ; k < vg.
size() ; k++)
 
  257                 auto it = vg.get(k).g.getIterator();
 
  269             if (ft == file_type::BINARY)
 
  276 template<
typename I, 
typename ele_g, 
typename St, 
typename T, 
size_t N1, 
bool is_writable>
 
  290         size_t sz = v_out.size();
 
  293         v_out += get_point_property_header_impl<I::value,ele_g,has_attributes<typename ele_g::value_type::value_type>::value>(
"",prop_names);
 
  296         if (v_out.size() != sz)
 
  300             for (
size_t k = 0 ; k < vg.
size() ; k++)
 
  303                 auto it = vg.get(k).g.getIterator();
 
  308                     if (ft == file_type::ASCII)
 
  311                         for (
size_t i1 = 0 ; i1 < N1 ; i1++)
 
  313                             v_out += std::to_string(vg.get(k).g.get_o(it.get()).
template get<I::value>()[i1]) + 
" ";
 
  326                         for (
size_t i1 = 0 ; i1 < N1 ; i1++)
 
  328                             tmp = vg.get(k).g.get_o(it.get()).
template get<I::value>()[i1];
 
  329                             tmp = swap_endian_lt(tmp);
 
  330                             v_out.append((
const char *)&tmp,
sizeof(T));
 
  335                             tmp = swap_endian_lt(tmp);
 
  336                             v_out.append((
const char *)&tmp,
sizeof(T));
 
  344             if (ft == file_type::BINARY)
 
  351 template<
typename I, 
typename ele_g, 
typename St ,
typename T,
size_t N1,
size_t N2, 
bool is_writable>
 
  365         for (
size_t i1 = 0 ; i1 < N1 ; i1++)
 
  367             for (
size_t i2 = 0 ; i2 < N2 ; i2++)
 
  370                 size_t sz = v_out.size();
 
  373                 v_out += get_point_property_header_impl<I::value,ele_g,has_attributes<typename ele_g::value_type::value_type>::value>(
"_" + std::to_string(i1) + 
"_" + std::to_string(i2),prop_names);
 
  376                 if (v_out.size() != sz)
 
  380                     for (
size_t k = 0 ; k < vg.
size() ; k++)
 
  383                         auto it = vg.get(k).g.getIterator();
 
  390                             if (ft == file_type::ASCII)
 
  393                                 v_out += std::to_string(vg.get(k).g.get_o(it.get()).
template get<I::value>()[i1][i2]) + 
"\n";
 
  397                                 tmp = vg.get(k).g.get_o(it.get()).
template get<I::value>()[i1][i2];
 
  398                                 tmp = swap_endian_lt(tmp);
 
  399                                 v_out.append((
const char *)&tmp,
sizeof(tmp));
 
  407                     if (ft == file_type::BINARY)
 
  417 template<
typename I, 
typename ele_g, 
typename St, 
typename T>
 
  434 template<
unsigned int dims,
typename T> 
inline void output_point(
Point<dims,T> & p,std::stringstream & v_out, file_type ft)
 
  436     if (ft == file_type::ASCII)
 
  447         for ( ; i < dims ; i++)
 
  451             tmp = swap_endian_lt(tmp);
 
  452             v_out.write((
const char *)&tmp,
sizeof(tmp));
 
  460             tmp = swap_endian_lt(tmp);
 
  461             v_out.write((
const char *)&tmp,
sizeof(tmp));
 
  466 inline void output_vertex(
size_t k,std::string & v_out, file_type ft)
 
  468     if (ft == file_type::ASCII)
 
  469         v_out += 
"1 " + std::to_string(k) + 
"\n";
 
  474         tmp = swap_endian_lt(tmp);
 
  475         v_out.append((
const char *)&tmp,
sizeof(
int));
 
  477         tmp = swap_endian_lt(tmp);
 
  478         v_out.append((
const char *)&tmp,
sizeof(
int));
 
std::string toString() const 
Return the string with the point coordinate. 
 
This class implement the point shape in an N-dimensional space. 
 
static std::string get(size_t i, const openfpm::vector< std::string > &prop_names, const std::string &oprp)
Get attribute name. 
 
If it has not dims property defined the object is considered scalar. 
 
Write the vectror property. 
 
Return the Attributes name from the type. 
 
const T & get(size_t i) const 
Get coordinate. 
 
static void write(std::string &v_out, vector &vg, size_t k, iterator &it, file_type ft)
Write the property. 
 
check for T to be writable