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 80597d776f91a39b8040e34b079daa44a6f533e7..7d879ab1f6f805c04e28da8766d660c9fcdfbb8e 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,9 +84,19 @@ 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$pdata_dir " +INCLUDES_PATH+="-I. -Iconfig -I../../openfpm_vcluster/src -I../../openfpm_data/src -I../../openfpm_devices/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 88% rename from src/GraphMLWriter_unit_tests.hpp rename to src/GraphMLWriter/GraphMLWriter_unit_tests.hpp index 8da0ccdeb15fdc037914500d70649d8eb1ef05ea..570d3253d54812177a4394021b152371ddeef157 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,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 a3a61529bf8c78e5dc2c1487ec6cbee0b8c42910..be7706a56fe1245450fbe7a13b8ba0cedf0d9c70 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; 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 b36f2912e5cca499f1cd4100011aaf9fd39cdee0..9e6ada399c0f299f7f0bb4f4332f04f129143def 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,8 @@ #define BOOST_TEST_MODULE "C++ test module for OpenFPM_io project" #include -#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