Commit cb37b2bc authored by Pietro Incardona's avatar Pietro Incardona

Reordering io files

parent 62978d3e
......@@ -11,7 +11,6 @@
#define GS_SIZE 8
#include "GraphMLWriter.hpp"
#include "VTKWriter.hpp"
#include "Graph/CartesianGraphFactory.hpp"
#include "util.hpp"
......
......@@ -7,7 +7,7 @@ io_CXXFLAGS = $(CUDA_CFLAGS) $(INCLUDES_PATH) $(BOOST_CPPFLAGS) -I/usr/local/inc
io_CFLAGS = $(CUDA_CFLAGS)
io_LDADD = $(LINKLIBS)
nobase_include_HEADERS = csv_multiarray.hpp CSVWriter.hpp GraphMLWriter.hpp util.hpp VTKWriter.hpp VTKWriter_graph.hpp VTKWriter_grids.hpp VTKWriter_grids_st.hpp VTKWriter_grids_util.hpp VTKWriter_vector_box.hpp
nobase_include_HEADERS = CSVWriter/csv_multiarray.hpp CSVWriter/CSVWriter.hpp GraphMLWriter/GraphMLWriter.hpp util.hpp VTKWriter/VTKWriter.hpp VTKWriter/VTKWriter_graph.hpp VTKWriter/VTKWriter_grids.hpp VTKWriter/VTKWriter_grids_st.hpp VTKWriter/VTKWriter_grids_util.hpp VTKWriter/VTKWriter_vector_box.hpp
.cu.o :
......
/*
* VTKWriter_point_set.hpp
*
* Created on: Feb 6, 2016
* Author: i-bird
*/
#ifndef OPENFPM_IO_SRC_VTKWRITER_POINT_SET_HPP_
#define OPENFPM_IO_SRC_VTKWRITER_POINT_SET_HPP_
#include <boost/mpl/pair.hpp>
#include "VTKWriter_grids_util.hpp"
/*! \brief Store the couple of vector position and properties
*
* \tparam Vps Type of vector that store the position of the particles
*
*/
template <typename Vps>
class ele_vps
{
public:
typedef Vps value_type;
const Vps & g;
size_t mark;
ele_vps(const Vps & g, size_t mark)
:g(g),mark(mark)
{}
};
/*! \brief Store the couple of vector position and properties
*
* \tparam Vpp Type of vector that store the property of the particles
*
*/
template <typename Vpp>
class ele_vpp
{
public:
typedef Vpp value_type;
const Vpp & g;
size_t mark;
ele_vpp(const Vpp & vpp, size_t mark)
:g(vpp),mark(mark)
{}
};
/*! \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 produce an output for each property
*
* \tparam ele_v It is the class ele_v that store the couple vector of position and property
*
*
*/
template<typename ele_v, typename St>
struct prop_out_v
{
// property output string
std::string & v_out;
// vector that we are processing
const openfpm::vector_std< ele_v > & vv;
/*! \brief constructor
*
* \param v_out string to fill with the vertex properties
*
*/
prop_out_v(std::string & v_out, const openfpm::vector_std< ele_v > & vv)
:v_out(v_out),vv(vv)
{};
//! It produce an output for each property
template<typename T>
void operator()(T& t) const
{
typedef typename boost::mpl::at<typename ele_v::value_type::value_type::type,boost::mpl::int_<T::value>>::type ptype;
meta_prop<boost::mpl::int_<T::value> ,ele_v,St, ptype > m(vv,v_out);
}
void lastProp()
{
// Create point data properties
v_out += "SCALARS domain float\n";
// Default lookup table
v_out += "LOOKUP_TABLE default\n";
// Produce point data
for (size_t k = 0 ; k < vv.size() ; k++)
{
//! Get a vertex iterator
auto it = vv.get(k).g.getIterator();
// if there is the next element
while (it.isNext())
{
if (it.get() < vv.get(k).mark)
v_out += "1.0\n";
else
v_out += "0.0\n";
// increment the iterator and counter
++it;
}
}
}
};
/*!
*
* It write a VTK format file for a list of grids defined on a space
*
* \tparam boost::mpl::pair<G,S>
*
* where G is the type of the vector containing the properties, S is the
* type of vector containing the particle positions
*
*/
template <typename pair>
class VTKWriter<pair,VECTOR_POINTS>
{
//! Vector of couple, position and properties
openfpm::vector< ele_vps<typename pair::first >> vps;
openfpm::vector< ele_vpp<typename pair::second>> vpp;
/*! \brief Get the total number of points
*
* \return the total number
*
*/
size_t get_total()
{
size_t tot = 0;
//! Calculate the full number of vertices
for (size_t i = 0 ; i < vps.size() ; i++)
{
tot += vps.get(i).g.size();
}
return tot;
}
/*! \brief It get the vertex properties list
*
* It get the vertex properties list of the vertex defined as VTK header
*
* \return a string that define the vertex properties in graphML format
*
*/
std::string get_vertex_properties_list()
{
//! vertex property output string
std::string v_out;
// write the number of vertex
v_out += "VERTICES " + std::to_string(get_total()) + " " + std::to_string(get_total() * 2) + "\n";
// return the vertex properties string
return v_out;
}
/*! \brief It get the vertex properties list
*
* It get the vertex properties list of the vertex defined as a VTK header
*
* \return a string that define the vertex properties in graphML format
*
*/
std::string get_point_properties_list()
{
//! vertex property output string
std::string v_out;
// write the number of vertex
v_out += "POINTS " + std::to_string(get_total()) + " float" + "\n";
// return the vertex properties string
return v_out;
}
/*! \brief Create the VTK point definition
*
*/
std::string get_point_list()
{
//! vertex node output string
std::stringstream v_out;
//! For each defined grid
for (size_t i = 0 ; i < vps.size() ; i++)
{
//! write the particle position
auto it = vps.get(i).g.getIterator();
// if there is the next element
while (it.isNext())
{
Point<pair::first::value_type::dims,typename pair::first::value_type::coord_type> p;
p = vps.get(i).g.get(it.get());
if (pair::first::value_type::dims == 2)
v_out << p.toString() << " 0.0" << "\n";
else
v_out << p.toString() << "\n";
// increment the iterator and counter
++it;
}
}
// return the vertex list
return v_out.str();
}
/*! \brief Create the VTK vertex definition
*
*/
std::string get_vertex_list()
{
//! vertex node output string
std::string v_out;
size_t k = 0;
for (size_t i = 0 ; i < vps.size() ; i++)
{
//! For each grid point create a vertex
auto it = vps.get(i).g.getIterator();
while (it.isNext())
{
v_out += "1 " + std::to_string(k) + "\n";
++k;
++it;
}
}
// return the vertex list
return v_out;
}
/*! \brief Get the point data header
*
* \return a string with the point data header for VTK format
*
*/
std::string get_point_data_header()
{
std::string v_out;
v_out += "POINT_DATA " + std::to_string(get_total()) + "\n";
return v_out;
}
public:
/*!
*
* VTKWriter constructor
*
*/
VTKWriter()
{}
/*! \brief Add a vector dataset
*
* \param vps vector of positions
* \param vpp vector of properties
* \param mark, additional information that divide the dataset into 2
* (in general is used to mark real from ghost information)
*
*/
void add(const typename pair::first & vps, const typename pair::second & vpp,size_t mark)
{
ele_vps<typename pair::first> t1(vps,mark);
ele_vpp<typename pair::second> t2(vpp,mark);
this->vps.add(t1);
this->vpp.add(t2);
}
/*! \brief It write a VTK file from a vector of points
*
* \tparam prp_out which properties to output [default = -1 (all)]
*
* \param file path where to write
* \param name name of the dataset
* \param file_type specify if it is a VTK BINARY or ASCII file [default = ASCII]
*
*/
template<int prp = -1> bool write(std::string file, std::string f_name = "grids" , file_type ft = file_type::ASCII)
{
// Header for the vtk
std::string vtk_header;
// Point list of the VTK
std::string point_list;
// Vertex list of the VTK
std::string vertex_list;
// Graph header
std::string vtk_binary_or_ascii;
// vertex properties header
std::string point_prop_header;
// edge properties header
std::string vertex_prop_header;
// Data point header
std::string point_data_header;
// Data point
std::string point_data;
// VTK header
vtk_header = "# vtk DataFile Version 3.0\n"
+ f_name + "\n";
// Choose if binary or ASCII
if (ft == file_type::ASCII)
{vtk_header += "ASCII\n";}
else
{vtk_header += "BINARY\n";}
// Data type for graph is DATASET POLYDATA
vtk_header += "DATASET POLYDATA\n";
// point properties header
point_prop_header = get_point_properties_list();
// Get point list
point_list = get_point_list();
// vertex properties header
vertex_prop_header = get_vertex_properties_list();
// Get vertex list
vertex_list = get_vertex_list();
// Get the point data header
point_data_header = get_point_data_header();
// For each property in the vertex type produce a point data
prop_out_v< ele_vpp<typename pair::second>, typename pair::first::value_type::coord_type> pp(point_data, vpp);
if (prp == -1)
boost::mpl::for_each< boost::mpl::range_c<int,0, pair::second::value_type::max_prop> >(pp);
else
boost::mpl::for_each< boost::mpl::range_c<int,prp, prp> >(pp);
// Add the last property
pp.lastProp();
// write the file
std::ofstream ofs(file);
// Check if the file is open
if (ofs.is_open() == false)
{std::cerr << "Error cannot create the VTK file: " + file + "\n";}
ofs << vtk_header << point_prop_header << point_list <<
vertex_prop_header << vertex_list << point_data_header << point_data;
// Close the file
ofs.close();
// Completed succefully
return true;
}
};
#endif /* OPENFPM_IO_SRC_VTKWRITER_POINT_SET_HPP_ */
......@@ -10,6 +10,7 @@
#include "data_type/aggregate.hpp"
#include <random>
#include "VTKWriter.hpp"
BOOST_AUTO_TEST_SUITE( vtk_writer_test )
......
......@@ -6,7 +6,7 @@
#define BOOST_TEST_MODULE "C++ test module for OpenFPM_io project"
#include <boost/test/included/unit_test.hpp>
#include "CSVWriter_unit_tests.hpp"
#include "GraphMLWriter_unit_tests.hpp"
#include "VTKWriter_unit_tests.hpp"
#include "CSVWriter/CSVWriter_unit_tests.hpp"
#include "GraphMLWriter/GraphMLWriter_unit_tests.hpp"
#include "VTKWriter/VTKWriter_unit_tests.hpp"
#include "Plot/Plot_unit_tests.hpp"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment