diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..3affdd38e54123c27b697377e6d500ce0025aa1c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,61 @@
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+###### Other
+
+AUTHORS
+COPYING
+ChangeLog
+INSTALL
+NEWS
+README
+Makefile
+Makefile.in
+config.status
+configure
+numerics
+**/.deps
+**/src/config
+aclocal.m4
+**/autom4te.cache
+src/io
+csv_out.csv
+test_graph.graphml
+test_graph2.graphml
+*.html
+
diff --git a/build_io.sh b/build_io.sh
index d35a92d4f4e1c9f2c51c05621728890d4db47fd4..9a30aeb487f9dec4e54693b61ca3b5d8cec8460e 100755
--- a/build_io.sh
+++ b/build_io.sh
@@ -11,9 +11,7 @@ mkdir openfpm_io/src/config
git clone git@ppmcore.mpi-cbg.de:incardon/openfpm_devices.git openfpm_devices
git clone git@ppmcore.mpi-cbg.de:incardon/openfpm_data.git openfpm_data
git clone git@ppmcore.mpi-cbg.de:incardon/openfpm_pdata.git openfpm_pdata
-cd "$1/openfpm_data"
-git checkout develop
-cd ..
+git clone git@ppmcore.mpi-cbg.de:incardon/openfpm_vcluster.git openfpm_vcluster
cd "$1/openfpm_io"
diff --git a/configure.ac b/configure.ac
index 0406ea4a18b5c0a7bb5d07c1878f5b2d7a044ce4..ee2c8c7a91770a3dee458dbe7c5f7e629a34a652 100755
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,18 @@ m4_ifdef([AX_BOOST_IOSTREAMS],,[m4_include([m4/ax_boost_iostreams.m4])])
m4_ifdef([AX_BOOST_PROGRAM_OPTIONS],,[m4_include([m4/ax_boost_program_options.m4])])
m4_ifdef([AX_BOOST_UNIT_TEST_FRAMEWORK],,[m4_include([m4/ax_boost_unit_test_framework.m4])])
-CXXFLAGS+=" --std=c++11 -march=native -mtune=native -Wno-unused-local-typedefs -Wextra -Wno-unused-parameter "
+case $host_os in
+ *cygwin*)
+ # Do something specific for cygwin
+ CXXFLAGS+=" --std=gnu++11 "
+ ;;
+ *)
+ #Default Case
+ CXXFLAGS+=" --std=c++11 "
+ ;;
+esac
+
+CXXFLAGS+=" -march=native -mtune=native -Wno-unused-local-typedefs -Wextra -Wno-unused-parameter "
NVCCFLAGS=" "
INCLUDES_PATH=" "
@@ -73,6 +84,16 @@ AC_ARG_WITH([pdata],
[pdata_dir="$withval"],
[pdata_dir="../../openfpm_pdata/src"])
+####### HDF5
+
+AX_LIB_HDF5([parallel])
+
+if test x"$with_hdf5" = x"no"; then
+ echo "Cannot detect hdf5, use the --with-hdf5 option if it is not installed in the default location"
+ exit 207
+fi
+
+
####### include openfpm_devices include path
INCLUDES_PATH+="-I. -Iconfig -I../../openfpm_data/src -I../../openfpm_devices/src -I../../openfpm_vcluster/src -I$pdata_dir "
diff --git a/gc_out2_test.html b/gc_out2_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..771c7bfc6dccce3725accacdcc9d9c2978570703
--- /dev/null
+++ b/gc_out2_test.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_out3_test.html b/gc_out3_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..6ae633a424a988d754fa3e46a6053ebcd43fd33b
--- /dev/null
+++ b/gc_out3_test.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_out4_test.html b/gc_out4_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..53d712696c22c2824fcf65eed863f0f473e7cd35
--- /dev/null
+++ b/gc_out4_test.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_out5_test.html b/gc_out5_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..866e4b702683b0103713d1d32f3293745f671542
--- /dev/null
+++ b/gc_out5_test.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_out6_test.html b/gc_out6_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..8787f4649c178c6bd4a910f21b849336ff604ec7
--- /dev/null
+++ b/gc_out6_test.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_out7_test.html b/gc_out7_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..3ff25d9859b5d043e7ed39f55c517a7124a28b1c
--- /dev/null
+++ b/gc_out7_test.html
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+Before first graph
+Before second graph
+Before third graph
+At the end
+
diff --git a/gc_out_test.html b/gc_out_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..77b615238355cd3dab9c821dca488a86bb27fd4f
--- /dev/null
+++ b/gc_out_test.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_plot2_out_test.html b/gc_plot2_out_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..0fd3d25f7db51b8abddf937ff930e64924bb34bf
--- /dev/null
+++ b/gc_plot2_out_test.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/gc_plot_out_test.html b/gc_plot_out_test.html
new file mode 100644
index 0000000000000000000000000000000000000000..4baf5abdf68f3ac00b9dba44479eb6dc6c73d6f5
--- /dev/null
+++ b/gc_plot_out_test.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/CSVWriter.hpp b/src/CSVWriter/CSVWriter.hpp
similarity index 91%
rename from src/CSVWriter.hpp
rename to src/CSVWriter/CSVWriter.hpp
index ff31345666f1beefb27fed672bfda9dadc483cb4..fc6822c8af1ad00d00f7305eafbf2c7256d76d86 100644
--- a/src/CSVWriter.hpp
+++ b/src/CSVWriter/CSVWriter.hpp
@@ -18,6 +18,8 @@
#include "csv_multiarray.hpp"
#include "util.hpp"
+#define CSV_WRITER 0x30000
+
/*! \brief this class is a functor for "for_each" algorithm
*
* For each element of the boost::vector the operator() is called.
@@ -54,7 +56,7 @@ struct csv_prp
void operator()(T& t)
{
// This is the type of the csv column
- typedef typename boost::fusion::result_of::at_c::type col_type;
+ typedef decltype(obj.template get()) col_type;
// Remove the reference from the column type
typedef typename boost::remove_reference::type col_rtype;
@@ -87,7 +89,7 @@ struct csv_col
void operator()(T& t)
{
// This is the type of the csv column
- typedef typename boost::fusion::result_of::at_c::type col_type;
+ typedef decltype(std::declval.template get()) col_type;
// Remove the reference from the column type
typedef typename boost::remove_reference::type col_rtype;
@@ -181,9 +183,10 @@ class CSVWriter
*
* \param v_pos vector that contain the positional information
* \param v_prp vector that contain the property information
+ * \param offset from where to start
*
*/
- std::string get_csv_data(v_pos & vp, v_prp & vpr)
+ std::string get_csv_data(v_pos & vp, v_prp & vpr, size_t offset)
{
std::stringstream str;
@@ -195,7 +198,7 @@ class CSVWriter
}
// Write the data
- for (size_t i = 0 ; i < vp.size() ; i++)
+ for (size_t i = offset ; i < vp.size() ; i++)
{
for (size_t j = 0 ; j < v_pos::value_type::dims ; j++)
{
@@ -206,9 +209,9 @@ class CSVWriter
}
// Object to write
- typename v_prp::value_type obj = vpr.get(i);
+ auto obj = vpr.get(i);
- csv_prp c_prp(str,obj);
+ csv_prp c_prp(str,obj);
// write the properties to the stream string
boost::mpl::for_each< boost::mpl::range_c >(c_prp);
@@ -228,10 +231,11 @@ public:
* \param file path where to write
* \param v_pos positional vector
* \param v_prp properties vector
+ * \param offset from where to start to write
*
*/
- bool write(std::string file, v_pos & v , v_prp & prp)
+ bool write(std::string file, v_pos & v , v_prp & prp, size_t offset=0)
{
// Header for csv (colums name)
std::string csv_header;
@@ -242,7 +246,7 @@ public:
csv_header = get_csv_colums();
// For each property in the vertex type produce a point data
- point_data = get_csv_data(v,prp);
+ point_data = get_csv_data(v,prp,offset);
// write the file
std::ofstream ofs(file);
diff --git a/src/CSVWriter_unit_tests.hpp b/src/CSVWriter/CSVWriter_unit_tests.hpp
similarity index 100%
rename from src/CSVWriter_unit_tests.hpp
rename to src/CSVWriter/CSVWriter_unit_tests.hpp
diff --git a/src/csv_multiarray.hpp b/src/CSVWriter/csv_multiarray.hpp
similarity index 100%
rename from src/csv_multiarray.hpp
rename to src/CSVWriter/csv_multiarray.hpp
diff --git a/src/GraphMLWriter.hpp b/src/GraphMLWriter/GraphMLWriter.hpp
similarity index 99%
rename from src/GraphMLWriter.hpp
rename to src/GraphMLWriter/GraphMLWriter.hpp
index 16e993cca80181e443f73e55b28273ae4801ecc3..b96b8bb65c5f9436d61427a019c33b46326ae1de 100644
--- a/src/GraphMLWriter.hpp
+++ b/src/GraphMLWriter/GraphMLWriter.hpp
@@ -208,6 +208,11 @@ struct vertex_node
create_prop(attributes_names);
};
+ inline ~vertex_node()
+ {
+ delete [] attributes_names;
+ }
+
#ifdef DEBUG
/*! \brief Constructor
*
@@ -558,7 +563,7 @@ class GraphMLWriter
vn.new_node(nc);
// Iterate through all the vertex and create the vertex list
- boost::mpl::for_each< boost::mpl::range_c >(vn);
+ boost::mpl::for_each_ref< boost::mpl::range_c >(vn);
// end node
vn.end_node();
diff --git a/src/GraphMLWriter_unit_tests.hpp b/src/GraphMLWriter/GraphMLWriter_unit_tests.hpp
similarity index 87%
rename from src/GraphMLWriter_unit_tests.hpp
rename to src/GraphMLWriter/GraphMLWriter_unit_tests.hpp
index 8da0ccdeb15fdc037914500d70649d8eb1ef05ea..1fc568bb89d019a660a5686dd25a24122a9dd6bd 100644
--- a/src/GraphMLWriter_unit_tests.hpp
+++ b/src/GraphMLWriter/GraphMLWriter_unit_tests.hpp
@@ -11,7 +11,6 @@
#define GS_SIZE 8
#include "GraphMLWriter.hpp"
-#include "VTKWriter.hpp"
#include "Graph/CartesianGraphFactory.hpp"
#include "util.hpp"
@@ -94,14 +93,22 @@ BOOST_AUTO_TEST_CASE( graphml_writer_use)
n1.get_i() = 6.0;
n1.get_str() = std::string("test");
g_csr2.addVertex(n1);
+ n1.get_str() = std::string("tes2");
g_csr2.addVertex(n1);
+ n1.get_str() = std::string("test3");
g_csr2.addVertex(n1);
+ n1.get_str() = std::string("test4");
g_csr2.addVertex(n1);
+ n1.get_str() = std::string("test5");
g_csr2.addEdge(0,1,n1);
+ n1.get_str() = std::string("test6");
g_csr2.addEdge(2,1,n1);
+ n1.get_str() = std::string("test7");
g_csr2.addEdge(3,1,n1);
+ n1.get_str() = std::string("test8");
g_csr2.addEdge(2,0,n1);
+ n1.get_str() = std::string("test9");
g_csr2.addEdge(3,2,n1);
// Create a graph ML
@@ -123,7 +130,10 @@ BOOST_AUTO_TEST_CASE( graphml_writer_use)
// Box
Box<3,float> box({0.0,0.0,0.0},{1.0,1.0,1.0});
- Graph_CSR g_csr = g_factory.construct<5,float,2,ne_cp::x,ne_cp::y,ne_cp::z>(sz,box);
+ // Boundary conditions, non periodic
+ size_t bc[] = {NON_PERIODIC,NON_PERIODIC,NON_PERIODIC};
+
+ Graph_CSR g_csr = g_factory.construct<5,NO_VERTEX_ID,float,2,ne_cp::x,ne_cp::y,ne_cp::z>(sz,box,bc);
// Create a graph ML
GraphMLWriter> gw(g_csr);
diff --git a/src/HDF5_XdmfWriter/HDF5_XdmfWriter.hpp b/src/HDF5_XdmfWriter/HDF5_XdmfWriter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..597c69b92eb18877741c75e0723dc0e9340a5973
--- /dev/null
+++ b/src/HDF5_XdmfWriter/HDF5_XdmfWriter.hpp
@@ -0,0 +1,24 @@
+/*
+ * H5PartWriter.hpp
+ *
+ * Created on: Feb 7, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_HPP_
+#define OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_HPP_
+
+#define H5PART_WRITER 0x20000
+
+#define H5_POINTSET 1
+
+template
+class HDF5_XdmfWriter
+{
+
+};
+
+#include "HDF5_XdmfWriter_point_set.hpp"
+
+
+#endif /* OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_HPP_ */
diff --git a/src/HDF5_XdmfWriter/HDF5_XdmfWriter_point_set.hpp b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_point_set.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..fd760158524f56f7bf6e889b400f4908ef1c9ad6
--- /dev/null
+++ b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_point_set.hpp
@@ -0,0 +1,178 @@
+/*
+ * H5PartWriter_point_set.hpp
+ *
+ * Created on: Feb 7, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_POINT_SET_HPP_
+#define OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_POINT_SET_HPP_
+
+#include "HDF5_XdmfWriter_util.hpp"
+#include "Vector/map_vector.hpp"
+#include "VCluster.hpp"
+
+/*! \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 write each property in H5Part
+ *
+ * \tparam ele_v is the vector of properties
+ * \tparam seq, sequence of property to output
+ * \tparam has_name define if the structure define names for the properties
+ *
+ */
+
+template
+struct H5_prop_out
+{
+ // HDF5 file
+ hid_t file_id;
+
+ // vector that we are processing
+ ele_v & vv;
+
+ // Up to which element to write
+ size_t stop;
+
+ /*! \brief constructor
+ *
+ * \param v_out string to fill with the vertex properties
+ *
+ */
+ H5_prop_out(hid_t file_id, ele_v & vv, size_t stop)
+ :file_id(file_id),vv(vv),stop(stop)
+ {};
+
+ //! It produce an output for each property
+ template
+ void operator()(T& t) const
+ {
+ typedef typename boost::mpl::at>::type ptype;
+
+ H5_write::write(file_id,std::string(ele_v::value_type::attributes::names[T::value]),vv,stop);
+ }
+};
+
+
+
+/*! \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 is the vector of properties
+ * \tparam seq, sequence of property to output
+ * \tparam has_name define if the structure define names
+ *
+ */
+template
+struct H5_prop_out
+{
+ // HDF5 file
+ hid_t file_id;
+
+ // vector that we are processing
+ ele_v & vv;
+
+ // Up to which element to write
+ size_t stop;
+
+ /*! \brief constructor
+ *
+ * \param v_out string to fill with the vertex properties
+ *
+ */
+ H5_prop_out(hid_t file_id, ele_v & vv, size_t stop)
+ :file_id(file_id),vv(vv),stop(stop)
+ {};
+
+ //! It produce an output for each property
+ template
+ void operator()(T& t) const
+ {
+ typedef typename boost::mpl::at>::type ptype;
+
+ H5_write::write(file_id,std::string("attr") + std::to_string(T::value),vv,stop);
+ }
+};
+
+template <>
+class HDF5_XdmfWriter
+{
+ // Time step
+ int t;
+
+ //! HDF5 file
+ hid_t file_id;
+
+public:
+
+ /*!
+ *
+ * H5PartWriter constructor
+ *
+ */
+ HDF5_XdmfWriter()
+ :t(0)
+ {}
+
+
+ /*!
+ *
+ * \brief Write a set of particle position and properties into HDF5
+ *
+ * \tparam Pos Vector of positions type
+ * \taparam Prp Vector of properties type
+ * \tparam prp list of properties to output
+ *
+ * \param pos Vector with the positions
+ * \param prp Vector with the properties
+ * \param stop size of the vector to output
+ *
+ */
+ template bool write(const std::string & file, openfpm::vector & v_pos, openfpm::vector & v_prp, size_t stop)
+ {
+ Vcluster & v_cl = *global_v_cluster;
+
+ // Open and HDF5 file in parallel
+
+ hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
+ H5Pset_fapl_mpio(plist_id, v_cl.getMPIComm(), MPI_INFO_NULL);
+ file_id = H5Fcreate(file.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, plist_id);
+ H5Pclose(plist_id);
+
+ // Single coordinate positional vector
+ openfpm::vector x_n;
+ x_n.resize(stop);
+
+ //for each component, fill x_n
+ for (size_t i = 0 ; i < VPos::dims ; i++)
+ {
+ //
+ for (size_t j = 0 ; j < stop ; j++)
+ x_n.get(j) = v_pos.template get<0>(j)[i];
+
+ std::stringstream str;
+ str << "x" << i;
+
+ HDF5CreateDataSet(file_id,str.str(),x_n.getPointer(),stop*sizeof(typename VPos::coord_type));
+ }
+
+ // Now we write the properties
+
+ typedef typename to_boost_vmpl::type v_prp_seq;
+ H5_prop_out,has_attributes::value> f(file_id,v_prp,stop);
+
+ boost::mpl::for_each_ref(f);
+
+ H5Fclose(file_id);
+
+ return true;
+ }
+};
+
+
+#endif /* OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_POINT_SET_HPP_ */
diff --git a/src/HDF5_XdmfWriter/HDF5_XdmfWriter_unit_tests.hpp b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_unit_tests.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..86bd879f3da0f221c1f3e6fa675d1fc00587de3f
--- /dev/null
+++ b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_unit_tests.hpp
@@ -0,0 +1,64 @@
+/*
+ * H5PartWriter_unit_tests.hpp
+ *
+ * Created on: Feb 22, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UNIT_TESTS_HPP_
+#define OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UNIT_TESTS_HPP_
+
+#include "VCluster.hpp"
+#include "util/SimpleRNG.hpp"
+#include "HDF5_XdmfWriter.hpp"
+
+BOOST_AUTO_TEST_SUITE( HDF5_writer_test )
+
+
+BOOST_AUTO_TEST_CASE( HDF5_writer_use)
+{
+ openfpm::vector> pv;
+ openfpm::vector> pvp;
+
+ SimpleRNG rng;
+
+ Vcluster & v_cl = *global_v_cluster;
+
+ if (v_cl.getProcessingUnits() != 3)
+ return;
+
+ double z_base = v_cl.getProcessUnitID();
+
+ // fill 1000 particles for each processors
+
+ for (size_t i = 0 ; i < 1000 ; i++)
+ {
+ Point<3,double> p;
+ p[0] = rng.GetUniform();
+ p[1] = rng.GetUniform();
+ p[2] = z_base+rng.GetUniform();
+
+ pv.add(p);
+
+ p[0] += 2.0;
+
+ Point_test pt;
+ pt.fill();
+
+ pvp.add(pt);
+ }
+
+ HDF5_XdmfWriter h5p;
+ h5p.template write,Point_test,0,1,4,5>("h5part.h5",pv,pvp,1000);
+
+ // check that match
+
+ bool test = compare("test_h5part.h5part","test_h5part_test.h5part");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+
+
+#endif /* OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UNIT_TESTS_HPP_ */
diff --git a/src/HDF5_XdmfWriter/HDF5_XdmfWriter_util.hpp b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_util.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..db7acd59b26ee8da0ed7e25da3a7071f17e6f3ff
--- /dev/null
+++ b/src/HDF5_XdmfWriter/HDF5_XdmfWriter_util.hpp
@@ -0,0 +1,300 @@
+/*
+ * H5PartWriteData_meta.hpp
+ *
+ * Created on: Feb 22, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UTIL_HPP_
+#define OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UTIL_HPP_
+
+#include "hdf5.h"
+#include "Vector/map_vector.hpp"
+
+/*! \brief HDF5 Create the data-set in the file
+ *
+ * \tparam type Type to write
+ *
+ * \param file_id Id of the file
+ * \param filespace id where to write
+ * \param str dataset to write
+ * \param ptr pointer with the data to write
+ * \param sz size of the data to write
+ *
+ * \return true if the function succeed
+ *
+ */
+template bool HDF5CreateDataSet(hid_t file_id, const std::string & str ,void * ptr, size_t sz)
+{
+ hid_t plist_id = H5Pcreate(H5P_DATASET_XFER);
+ if (plist_id < 0)
+ return false;
+
+ /* Create the dataspace for the position dataset. */
+ hsize_t dimsf[1] = {sz};
+ hid_t filespace = H5Screate_simple(1, dimsf, NULL);
+ if (filespace < 0)
+ return false;
+
+ if (std::is_same::value == true)
+ {
+ hid_t dset_id = H5Dcreate(file_id, str.c_str(), H5T_NATIVE_CHAR, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (dset_id < 0)
+ return false;
+
+ herr_t status = H5Dwrite(dset_id, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, plist_id, ptr);
+ if (status < 0)
+ return false;
+
+ H5Dclose(dset_id);
+ H5Dclose(filespace);
+ return true;
+ }
+/* else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_SCHAR, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ H5Dclose(dset_id);
+ return status;
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_UCHAR, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_SHORT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_USHORT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_UINT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_LONG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_ULONG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_LLONG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_ULLONG, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }
+ else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_FLOAT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }*/
+ else if (std::is_same::value == true)
+ {
+ hid_t dset_id = H5Dcreate(file_id, str.c_str(), H5T_NATIVE_DOUBLE, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (dset_id < 0)
+ return false;
+
+ herr_t status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, plist_id, ptr);
+ if (status < 0)
+ return false;
+
+ H5Dclose(dset_id);
+ H5Dclose(filespace);
+ return true;
+ }
+ /*else if (std::is_same::value == true)
+ {
+ dset_id = H5Dcreate(file_id, std.c_str(), H5T_NATIVE_LDOUBLE, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ }*/
+
+ return true;
+}
+
+
+/*! \brief Write an HDF5 dataset in case of scalars and vectors
+ *
+ * \tparam T type to write
+ * \tparam pid Property id
+ * \tparam V Vector containing the information
+ *
+ */
+template
+struct H5_write
+{
+ /*! \brief write
+ *
+ * \param file_id HDF5 file
+ * \param str dataset name
+ * \param v Vector containing the information
+ * \param stop size to store
+ *
+ */
+ static inline void write(hid_t file_id, const std::string & str, V & v, size_t stop)
+ {
+ // Create the buffer
+ openfpm::vector buffer;
+ buffer.resize(stop);
+
+ for (size_t j = 0 ; j < stop ; j++)
+ buffer.get(j) = v.template get(j);
+
+ HDF5CreateDataSet(file_id,str.c_str(),buffer.getPointer(),stop*sizeof(T));
+ }
+};
+
+//! Partial specialization for N=1 1D-Array
+template
+struct H5_write
+{
+
+ /*! \brief write
+ *
+ * \param file_id HDF5 file
+ * \param str dataset name
+ * \param v Vector containing the information
+ * \param stop size to store
+ *
+ */
+ static inline void write(hid_t file_id, const std::string & str, V & v, size_t stop)
+ {
+ for (size_t i1 = 0 ; i1 < N1 ; i1++)
+ {
+ // Create the buffer
+ openfpm::vector buffer;
+ buffer.resize(stop);
+
+ for (size_t j = 0 ; j < stop ; j++)
+ buffer.get(j) = v.template get(j)[i1];
+
+ std::stringstream sstr;
+ sstr << "_" << i1;
+
+ HDF5CreateDataSet(file_id,std::string(str) + sstr.str(),v.getPointer(),stop*sizeof(T));
+ }
+ }
+};
+
+//! Partial specialization for N=2 2D-Array
+template
+struct H5_write
+{
+
+ /*! \brief write
+ *
+ * \param file_id HDF5 file
+ * \param str dataset name
+ * \param v Vector containing the information
+ * \param stop size to store
+ *
+ */
+ static inline void write(hid_t file_id, const std::string & str, V & v, size_t stop)
+ {
+ for (size_t i1 = 0 ; i1 < N1 ; i1++)
+ {
+ for (size_t i2 = 0 ; i2 < N2 ; i2++)
+ {
+ // Create the buffer
+ openfpm::vector buffer;
+ buffer.resize(stop);
+
+ for (size_t j = 0 ; j < stop ; j++)
+ buffer.get(j) = v.template get(j)[i1][i2];
+
+ std::stringstream sstr;
+ sstr << "_" << i1 << "_" << i2;
+
+ HDF5CreateDataSet(file_id,std::string(str) + sstr.str(),v.getPointer(),stop*sizeof(T));
+ }
+ }
+ }
+};
+
+//! Partial specialization for N=3
+template
+struct H5_write
+{
+
+ /*! \brief write
+ *
+ * \param file_id HDF5 file
+ * \param str dataset name
+ * \param v Vector containing the information
+ * \param stop size to store
+ *
+ */
+ static inline void write(hid_t file_id, const std::string & str, V & v, size_t stop)
+ {
+ for (size_t i1 = 0 ; i1 < N1 ; i1++)
+ {
+ for (size_t i2 = 0 ; i2 < N2 ; i2++)
+ {
+ for (size_t i3 = 0 ; i3 < N3 ; i3++)
+ {
+ // Create the buffer
+ openfpm::vector buffer;
+ buffer.resize(stop);
+
+ for (size_t j = 0 ; j < stop ; j++)
+ buffer.get(j) = v.template get(j)[i1][i2][i3];
+
+ std::stringstream sstr;
+ sstr << "_" << i1 << "_" << i2 << "_" << i3;
+
+ HDF5CreateDataSet(file_id,std::string(str) + sstr.str(),v.getPointer(),stop*sizeof(T));
+ }
+ }
+ }
+ }
+};
+
+//! Partial specialization for N=4
+template
+struct H5_write
+{
+
+ /*! \brief write
+ *
+ * \param file_id HDF5 file
+ * \param str dataset name
+ * \param v Vector containing the information
+ * \param stop size to store
+ *
+ */
+ static inline void write(hid_t file_id, const std::string & str, V & v, size_t stop)
+ {
+ for (size_t i1 = 0 ; i1 < N1 ; i1++)
+ {
+ for (size_t i2 = 0 ; i2 < N2 ; i2++)
+ {
+ for (size_t i3 = 0 ; i3 < N3 ; i3++)
+ {
+ for (size_t i4 = 0 ; i4 < N4 ; i4++)
+ {
+ // Create the buffer
+ openfpm::vector buffer;
+ buffer.resize(stop);
+
+ for (size_t j = 0 ; j < stop ; j++)
+ buffer.get(j) = v.template get(j)[i1][i2][i3][i4];
+
+
+ std::stringstream sstr;
+ sstr << "_" << i1 << "_" << i2 << "_" << i3 << "_" << i4;
+
+ HDF5CreateDataSet(file_id,std::string(str) + sstr.str(),v.getPointer(),stop*sizeof(T));
+ }
+ }
+ }
+ }
+ }
+};
+
+#endif /* OPENFPM_IO_SRC_HDF5_XDMFWRITER_HDF5_XDMFWRITER_UTIL_HPP_ */
diff --git a/src/Makefile.am b/src/Makefile.am
index a2698977663d8692f4324d9df2627a17e80cc613..a51c04f242bbbefe1b8d0f51dbfaa570b2d47d7d 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,13 +1,16 @@
-LINKLIBS = $(PTHREAD_LIBS) $(OPT_LIBS) $(BOOST_IOSTREAMS_LIB) $(BOOST_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_THREAD_LIB)
+LINKLIBS = $(PTHREAD_LIBS) $(OPT_LIBS) $(BOOST_IOSTREAMS_LIB) $(BOOST_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_THREAD_LIB) $(HDF5_LDFLAGS) $(HDF5_LIBS)
noinst_PROGRAMS = io
-io_SOURCES = main.cpp ../../openfpm_devices/src/memory/HeapMemory.cpp ../../openfpm_devices/src/Memleak_check.cpp
-io_CXXFLAGS = $(CUDA_CFLAGS) $(INCLUDES_PATH) $(BOOST_CPPFLAGS) -I/usr/local/include
+io_SOURCES = main.cpp ../../openfpm_vcluster/src/VCluster.cpp ../../openfpm_devices/src/memory/HeapMemory.cpp ../../openfpm_devices/src/Memleak_check.cpp
+io_CXXFLAGS = $(CUDA_CFLAGS) $(INCLUDES_PATH) $(BOOST_CPPFLAGS) -I/usr/local/include $(HDF5_CPPFLAGS)
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_point_set.hpp VTKWriter/VTKWriter_grids.hpp VTKWriter/VTKWriter_grids_st.hpp VTKWriter/VTKWriter_grids_util.hpp VTKWriter/VTKWriter_vector_box.hpp HDF5_XdmfWriter/HDF5_XdmfWriter.hpp HDF5_XdmfWriter/HDF5_XdmfWriter_point_set.hpp HDF5_XdmfWriter/HDF5_XdmfWriter_util.hpp \
+Plot/GoogleChart.hpp Plot/util.hpp
.cu.o :
diff --git a/src/Plot/GoogleChart.hpp b/src/Plot/GoogleChart.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..1bf4a0814decb6cfb3545255e546ca415dab0304
--- /dev/null
+++ b/src/Plot/GoogleChart.hpp
@@ -0,0 +1,547 @@
+/*
+ * GoogleChart.hpp
+ *
+ * Created on: Jan 9, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_DATA_SRC_PLOT_GOOGLECHART_HPP_
+#define OPENFPM_DATA_SRC_PLOT_GOOGLECHART_HPP_
+
+#include
+#include "Vector/map_vector.hpp"
+
+#define GGRAPH_COLUMS 1
+#define GGRAPH_POINTS 2
+
+/*! \brief Google chart options
+ *
+ */
+struct GCoptions
+{
+ //! Title of the chart
+ std::string title;
+ //! Y axis name
+ std::string yAxis;
+ //! X axis name
+ std::string xAxis;
+
+ //! Type of chart (list of the option can be founded in Google Chart API for seriesType)
+ //! Possible options are:
+ //! 'line', 'area', 'bars', 'candlesticks', and 'steppedArea'
+ //! default: line
+ std::string stype;
+
+ //! Extended series options
+ //! Example {5: {type: 'line'}} specify that the series number 5 must be represented
+ //! with a line
+ std::string stypeext;
+
+ size_t width=900;
+ size_t heigh=500;
+
+ //! Flag that specify if the colums are stacked
+ //! Check in Google Chart for is stacked option
+ bool isStacked = false;
+
+ //! Width of the line
+ size_t lineWidth = 4;
+
+ //! Style for all the intervals
+ //! Check Google Chart API intervals option
+ std::string intervalsext;
+
+ //! Style for each interval
+ //! Check Google Chart API interval option
+ std::string intervalext;
+
+ //! more
+ std::string more;
+
+ GCoptions & operator=(const GCoptions & opt)
+ {
+ title = opt.title;
+ yAxis = opt.yAxis;
+ xAxis = opt.xAxis;
+ stype = opt.stype;
+ stypeext = opt.stypeext;
+ width=opt.width;
+ heigh=opt.heigh;
+
+ lineWidth = opt.lineWidth;
+ intervalsext = opt.intervalsext;
+ more = opt.more;
+
+ return *this;
+ }
+};
+
+struct GGraph
+{
+ // TypeOfGraph
+ size_t type;
+
+ // data
+ std::string data;
+
+ // option
+ std::string option;
+
+ // Google chart option
+ GCoptions opt;
+};
+
+/////////////////// Constants strings usefull to construct the HTML page //////////
+
+const std::string begin_data ="\n\
+ \n\
+ \n\
+ \n\
+\n\
+\n";
+
+const std::string div_end = "\n\
+\n";
+
+/////////////////////////////////////////////////////////////////////
+
+/*! It convert an array y or a set of two array x,y into a Google chart
+ *
+ */
+class GoogleChart
+{
+ // set of graphs
+ openfpm::vector set_of_graphs;
+
+ // set inject HTML;
+ openfpm::vector injectHTML;
+
+ /*! \brief Given X and Y vector return the string representing the data section of the Google Chart
+ *
+ * \param X vector
+ * \param Y vector
+ * \param i counter
+ *
+ * \return string with the data section
+ *
+ */
+ template std::string get_points_plot_data(const openfpm::vector & x, const openfpm::vector & y, const openfpm::vector & yn, const GCoptions & opt, size_t i)
+ {
+ std::stringstream data;
+
+ size_t interval = 0;
+
+ // we require that the number of x elements are the same as y elements
+
+ if (x.size() != y.size())
+ std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " vector x and the vector y must have the same number of elements " << x.size() << "!=" << y.size() << "\n";
+
+ // Google chart visualization
+ data << "var data" << i << " = new google.visualization.DataTable();\n";
+ if (std::is_same::value == true)
+ data << "data" << i << ".addColumn(" << "'string'" << "," << "'" << opt.xAxis <<"');\n";
+ else
+ data << "data" << i << ".addColumn(" << "'number'" << "," << "'" << opt.xAxis <<"');\n";
+
+ for (size_t j = 0 ; j < y.last().size() ; j++)
+ {
+ if (yn.get(j) == std::string("interval"))
+ {
+ data << "data" << i << ".addColumn({id:'i" << interval/2 << "', type:'number', role:'interval'});\n";
+ interval++;
+ }
+ else
+ data << "data" << i << ".addColumn(" << "'number'" << "," << "'" << yn.get(j) <<"');\n";
+ }
+
+ data << "data" << i << ".addRows([\n";
+ for (size_t i = 0 ; i < y.size() ; i++)
+ {
+
+ for (size_t j = 0 ; j < y.get(i).size()+1 ; j++)
+ {
+ // the first is x
+ if (j == 0)
+ {
+ if (std::is_same::value == true)
+ data << "['" << x.get(i) << "'";
+ else
+ data << "[" << x.get(i);
+ }
+ else
+ data << "," << y.get(i).get(j-1);
+ }
+ data << "],\n";
+ }
+
+ return data.str();
+ }
+
+ /*! \brief Given X and Y vector return the string representing the data section of the Google Chart
+ *
+ * \param X vector
+ * \param Y vector
+ *
+ * \return string with the data section
+ *
+ */
+ template std::string get_colums_bar_data(const openfpm::vector & x, const openfpm::vector & y, const openfpm::vector & yn, const GCoptions & opt, size_t i)
+ {
+ std::stringstream data;
+
+ data << "var data";
+ data << i;
+ data << " = google.visualization.arrayToDataTable([\n";
+
+ // we require that the number of x elements are the same as y elements
+
+ if (x.size() != y.size())
+ std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " vector x and the vector y must have the same number of elements " << x.size() << "!=" << y.size() << "\n";
+
+ data << "['";
+ data << opt.xAxis << "'";
+ for (size_t i = 0 ; i < yn.size() ; i++)
+ data << ",'" << std::to_string(yn.get(i)) << "'";
+
+ data << "],\n";
+
+ // Write the values
+ for (size_t i = 0 ; i < y.size() ; i++)
+ {
+ data << "[";
+ data << "'" << std::to_string(x.get(i)) << "'";
+ for (size_t j = 0 ; j < y.get(i).size() ; j++)
+ data << "," << std::to_string(y.get(i).get(j));
+
+ data << "],\n";
+ }
+
+ return data.str();
+ }
+
+ std::string get_colums_bar_option(const GCoptions & opt)
+ {
+ std::stringstream str;
+ str << "title : '" << opt.title << "',\n";
+ str << "vAxis: {title: '" << opt.yAxis << "'},\n";
+ str << "hAxis: {title: '" << opt.xAxis << "'},\n";
+ str << "seriesType: '" << opt.stype << "',\n";
+ if (opt.stypeext.size() != 0)
+ str << "series: " << opt.stypeext << "\n";
+ str << opt.more;
+
+ return str.str();
+ }
+
+ std::string get_points_plot_option(const GCoptions & opt)
+ {
+ std::stringstream str;
+ str << "title : '" << opt.title << "',\n";
+ str << "vAxis: {title: '" << opt.yAxis << "'},\n";
+ str << "hAxis: {title: '" << opt.xAxis << "'},\n";
+ str << "curveType: 'function',\n";
+
+ str << "lineWidth: " << opt.lineWidth << ",\n";
+ if (opt.intervalsext.size() != 0)
+ str << "intervals: " << opt.intervalsext << ",\n";
+ else
+ str << "intervals: " << "{ 'style':'area' }" << ",\n";
+
+ if (opt.intervalext.size() != 0)
+ str << "interval: " << opt.intervalext << "\n";
+
+ str << opt.more;
+
+ return str.str();
+ }
+
+ /*! \brief Add a graph data variable
+ *
+ * \param of file out
+ * \param i id
+ * \param data string
+ *
+ */
+ void addData(std::ofstream & of, size_t i, const std::string & data)
+ {
+
+ of << data;
+ of << "]);\n";
+ }
+
+ /*! \brief Add an option data variable
+ *
+ * \param of file out
+ * \param i id
+ * \param opt string
+ *
+ */
+ void addOption(std::ofstream & of, size_t i, const std::string & opt)
+ {
+ of << "var options";
+ of << i;
+ of << "= {\n";
+ of << opt;
+ of << "};\n";
+ }
+
+ /*! \brief Add a draw div section
+ *
+ * \param of file out
+ * \param i id
+ *
+ */
+ void addDrawDiv(std::ofstream & of, size_t i)
+ {
+ of << "var chart = new google.visualization.ComboChart(document.getElementById('chart_div";
+ of << i;
+ of << "'));chart.draw(data";
+ of << i;
+ of << ", options";
+ of << i;
+ of << ");\n";
+ }
+
+ /*! \brief Add a div section
+ *
+ * \param i id
+ * \param gc GoogleChart option
+ *
+ */
+ void addDiv(std::ofstream & of, size_t i, const GCoptions & gc)
+ {
+ of << "\n";
+ }
+
+public:
+
+ GoogleChart()
+ {
+ injectHTML.add();
+ }
+
+ /*! \brief Add a colums graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many columns
+ * has the graph while the internal vector can store multiple datasets
+ *
+ */
+ template void AddColumsGraph(openfpm::vector & y)
+ {
+ openfpm::vector x;
+ x.resize(y.size());
+
+ AddColumsGraph(x,y);
+ }
+
+ /*! \brief Add a colums graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many columns
+ * has the graph while the internal vector can store multiple datasets
+ *
+ * \param x Give a name or number to each colums, so can be a string or a number
+ *
+ */
+ template void AddColumsGraph(openfpm::vector & x, openfpm::vector & y)
+ {
+ GCoptions opt;
+
+ openfpm::vector yn;
+
+ if (y.size() != 0)
+ yn.resize(y.get(0).size());
+
+ AddColumsGraph(x,y,yn,opt);
+ }
+
+ /*! \brief Add a colums graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many columns
+ * has the graph while the internal vector can store multiple datasets
+ *
+ * \param x Give a name or number to each colums, so can be a string or a number
+ *
+ * \param yn Give a name to each dataset
+ *
+ */
+ template void AddColumsGraph(openfpm::vector & x, openfpm::vector & y, openfpm::vector & yn)
+ {
+ GCoptions opt;
+
+ AddColumsGraph(x,y,yn,opt);
+ }
+
+ /*! \brief Add a colums graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many columns
+ * has the graph while the internal vector can store multiple datasets
+ *
+ * \param x Give a name or number to each colums, so can be a string or a number
+ *
+ * \param yn Give a name to each dataset
+ *
+ * \param opt Graph options
+ *
+ */
+ template void AddColumsGraph(openfpm::vector & x, openfpm::vector & y, openfpm::vector & yn , const GCoptions & opt)
+ {
+ set_of_graphs.add();
+ injectHTML.add();
+
+ // Check that all the internal vector has the same number of elements
+
+ if (y.size() != 0)
+ {
+ size_t sz = y.get(0).size();
+ for (size_t i = 0; i < y.size() ; i++)
+ {
+ if (y.get(i).size() != sz)
+ std::cerr << __FILE__ << ":" << __LINE__ << " error all the elements in the y vector must have the same numbers, element " << i << ": " << y.get(i).size() << " " << " mismatch the numbers of elements at 0: " << sz << "/n";
+ }
+ }
+
+ set_of_graphs.last().type = GGRAPH_COLUMS;
+ set_of_graphs.last().data = get_colums_bar_data(x,y,yn,opt,set_of_graphs.size()-1);
+ set_of_graphs.last().option = get_colums_bar_option(opt);
+ set_of_graphs.last().opt = opt;
+ }
+
+ /*! \brief Add a simple plot graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many x values
+ * or colums do we have, while the internal vector can store multiple realizations,
+ * or min and max, for error bar
+ *
+ * \param x Give a name or number to each colums, so can be a string or a number
+ *
+ * \param opt Graph options
+ *
+ */
+ template void AddPointsGraph(openfpm::vector & x, openfpm::vector & y , const GCoptions & opt)
+ {
+ openfpm::vector yn;
+
+ if (y.size() == 0)
+ {
+ std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " vector y must be filled";
+ return;
+ }
+
+ for (size_t i = 0 ; i < y.last().size() ; i++)
+ yn.add(std::string("line") + std::to_string(i));
+
+ AddPointsGraph(x,y,yn,opt);
+ }
+
+ /*! \brief Add a simple plot graph
+ *
+ * \param y A vector of vector of values (numbers) the size of y indicate how many x values
+ * or colums we have, while the internal vector store multiple lines,
+ * or error bars
+ *
+ * \param x Give a name or number to each colums, so can be a string or a number
+ *
+ * \param yn Give a name to each line, or specify an error bar
+ *
+ * \param opt Graph options
+ *
+ */
+ template void AddPointsGraph(openfpm::vector & x, openfpm::vector & y , const openfpm::vector & yn, const GCoptions & opt)
+ {
+ if (y.size() == 0)
+ {
+ std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " vector y must be filled\n";
+ return;
+ }
+
+ set_of_graphs.add();
+ injectHTML.add();
+
+ // Check that all the internal vectors has the same number of elements
+
+ if (y.size() != 0)
+ {
+ size_t sz = y.get(0).size();
+ for (size_t i = 0; i < y.size() ; i++)
+ {
+ if (y.get(i).size() != sz)
+ std::cerr << __FILE__ << ":" << __LINE__ << " error all the elements in the y vector must have the same numbers, element " << i << ": " << y.get(i).size() << " " << " mismatch the numbers of elements at 0: " << sz << "/n";
+ }
+ }
+
+ set_of_graphs.last().type = GGRAPH_POINTS;
+ set_of_graphs.last().data = get_points_plot_data(x,y,yn,opt,set_of_graphs.size()-1);
+ set_of_graphs.last().option = get_points_plot_option(opt);
+ set_of_graphs.last().opt = opt;
+ }
+
+ /*! \brief Add HTML text
+ *
+ * \param html add html text in the page
+ *
+ */
+ void addHTML(const std::string & html)
+ {
+ injectHTML.last() = html;
+ }
+
+ /*! \brief It write the html file
+ *
+ * \param file output html file
+ *
+ */
+ void write(std::string file)
+ {
+ // Open a file
+
+ std::ofstream of(file);
+
+ // Check if the file is open
+ if (of.is_open() == false)
+ {std::cerr << "Error cannot create the HTML file: " + file + "\n";}
+
+ // write the file
+
+ of << begin_data;
+
+ for (size_t i = 0 ; i < set_of_graphs.size() ; i++)
+ addData(of,i,set_of_graphs.get(i).data);
+
+ for (size_t i = 0 ; i < set_of_graphs.size() ; i++)
+ addOption(of,i,set_of_graphs.get(i).option);
+
+ for (size_t i = 0 ; i < set_of_graphs.size() ; i++)
+ addDrawDiv(of,i);
+
+ of << begin_div;
+
+ of << injectHTML.get(0);
+
+ for (size_t i = 0 ; i < set_of_graphs.size() ; i++)
+ {
+ addDiv(of,i,set_of_graphs.get(i).opt);
+ of << injectHTML.get(i+1);
+ }
+
+ of << div_end;
+
+ of.close();
+ }
+};
+
+#endif /* OPENFPM_DATA_SRC_PLOT_GOOGLECHART_HPP_ */
diff --git a/src/Plot/Plot_unit_tests.hpp b/src/Plot/Plot_unit_tests.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7c77f192d8b3d0b7c0d88fce3e4a2aca275cd618
--- /dev/null
+++ b/src/Plot/Plot_unit_tests.hpp
@@ -0,0 +1,428 @@
+/*
+ * Plot_unit_tests.hpp
+ *
+ * Created on: Jan 9, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_DATA_SRC_PLOT_PLOT_UNIT_TESTS_HPP_
+#define OPENFPM_DATA_SRC_PLOT_PLOT_UNIT_TESTS_HPP_
+
+#include "GoogleChart.hpp"
+#include "Plot/util.hpp"
+
+BOOST_AUTO_TEST_SUITE( plot_unit_test )
+
+BOOST_AUTO_TEST_CASE( google_chart )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colum can have multiple data set (in this case 4 dataset)
+ // Each dataset can have a name
+ yn.add("dataset1");
+ yn.add("dataset2");
+ yn.add("dataset3");
+ yn.add("dataset4");
+
+ // Each colums can have multiple data-set
+ y.add({2,3,5,6});
+ y.add({5,6,1,6});
+ y.add({2,1,6,9});
+ y.add({1,6,3,2});
+ y.add({3,3,0,6});
+ y.add({2,1,4,6});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+ options.stype = std::string("bars");
+
+ // it say that the colum4 must me represented with a line
+ options.stypeext = std::string("{3: {type: 'line'}}");
+
+ GoogleChart cg;
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.write("gc_out.html");
+
+ bool test = compare("gc_out.html","gc_out_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart2 )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colum can have multiple data set (in this case 4 dataset)
+ // Each dataset can have a name
+ yn.add("dataset1");
+ yn.add("dataset2");
+ yn.add("dataset3");
+ yn.add("dataset4");
+
+ // Each colums can have multiple data-set
+ y.add({2.2,1.3,4.5,0.6});
+ y.add({5.0,6.1,1.3,2.6});
+ y.add({2.1,1.0,6.1,9.3});
+ y.add({1.1,6.1,3.0,2.0});
+ y.add({3.3,0.3,0.0,6.2});
+ y.add({2.0,1.1,4.0,6.1});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+ options.stype = std::string("bars");
+
+ GoogleChart cg;
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.write("gc_out2.html");
+
+ bool test = compare("gc_out2.html","gc_out2_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart3 )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colum can have multiple data set (in this case 4 dataset)
+ // Each dataset can have a name
+ yn.add("dataset1");
+ yn.add("dataset2");
+ yn.add("dataset3");
+ yn.add("dataset4");
+
+ // Each colums can have multiple data-set
+ y.add({2.2,1.3,4.5,0.6});
+ y.add({5.0,6.1,1.3,2.6});
+ y.add({2.1,1.0,6.1,9.3});
+ y.add({1.1,6.1,3.0,2.0});
+ y.add({3.3,0.3,0.0,6.2});
+ y.add({2.0,1.1,4.0,6.1});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+
+ GoogleChart cg;
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.write("gc_out3.html");
+
+ bool test = compare("gc_out3.html","gc_out3_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart4 )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colum can have multiple data set (in this case 4 dataset)
+ // Each dataset can have a name
+ yn.add("dataset1");
+ yn.add("dataset2");
+ yn.add("dataset3");
+ yn.add("dataset4");
+
+ // Each colums can have multiple data-set
+ y.add({2.2,1.3,4.5,0.6});
+ y.add({5.0,6.1,1.3,2.6});
+ y.add({2.1,1.0,6.1,9.3});
+ y.add({1.1,6.1,3.0,2.0});
+ y.add({3.3,0.3,0.0,6.2});
+ y.add({2.0,1.1,4.0,6.1});
+
+ GoogleChart cg;
+ cg.AddColumsGraph(x,y,yn);
+ cg.write("gc_out4.html");
+
+ bool test = compare("gc_out4.html","gc_out4_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart5 )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colums can have multiple data-set
+ y.add({2.2,1.3,4.5,0.6});
+ y.add({5.0,6.1,1.3,2.6});
+ y.add({2.1,1.0,6.1,9.3});
+ y.add({1.1,6.1,3.0,2.0});
+ y.add({3.3,0.3,0.0,6.2});
+ y.add({2.0,1.1,4.0,6.1});
+
+ GoogleChart cg;
+ cg.AddColumsGraph(x,y);
+ cg.write("gc_out5.html");
+
+ bool test = compare("gc_out5.html","gc_out5_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart6 )
+{
+ openfpm::vector> y;
+
+ // Each colums can have multiple data-set
+ y.add({2.2,1.3,4.5,0.6});
+ y.add({5.0,6.1,1.3,2.6});
+ y.add({2.1,1.0,6.1,9.3});
+ y.add({1.1,6.1,3.0,2.0});
+ y.add({3.3,0.3,0.0,6.2});
+ y.add({2.0,1.1,4.0,6.1});
+
+ GoogleChart cg;
+ cg.AddColumsGraph(y);
+ cg.write("gc_out6.html");
+
+ bool test = compare("gc_out6.html","gc_out6_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart_with_inject_HTML )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each colum can have multiple data set (in this case 4 dataset)
+ // Each dataset can have a name
+ yn.add("dataset1");
+ yn.add("dataset2");
+ yn.add("dataset3");
+ yn.add("dataset4");
+
+ // Each colums can have multiple data-set
+ y.add({2,3,5,6});
+ y.add({5,6,1,6});
+ y.add({2,1,6,9});
+ y.add({1,6,3,2});
+ y.add({3,3,0,6});
+ y.add({2,1,4,6});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+ options.stype = std::string("bars");
+
+ // it say that the colum4 must me represented with a line
+ options.stypeext = std::string("{3: {type: 'line'}}");
+
+ GoogleChart cg;
+ //
+ cg.addHTML("Before first graph
");
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.addHTML("Before second graph
");
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.addHTML("Before third graph
");
+ cg.AddColumsGraph(x,y,yn,options);
+ cg.addHTML("At the end
");
+ cg.write("gc_out7.html");
+
+ bool test = compare("gc_out7.html","gc_out7_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart_linear_plot )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+ openfpm::vector yn;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Here we specify how many lines we have
+ // first Line
+ yn.add("line1");
+
+ // second line + 2 intervals (Error bands)
+ yn.add("line2");
+ yn.add("interval");
+ yn.add("interval");
+ yn.add("interval");
+ yn.add("interval");
+
+ // third line + 1 interval (Error bands)
+ yn.add("line3");
+ yn.add("interval");
+ yn.add("interval");
+
+ // Each line can have multiple intervals or error bars
+ // The first number specify the bottom line
+ // The last three numbers specify the top line + error band (min, max)
+ // The middle 5 line specify the middle lines + one external error band + one internal error band
+
+ y.add({0.10,0.20,0.19,0.22,0.195,0.215,0.35,0.34,0.36});
+ y.add({0.11,0.21,0.18,0.22,0.19,0.215,0.36,0.35,0.37});
+ y.add({0.12,0.22,0.21,0.23,0.215,0.225,0.35,0.34,0.36});
+ y.add({0.15,0.25,0.20,0.26,0.22,0.255,0.36,0.35,0.37});
+ y.add({0.09,0.29,0.25,0.30,0.26,0.295,0.35,0.34,0.36});
+ y.add({0.08,0.28,0.27,0.29,0.275,0.285,0.36,0.35,0.37});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+ options.lineWidth = 1.0;
+ options.intervalext = std::string("{'i2': { 'color': '#4374E0', 'style':'bars', 'lineWidth':4, 'fillOpacity':1 } }");
+
+ GoogleChart cg;
+ cg.AddPointsGraph(x,y,yn,options);
+ cg.write("gc_plot_out.html");
+
+ bool test = compare("gc_plot_out.html","gc_plot_out_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+BOOST_AUTO_TEST_CASE( google_chart_linear_plot2 )
+{
+ openfpm::vector x;
+ openfpm::vector> y;
+
+ x.add("colum1");
+ x.add("colum2");
+ x.add("colum3");
+ x.add("colum4");
+ x.add("colum5");
+ x.add("colum6");
+
+ // Each line can have multiple intervals or error bars
+ // The first number specify the bottom line
+ // The last three numbers specify the top line + error band (min, max)
+ // The middle 5 line specify the middle lines + one external error band + one internal error band
+
+ y.add({0.10,0.20,0.19,0.22,0.195,0.215,0.35,0.34,0.36});
+ y.add({0.11,0.21,0.18,0.22,0.19,0.215,0.36,0.35,0.37});
+ y.add({0.12,0.22,0.21,0.23,0.215,0.225,0.35,0.34,0.36});
+ y.add({0.15,0.25,0.20,0.26,0.22,0.255,0.36,0.35,0.37});
+ y.add({0.09,0.29,0.25,0.30,0.26,0.295,0.35,0.34,0.36});
+ y.add({0.08,0.28,0.27,0.29,0.275,0.285,0.36,0.35,0.37});
+
+ // Google charts options
+ GCoptions options;
+
+ options.title = std::string("Example");
+ options.yAxis = std::string("Y Axis");
+ options.xAxis = std::string("X Axis");
+ options.lineWidth = 1.0;
+
+ GoogleChart cg;
+ cg.AddPointsGraph(x,y,options);
+ cg.write("gc_plot2_out.html");
+
+ bool test = compare("gc_plot2_out.html","gc_plot2_out_test.html");
+ BOOST_REQUIRE_EQUAL(true,test);
+}
+
+//! [Definition of a function]
+
+double f(double x)
+{
+ return x*x;
+}
+
+//! [Definition of a function]
+
+BOOST_AUTO_TEST_CASE( plot_util )
+{
+ //! [fill a vector]
+
+ openfpm::vector x;
+
+ Fill1D(0.0,2.0,5,x);
+
+ BOOST_REQUIRE_EQUAL(x.get(0),0.0);
+ BOOST_REQUIRE_EQUAL(x.get(1),0.5);
+ BOOST_REQUIRE_EQUAL(x.get(2),1.0);
+ BOOST_REQUIRE_EQUAL(x.get(3),1.5);
+ BOOST_REQUIRE_EQUAL(x.get(4),2.0);
+
+ //! [fill a vector]
+
+ x.clear();
+
+ //! [fill a vector with a function]
+
+ Fill1D(0.0,2.0,5,x,f);
+
+ BOOST_REQUIRE_EQUAL(x.get(0),0.0);
+ BOOST_REQUIRE_EQUAL(x.get(1),0.25);
+ BOOST_REQUIRE_EQUAL(x.get(2),1.0);
+ BOOST_REQUIRE_EQUAL(x.get(3),2.25);
+ BOOST_REQUIRE_EQUAL(x.get(4),4.0);
+
+ //! [fill a vector function]
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+#endif /* OPENFPM_DATA_SRC_PLOT_PLOT_UNIT_TESTS_HPP_ */
diff --git a/src/Plot/util.hpp b/src/Plot/util.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b9a53c529877493353f35f4e9f56d030e2425ba4
--- /dev/null
+++ b/src/Plot/util.hpp
@@ -0,0 +1,45 @@
+/*
+ * util.hpp
+ *
+ * Created on: Feb 23, 2016
+ * Author: i-bird
+ */
+
+#ifndef OPENFPM_IO_SRC_PLOT_UTIL_HPP_
+#define OPENFPM_IO_SRC_PLOT_UTIL_HPP_
+
+/*! \brief It fill the vector x with function values
+ *
+ * ### Define a function
+ * \snippet Plot_unit_tests.hpp Definition of a function
+ * ### Example vector with points on a specified range
+ * \snippet Plot_unit_tests.hpp fill a vector with a function
+ *
+ */
+template static inline void Fill1D(T start, T stop, size_t np, openfpm::vector & x,T f(T x))
+{
+ x.resize(np);
+
+ T spacing = (stop - start) / (np - 1);
+
+ for (size_t i = 0 ; i < np ; i++)
+ x.get(i) = f(start + i*spacing);
+}
+
+/*! \brief It fill the vector x with uniformly distributed set of points
+ *
+ * ### Example vector with points on a specified range
+ * \snippet Plot_unit_tests.hpp fill a vector
+ *
+ */
+template static inline void Fill1D(T start, T stop, size_t np, openfpm::vector & x)
+{
+ x.resize(np);
+
+ T spacing = (stop - start) / (np - 1);
+
+ for (size_t i = 0 ; i < np ; i++)
+ x.get(i) = start + i*spacing;
+}
+
+#endif /* OPENFPM_IO_SRC_PLOT_UTIL_HPP_ */
diff --git a/src/VTKWriter.hpp b/src/VTKWriter/VTKWriter.hpp
similarity index 93%
rename from src/VTKWriter.hpp
rename to src/VTKWriter/VTKWriter.hpp
index 8acb81ac9fa19642087ce32854d735e7dec28c54..caeb31f6b2acedfd51e317ec6a4d168f8451b7aa 100644
--- a/src/VTKWriter.hpp
+++ b/src/VTKWriter/VTKWriter.hpp
@@ -94,13 +94,15 @@ enum file_type
ASCII
};
-#define GRAPH 1
+#define VTK_GRAPH 1
#define VECTOR_BOX 2
#define VECTOR_GRIDS 3
#define VECTOR_ST_GRIDS 4
#define DIST_GRAPH 5
+#define VECTOR_POINTS 6
+#define VTK_WRITER 0x10000
-template
+template
class VTKWriter
{
@@ -111,5 +113,6 @@ class VTKWriter
#include "VTKWriter_grids.hpp"
#include "VTKWriter_grids_st.hpp"
#include "VTKWriter_dist_graph.hpp"
+#include "VTKWriter_point_set.hpp"
#endif /* VTKWRITER_HPP_ */
diff --git a/src/VTKWriter_graph.hpp b/src/VTKWriter/VTKWriter_graph.hpp
similarity index 99%
rename from src/VTKWriter_graph.hpp
rename to src/VTKWriter/VTKWriter_graph.hpp
index 8f59d13f134522c5e46947e26b8c1a001cd312cf..f896a2d3d5119a7032d0f94eaf3a918a12705ee2 100644
--- a/src/VTKWriter_graph.hpp
+++ b/src/VTKWriter/VTKWriter_graph.hpp
@@ -109,11 +109,10 @@ struct vtk_vertex_node
* \param n_obj object container to access its properties for example encapc<...>
*
*/
- vtk_vertex_node(std::string & v_node, typename G::V_container & n_obj, s_type (&x)[3]) :
- x(x), vo(n_obj), v_node(v_node), z_set(false)
+ vtk_vertex_node(std::string & v_node, typename G::V_container & n_obj, s_type (&x)[3])
+ :z_set(false),x(x),vo(n_obj),v_node(v_node)
{
}
- ;
//! \brief Write collected information
void write()
@@ -473,7 +472,7 @@ public:
// Check if T is a supported format
// for now we support only scalar of native type
- if (std::is_array::value == true && std::is_array::type>::value == false)
+ if (std::rank::value == 1)
{
//Get type of the property
type = getType::type>();
@@ -879,7 +878,7 @@ struct prop_out_edge
*/
template
-class VTKWriter
+class VTKWriter
{
const Graph & g;
@@ -971,7 +970,7 @@ class VTKWriter
vtk_vertex_node vn(v_out, obj, x);
// Iterate through all the vertex and create the vertex list
- boost::mpl::for_each >(vn);
+ boost::mpl::for_each >(vn);
// write the node string
vn.write();
diff --git a/src/VTKWriter_grids.hpp b/src/VTKWriter/VTKWriter_grids.hpp
similarity index 97%
rename from src/VTKWriter_grids.hpp
rename to src/VTKWriter/VTKWriter_grids.hpp
index 6b5fba6d1090127acadf8629b3ce5b20466a9910..52545d595223b7f3b743ed86f8bb4e019a8e46a5 100644
--- a/src/VTKWriter_grids.hpp
+++ b/src/VTKWriter/VTKWriter_grids.hpp
@@ -11,6 +11,12 @@
#include
#include "VTKWriter_grids_util.hpp"
+/*! \brief It store one grid
+ *
+ * \tparam Grid type of grid
+ * \tparam St type of space where the grid is defined
+ *
+ */
template
class ele_g
{
@@ -22,6 +28,7 @@ public:
:g(g),offset(offset),spacing(spacing),dom(dom)
{}
+ //! Dataset name
std::string dataset;
//! Grid
const Grid & g;
@@ -41,10 +48,8 @@ public:
* element of the boost::vector the operator() is called.
* Is mainly used to produce at output for each property
*
- * \tparam Graph graph we are processing
- *
- * \param dim Dimensionality
- * \param S type of grid
+ * \tparam ele_g element that store the grid and its attributes
+ * \param St type of space where the grid live
*
*/
diff --git a/src/VTKWriter_grids_st.hpp b/src/VTKWriter/VTKWriter_grids_st.hpp
similarity index 100%
rename from src/VTKWriter_grids_st.hpp
rename to src/VTKWriter/VTKWriter_grids_st.hpp
diff --git a/src/VTKWriter_grids_util.hpp b/src/VTKWriter/VTKWriter_grids_util.hpp
similarity index 72%
rename from src/VTKWriter_grids_util.hpp
rename to src/VTKWriter/VTKWriter_grids_util.hpp
index fa576b8961eb1cad491db1f87a68bda8f3ece868..246aa7303e8bead138e6dfb1092c8b0364624204 100644
--- a/src/VTKWriter_grids_util.hpp
+++ b/src/VTKWriter/VTKWriter_grids_util.hpp
@@ -69,26 +69,40 @@ public:
//! vertex node output string
std::string v_out;
- typedef typename boost::fusion::result_of::at>::type ctype;
+ typedef typename boost::mpl::at>::type ctype;
// Check if T is a supported format
// for now we support only scalar of native type
+ if (std::rank::value == 1)
+ {
+ //Get type of the property
+ std::string type = getType::type>();
- std::string type = getType();
+ // if the type is not supported skip-it
+ if (type.size() == 0)
+ {
+ std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " the type " << demangle(typeid(ctype).name()) << " is not supported by vtk\n";
+ return "";
+ }
- // if the type is not supported return
- // if the type is not supported return
- if (type.size() == 0)
- {
- std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " the type " << demangle(typeid(ctype).name()) << " is not supported by vtk\n";
- return "";
+ // Create point data properties
+ v_out += "VECTORS " + get_attributes("") + " " + type + "\n";
}
+ else
+ {
+ std::string type = getType();
- // Create point data properties
- v_out += "SCALARS " + get_attributes(oprp) + " " + type + "\n";
+ // if the type is not supported return
+ if (type.size() == 0)
+ return v_out;
- // Default lookup table
- v_out += "LOOKUP_TABLE default\n";
+ // Create point data properties
+ v_out += "SCALARS " + get_attributes(oprp) + " " + type + "\n";
+
+ // Default lookup table
+ v_out += "LOOKUP_TABLE default\n";
+
+ }
// return the vertex list
return v_out;
@@ -134,26 +148,40 @@ public:
//! vertex node output string
std::string v_out;
+ typedef typename boost::mpl::at>::type ctype;
+
// Check if T is a supported format
// for now we support only scalar of native type
+ if (std::rank::value == 1)
+ {
+ //Get type of the property
+ std::string type = getType::type>();
- typedef typename boost::mpl::at>::type ctype;
- typedef typename std::remove_all_extents::type vttype;
-
- std::string type = getType();
+ // if the type is not supported skip-it
+ if (type.size() == 0)
+ {
+ std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " the type " << demangle(typeid(ctype).name()) << " is not supported by vtk\n";
+ return "";
+ }
- // if the type is not supported return
- if (type.size() == 0)
- {
- std::cerr << "Error " << __FILE__ << ":" << __LINE__ << " the type " << demangle(typeid(ctype).name()) << " is not supported by vtk\n";
- return "";
+ // Create point data properties
+ v_out += "VECTORS " + get_attributes("") + " " + type + "\n";
}
+ else
+ {
+ std::string type = getType::type>();
+
+ // if the type is not supported return
+ if (type.size() == 0)
+ return v_out;
- // Create point data properties
- v_out += "SCALARS " + get_attributes(oprp) + " " + type + "\n";
+ // Create point data properties
+ v_out += "SCALARS " + get_attributes(oprp) + " " + type + "\n";
- // Default lookup table
- v_out += "LOOKUP_TABLE default\n";
+ // Default lookup table
+ v_out += "LOOKUP_TABLE default\n";
+
+ }
// return the vertex list
return v_out;
@@ -170,7 +198,10 @@ public:
/*! \brief This class is an helper to create properties output from scalar and compile-time array elements
*
- * This class is an helper to copy scalar and compile-time array elements
+ * \tparam I It is an boost::mpl::int_ that indicate which property we are writing
+ * \tparam ele_g element type that store the grid information
+ * \tparam St type of space where the grid live
+ * \tparam T the type of the property
*
*/
template
@@ -214,33 +245,38 @@ struct meta_prop
{
inline meta_prop(const openfpm::vector< ele_g > & vg, std::string & v_out)
{
- for (size_t i1 = 0 ; i1 < N1 ; i1++)
- {
- // actual string size
- size_t sz = v_out.size();
+ // actual string size
+ size_t sz = v_out.size();
- // Produce the point properties header
- v_out += prop_output_g::value,St ,ele_g,I::value>::get_point_property_header("_" + std::to_string(i1));
+ // Produce the point properties header
+ v_out += prop_output_g::value,St ,ele_g,I::value>::get_point_property_header("");
- // If the output has changed, we have to write the properties
- if (v_out.size() != sz)
+ // If the output has changed, we have to write the properties
+ if (v_out.size() != sz)
+ {
+ // Produce point data
+
+ for (size_t k = 0 ; k < vg.size() ; k++)
{
- // Produce point data
+ //! Get a vertex iterator
+ auto it = vg.get(k).g.getIterator();
- for (size_t k = 0 ; k < vg.size() ; k++)
+ // if there is the next element
+ while (it.isNext())
{
- //! Get a vertex iterator
- auto it = vg.get(k).g.getIterator();
-
- // if there is the next element
- while (it.isNext())
+ // Print the properties
+ for (size_t i1 = 0 ; i1 < N1 ; i1++)
{
- // Print the property
- v_out += std::to_string(vg.get(k).g.get_o(it.get()).template get()[i1]) + "\n";
-
- // increment the iterator and counter
- ++it;
+ v_out += std::to_string(vg.get(k).g.get_o(it.get()).template get()[i1]) + " ";
}
+ if (N1 == 2)
+ {
+ v_out += "0.0";
+ }
+ v_out += "\n";
+
+ // increment the iterator and counter
+ ++it;
}
}
}
diff --git a/src/VTKWriter/VTKWriter_point_set.hpp b/src/VTKWriter/VTKWriter_point_set.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7fac47715fc81ad97f32ff1edd1245449af39a28
--- /dev/null
+++ b/src/VTKWriter/VTKWriter_point_set.hpp
@@ -0,0 +1,394 @@
+/*
+ * 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
+#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
+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
+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
+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
+ void operator()(T& t) const
+ {
+ typedef typename boost::mpl::at>::type ptype;
+
+ meta_prop ,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
+ *
+ * where G is the type of the vector containing the properties, S is the
+ * type of vector containing the particle positions
+ *
+ */
+template
+class VTKWriter
+{
+ //! Vector of couple, position and properties
+ openfpm::vector< ele_vps> vps;
+ openfpm::vector< ele_vpp> 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 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 t1(vps,mark);
+ ele_vpp 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 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::first::value_type::coord_type> pp(point_data, vpp);
+
+ if (prp == -1)
+ boost::mpl::for_each< boost::mpl::range_c >(pp);
+ else
+ boost::mpl::for_each< boost::mpl::range_c >(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_ */
diff --git a/src/VTKWriter_unit_tests.hpp b/src/VTKWriter/VTKWriter_unit_tests.hpp
similarity index 88%
rename from src/VTKWriter_unit_tests.hpp
rename to src/VTKWriter/VTKWriter_unit_tests.hpp
index c34568a66a60e2712ba32d8a84e94e97c6f85f78..09dc9cab125cda1c9428a0bf958937a581a36684 100644
--- a/src/VTKWriter_unit_tests.hpp
+++ b/src/VTKWriter/VTKWriter_unit_tests.hpp
@@ -8,6 +8,11 @@
#ifndef VTKWRITER_UNIT_TESTS_HPP_
#define VTKWRITER_UNIT_TESTS_HPP_
+#include "data_type/aggregate.hpp"
+#include
+#include "VTKWriter.hpp"
+#include "util/SimpleRNG.hpp"
+
BOOST_AUTO_TEST_SUITE( vtk_writer_test )
/* \brief Sub-domain vertex graph node
@@ -195,7 +200,7 @@ BOOST_AUTO_TEST_CASE( vtk_writer_use_graph3D )
// Write the VTK file
- VTKWriter,GRAPH> vtk(gr);
+ VTKWriter,VTK_GRAPH> vtk(gr);
vtk.write("vtk_graph_v2.vtk");
// check that match
@@ -273,7 +278,7 @@ BOOST_AUTO_TEST_CASE( vtk_writer_use_graph3D_edge )
// Write the VTK file
- VTKWriter,GRAPH> vtk(gr);
+ VTKWriter,VTK_GRAPH> vtk(gr);
vtk.write("vtk_graph_v4.vtk");
// check that match
@@ -358,7 +363,7 @@ BOOST_AUTO_TEST_CASE( vtk_writer_use_graph2D )
// Write the VTK file
- VTKWriter,GRAPH> vtk(gr);
+ VTKWriter,VTK_GRAPH> vtk(gr);
vtk.write("vtk_graph_v3.vtk");
// check that match
@@ -438,7 +443,7 @@ BOOST_AUTO_TEST_CASE( vtk_writer_use_graph)
// Write the VTK file
- VTKWriter,GRAPH> vtk(gr);
+ VTKWriter,VTK_GRAPH> vtk(gr);
vtk.write("vtk_graph.vtk");
// check that match
@@ -754,6 +759,74 @@ BOOST_AUTO_TEST_CASE( vtk_writer_use_grids)
}
}
+BOOST_AUTO_TEST_CASE( vtk_writer_use_point_set )
+{
+ {
+ // Create 3 vectors with random particles
+ openfpm::vector> v1ps;
+ openfpm::vector> v2ps;
+ openfpm::vector> v3ps;
+ openfpm::vector> v1pp;
+ openfpm::vector> v2pp;
+ openfpm::vector> v3pp;
+
+ // set the seed
+ // create the random generator engine
+ SimpleRNG rng;
+
+ // fill the vector with random data
+ v1ps.resize(100);
+ v2ps.resize(100);
+ v3ps.resize(100);
+
+ v1pp.resize(100);
+ v2pp.resize(100);
+ v3pp.resize(100);
+
+ for (size_t i = 0 ; i < v1ps.size(); i++)
+ {
+ v1ps.template get<0>(i)[0] = rng.GetUniform();
+ v1ps.template get<0>(i)[1] = rng.GetUniform();
+ v1ps.template get<0>(i)[2] = rng.GetUniform();
+
+ v2ps.template get<0>(i)[0] = rng.GetUniform()*0.5;
+ v2ps.template get<0>(i)[1] = rng.GetUniform()*0.5;
+ v2ps.template get<0>(i)[2] = rng.GetUniform()*0.5;
+
+ v3ps.template get<0>(i)[0] = rng.GetUniform()*0.3;
+ v3ps.template get<0>(i)[1] = rng.GetUniform()*0.3;
+ v3ps.template get<0>(i)[2] = rng.GetUniform()*0.3;
+
+ v1pp.template get<0>(i) = rng.GetUniform();
+ v1pp.template get<1>(i)[0] = rng.GetUniform();
+ v1pp.template get<1>(i)[1] = rng.GetUniform();
+ v1pp.template get<1>(i)[2] = rng.GetUniform();
+
+ v2pp.template get<0>(i) = rng.GetUniform();
+ v2pp.template get<1>(i)[0] = rng.GetUniform();
+ v2pp.template get<1>(i)[1] = rng.GetUniform();
+ v2pp.template get<1>(i)[2] = rng.GetUniform();
+
+ v3pp.template get<0>(i) = rng.GetUniform();
+ v3pp.template get<1>(i)[0] = rng.GetUniform();
+ v3pp.template get<1>(i)[1] = rng.GetUniform();
+ v3pp.template get<1>(i)[2] = rng.GetUniform();
+ }
+
+ // Create a writer and write
+ VTKWriter>,openfpm::vector>>,VECTOR_POINTS> vtk_v;
+ vtk_v.add(v1ps,v1pp,75);
+ vtk_v.add(v2ps,v2pp,88);
+ vtk_v.add(v3ps,v3pp,90);
+
+ vtk_v.write("vtk_points.vtk");
+
+ // Check that match
+ bool test = compare("vtk_points.vtk","vtk_points_test.vtk");
+ BOOST_REQUIRE_EQUAL(test,true);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
#endif /* VTKWRITER_UNIT_TESTS_HPP_ */
diff --git a/src/VTKWriter_vector_box.hpp b/src/VTKWriter/VTKWriter_vector_box.hpp
similarity index 100%
rename from src/VTKWriter_vector_box.hpp
rename to src/VTKWriter/VTKWriter_vector_box.hpp
diff --git a/src/main.cpp b/src/main.cpp
index 7f156ab1716fc48d281fb667bce3fcb747f565a9..41909bf00eb45948330b6090fa841e2c42ff1dfe 100755
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -7,7 +7,8 @@
#include
#include "VCluster.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 "HDF5_XdmfWriter/HDF5_XdmfWriter_unit_tests.hpp"
+#include "Plot/Plot_unit_tests.hpp"
diff --git a/src/util.hpp b/src/util.hpp
index 9533c1d0a16235052d5075668433180cfb0753c2..0e69ba48f891e27bb076d26d8710f66e677959b1 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -21,7 +21,7 @@
* \return true if they match
*
*/
-bool compare(std::string file1, std::string file2)
+static inline bool compare(std::string file1, std::string file2)
{
boost::iostreams::mapped_file_source f1(file1);
boost::iostreams::mapped_file_source f2(file2);
@@ -65,12 +65,14 @@ struct RGB
*
*/
-struct RGB getColor(int group, std::uniform_real_distribution & d, std::default_random_engine & g)
+static inline struct RGB getColor(int group, std::uniform_real_distribution & d, std::default_random_engine & g)
{
struct RGB col;
float s = d(g);
+ group = group % 12;
+
#ifdef ON_IO_UNIT_TESTS
s = 0.5;
#endif
@@ -157,7 +159,7 @@ struct RGB getColor(int group, std::uniform_real_distribution & d, std::d
* \param ending ending string to check
*
*/
-bool hasEnding (std::string const &fullString, std::string const &ending)
+static inline bool hasEnding (std::string const &fullString, std::string const &ending)
{
if (fullString.length() >= ending.length())
{return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));}
diff --git a/test_graph2_test.graphml b/test_graph2_test.graphml
index 8239e46d7fe20987e6e01724d64a10bf8c5e6458..da443afbd0fe26b6a72dea6329f9b8ea8b80c29f 100644
--- a/test_graph2_test.graphml
+++ b/test_graph2_test.graphml
@@ -31,7 +31,7 @@
4.000000
5
6
- test
+ tes2
1.000000
@@ -40,7 +40,7 @@
4.000000
5
6
- test
+ test3
1.000000
@@ -49,7 +49,7 @@
4.000000
5
6
- test
+ test4
1.000000
@@ -58,7 +58,7 @@
4.000000
5
6
- test
+ test5
1.000000
@@ -67,7 +67,7 @@
4.000000
5
6
- test
+ test6
1.000000
@@ -76,7 +76,7 @@
4.000000
5
6
- test
+ test8
1.000000
@@ -85,7 +85,7 @@
4.000000
5
6
- test
+ test7
1.000000
@@ -94,7 +94,7 @@
4.000000
5
6
- test
+ test9
\ No newline at end of file
diff --git a/vtk_grids_test.vtk b/vtk_grids_test.vtk
index ffd8b56387f1eb86bc8600c53554c118966f213e..5e292278af14dc4d2f5993d5492aa0e25e427016 100644
--- a/vtk_grids_test.vtk
+++ b/vtk_grids_test.vtk
@@ -6157,3084 +6157,1031 @@ LOOKUP_TABLE default
1.000000
1.000000
1.000000
-SCALARS attr4_0 float
-LOOKUP_TABLE default
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-SCALARS attr4_1 float
-LOOKUP_TABLE default
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-SCALARS attr4_2 float
-LOOKUP_TABLE default
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
-0.000000
-1.000000
-2.000000
-3.000000
-4.000000
-5.000000
-6.000000
-7.000000
-8.000000
-9.000000
-10.000000
-11.000000
-12.000000
-13.000000
-14.000000
-15.000000
-16.000000
-17.000000
-18.000000
-19.000000
-20.000000
-21.000000
-22.000000
-23.000000
-24.000000
-25.000000
-26.000000
-27.000000
-28.000000
-29.000000
-30.000000
-31.000000
-32.000000
-33.000000
-34.000000
-35.000000
-36.000000
-37.000000
-38.000000
-39.000000
-40.000000
-41.000000
-42.000000
-43.000000
-44.000000
-45.000000
-46.000000
-47.000000
-48.000000
-49.000000
-50.000000
-51.000000
-52.000000
-53.000000
-54.000000
-55.000000
-56.000000
-57.000000
-58.000000
-59.000000
-60.000000
-61.000000
-62.000000
-63.000000
-64.000000
-65.000000
-66.000000
-67.000000
-68.000000
-69.000000
-70.000000
-71.000000
-72.000000
-73.000000
-74.000000
-75.000000
-76.000000
-77.000000
-78.000000
-79.000000
-80.000000
-81.000000
-82.000000
-83.000000
-84.000000
-85.000000
-86.000000
-87.000000
-88.000000
-89.000000
-90.000000
-91.000000
-92.000000
-93.000000
-94.000000
-95.000000
-96.000000
-97.000000
-98.000000
-99.000000
-100.000000
-101.000000
-102.000000
-103.000000
-104.000000
-105.000000
-106.000000
-107.000000
-108.000000
-109.000000
-110.000000
-111.000000
-112.000000
-113.000000
-114.000000
-115.000000
-116.000000
-117.000000
-118.000000
-119.000000
-120.000000
-121.000000
-122.000000
-123.000000
-124.000000
-125.000000
-126.000000
-127.000000
-128.000000
-129.000000
-130.000000
-131.000000
-132.000000
-133.000000
-134.000000
-135.000000
-136.000000
-137.000000
-138.000000
-139.000000
-140.000000
-141.000000
-142.000000
-143.000000
-144.000000
-145.000000
-146.000000
-147.000000
-148.000000
-149.000000
-150.000000
-151.000000
-152.000000
-153.000000
-154.000000
-155.000000
-156.000000
-157.000000
-158.000000
-159.000000
-160.000000
-161.000000
-162.000000
-163.000000
-164.000000
-165.000000
-166.000000
-167.000000
-168.000000
-169.000000
-170.000000
-171.000000
-172.000000
-173.000000
-174.000000
-175.000000
-176.000000
-177.000000
-178.000000
-179.000000
-180.000000
-181.000000
-182.000000
-183.000000
-184.000000
-185.000000
-186.000000
-187.000000
-188.000000
-189.000000
-190.000000
-191.000000
-192.000000
-193.000000
-194.000000
-195.000000
-196.000000
-197.000000
-198.000000
-199.000000
-200.000000
-201.000000
-202.000000
-203.000000
-204.000000
-205.000000
-206.000000
-207.000000
-208.000000
-209.000000
-210.000000
-211.000000
-212.000000
-213.000000
-214.000000
-215.000000
-216.000000
-217.000000
-218.000000
-219.000000
-220.000000
-221.000000
-222.000000
-223.000000
-224.000000
-225.000000
-226.000000
-227.000000
-228.000000
-229.000000
-230.000000
-231.000000
-232.000000
-233.000000
-234.000000
-235.000000
-236.000000
-237.000000
-238.000000
-239.000000
-240.000000
-241.000000
-242.000000
-243.000000
-244.000000
-245.000000
-246.000000
-247.000000
-248.000000
-249.000000
-250.000000
-251.000000
-252.000000
-253.000000
-254.000000
-255.000000
+VECTORS attr4 float
+0.000000 0.000000 0.000000
+1.000000 1.000000 1.000000
+2.000000 2.000000 2.000000
+3.000000 3.000000 3.000000
+4.000000 4.000000 4.000000
+5.000000 5.000000 5.000000
+6.000000 6.000000 6.000000
+7.000000 7.000000 7.000000
+8.000000 8.000000 8.000000
+9.000000 9.000000 9.000000
+10.000000 10.000000 10.000000
+11.000000 11.000000 11.000000
+12.000000 12.000000 12.000000
+13.000000 13.000000 13.000000
+14.000000 14.000000 14.000000
+15.000000 15.000000 15.000000
+16.000000 16.000000 16.000000
+17.000000 17.000000 17.000000
+18.000000 18.000000 18.000000
+19.000000 19.000000 19.000000
+20.000000 20.000000 20.000000
+21.000000 21.000000 21.000000
+22.000000 22.000000 22.000000
+23.000000 23.000000 23.000000
+24.000000 24.000000 24.000000
+25.000000 25.000000 25.000000
+26.000000 26.000000 26.000000
+27.000000 27.000000 27.000000
+28.000000 28.000000 28.000000
+29.000000 29.000000 29.000000
+30.000000 30.000000 30.000000
+31.000000 31.000000 31.000000
+32.000000 32.000000 32.000000
+33.000000 33.000000 33.000000
+34.000000 34.000000 34.000000
+35.000000 35.000000 35.000000
+36.000000 36.000000 36.000000
+37.000000 37.000000 37.000000
+38.000000 38.000000 38.000000
+39.000000 39.000000 39.000000
+40.000000 40.000000 40.000000
+41.000000 41.000000 41.000000
+42.000000 42.000000 42.000000
+43.000000 43.000000 43.000000
+44.000000 44.000000 44.000000
+45.000000 45.000000 45.000000
+46.000000 46.000000 46.000000
+47.000000 47.000000 47.000000
+48.000000 48.000000 48.000000
+49.000000 49.000000 49.000000
+50.000000 50.000000 50.000000
+51.000000 51.000000 51.000000
+52.000000 52.000000 52.000000
+53.000000 53.000000 53.000000
+54.000000 54.000000 54.000000
+55.000000 55.000000 55.000000
+56.000000 56.000000 56.000000
+57.000000 57.000000 57.000000
+58.000000 58.000000 58.000000
+59.000000 59.000000 59.000000
+60.000000 60.000000 60.000000
+61.000000 61.000000 61.000000
+62.000000 62.000000 62.000000
+63.000000 63.000000 63.000000
+64.000000 64.000000 64.000000
+65.000000 65.000000 65.000000
+66.000000 66.000000 66.000000
+67.000000 67.000000 67.000000
+68.000000 68.000000 68.000000
+69.000000 69.000000 69.000000
+70.000000 70.000000 70.000000
+71.000000 71.000000 71.000000
+72.000000 72.000000 72.000000
+73.000000 73.000000 73.000000
+74.000000 74.000000 74.000000
+75.000000 75.000000 75.000000
+76.000000 76.000000 76.000000
+77.000000 77.000000 77.000000
+78.000000 78.000000 78.000000
+79.000000 79.000000 79.000000
+80.000000 80.000000 80.000000
+81.000000 81.000000 81.000000
+82.000000 82.000000 82.000000
+83.000000 83.000000 83.000000
+84.000000 84.000000 84.000000
+85.000000 85.000000 85.000000
+86.000000 86.000000 86.000000
+87.000000 87.000000 87.000000
+88.000000 88.000000 88.000000
+89.000000 89.000000 89.000000
+90.000000 90.000000 90.000000
+91.000000 91.000000 91.000000
+92.000000 92.000000 92.000000
+93.000000 93.000000 93.000000
+94.000000 94.000000 94.000000
+95.000000 95.000000 95.000000
+96.000000 96.000000 96.000000
+97.000000 97.000000 97.000000
+98.000000 98.000000 98.000000
+99.000000 99.000000 99.000000
+100.000000 100.000000 100.000000
+101.000000 101.000000 101.000000
+102.000000 102.000000 102.000000
+103.000000 103.000000 103.000000
+104.000000 104.000000 104.000000
+105.000000 105.000000 105.000000
+106.000000 106.000000 106.000000
+107.000000 107.000000 107.000000
+108.000000 108.000000 108.000000
+109.000000 109.000000 109.000000
+110.000000 110.000000 110.000000
+111.000000 111.000000 111.000000
+112.000000 112.000000 112.000000
+113.000000 113.000000 113.000000
+114.000000 114.000000 114.000000
+115.000000 115.000000 115.000000
+116.000000 116.000000 116.000000
+117.000000 117.000000 117.000000
+118.000000 118.000000 118.000000
+119.000000 119.000000 119.000000
+120.000000 120.000000 120.000000
+121.000000 121.000000 121.000000
+122.000000 122.000000 122.000000
+123.000000 123.000000 123.000000
+124.000000 124.000000 124.000000
+125.000000 125.000000 125.000000
+126.000000 126.000000 126.000000
+127.000000 127.000000 127.000000
+128.000000 128.000000 128.000000
+129.000000 129.000000 129.000000
+130.000000 130.000000 130.000000
+131.000000 131.000000 131.000000
+132.000000 132.000000 132.000000
+133.000000 133.000000 133.000000
+134.000000 134.000000 134.000000
+135.000000 135.000000 135.000000
+136.000000 136.000000 136.000000
+137.000000 137.000000 137.000000
+138.000000 138.000000 138.000000
+139.000000 139.000000 139.000000
+140.000000 140.000000 140.000000
+141.000000 141.000000 141.000000
+142.000000 142.000000 142.000000
+143.000000 143.000000 143.000000
+144.000000 144.000000 144.000000
+145.000000 145.000000 145.000000
+146.000000 146.000000 146.000000
+147.000000 147.000000 147.000000
+148.000000 148.000000 148.000000
+149.000000 149.000000 149.000000
+150.000000 150.000000 150.000000
+151.000000 151.000000 151.000000
+152.000000 152.000000 152.000000
+153.000000 153.000000 153.000000
+154.000000 154.000000 154.000000
+155.000000 155.000000 155.000000
+156.000000 156.000000 156.000000
+157.000000 157.000000 157.000000
+158.000000 158.000000 158.000000
+159.000000 159.000000 159.000000
+160.000000 160.000000 160.000000
+161.000000 161.000000 161.000000
+162.000000 162.000000 162.000000
+163.000000 163.000000 163.000000
+164.000000 164.000000 164.000000
+165.000000 165.000000 165.000000
+166.000000 166.000000 166.000000
+167.000000 167.000000 167.000000
+168.000000 168.000000 168.000000
+169.000000 169.000000 169.000000
+170.000000 170.000000 170.000000
+171.000000 171.000000 171.000000
+172.000000 172.000000 172.000000
+173.000000 173.000000 173.000000
+174.000000 174.000000 174.000000
+175.000000 175.000000 175.000000
+176.000000 176.000000 176.000000
+177.000000 177.000000 177.000000
+178.000000 178.000000 178.000000
+179.000000 179.000000 179.000000
+180.000000 180.000000 180.000000
+181.000000 181.000000 181.000000
+182.000000 182.000000 182.000000
+183.000000 183.000000 183.000000
+184.000000 184.000000 184.000000
+185.000000 185.000000 185.000000
+186.000000 186.000000 186.000000
+187.000000 187.000000 187.000000
+188.000000 188.000000 188.000000
+189.000000 189.000000 189.000000
+190.000000 190.000000 190.000000
+191.000000 191.000000 191.000000
+192.000000 192.000000 192.000000
+193.000000 193.000000 193.000000
+194.000000 194.000000 194.000000
+195.000000 195.000000 195.000000
+196.000000 196.000000 196.000000
+197.000000 197.000000 197.000000
+198.000000 198.000000 198.000000
+199.000000 199.000000 199.000000
+200.000000 200.000000 200.000000
+201.000000 201.000000 201.000000
+202.000000 202.000000 202.000000
+203.000000 203.000000 203.000000
+204.000000 204.000000 204.000000
+205.000000 205.000000 205.000000
+206.000000 206.000000 206.000000
+207.000000 207.000000 207.000000
+208.000000 208.000000 208.000000
+209.000000 209.000000 209.000000
+210.000000 210.000000 210.000000
+211.000000 211.000000 211.000000
+212.000000 212.000000 212.000000
+213.000000 213.000000 213.000000
+214.000000 214.000000 214.000000
+215.000000 215.000000 215.000000
+216.000000 216.000000 216.000000
+217.000000 217.000000 217.000000
+218.000000 218.000000 218.000000
+219.000000 219.000000 219.000000
+220.000000 220.000000 220.000000
+221.000000 221.000000 221.000000
+222.000000 222.000000 222.000000
+223.000000 223.000000 223.000000
+224.000000 224.000000 224.000000
+225.000000 225.000000 225.000000
+226.000000 226.000000 226.000000
+227.000000 227.000000 227.000000
+228.000000 228.000000 228.000000
+229.000000 229.000000 229.000000
+230.000000 230.000000 230.000000
+231.000000 231.000000 231.000000
+232.000000 232.000000 232.000000
+233.000000 233.000000 233.000000
+234.000000 234.000000 234.000000
+235.000000 235.000000 235.000000
+236.000000 236.000000 236.000000
+237.000000 237.000000 237.000000
+238.000000 238.000000 238.000000
+239.000000 239.000000 239.000000
+240.000000 240.000000 240.000000
+241.000000 241.000000 241.000000
+242.000000 242.000000 242.000000
+243.000000 243.000000 243.000000
+244.000000 244.000000 244.000000
+245.000000 245.000000 245.000000
+246.000000 246.000000 246.000000
+247.000000 247.000000 247.000000
+248.000000 248.000000 248.000000
+249.000000 249.000000 249.000000
+250.000000 250.000000 250.000000
+251.000000 251.000000 251.000000
+252.000000 252.000000 252.000000
+253.000000 253.000000 253.000000
+254.000000 254.000000 254.000000
+255.000000 255.000000 255.000000
+0.000000 0.000000 0.000000
+1.000000 1.000000 1.000000
+2.000000 2.000000 2.000000
+3.000000 3.000000 3.000000
+4.000000 4.000000 4.000000
+5.000000 5.000000 5.000000
+6.000000 6.000000 6.000000
+7.000000 7.000000 7.000000
+8.000000 8.000000 8.000000
+9.000000 9.000000 9.000000
+10.000000 10.000000 10.000000
+11.000000 11.000000 11.000000
+12.000000 12.000000 12.000000
+13.000000 13.000000 13.000000
+14.000000 14.000000 14.000000
+15.000000 15.000000 15.000000
+16.000000 16.000000 16.000000
+17.000000 17.000000 17.000000
+18.000000 18.000000 18.000000
+19.000000 19.000000 19.000000
+20.000000 20.000000 20.000000
+21.000000 21.000000 21.000000
+22.000000 22.000000 22.000000
+23.000000 23.000000 23.000000
+24.000000 24.000000 24.000000
+25.000000 25.000000 25.000000
+26.000000 26.000000 26.000000
+27.000000 27.000000 27.000000
+28.000000 28.000000 28.000000
+29.000000 29.000000 29.000000
+30.000000 30.000000 30.000000
+31.000000 31.000000 31.000000
+32.000000 32.000000 32.000000
+33.000000 33.000000 33.000000
+34.000000 34.000000 34.000000
+35.000000 35.000000 35.000000
+36.000000 36.000000 36.000000
+37.000000 37.000000 37.000000
+38.000000 38.000000 38.000000
+39.000000 39.000000 39.000000
+40.000000 40.000000 40.000000
+41.000000 41.000000 41.000000
+42.000000 42.000000 42.000000
+43.000000 43.000000 43.000000
+44.000000 44.000000 44.000000
+45.000000 45.000000 45.000000
+46.000000 46.000000 46.000000
+47.000000 47.000000 47.000000
+48.000000 48.000000 48.000000
+49.000000 49.000000 49.000000
+50.000000 50.000000 50.000000
+51.000000 51.000000 51.000000
+52.000000 52.000000 52.000000
+53.000000 53.000000 53.000000
+54.000000 54.000000 54.000000
+55.000000 55.000000 55.000000
+56.000000 56.000000 56.000000
+57.000000 57.000000 57.000000
+58.000000 58.000000 58.000000
+59.000000 59.000000 59.000000
+60.000000 60.000000 60.000000
+61.000000 61.000000 61.000000
+62.000000 62.000000 62.000000
+63.000000 63.000000 63.000000
+64.000000 64.000000 64.000000
+65.000000 65.000000 65.000000
+66.000000 66.000000 66.000000
+67.000000 67.000000 67.000000
+68.000000 68.000000 68.000000
+69.000000 69.000000 69.000000
+70.000000 70.000000 70.000000
+71.000000 71.000000 71.000000
+72.000000 72.000000 72.000000
+73.000000 73.000000 73.000000
+74.000000 74.000000 74.000000
+75.000000 75.000000 75.000000
+76.000000 76.000000 76.000000
+77.000000 77.000000 77.000000
+78.000000 78.000000 78.000000
+79.000000 79.000000 79.000000
+80.000000 80.000000 80.000000
+81.000000 81.000000 81.000000
+82.000000 82.000000 82.000000
+83.000000 83.000000 83.000000
+84.000000 84.000000 84.000000
+85.000000 85.000000 85.000000
+86.000000 86.000000 86.000000
+87.000000 87.000000 87.000000
+88.000000 88.000000 88.000000
+89.000000 89.000000 89.000000
+90.000000 90.000000 90.000000
+91.000000 91.000000 91.000000
+92.000000 92.000000 92.000000
+93.000000 93.000000 93.000000
+94.000000 94.000000 94.000000
+95.000000 95.000000 95.000000
+96.000000 96.000000 96.000000
+97.000000 97.000000 97.000000
+98.000000 98.000000 98.000000
+99.000000 99.000000 99.000000
+100.000000 100.000000 100.000000
+101.000000 101.000000 101.000000
+102.000000 102.000000 102.000000
+103.000000 103.000000 103.000000
+104.000000 104.000000 104.000000
+105.000000 105.000000 105.000000
+106.000000 106.000000 106.000000
+107.000000 107.000000 107.000000
+108.000000 108.000000 108.000000
+109.000000 109.000000 109.000000
+110.000000 110.000000 110.000000
+111.000000 111.000000 111.000000
+112.000000 112.000000 112.000000
+113.000000 113.000000 113.000000
+114.000000 114.000000 114.000000
+115.000000 115.000000 115.000000
+116.000000 116.000000 116.000000
+117.000000 117.000000 117.000000
+118.000000 118.000000 118.000000
+119.000000 119.000000 119.000000
+120.000000 120.000000 120.000000
+121.000000 121.000000 121.000000
+122.000000 122.000000 122.000000
+123.000000 123.000000 123.000000
+124.000000 124.000000 124.000000
+125.000000 125.000000 125.000000
+126.000000 126.000000 126.000000
+127.000000 127.000000 127.000000
+128.000000 128.000000 128.000000
+129.000000 129.000000 129.000000
+130.000000 130.000000 130.000000
+131.000000 131.000000 131.000000
+132.000000 132.000000 132.000000
+133.000000 133.000000 133.000000
+134.000000 134.000000 134.000000
+135.000000 135.000000 135.000000
+136.000000 136.000000 136.000000
+137.000000 137.000000 137.000000
+138.000000 138.000000 138.000000
+139.000000 139.000000 139.000000
+140.000000 140.000000 140.000000
+141.000000 141.000000 141.000000
+142.000000 142.000000 142.000000
+143.000000 143.000000 143.000000
+144.000000 144.000000 144.000000
+145.000000 145.000000 145.000000
+146.000000 146.000000 146.000000
+147.000000 147.000000 147.000000
+148.000000 148.000000 148.000000
+149.000000 149.000000 149.000000
+150.000000 150.000000 150.000000
+151.000000 151.000000 151.000000
+152.000000 152.000000 152.000000
+153.000000 153.000000 153.000000
+154.000000 154.000000 154.000000
+155.000000 155.000000 155.000000
+156.000000 156.000000 156.000000
+157.000000 157.000000 157.000000
+158.000000 158.000000 158.000000
+159.000000 159.000000 159.000000
+160.000000 160.000000 160.000000
+161.000000 161.000000 161.000000
+162.000000 162.000000 162.000000
+163.000000 163.000000 163.000000
+164.000000 164.000000 164.000000
+165.000000 165.000000 165.000000
+166.000000 166.000000 166.000000
+167.000000 167.000000 167.000000
+168.000000 168.000000 168.000000
+169.000000 169.000000 169.000000
+170.000000 170.000000 170.000000
+171.000000 171.000000 171.000000
+172.000000 172.000000 172.000000
+173.000000 173.000000 173.000000
+174.000000 174.000000 174.000000
+175.000000 175.000000 175.000000
+176.000000 176.000000 176.000000
+177.000000 177.000000 177.000000
+178.000000 178.000000 178.000000
+179.000000 179.000000 179.000000
+180.000000 180.000000 180.000000
+181.000000 181.000000 181.000000
+182.000000 182.000000 182.000000
+183.000000 183.000000 183.000000
+184.000000 184.000000 184.000000
+185.000000 185.000000 185.000000
+186.000000 186.000000 186.000000
+187.000000 187.000000 187.000000
+188.000000 188.000000 188.000000
+189.000000 189.000000 189.000000
+190.000000 190.000000 190.000000
+191.000000 191.000000 191.000000
+192.000000 192.000000 192.000000
+193.000000 193.000000 193.000000
+194.000000 194.000000 194.000000
+195.000000 195.000000 195.000000
+196.000000 196.000000 196.000000
+197.000000 197.000000 197.000000
+198.000000 198.000000 198.000000
+199.000000 199.000000 199.000000
+200.000000 200.000000 200.000000
+201.000000 201.000000 201.000000
+202.000000 202.000000 202.000000
+203.000000 203.000000 203.000000
+204.000000 204.000000 204.000000
+205.000000 205.000000 205.000000
+206.000000 206.000000 206.000000
+207.000000 207.000000 207.000000
+208.000000 208.000000 208.000000
+209.000000 209.000000 209.000000
+210.000000 210.000000 210.000000
+211.000000 211.000000 211.000000
+212.000000 212.000000 212.000000
+213.000000 213.000000 213.000000
+214.000000 214.000000 214.000000
+215.000000 215.000000 215.000000
+216.000000 216.000000 216.000000
+217.000000 217.000000 217.000000
+218.000000 218.000000 218.000000
+219.000000 219.000000 219.000000
+220.000000 220.000000 220.000000
+221.000000 221.000000 221.000000
+222.000000 222.000000 222.000000
+223.000000 223.000000 223.000000
+224.000000 224.000000 224.000000
+225.000000 225.000000 225.000000
+226.000000 226.000000 226.000000
+227.000000 227.000000 227.000000
+228.000000 228.000000 228.000000
+229.000000 229.000000 229.000000
+230.000000 230.000000 230.000000
+231.000000 231.000000 231.000000
+232.000000 232.000000 232.000000
+233.000000 233.000000 233.000000
+234.000000 234.000000 234.000000
+235.000000 235.000000 235.000000
+236.000000 236.000000 236.000000
+237.000000 237.000000 237.000000
+238.000000 238.000000 238.000000
+239.000000 239.000000 239.000000
+240.000000 240.000000 240.000000
+241.000000 241.000000 241.000000
+242.000000 242.000000 242.000000
+243.000000 243.000000 243.000000
+244.000000 244.000000 244.000000
+245.000000 245.000000 245.000000
+246.000000 246.000000 246.000000
+247.000000 247.000000 247.000000
+248.000000 248.000000 248.000000
+249.000000 249.000000 249.000000
+250.000000 250.000000 250.000000
+251.000000 251.000000 251.000000
+252.000000 252.000000 252.000000
+253.000000 253.000000 253.000000
+254.000000 254.000000 254.000000
+255.000000 255.000000 255.000000
+0.000000 0.000000 0.000000
+1.000000 1.000000 1.000000
+2.000000 2.000000 2.000000
+3.000000 3.000000 3.000000
+4.000000 4.000000 4.000000
+5.000000 5.000000 5.000000
+6.000000 6.000000 6.000000
+7.000000 7.000000 7.000000
+8.000000 8.000000 8.000000
+9.000000 9.000000 9.000000
+10.000000 10.000000 10.000000
+11.000000 11.000000 11.000000
+12.000000 12.000000 12.000000
+13.000000 13.000000 13.000000
+14.000000 14.000000 14.000000
+15.000000 15.000000 15.000000
+16.000000 16.000000 16.000000
+17.000000 17.000000 17.000000
+18.000000 18.000000 18.000000
+19.000000 19.000000 19.000000
+20.000000 20.000000 20.000000
+21.000000 21.000000 21.000000
+22.000000 22.000000 22.000000
+23.000000 23.000000 23.000000
+24.000000 24.000000 24.000000
+25.000000 25.000000 25.000000
+26.000000 26.000000 26.000000
+27.000000 27.000000 27.000000
+28.000000 28.000000 28.000000
+29.000000 29.000000 29.000000
+30.000000 30.000000 30.000000
+31.000000 31.000000 31.000000
+32.000000 32.000000 32.000000
+33.000000 33.000000 33.000000
+34.000000 34.000000 34.000000
+35.000000 35.000000 35.000000
+36.000000 36.000000 36.000000
+37.000000 37.000000 37.000000
+38.000000 38.000000 38.000000
+39.000000 39.000000 39.000000
+40.000000 40.000000 40.000000
+41.000000 41.000000 41.000000
+42.000000 42.000000 42.000000
+43.000000 43.000000 43.000000
+44.000000 44.000000 44.000000
+45.000000 45.000000 45.000000
+46.000000 46.000000 46.000000
+47.000000 47.000000 47.000000
+48.000000 48.000000 48.000000
+49.000000 49.000000 49.000000
+50.000000 50.000000 50.000000
+51.000000 51.000000 51.000000
+52.000000 52.000000 52.000000
+53.000000 53.000000 53.000000
+54.000000 54.000000 54.000000
+55.000000 55.000000 55.000000
+56.000000 56.000000 56.000000
+57.000000 57.000000 57.000000
+58.000000 58.000000 58.000000
+59.000000 59.000000 59.000000
+60.000000 60.000000 60.000000
+61.000000 61.000000 61.000000
+62.000000 62.000000 62.000000
+63.000000 63.000000 63.000000
+64.000000 64.000000 64.000000
+65.000000 65.000000 65.000000
+66.000000 66.000000 66.000000
+67.000000 67.000000 67.000000
+68.000000 68.000000 68.000000
+69.000000 69.000000 69.000000
+70.000000 70.000000 70.000000
+71.000000 71.000000 71.000000
+72.000000 72.000000 72.000000
+73.000000 73.000000 73.000000
+74.000000 74.000000 74.000000
+75.000000 75.000000 75.000000
+76.000000 76.000000 76.000000
+77.000000 77.000000 77.000000
+78.000000 78.000000 78.000000
+79.000000 79.000000 79.000000
+80.000000 80.000000 80.000000
+81.000000 81.000000 81.000000
+82.000000 82.000000 82.000000
+83.000000 83.000000 83.000000
+84.000000 84.000000 84.000000
+85.000000 85.000000 85.000000
+86.000000 86.000000 86.000000
+87.000000 87.000000 87.000000
+88.000000 88.000000 88.000000
+89.000000 89.000000 89.000000
+90.000000 90.000000 90.000000
+91.000000 91.000000 91.000000
+92.000000 92.000000 92.000000
+93.000000 93.000000 93.000000
+94.000000 94.000000 94.000000
+95.000000 95.000000 95.000000
+96.000000 96.000000 96.000000
+97.000000 97.000000 97.000000
+98.000000 98.000000 98.000000
+99.000000 99.000000 99.000000
+100.000000 100.000000 100.000000
+101.000000 101.000000 101.000000
+102.000000 102.000000 102.000000
+103.000000 103.000000 103.000000
+104.000000 104.000000 104.000000
+105.000000 105.000000 105.000000
+106.000000 106.000000 106.000000
+107.000000 107.000000 107.000000
+108.000000 108.000000 108.000000
+109.000000 109.000000 109.000000
+110.000000 110.000000 110.000000
+111.000000 111.000000 111.000000
+112.000000 112.000000 112.000000
+113.000000 113.000000 113.000000
+114.000000 114.000000 114.000000
+115.000000 115.000000 115.000000
+116.000000 116.000000 116.000000
+117.000000 117.000000 117.000000
+118.000000 118.000000 118.000000
+119.000000 119.000000 119.000000
+120.000000 120.000000 120.000000
+121.000000 121.000000 121.000000
+122.000000 122.000000 122.000000
+123.000000 123.000000 123.000000
+124.000000 124.000000 124.000000
+125.000000 125.000000 125.000000
+126.000000 126.000000 126.000000
+127.000000 127.000000 127.000000
+128.000000 128.000000 128.000000
+129.000000 129.000000 129.000000
+130.000000 130.000000 130.000000
+131.000000 131.000000 131.000000
+132.000000 132.000000 132.000000
+133.000000 133.000000 133.000000
+134.000000 134.000000 134.000000
+135.000000 135.000000 135.000000
+136.000000 136.000000 136.000000
+137.000000 137.000000 137.000000
+138.000000 138.000000 138.000000
+139.000000 139.000000 139.000000
+140.000000 140.000000 140.000000
+141.000000 141.000000 141.000000
+142.000000 142.000000 142.000000
+143.000000 143.000000 143.000000
+144.000000 144.000000 144.000000
+145.000000 145.000000 145.000000
+146.000000 146.000000 146.000000
+147.000000 147.000000 147.000000
+148.000000 148.000000 148.000000
+149.000000 149.000000 149.000000
+150.000000 150.000000 150.000000
+151.000000 151.000000 151.000000
+152.000000 152.000000 152.000000
+153.000000 153.000000 153.000000
+154.000000 154.000000 154.000000
+155.000000 155.000000 155.000000
+156.000000 156.000000 156.000000
+157.000000 157.000000 157.000000
+158.000000 158.000000 158.000000
+159.000000 159.000000 159.000000
+160.000000 160.000000 160.000000
+161.000000 161.000000 161.000000
+162.000000 162.000000 162.000000
+163.000000 163.000000 163.000000
+164.000000 164.000000 164.000000
+165.000000 165.000000 165.000000
+166.000000 166.000000 166.000000
+167.000000 167.000000 167.000000
+168.000000 168.000000 168.000000
+169.000000 169.000000 169.000000
+170.000000 170.000000 170.000000
+171.000000 171.000000 171.000000
+172.000000 172.000000 172.000000
+173.000000 173.000000 173.000000
+174.000000 174.000000 174.000000
+175.000000 175.000000 175.000000
+176.000000 176.000000 176.000000
+177.000000 177.000000 177.000000
+178.000000 178.000000 178.000000
+179.000000 179.000000 179.000000
+180.000000 180.000000 180.000000
+181.000000 181.000000 181.000000
+182.000000 182.000000 182.000000
+183.000000 183.000000 183.000000
+184.000000 184.000000 184.000000
+185.000000 185.000000 185.000000
+186.000000 186.000000 186.000000
+187.000000 187.000000 187.000000
+188.000000 188.000000 188.000000
+189.000000 189.000000 189.000000
+190.000000 190.000000 190.000000
+191.000000 191.000000 191.000000
+192.000000 192.000000 192.000000
+193.000000 193.000000 193.000000
+194.000000 194.000000 194.000000
+195.000000 195.000000 195.000000
+196.000000 196.000000 196.000000
+197.000000 197.000000 197.000000
+198.000000 198.000000 198.000000
+199.000000 199.000000 199.000000
+200.000000 200.000000 200.000000
+201.000000 201.000000 201.000000
+202.000000 202.000000 202.000000
+203.000000 203.000000 203.000000
+204.000000 204.000000 204.000000
+205.000000 205.000000 205.000000
+206.000000 206.000000 206.000000
+207.000000 207.000000 207.000000
+208.000000 208.000000 208.000000
+209.000000 209.000000 209.000000
+210.000000 210.000000 210.000000
+211.000000 211.000000 211.000000
+212.000000 212.000000 212.000000
+213.000000 213.000000 213.000000
+214.000000 214.000000 214.000000
+215.000000 215.000000 215.000000
+216.000000 216.000000 216.000000
+217.000000 217.000000 217.000000
+218.000000 218.000000 218.000000
+219.000000 219.000000 219.000000
+220.000000 220.000000 220.000000
+221.000000 221.000000 221.000000
+222.000000 222.000000 222.000000
+223.000000 223.000000 223.000000
+224.000000 224.000000 224.000000
+225.000000 225.000000 225.000000
+226.000000 226.000000 226.000000
+227.000000 227.000000 227.000000
+228.000000 228.000000 228.000000
+229.000000 229.000000 229.000000
+230.000000 230.000000 230.000000
+231.000000 231.000000 231.000000
+232.000000 232.000000 232.000000
+233.000000 233.000000 233.000000
+234.000000 234.000000 234.000000
+235.000000 235.000000 235.000000
+236.000000 236.000000 236.000000
+237.000000 237.000000 237.000000
+238.000000 238.000000 238.000000
+239.000000 239.000000 239.000000
+240.000000 240.000000 240.000000
+241.000000 241.000000 241.000000
+242.000000 242.000000 242.000000
+243.000000 243.000000 243.000000
+244.000000 244.000000 244.000000
+245.000000 245.000000 245.000000
+246.000000 246.000000 246.000000
+247.000000 247.000000 247.000000
+248.000000 248.000000 248.000000
+249.000000 249.000000 249.000000
+250.000000 250.000000 250.000000
+251.000000 251.000000 251.000000
+252.000000 252.000000 252.000000
+253.000000 253.000000 253.000000
+254.000000 254.000000 254.000000
+255.000000 255.000000 255.000000
+0.000000 0.000000 0.000000
+1.000000 1.000000 1.000000
+2.000000 2.000000 2.000000
+3.000000 3.000000 3.000000
+4.000000 4.000000 4.000000
+5.000000 5.000000 5.000000
+6.000000 6.000000 6.000000
+7.000000 7.000000 7.000000
+8.000000 8.000000 8.000000
+9.000000 9.000000 9.000000
+10.000000 10.000000 10.000000
+11.000000 11.000000 11.000000
+12.000000 12.000000 12.000000
+13.000000 13.000000 13.000000
+14.000000 14.000000 14.000000
+15.000000 15.000000 15.000000
+16.000000 16.000000 16.000000
+17.000000 17.000000 17.000000
+18.000000 18.000000 18.000000
+19.000000 19.000000 19.000000
+20.000000 20.000000 20.000000
+21.000000 21.000000 21.000000
+22.000000 22.000000 22.000000
+23.000000 23.000000 23.000000
+24.000000 24.000000 24.000000
+25.000000 25.000000 25.000000
+26.000000 26.000000 26.000000
+27.000000 27.000000 27.000000
+28.000000 28.000000 28.000000
+29.000000 29.000000 29.000000
+30.000000 30.000000 30.000000
+31.000000 31.000000 31.000000
+32.000000 32.000000 32.000000
+33.000000 33.000000 33.000000
+34.000000 34.000000 34.000000
+35.000000 35.000000 35.000000
+36.000000 36.000000 36.000000
+37.000000 37.000000 37.000000
+38.000000 38.000000 38.000000
+39.000000 39.000000 39.000000
+40.000000 40.000000 40.000000
+41.000000 41.000000 41.000000
+42.000000 42.000000 42.000000
+43.000000 43.000000 43.000000
+44.000000 44.000000 44.000000
+45.000000 45.000000 45.000000
+46.000000 46.000000 46.000000
+47.000000 47.000000 47.000000
+48.000000 48.000000 48.000000
+49.000000 49.000000 49.000000
+50.000000 50.000000 50.000000
+51.000000 51.000000 51.000000
+52.000000 52.000000 52.000000
+53.000000 53.000000 53.000000
+54.000000 54.000000 54.000000
+55.000000 55.000000 55.000000
+56.000000 56.000000 56.000000
+57.000000 57.000000 57.000000
+58.000000 58.000000 58.000000
+59.000000 59.000000 59.000000
+60.000000 60.000000 60.000000
+61.000000 61.000000 61.000000
+62.000000 62.000000 62.000000
+63.000000 63.000000 63.000000
+64.000000 64.000000 64.000000
+65.000000 65.000000 65.000000
+66.000000 66.000000 66.000000
+67.000000 67.000000 67.000000
+68.000000 68.000000 68.000000
+69.000000 69.000000 69.000000
+70.000000 70.000000 70.000000
+71.000000 71.000000 71.000000
+72.000000 72.000000 72.000000
+73.000000 73.000000 73.000000
+74.000000 74.000000 74.000000
+75.000000 75.000000 75.000000
+76.000000 76.000000 76.000000
+77.000000 77.000000 77.000000
+78.000000 78.000000 78.000000
+79.000000 79.000000 79.000000
+80.000000 80.000000 80.000000
+81.000000 81.000000 81.000000
+82.000000 82.000000 82.000000
+83.000000 83.000000 83.000000
+84.000000 84.000000 84.000000
+85.000000 85.000000 85.000000
+86.000000 86.000000 86.000000
+87.000000 87.000000 87.000000
+88.000000 88.000000 88.000000
+89.000000 89.000000 89.000000
+90.000000 90.000000 90.000000
+91.000000 91.000000 91.000000
+92.000000 92.000000 92.000000
+93.000000 93.000000 93.000000
+94.000000 94.000000 94.000000
+95.000000 95.000000 95.000000
+96.000000 96.000000 96.000000
+97.000000 97.000000 97.000000
+98.000000 98.000000 98.000000
+99.000000 99.000000 99.000000
+100.000000 100.000000 100.000000
+101.000000 101.000000 101.000000
+102.000000 102.000000 102.000000
+103.000000 103.000000 103.000000
+104.000000 104.000000 104.000000
+105.000000 105.000000 105.000000
+106.000000 106.000000 106.000000
+107.000000 107.000000 107.000000
+108.000000 108.000000 108.000000
+109.000000 109.000000 109.000000
+110.000000 110.000000 110.000000
+111.000000 111.000000 111.000000
+112.000000 112.000000 112.000000
+113.000000 113.000000 113.000000
+114.000000 114.000000 114.000000
+115.000000 115.000000 115.000000
+116.000000 116.000000 116.000000
+117.000000 117.000000 117.000000
+118.000000 118.000000 118.000000
+119.000000 119.000000 119.000000
+120.000000 120.000000 120.000000
+121.000000 121.000000 121.000000
+122.000000 122.000000 122.000000
+123.000000 123.000000 123.000000
+124.000000 124.000000 124.000000
+125.000000 125.000000 125.000000
+126.000000 126.000000 126.000000
+127.000000 127.000000 127.000000
+128.000000 128.000000 128.000000
+129.000000 129.000000 129.000000
+130.000000 130.000000 130.000000
+131.000000 131.000000 131.000000
+132.000000 132.000000 132.000000
+133.000000 133.000000 133.000000
+134.000000 134.000000 134.000000
+135.000000 135.000000 135.000000
+136.000000 136.000000 136.000000
+137.000000 137.000000 137.000000
+138.000000 138.000000 138.000000
+139.000000 139.000000 139.000000
+140.000000 140.000000 140.000000
+141.000000 141.000000 141.000000
+142.000000 142.000000 142.000000
+143.000000 143.000000 143.000000
+144.000000 144.000000 144.000000
+145.000000 145.000000 145.000000
+146.000000 146.000000 146.000000
+147.000000 147.000000 147.000000
+148.000000 148.000000 148.000000
+149.000000 149.000000 149.000000
+150.000000 150.000000 150.000000
+151.000000 151.000000 151.000000
+152.000000 152.000000 152.000000
+153.000000 153.000000 153.000000
+154.000000 154.000000 154.000000
+155.000000 155.000000 155.000000
+156.000000 156.000000 156.000000
+157.000000 157.000000 157.000000
+158.000000 158.000000 158.000000
+159.000000 159.000000 159.000000
+160.000000 160.000000 160.000000
+161.000000 161.000000 161.000000
+162.000000 162.000000 162.000000
+163.000000 163.000000 163.000000
+164.000000 164.000000 164.000000
+165.000000 165.000000 165.000000
+166.000000 166.000000 166.000000
+167.000000 167.000000 167.000000
+168.000000 168.000000 168.000000
+169.000000 169.000000 169.000000
+170.000000 170.000000 170.000000
+171.000000 171.000000 171.000000
+172.000000 172.000000 172.000000
+173.000000 173.000000 173.000000
+174.000000 174.000000 174.000000
+175.000000 175.000000 175.000000
+176.000000 176.000000 176.000000
+177.000000 177.000000 177.000000
+178.000000 178.000000 178.000000
+179.000000 179.000000 179.000000
+180.000000 180.000000 180.000000
+181.000000 181.000000 181.000000
+182.000000 182.000000 182.000000
+183.000000 183.000000 183.000000
+184.000000 184.000000 184.000000
+185.000000 185.000000 185.000000
+186.000000 186.000000 186.000000
+187.000000 187.000000 187.000000
+188.000000 188.000000 188.000000
+189.000000 189.000000 189.000000
+190.000000 190.000000 190.000000
+191.000000 191.000000 191.000000
+192.000000 192.000000 192.000000
+193.000000 193.000000 193.000000
+194.000000 194.000000 194.000000
+195.000000 195.000000 195.000000
+196.000000 196.000000 196.000000
+197.000000 197.000000 197.000000
+198.000000 198.000000 198.000000
+199.000000 199.000000 199.000000
+200.000000 200.000000 200.000000
+201.000000 201.000000 201.000000
+202.000000 202.000000 202.000000
+203.000000 203.000000 203.000000
+204.000000 204.000000 204.000000
+205.000000 205.000000 205.000000
+206.000000 206.000000 206.000000
+207.000000 207.000000 207.000000
+208.000000 208.000000 208.000000
+209.000000 209.000000 209.000000
+210.000000 210.000000 210.000000
+211.000000 211.000000 211.000000
+212.000000 212.000000 212.000000
+213.000000 213.000000 213.000000
+214.000000 214.000000 214.000000
+215.000000 215.000000 215.000000
+216.000000 216.000000 216.000000
+217.000000 217.000000 217.000000
+218.000000 218.000000 218.000000
+219.000000 219.000000 219.000000
+220.000000 220.000000 220.000000
+221.000000 221.000000 221.000000
+222.000000 222.000000 222.000000
+223.000000 223.000000 223.000000
+224.000000 224.000000 224.000000
+225.000000 225.000000 225.000000
+226.000000 226.000000 226.000000
+227.000000 227.000000 227.000000
+228.000000 228.000000 228.000000
+229.000000 229.000000 229.000000
+230.000000 230.000000 230.000000
+231.000000 231.000000 231.000000
+232.000000 232.000000 232.000000
+233.000000 233.000000 233.000000
+234.000000 234.000000 234.000000
+235.000000 235.000000 235.000000
+236.000000 236.000000 236.000000
+237.000000 237.000000 237.000000
+238.000000 238.000000 238.000000
+239.000000 239.000000 239.000000
+240.000000 240.000000 240.000000
+241.000000 241.000000 241.000000
+242.000000 242.000000 242.000000
+243.000000 243.000000 243.000000
+244.000000 244.000000 244.000000
+245.000000 245.000000 245.000000
+246.000000 246.000000 246.000000
+247.000000 247.000000 247.000000
+248.000000 248.000000 248.000000
+249.000000 249.000000 249.000000
+250.000000 250.000000 250.000000
+251.000000 251.000000 251.000000
+252.000000 252.000000 252.000000
+253.000000 253.000000 253.000000
+254.000000 254.000000 254.000000
+255.000000 255.000000 255.000000
SCALARS attr5_0_0 float
LOOKUP_TABLE default
0.000000
diff --git a/vtk_points_test.vtk b/vtk_points_test.vtk
new file mode 100644
index 0000000000000000000000000000000000000000..00d7fd84392c0dcf47f0f4745f2768f7e18ae533
--- /dev/null
+++ b/vtk_points_test.vtk
@@ -0,0 +1,1512 @@
+# vtk DataFile Version 3.0
+grids
+ASCII
+DATASET POLYDATA
+POINTS 300 float
+0.191120 0.542772 0.939108
+0.949426 0.657156 0.682034
+0.501548 0.049788 0.030341
+0.213440 0.022536 0.216983
+0.655972 0.611396 0.804149
+0.974139 0.277770 0.467799
+0.261523 0.050127 0.925221
+0.015654 0.653189 0.103735
+0.791857 0.627635 0.049912
+0.538857 0.092245 0.458816
+0.380907 0.744841 0.394940
+0.602576 0.458485 0.248419
+0.574775 0.691995 0.624018
+0.447138 0.034446 0.336361
+0.768817 0.370557 0.222135
+0.553262 0.069753 0.019856
+0.406505 0.310794 0.964282
+0.174942 0.121315 0.711162
+0.565953 0.516379 0.571763
+0.349307 0.095793 0.009830
+0.072481 0.530659 0.511365
+0.046417 0.729395 0.027743
+0.728432 0.572606 0.967157
+0.069202 0.317058 0.540727
+0.496447 0.346735 0.446950
+0.193627 0.047362 0.347666
+0.127910 0.633133 0.172681
+0.833728 0.885522 0.340871
+0.948323 0.688523 0.542344
+0.341156 0.055461 0.699285
+0.693060 0.762384 0.300997
+0.563805 0.325374 0.394492
+0.612276 0.923360 0.322679
+0.058091 0.685765 0.053998
+0.371200 0.759352 0.781539
+0.660425 0.035142 0.765143
+0.532271 0.650615 0.427019
+0.263612 0.057686 0.036218
+0.610656 0.558196 0.905927
+0.309139 0.520642 0.725488
+0.788756 0.031770 0.768161
+0.871355 0.760744 0.282541
+0.320097 0.427809 0.698174
+0.295764 0.469412 0.629959
+0.087016 0.937087 0.686836
+0.284583 0.906924 0.986558
+0.645716 0.397673 0.061998
+0.587394 0.175924 0.362743
+0.833207 0.532904 0.467794
+0.281347 0.824074 0.546790
+0.954834 0.877288 0.061284
+0.491532 0.354675 0.285570
+0.355193 0.506312 0.942161
+0.616374 0.187104 0.404920
+0.030554 0.628880 0.311676
+0.156718 0.760729 0.141402
+0.698422 0.808751 0.341944
+0.664300 0.935124 0.505412
+0.388234 0.624212 0.528491
+0.093412 0.941462 0.879504
+0.634902 0.821160 0.391876
+0.889355 0.395415 0.119756
+0.801600 0.345677 0.057517
+0.643167 0.612905 0.857205
+0.819207 0.406316 0.820094
+0.418597 0.862125 0.286015
+0.524246 0.062171 0.993420
+0.579185 0.061318 0.694960
+0.330818 0.350814 0.420698
+0.834694 0.723200 0.826380
+0.314768 0.591060 0.754526
+0.899907 0.767986 0.540215
+0.002118 0.976632 0.226122
+0.001924 0.402131 0.433484
+0.554102 0.976089 0.585426
+0.025767 0.297417 0.212592
+0.152219 0.066472 0.649750
+0.111935 0.280193 0.111119
+0.574414 0.956562 0.316070
+0.968540 0.075379 0.462334
+0.820820 0.862209 0.998937
+0.552892 0.556047 0.354408
+0.544668 0.750556 0.258386
+0.142147 0.561744 0.760260
+0.941378 0.750693 0.520998
+0.420876 0.664465 0.087848
+0.936441 0.970923 0.509360
+0.240190 0.441355 0.986972
+0.043523 0.356339 0.921028
+0.928134 0.809949 0.546933
+0.229501 0.035890 0.642957
+0.933363 0.551387 0.708064
+0.234039 0.248888 0.650489
+0.100673 0.807461 0.883476
+0.320905 0.033064 0.374076
+0.827332 0.929235 0.717285
+0.098780 0.127755 0.832664
+0.389588 0.095995 0.370678
+0.519389 0.017537 0.082599
+0.594001 0.402170 0.667610
+0.369033 0.299516 0.011738
+0.012592 0.466761 0.355074
+0.440251 0.138601 0.125044
+0.121819 0.297058 0.228985
+0.393916 0.000748 0.374483
+0.103674 0.432636 0.129196
+0.389263 0.483895 0.281595
+0.286854 0.384192 0.011294
+0.171281 0.004546 0.344262
+0.214761 0.304103 0.127791
+0.039747 0.387814 0.498174
+0.059177 0.281705 0.148032
+0.096517 0.444439 0.319880
+0.102706 0.220216 0.398427
+0.373598 0.431982 0.489440
+0.078500 0.072622 0.442990
+0.356018 0.265329 0.079078
+0.332776 0.370145 0.344918
+0.374930 0.200664 0.068603
+0.400562 0.432920 0.326511
+0.368295 0.165614 0.174680
+0.233398 0.076265 0.182871
+0.400996 0.284545 0.224037
+0.193611 0.394407 0.198044
+0.271736 0.230462 0.478873
+0.226998 0.475005 0.495730
+0.148310 0.039411 0.412051
+0.203465 0.358695 0.068829
+0.263621 0.167319 0.159807
+0.475798 0.043409 0.001061
+0.125812 0.402161 0.161913
+0.386069 0.292313 0.190602
+0.120995 0.060446 0.496825
+0.160991 0.119563 0.453344
+0.428020 0.332748 0.243763
+0.270958 0.138588 0.307646
+0.129302 0.310446 0.458532
+0.043890 0.492867 0.089368
+0.213084 0.121459 0.470008
+0.265386 0.087917 0.309426
+0.284067 0.279348 0.280249
+0.336328 0.336547 0.382496
+0.017657 0.391975 0.087630
+0.114968 0.071710 0.115031
+0.104961 0.357467 0.185318
+0.254457 0.025967 0.480016
+0.132774 0.458687 0.432283
+0.201520 0.100892 0.313462
+0.152889 0.247942 0.164514
+0.337315 0.421516 0.489564
+0.231982 0.211471 0.468093
+0.410684 0.119957 0.489855
+0.378918 0.266531 0.324857
+0.033476 0.094819 0.092712
+0.444230 0.016362 0.109667
+0.179136 0.472507 0.241815
+0.140148 0.175650 0.037678
+0.267491 0.302897 0.107858
+0.491886 0.296777 0.467145
+0.175493 0.247079 0.000344
+0.369368 0.436868 0.314950
+0.256143 0.001945 0.217615
+0.360324 0.429870 0.161243
+0.233754 0.313771 0.048560
+0.412573 0.338961 0.158938
+0.146435 0.043423 0.109896
+0.316316 0.361484 0.366767
+0.303545 0.320173 0.092580
+0.206614 0.026207 0.439232
+0.310478 0.240776 0.406808
+0.203500 0.152136 0.332505
+0.050774 0.282897 0.499241
+0.220740 0.060052 0.047883
+0.318917 0.164363 0.010079
+0.163232 0.396470 0.468732
+0.152317 0.417591 0.058421
+0.443308 0.478482 0.030216
+0.378614 0.499183 0.368948
+0.275442 0.177279 0.319310
+0.328696 0.037782 0.172131
+0.182561 0.350569 0.276258
+0.477689 0.255347 0.437823
+0.363589 0.095101 0.239850
+0.248442 0.059726 0.197884
+0.478714 0.359607 0.126861
+0.162554 0.006022 0.305013
+0.069810 0.417159 0.367660
+0.322588 0.275417 0.336846
+0.172379 0.275447 0.010527
+0.321245 0.322947 0.194863
+0.170735 0.286312 0.311646
+0.444912 0.427471 0.284472
+0.287185 0.212159 0.259706
+0.386944 0.345362 0.391552
+0.400277 0.131048 0.489254
+0.050633 0.196649 0.262099
+0.122157 0.134313 0.265303
+0.428336 0.352151 0.385550
+0.174372 0.323212 0.001009
+0.242782 0.129385 0.193780
+0.118551 0.284626 0.040045
+0.204677 0.285263 0.252733
+0.182170 0.079147 0.068534
+0.031040 0.145389 0.112933
+0.084977 0.142546 0.057884
+0.026479 0.155100 0.295120
+0.146042 0.167754 0.184810
+0.137157 0.139288 0.081564
+0.094739 0.225063 0.093941
+0.242503 0.243359 0.200124
+0.034004 0.194536 0.005136
+0.024357 0.166163 0.059699
+0.168763 0.005718 0.235741
+0.120769 0.145667 0.104026
+0.166147 0.222167 0.019446
+0.204178 0.187699 0.142703
+0.181281 0.294405 0.044873
+0.266660 0.263516 0.141758
+0.121189 0.247998 0.053538
+0.097575 0.018617 0.248016
+0.063692 0.080098 0.158029
+0.064470 0.276194 0.090836
+0.248992 0.131633 0.271096
+0.007215 0.096668 0.183536
+0.290740 0.088687 0.071999
+0.269481 0.009191 0.204128
+0.090997 0.011965 0.259923
+0.121253 0.094551 0.267893
+0.209857 0.012846 0.293168
+0.163114 0.287747 0.110535
+0.281883 0.264743 0.072675
+0.175878 0.060813 0.140354
+0.078479 0.202488 0.025674
+0.243824 0.285058 0.089320
+0.131963 0.149175 0.239908
+0.034380 0.026748 0.219178
+0.089901 0.007983 0.271481
+0.143373 0.098100 0.189960
+0.063323 0.226631 0.147892
+0.165465 0.248006 0.118286
+0.059792 0.042445 0.133274
+0.057808 0.007587 0.213985
+0.056494 0.100633 0.174949
+0.143584 0.080243 0.102669
+0.297276 0.219187 0.158450
+0.064201 0.136918 0.163682
+0.170758 0.027377 0.089369
+0.113012 0.048512 0.112520
+0.044373 0.177600 0.173404
+0.175024 0.074831 0.195710
+0.048510 0.152404 0.205957
+0.207263 0.274453 0.054502
+0.114141 0.197499 0.100301
+0.248719 0.112333 0.024942
+0.080402 0.272943 0.225548
+0.181935 0.018645 0.232374
+0.186198 0.240395 0.168249
+0.231339 0.064699 0.231795
+0.134919 0.279736 0.190052
+0.230006 0.156947 0.070012
+0.101847 0.133552 0.109875
+0.261160 0.110426 0.212261
+0.200882 0.119241 0.109415
+0.215972 0.257388 0.255168
+0.225816 0.292236 0.128109
+0.085817 0.024602 0.168374
+0.293151 0.104637 0.093364
+0.247991 0.167530 0.103450
+0.013163 0.243524 0.083591
+0.182480 0.293842 0.133309
+0.085941 0.193266 0.031272
+0.047526 0.073263 0.110689
+0.255080 0.190414 0.166919
+0.213845 0.040455 0.239611
+0.026542 0.265560 0.124469
+0.274028 0.209767 0.006667
+0.114752 0.046770 0.270985
+0.114722 0.268484 0.194247
+0.228159 0.082681 0.252072
+0.010753 0.154337 0.172746
+0.281230 0.233464 0.061016
+0.052572 0.092809 0.223879
+0.234026 0.125142 0.266589
+0.238006 0.135870 0.057597
+0.032419 0.129852 0.239177
+0.020472 0.068352 0.208812
+0.224979 0.186438 0.225718
+0.199372 0.101987 0.269031
+0.244278 0.273894 0.188213
+0.015471 0.061627 0.203962
+0.101571 0.271201 0.032494
+0.004487 0.281645 0.107366
+0.264307 0.029045 0.129854
+0.234825 0.108505 0.081605
+0.086988 0.143946 0.292738
+0.118194 0.165614 0.225017
+0.149953 0.048003 0.215407
+0.242683 0.291911 0.107878
+0.017652 0.251505 0.298075
+0.122995 0.176008 0.004623
+VERTICES 300 600
+1 0
+1 1
+1 2
+1 3
+1 4
+1 5
+1 6
+1 7
+1 8
+1 9
+1 10
+1 11
+1 12
+1 13
+1 14
+1 15
+1 16
+1 17
+1 18
+1 19
+1 20
+1 21
+1 22
+1 23
+1 24
+1 25
+1 26
+1 27
+1 28
+1 29
+1 30
+1 31
+1 32
+1 33
+1 34
+1 35
+1 36
+1 37
+1 38
+1 39
+1 40
+1 41
+1 42
+1 43
+1 44
+1 45
+1 46
+1 47
+1 48
+1 49
+1 50
+1 51
+1 52
+1 53
+1 54
+1 55
+1 56
+1 57
+1 58
+1 59
+1 60
+1 61
+1 62
+1 63
+1 64
+1 65
+1 66
+1 67
+1 68
+1 69
+1 70
+1 71
+1 72
+1 73
+1 74
+1 75
+1 76
+1 77
+1 78
+1 79
+1 80
+1 81
+1 82
+1 83
+1 84
+1 85
+1 86
+1 87
+1 88
+1 89
+1 90
+1 91
+1 92
+1 93
+1 94
+1 95
+1 96
+1 97
+1 98
+1 99
+1 100
+1 101
+1 102
+1 103
+1 104
+1 105
+1 106
+1 107
+1 108
+1 109
+1 110
+1 111
+1 112
+1 113
+1 114
+1 115
+1 116
+1 117
+1 118
+1 119
+1 120
+1 121
+1 122
+1 123
+1 124
+1 125
+1 126
+1 127
+1 128
+1 129
+1 130
+1 131
+1 132
+1 133
+1 134
+1 135
+1 136
+1 137
+1 138
+1 139
+1 140
+1 141
+1 142
+1 143
+1 144
+1 145
+1 146
+1 147
+1 148
+1 149
+1 150
+1 151
+1 152
+1 153
+1 154
+1 155
+1 156
+1 157
+1 158
+1 159
+1 160
+1 161
+1 162
+1 163
+1 164
+1 165
+1 166
+1 167
+1 168
+1 169
+1 170
+1 171
+1 172
+1 173
+1 174
+1 175
+1 176
+1 177
+1 178
+1 179
+1 180
+1 181
+1 182
+1 183
+1 184
+1 185
+1 186
+1 187
+1 188
+1 189
+1 190
+1 191
+1 192
+1 193
+1 194
+1 195
+1 196
+1 197
+1 198
+1 199
+1 200
+1 201
+1 202
+1 203
+1 204
+1 205
+1 206
+1 207
+1 208
+1 209
+1 210
+1 211
+1 212
+1 213
+1 214
+1 215
+1 216
+1 217
+1 218
+1 219
+1 220
+1 221
+1 222
+1 223
+1 224
+1 225
+1 226
+1 227
+1 228
+1 229
+1 230
+1 231
+1 232
+1 233
+1 234
+1 235
+1 236
+1 237
+1 238
+1 239
+1 240
+1 241
+1 242
+1 243
+1 244
+1 245
+1 246
+1 247
+1 248
+1 249
+1 250
+1 251
+1 252
+1 253
+1 254
+1 255
+1 256
+1 257
+1 258
+1 259
+1 260
+1 261
+1 262
+1 263
+1 264
+1 265
+1 266
+1 267
+1 268
+1 269
+1 270
+1 271
+1 272
+1 273
+1 274
+1 275
+1 276
+1 277
+1 278
+1 279
+1 280
+1 281
+1 282
+1 283
+1 284
+1 285
+1 286
+1 287
+1 288
+1 289
+1 290
+1 291
+1 292
+1 293
+1 294
+1 295
+1 296
+1 297
+1 298
+1 299
+POINT_DATA 300
+SCALARS attr0 float
+LOOKUP_TABLE default
+0.852971
+0.142642
+0.513097
+0.739673
+0.418492
+0.608974
+0.932864
+0.704308
+0.190846
+0.032995
+0.299320
+0.096923
+0.971876
+0.250459
+0.708095
+0.615332
+0.597012
+0.018790
+0.931445
+0.405780
+0.776751
+0.368002
+0.515093
+0.797913
+0.899592
+0.206326
+0.786766
+0.147594
+0.421794
+0.397550
+0.467417
+0.759131
+0.083897
+0.372967
+0.244892
+0.395358
+0.695272
+0.285234
+0.741090
+0.482378
+0.747305
+0.645760
+0.631399
+0.580082
+0.044595
+0.781274
+0.838234
+0.695952
+0.765279
+0.444972
+0.023074
+0.284180
+0.292961
+0.240403
+0.344663
+0.674851
+0.700950
+0.401477
+0.954549
+0.680789
+0.452484
+0.525924
+0.036222
+0.041302
+0.868429
+0.378754
+0.410969
+0.366083
+0.416859
+0.862164
+0.472456
+0.550957
+0.735711
+0.669539
+0.478424
+0.573764
+0.736027
+0.425935
+0.011884
+0.418616
+0.554306
+0.259311
+0.490285
+0.800239
+0.862283
+0.087524
+0.479354
+0.459715
+0.983071
+0.196368
+0.849800
+0.214229
+0.125681
+0.035163
+0.514932
+0.850999
+0.743037
+0.678448
+0.511895
+0.220029
+0.587362
+0.298533
+0.327916
+0.436179
+0.194670
+0.186381
+0.623307
+0.202463
+0.270373
+0.264172
+0.179694
+0.966529
+0.694374
+0.512313
+0.470675
+0.457862
+0.672225
+0.660675
+0.440579
+0.487801
+0.816170
+0.755275
+0.471037
+0.804031
+0.453553
+0.948734
+0.653689
+0.102279
+0.021556
+0.777115
+0.901608
+0.851858
+0.278800
+0.961652
+0.852418
+0.871504
+0.776556
+0.725569
+0.611679
+0.994124
+0.825377
+0.095072
+0.792477
+0.913985
+0.160317
+0.262742
+0.250089
+0.743514
+0.682480
+0.972695
+0.602742
+0.455661
+0.403150
+0.064623
+0.060240
+0.427489
+0.544429
+0.509964
+0.188519
+0.901505
+0.541032
+0.174815
+0.214112
+0.222180
+0.105408
+0.982114
+0.847171
+0.922357
+0.450498
+0.850085
+0.897592
+0.625877
+0.136109
+0.560975
+0.220586
+0.735344
+0.808921
+0.375646
+0.694858
+0.952056
+0.705753
+0.069751
+0.684262
+0.467112
+0.255534
+0.510865
+0.300091
+0.108316
+0.126174
+0.690273
+0.606340
+0.010674
+0.055879
+0.782044
+0.790335
+0.017066
+0.659788
+0.264430
+0.264949
+0.021708
+0.297572
+0.874005
+0.374499
+0.173256
+0.522504
+0.413817
+0.740119
+0.636431
+0.647372
+0.738618
+0.212948
+0.171335
+0.517521
+0.001341
+0.304175
+0.531736
+0.287220
+0.674599
+0.340409
+0.507606
+0.056097
+0.096411
+0.047968
+0.363141
+0.680893
+0.004086
+0.142206
+0.447751
+0.112662
+0.131239
+0.182539
+0.660715
+0.629267
+0.951852
+0.612036
+0.435244
+0.933001
+0.152785
+0.459218
+0.437300
+0.858148
+0.512112
+0.554611
+0.643477
+0.062086
+0.201576
+0.132173
+0.918523
+0.434425
+0.979791
+0.090216
+0.281667
+0.010038
+0.914374
+0.559217
+0.082922
+0.521112
+0.280467
+0.157430
+0.854652
+0.013719
+0.005624
+0.323701
+0.958344
+0.300678
+0.177226
+0.787436
+0.470395
+0.699779
+0.972249
+0.766277
+0.578433
+0.273233
+0.958540
+0.015887
+0.543165
+0.970718
+0.442014
+0.911478
+0.101746
+0.131470
+0.222696
+0.894048
+0.664215
+0.940062
+0.467209
+0.325321
+0.365024
+0.622865
+0.838622
+0.020516
+0.681342
+0.994820
+0.254399
+0.335398
+0.813044
+0.326415
+0.353624
+0.538226
+0.141648
+VECTORS attr1 float
+0.974855 0.182712 0.353524
+0.764398 0.172342 0.522042
+0.438905 0.976479 0.925580
+0.039018 0.114608 0.700754
+0.482578 0.955606 0.502502
+0.622314 0.739247 0.595426
+0.796400 0.761720 0.810587
+0.013873 0.516256 0.082312
+0.998849 0.617100 0.460162
+0.262446 0.507718 0.273360
+0.988605 0.865707 0.434889
+0.831425 0.560535 0.709626
+0.465784 0.648266 0.467768
+0.611095 0.941814 0.546090
+0.230728 0.072481 0.565806
+0.764503 0.468990 0.878126
+0.877432 0.092992 0.950583
+0.904489 0.644693 0.364891
+0.328919 0.235864 0.544684
+0.921693 0.730651 0.339351
+0.564136 0.245284 0.590949
+0.414173 0.890974 0.270302
+0.624194 0.193248 0.903050
+0.446537 0.325474 0.158925
+0.292525 0.560025 0.087836
+0.906036 0.631122 0.057216
+0.417532 0.052461 0.156114
+0.589520 0.868026 0.283006
+0.706947 0.824835 0.768770
+0.311165 0.943747 0.272178
+0.342127 0.836699 0.443595
+0.416966 0.694541 0.174357
+0.408055 0.094396 0.535770
+0.274101 0.945915 0.882017
+0.122680 0.618250 0.020735
+0.573596 0.938873 0.694895
+0.370602 0.286122 0.894958
+0.231222 0.233866 0.057916
+0.848216 0.439604 0.468825
+0.580559 0.715504 0.575299
+0.107476 0.018033 0.122876
+0.090781 0.002605 0.422395
+0.346131 0.052840 0.010974
+0.571784 0.999564 0.972554
+0.651305 0.230425 0.492935
+0.801557 0.630477 0.179448
+0.705078 0.379994 0.184544
+0.504004 0.034606 0.582476
+0.546277 0.948538 0.640875
+0.736613 0.373107 0.164519
+0.947601 0.872980 0.625842
+0.682194 0.014407 0.147657
+0.194138 0.304991 0.071420
+0.304495 0.841470 0.397971
+0.085291 0.602616 0.247945
+0.758341 0.662445 0.308916
+0.906899 0.806163 0.460717
+0.882749 0.303071 0.795318
+0.695218 0.296862 0.341154
+0.471149 0.860046 0.170877
+0.472685 0.739292 0.123419
+0.803564 0.516773 0.989041
+0.028219 0.071144 0.055409
+0.217297 0.937954 0.523801
+0.323874 0.211575 0.086596
+0.371101 0.245019 0.119228
+0.676279 0.052267 0.955961
+0.211858 0.228235 0.653783
+0.716955 0.307090 0.091221
+0.636348 0.273147 0.041583
+0.664002 0.523766 0.503054
+0.831365 0.249487 0.664893
+0.787678 0.950612 0.241943
+0.858346 0.181531 0.903081
+0.589438 0.839285 0.604777
+0.296346 0.321069 0.988769
+0.828303 0.487938 0.932540
+0.083679 0.503009 0.649996
+0.751527 0.573463 0.492244
+0.319990 0.788064 0.050251
+0.820681 0.222277 0.349471
+0.348355 0.567217 0.495641
+0.006410 0.680225 0.338837
+0.398490 0.414732 0.279156
+0.085578 0.189775 0.575804
+0.875843 0.867086 0.899564
+0.229565 0.590566 0.732354
+0.679681 0.925488 0.964143
+0.794528 0.538921 0.197650
+0.608962 0.291165 0.603858
+0.450943 0.397533 0.256193
+0.220038 0.174632 0.494240
+0.730456 0.826956 0.684406
+0.940036 0.500931 0.583018
+0.739235 0.914091 0.750783
+0.658911 0.593884 0.027948
+0.632495 0.584216 0.925784
+0.802297 0.769054 0.496464
+0.003547 0.386281 0.664759
+0.915902 0.367099 0.874785
+0.118846 0.284581 0.498548
+0.424160 0.110110 0.579035
+0.964881 0.143517 0.766729
+0.434735 0.772395 0.968258
+0.401742 0.475700 0.751419
+0.318345 0.977538 0.661436
+0.045112 0.563700 0.563149
+0.933742 0.233223 0.639992
+0.282418 0.904891 0.993332
+0.174619 0.084161 0.756540
+0.042175 0.670213 0.932599
+0.977899 0.528286 0.758505
+0.960596 0.028052 0.874348
+0.060887 0.881843 0.487926
+0.824842 0.603229 0.414785
+0.720892 0.834692 0.175396
+0.323438 0.181610 0.943831
+0.498441 0.026450 0.304725
+0.467788 0.182905 0.610254
+0.129298 0.940469 0.704494
+0.107294 0.812279 0.343814
+0.530184 0.294443 0.777959
+0.198481 0.584590 0.738716
+0.732847 0.734187 0.774465
+0.531300 0.962620 0.919793
+0.216231 0.413998 0.506112
+0.589475 0.196202 0.486468
+0.634684 0.087873 0.177122
+0.879563 0.454732 0.304395
+0.369309 0.959553 0.173734
+0.927040 0.371431 0.926172
+0.811869 0.944677 0.396396
+0.264022 0.517509 0.123324
+0.361365 0.956482 0.772000
+0.453556 0.381164 0.711844
+0.184096 0.507541 0.634685
+0.523343 0.833009 0.632809
+0.105722 0.748909 0.614543
+0.848871 0.639915 0.031935
+0.517156 0.392555 0.685626
+0.354854 0.992942 0.907113
+0.027658 0.315680 0.861391
+0.817653 0.873376 0.003198
+0.942188 0.180695 0.166925
+0.832912 0.558700 0.729931
+0.659516 0.921161 0.068945
+0.559245 0.144037 0.518508
+0.670946 0.671558 0.776078
+0.883971 0.690371 0.125719
+0.892392 0.683896 0.199377
+0.563700 0.676302 0.427174
+0.074566 0.281616 0.156323
+0.562962 0.749505 0.738472
+0.159310 0.005303 0.799458
+0.425689 0.573951 0.639743
+0.264496 0.946587 0.335915
+0.002246 0.261469 0.831476
+0.038603 0.288107 0.756699
+0.662893 0.297359 0.013792
+0.328203 0.595168 0.671596
+0.943018 0.581338 0.696935
+0.576522 0.914939 0.840163
+0.594676 0.862921 0.314727
+0.245130 0.351417 0.117751
+0.589179 0.594856 0.505365
+0.336038 0.590367 0.166285
+0.733240 0.911167 0.240259
+0.070532 0.732659 0.672963
+0.665073 0.874086 0.719061
+0.006115 0.291013 0.179620
+0.245933 0.664299 0.850463
+0.980949 0.851828 0.767719
+0.843937 0.995786 0.769167
+0.298357 0.024632 0.268835
+0.336151 0.306898 0.351409
+0.124083 0.637404 0.953506
+0.232446 0.337396 0.632253
+0.260116 0.505058 0.866323
+0.917290 0.100010 0.427238
+0.403111 0.874667 0.595547
+0.947432 0.686777 0.069199
+0.427959 0.744415 0.254946
+0.140062 0.153986 0.973494
+0.273088 0.125344 0.256469
+0.051542 0.888051 0.786753
+0.487300 0.787141 0.426864
+0.038074 0.502347 0.474531
+0.304055 0.038630 0.538577
+0.327835 0.041937 0.625999
+0.516408 0.500537 0.710454
+0.636053 0.681350 0.433723
+0.520349 0.229449 0.854270
+0.319801 0.896802 0.164147
+0.869711 0.038570 0.214664
+0.559846 0.019721 0.294496
+0.959145 0.984060 0.345891
+0.311664 0.149701 0.531236
+0.570423 0.532054 0.035400
+0.075878 0.302394 0.821459
+0.704236 0.330563 0.687325
+0.021353 0.610375 0.976363
+0.465571 0.182496 0.419099
+0.190246 0.061420 0.373246
+0.428990 0.791156 0.091101
+0.196855 0.241516 0.123692
+0.294766 0.681465 0.666369
+0.700947 0.003265 0.805367
+0.545619 0.636195 0.841496
+0.937100 0.327533 0.058517
+0.219725 0.133907 0.232030
+0.376112 0.063649 0.774433
+0.646745 0.586036 0.006718
+0.765960 0.214237 0.964508
+0.902940 0.864735 0.793746
+0.983048 0.970527 0.799845
+0.552082 0.354637 0.636676
+0.322637 0.678556 0.711747
+0.329992 0.043079 0.688576
+0.960167 0.668662 0.198033
+0.776353 0.312394 0.404122
+0.606851 0.094193 0.144959
+0.245661 0.865080 0.309431
+0.317872 0.425277 0.014135
+0.971788 0.567570 0.642029
+0.122126 0.636064 0.978777
+0.183957 0.392644 0.068681
+0.319363 0.084357 0.354575
+0.113449 0.009212 0.401778
+0.730996 0.626259 0.988022
+0.179741 0.076381 0.691466
+0.907493 0.264560 0.392798
+0.813783 0.218629 0.580568
+0.703697 0.958160 0.315691
+0.220863 0.792527 0.378005
+0.720793 0.609140 0.729917
+0.974146 0.974891 0.624578
+0.947730 0.857826 0.812930
+0.624663 0.779967 0.478003
+0.995347 0.864509 0.237547
+0.513253 0.182560 0.601200
+0.166135 0.004309 0.786486
+0.463795 0.022764 0.119139
+0.864926 0.042390 0.667640
+0.191807 0.039373 0.473211
+0.395710 0.833751 0.824702
+0.495725 0.435946 0.549780
+0.393817 0.501517 0.194002
+0.883201 0.724198 0.772247
+0.879627 0.032296 0.798059
+0.709503 0.007746 0.349253
+0.966658 0.653682 0.742341
+0.376949 0.876587 0.368549
+0.722019 0.197292 0.951730
+0.459049 0.555040 0.089504
+0.628284 0.929400 0.265548
+0.593872 0.293519 0.319393
+0.712090 0.590326 0.026614
+0.071991 0.826468 0.527642
+0.737118 0.704073 0.229757
+0.561835 0.884658 0.788268
+0.352128 0.201119 0.654392
+0.588636 0.273513 0.037100
+0.948497 0.454955 0.054774
+0.107447 0.064114 0.679502
+0.293855 0.882991 0.047842
+0.355947 0.055069 0.166380
+0.686309 0.098692 0.461792
+0.659184 0.906727 0.920069
+0.776539 0.108920 0.168110
+0.630984 0.501257 0.107291
+0.704945 0.936809 0.474510
+0.382113 0.798687 0.728934
+0.079699 0.589451 0.235358
+0.434625 0.812213 0.083958
+0.878477 0.185988 0.213471
+0.013946 0.513432 0.199538
+0.277633 0.226506 0.810398
+0.655486 0.802277 0.100490
+0.148986 0.781396 0.440101
+0.165874 0.567948 0.090923
+0.252003 0.567192 0.715210
+0.035244 0.718299 0.564634
+0.342507 0.477295 0.909942
+0.321142 0.437074 0.047755
+0.625249 0.881639 0.058276
+0.260326 0.256132 0.068286
+0.350061 0.674216 0.630124
+0.278859 0.079045 0.878789
+0.944977 0.524101 0.798615
+0.649526 0.120086 0.171931
+0.269202 0.107227 0.427176
+0.991518 0.507013 0.719411
+0.444768 0.451041 0.509270
+0.672418 0.275338 0.486372
+0.328956 0.016674 0.088928
+0.615448 0.870327 0.132181
+0.687044 0.052482 0.053722
+0.607640 0.771956 0.869916
+0.023322 0.450331 0.476118
+0.251684 0.943570 0.225473
+SCALARS domain float
+LOOKUP_TABLE default
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+1.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0