8 #ifndef SRC_VTKWRITER_GRIDS_ST_HPP_
9 #define SRC_VTKWRITER_GRIDS_ST_HPP_
12 #include <boost/mpl/pair.hpp>
13 #include "VTKWriter_grids_util.hpp"
14 #include "util/util_debug.hpp"
15 #include "util/convert.hpp"
22 template <
typename Gr
id>
26 openfpm::vector<const Grid *> grids;
79 template <
typename Gr
id,
typename St>
84 typedef Grid value_type;
88 ele_g_st(
const Point<Grid::dims,St> &
offset,
const Point<Grid::dims,St> & spacing,
const Box<Grid::dims,St> & dom)
89 :
offset(offset),spacing(spacing),dom(dom)
94 openfpm::vector<cell_grid<Grid>>
g;
98 Point<Grid::dims,St> spacing;
100 Box<Grid::dims,size_t> dom;
121 dataset = ele.dataset;
124 spacing = ele.spacing;
137 dataset = ele.dataset;
140 spacing = ele.spacing;
156 template <
typename pair>
160 openfpm::vector< ele_g_st<typename pair::first,typename pair::second> >
vg;
172 for (
size_t i = 0 ; i < vg.size() ; i++)
174 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
176 if (vg.get(i).g.get(j).grids.size() != 0)
177 tot += vg.get(i).g.get(j).grids.get(0)->size();
197 v_out +=
"VERTICES " + std::to_string(get_total()) +
" " + std::to_string(get_total() * 2) +
"\n";
217 v_out +=
"POINTS " + std::to_string(get_total()) +
" float" +
"\n";
229 std::stringstream v_out;
232 for (
size_t i = 0 ; i < vg.size() ; i++)
235 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
238 if (vg.get(i).g.get(j).grids.size() == 0)
242 auto it = vg.get(i).g.get(j).grids.get(0)->getIterator();
245 Box<pair::first::dims,typename pair::second> dom;
248 Point<pair::first::dims,typename pair::second> middle = vg.get(i).spacing / 2;
249 Point<pair::first::dims,typename pair::second> one;
251 one = one + toPoint<pair::first::dims,typename pair::second>::convert(vg.get(i).g.get(j).cmb);
252 Point<pair::first::dims,typename pair::second> offset = middle * one + vg.get(i).offset;
257 Point<pair::first::dims,typename pair::second> p;
258 p = it.get().toPoint();
259 p = p * vg.get(i).spacing + offset;
261 if (pair::first::dims == 2)
262 v_out << p.toString() <<
" 0.0" <<
"\n";
264 v_out << p.toString() <<
"\n";
283 std::stringstream v_out;
286 for (
size_t i = 0 ; i < vg.size() ; i++)
289 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
291 if (k < vg.get(i).g.get(j).grids.size())
294 v_out << vg.get(i).g.get(j).cmb.to_string();
311 std::stringstream v_out;
316 typedef typename boost::mpl::at<typename pair::first::value_type::type,boost::mpl::int_<0>>::type ctype;
318 std::string type = getType<ctype>();
321 if (type.size() == 0)
323 std::cerr <<
"Error " << __FILE__ <<
":" << __LINE__ <<
" the type " << demangle(
typeid(ctype).name()) <<
" is not supported by vtk\n";
327 std::string prp_cp = get_prop_components(k);
330 v_out <<
"SCALARS " << prop_name <<
"_" << prp_cp <<
" " << type +
"\n";
333 v_out <<
"LOOKUP_TABLE default\n";
336 for (
size_t i = 0 ; i < vg.size() ; i++)
339 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
342 if (vg.get(i).g.get(j).grids.size() == 0)
345 if (k < vg.get(i).g.get(j).grids.size())
348 auto & g_src = *vg.get(i).g.get(j).grids.get(k);
351 auto it = g_src.getIterator();
354 Box<pair::first::dims,typename pair::second> dom;
361 v_out << std::to_string(g_src.template get<0>(key)) <<
"\n";
370 auto & g_src = *vg.get(i).g.get(j).grids.get(0);
373 auto it = g_src.getIterator();
376 Box<pair::first::dims,typename pair::second> dom;
402 std::stringstream v_out;
405 v_out <<
"SCALARS domain float\n";
408 v_out <<
"LOOKUP_TABLE default\n";
411 for (
size_t i = 0 ; i < vg.size() ; i++)
414 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
417 if (vg.get(i).g.get(j).grids.size() == 0)
421 auto it = vg.get(i).g.get(j).grids.get(0)->getIterator();
426 if (vg.get(i).dom.isInside(it.get().toPoint()) ==
true)
450 for (
size_t i = 0 ; i < vg.size() ; i++)
453 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
456 if (vg.get(i).g.get(j).grids.size() > max)
457 max = vg.get(i).g.get(j).grids.size();
475 for (
size_t i = 0 ; i < vg.size() ; i++)
478 for (
size_t j = 0 ; j < vg.get(i).g.size() ; j++)
481 if (vg.get(i).g.get(j).grids.size() == 0)
484 auto it = vg.get(i).g.get(j).grids.get(0)->getIterator();
488 v_out +=
"1 " + std::to_string(k) +
"\n";
509 v_out +=
"POINT_DATA " + std::to_string(get_total()) +
"\n";
523 void append_grid(
size_t id,
const typename pair::first & g,
const comb<pair::first::dims> & cmb)
525 for(
size_t i = 0 ; i < vg.get(
id).g.size() ; i++)
528 if (cmb == vg.get(
id).g.get(i).cmb)
530 vg.get(
id).g.get(i).grids.add(&g);
537 vg.get(
id).g.add(cg);
538 vg.get(
id).g.last().grids.add(&g);
560 void add(
size_t i,
const typename pair::first & g,
const Point<pair::first::dims,typename pair::second> & offset,
const Point<pair::first::dims,typename pair::second> & spacing,
const Box<pair::first::dims,typename pair::second> & dom,
const comb<pair::first::dims> & cmb)
566 vg.get(i).offset = offset;
567 vg.get(i).spacing = spacing;
571 append_grid(i,g,cmb);
584 template<
int prp = -1>
bool write(std::string file, std::string g_name =
"grids" , file_type ft = file_type::ASCII)
587 std::string vtk_header;
589 std::string point_list;
591 std::string vertex_list;
593 std::string vtk_binary_or_ascii;
595 std::string point_prop_header;
597 std::string vertex_prop_header;
599 std::string point_data_header;
601 std::string point_data;
604 vtk_header =
"# vtk DataFile Version 3.0\n"
608 if (ft == file_type::ASCII)
609 {vtk_header +=
"ASCII\n";}
611 {vtk_header +=
"BINARY\n";}
614 vtk_header +=
"DATASET POLYDATA\n";
617 point_prop_header = get_point_properties_list();
620 point_list = get_point_list();
623 vertex_prop_header = get_vertex_properties_list();
626 vertex_list = get_vertex_list();
629 point_data_header = get_point_data_header();
632 size_t mf = getMaxFused();
635 for (
size_t i = 0 ; i < mf ; i++)
636 point_data += get_properties_output(i,g_name);
642 std::ofstream ofs(file);
645 if (ofs.is_open() ==
false)
646 {std::cerr <<
"Error cannot create the VTK file: " + file +
"\n";}
648 ofs << vtk_header << point_prop_header << point_list <<
649 vertex_prop_header << vertex_list << point_data_header << point_data;
openfpm::vector< cell_grid< Grid > > g
fused grids
ele_g_st< Grid, St > & operator=(ele_g_st &&ele)
Copy the object.
std::string get_point_list()
Create the VTK point definition.
std::string get_point_data_header()
Get the point data header.
std::string get_point_properties_list()
It get the vertex properties list.
size_t get_total()
Get the total number of points.
void add(size_t i, const typename pair::first &g, const Point< pair::first::dims, typename pair::second > &offset, const Point< pair::first::dims, typename pair::second > &spacing, const Box< pair::first::dims, typename pair::second > &dom, const comb< pair::first::dims > &cmb)
Add grid dataset.
ele_g_st< Grid, St > & operator=(const ele_g_st &ele)
Copy the object.
std::string get_prop_components(size_t k)
size_t getMaxFused()
Get the maximum number of fused grid.
cell_grid< Grid > & operator=(cell_grid< Grid > &&cg)
Copy the cell grid.
for each combination in the cell grid you can have different grids
std::string get_vertex_list()
Create the VTK vertex definition.
Point< Grid::dims, St > offset
offset where it start
cell_grid(const comb< Grid::dims > &cmb)
construct a cell grid
std::string lastProp()
Return the output of the domain property.
void append_grid(size_t id, const typename pair::first &g, const comb< pair::first::dims > &cmb)
Append the grid to the sub-domain, if for a sub-domain we have a grid that is overlapping fuse them...
openfpm::vector< ele_g_st< typename pair::first, typename pair::second > > vg
Vector of grids.
ele_g_st(ele_g_st &&ele)
Copy constructor.
std::string get_properties_output(size_t k, std::string prop_name)
Create the VTK properties output.
ele_g_st(const ele_g_st &ele)
Copy constructor.
std::string get_vertex_properties_list()
It get the vertex properties list.
bool write(std::string file, std::string g_name="grids", file_type ft=file_type::ASCII)
It write a VTK file from a graph.
cell_grid< Grid > & operator=(const cell_grid< Grid > &cg)
Copy the cell grid.