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