//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // // Copyright 2015 National Technology & Engineering Solutions of Sandia, LLC (NTESS). // Copyright 2015 UT-Battelle, LLC. // Copyright 2015 Los Alamos National Security. // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_cont_DataSetBuilderExplicit_h #define vtk_m_cont_DataSetBuilderExplicit_h #include #include #include #include namespace vtkm { namespace cont { //Coordinates builder?? //Need a singlecellset handler. class VTKM_CONT_EXPORT DataSetBuilderExplicit { template VTKM_CONT static void CopyInto(const std::vector& input, vtkm::cont::ArrayHandle& output) { output.Allocate(static_cast(input.size())); std::copy(input.begin(), input.end(), ArrayPortalToIteratorBegin(output.GetPortalControl())); } public: VTKM_CONT DataSetBuilderExplicit() {} //Single cell explicits. //TODO //Zoo explicit cell template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells") { std::vector yVals(xVals.size(), 0), zVals(xVals.size(), 0); return DataSetBuilderExplicit::Create( xVals, yVals, zVals, shapes, numIndices, connectivity, coordsNm, cellNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& yVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells") { std::vector zVals(xVals.size(), 0); return DataSetBuilderExplicit::Create( xVals, yVals, zVals, shapes, numIndices, connectivity, coordsNm, cellNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector& xVals, const std::vector& yVals, const std::vector& zVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells"); template VTKM_CONT static vtkm::cont::DataSet Create( const vtkm::cont::ArrayHandle& xVals, const vtkm::cont::ArrayHandle& yVals, const vtkm::cont::ArrayHandle& zVals, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells") { return DataSetBuilderExplicit::BuildDataSet( xVals, yVals, zVals, shapes, numIndices, connectivity, coordsNm, cellNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector>& coords, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells"); template VTKM_CONT static vtkm::cont::DataSet Create( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells") { return DataSetBuilderExplicit::BuildDataSet( coords, shapes, numIndices, connectivity, coordsNm, cellNm); } template VTKM_CONT static vtkm::cont::DataSet Create(const std::vector>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const std::vector& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells"); template VTKM_CONT static vtkm::cont::DataSet Create( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm = "coords", const std::string& cellNm = "cells") { return DataSetBuilderExplicit::BuildDataSet( coords, tag, numberOfPointsPerCell, connectivity, coordsNm, cellNm); } private: template static vtkm::cont::DataSet BuildDataSet( const vtkm::cont::ArrayHandle& X, const vtkm::cont::ArrayHandle& Y, const vtkm::cont::ArrayHandle& Z, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm); template VTKM_CONT static vtkm::cont::DataSet BuildDataSet( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm); template VTKM_CONT static vtkm::cont::DataSet BuildDataSet( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm); }; template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector& xVals, const std::vector& yVals, const std::vector& zVals, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm, const std::string& cellNm) { VTKM_ASSERT(xVals.size() == yVals.size() && yVals.size() == zVals.size() && xVals.size() > 0); vtkm::cont::ArrayHandle Xc, Yc, Zc; DataSetBuilderExplicit::CopyInto(xVals, Xc); DataSetBuilderExplicit::CopyInto(yVals, Yc); DataSetBuilderExplicit::CopyInto(zVals, Zc); vtkm::cont::ArrayHandle Sc; vtkm::cont::ArrayHandle Nc; vtkm::cont::ArrayHandle Cc; DataSetBuilderExplicit::CopyInto(shapes, Sc); DataSetBuilderExplicit::CopyInto(numIndices, Nc); DataSetBuilderExplicit::CopyInto(connectivity, Cc); return DataSetBuilderExplicit::BuildDataSet(Xc, Yc, Zc, Sc, Nc, Cc, coordsNm, cellNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::BuildDataSet( const vtkm::cont::ArrayHandle& X, const vtkm::cont::ArrayHandle& Y, const vtkm::cont::ArrayHandle& Z, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm) { VTKM_ASSERT(X.GetNumberOfValues() == Y.GetNumberOfValues() && Y.GetNumberOfValues() == Z.GetNumberOfValues() && X.GetNumberOfValues() > 0 && shapes.GetNumberOfValues() == numIndices.GetNumberOfValues()); vtkm::cont::DataSet dataSet; dataSet.AddCoordinateSystem( vtkm::cont::CoordinateSystem(coordsNm, make_ArrayHandleCompositeVector(X, Y, Z))); vtkm::Id nPts = X.GetNumberOfValues(); vtkm::cont::CellSetExplicit<> cellSet(cellNm); cellSet.Fill(nPts, shapes, numIndices, connectivity); dataSet.AddCellSet(cellSet); return dataSet; } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector>& coords, const std::vector& shapes, const std::vector& numIndices, const std::vector& connectivity, const std::string& coordsNm, const std::string& cellNm) { vtkm::cont::ArrayHandle> coordsArray; DataSetBuilderExplicit::CopyInto(coords, coordsArray); vtkm::cont::ArrayHandle Sc; vtkm::cont::ArrayHandle Nc; vtkm::cont::ArrayHandle Cc; DataSetBuilderExplicit::CopyInto(shapes, Sc); DataSetBuilderExplicit::CopyInto(numIndices, Nc); DataSetBuilderExplicit::CopyInto(connectivity, Cc); return DataSetBuilderExplicit::Create(coordsArray, Sc, Nc, Cc, coordsNm, cellNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::BuildDataSet( const vtkm::cont::ArrayHandle>& coords, const vtkm::cont::ArrayHandle& shapes, const vtkm::cont::ArrayHandle& numIndices, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm) { vtkm::cont::DataSet dataSet; dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem(coordsNm, coords)); vtkm::Id nPts = static_cast(coords.GetNumberOfValues()); vtkm::cont::CellSetExplicit<> cellSet(cellNm); cellSet.Fill(nPts, shapes, numIndices, connectivity); dataSet.AddCellSet(cellSet); return dataSet; } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::Create( const std::vector>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const std::vector& connectivity, const std::string& coordsNm, const std::string& cellNm) { vtkm::cont::ArrayHandle> coordsArray; DataSetBuilderExplicit::CopyInto(coords, coordsArray); vtkm::cont::ArrayHandle Cc; DataSetBuilderExplicit::CopyInto(connectivity, Cc); return DataSetBuilderExplicit::Create( coordsArray, tag, numberOfPointsPerCell, Cc, coordsNm, cellNm); } template inline VTKM_CONT vtkm::cont::DataSet DataSetBuilderExplicit::BuildDataSet( const vtkm::cont::ArrayHandle>& coords, CellShapeTag tag, vtkm::IdComponent numberOfPointsPerCell, const vtkm::cont::ArrayHandle& connectivity, const std::string& coordsNm, const std::string& cellNm) { (void)tag; //C4100 false positive workaround vtkm::cont::DataSet dataSet; dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem(coordsNm, coords)); vtkm::cont::CellSetSingleType<> cellSet(cellNm); cellSet.Fill(coords.GetNumberOfValues(), tag.Id, numberOfPointsPerCell, connectivity); dataSet.AddCellSet(cellSet); return dataSet; } class VTKM_CONT_EXPORT DataSetBuilderExplicitIterative { public: VTKM_CONT DataSetBuilderExplicitIterative(); VTKM_CONT void Begin(const std::string& coordName = "coords", const std::string& cellName = "cells"); //Define points. VTKM_CONT vtkm::cont::DataSet Create(); VTKM_CONT vtkm::Id AddPoint(const vtkm::Vec& pt); VTKM_CONT vtkm::Id AddPoint(const vtkm::Float32& x, const vtkm::Float32& y, const vtkm::Float32& z = 0); template VTKM_CONT vtkm::Id AddPoint(const T& x, const T& y, const T& z = 0) { return AddPoint( static_cast(x), static_cast(y), static_cast(z)); } template VTKM_CONT vtkm::Id AddPoint(const vtkm::Vec& pt) { return AddPoint(static_cast>(pt)); } //Define cells. VTKM_CONT void AddCell(vtkm::UInt8 shape); VTKM_CONT void AddCell(const vtkm::UInt8& shape, const std::vector& conn); VTKM_CONT void AddCell(const vtkm::UInt8& shape, const vtkm::Id* conn, const vtkm::IdComponent& n); VTKM_CONT void AddCellPoint(vtkm::Id pointIndex); private: std::string coordNm, cellNm; std::vector> points; std::vector shapes; std::vector numIdx; std::vector connectivity; }; } } #endif //vtk_m_cont_DataSetBuilderExplicit_h