diff --git a/vtkm/cont/DataSetBuilderRectilinear.h b/vtkm/cont/DataSetBuilderRectilinear.h index 8e662c802..8348e5eee 100644 --- a/vtkm/cont/DataSetBuilderRectilinear.h +++ b/vtkm/cont/DataSetBuilderRectilinear.h @@ -20,174 +20,204 @@ #ifndef vtk_m_cont_DataSetBuilderRectilinear_h #define vtk_m_cont_DataSetBuilderRectilinear_h -#include -#include -#include #include +#include +#include +#include +#include namespace vtkm { namespace cont { -typedef vtkm::cont::DeviceAdapterAlgorithm DFA; - class DataSetBuilderRectilinear { + template + 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()) ); + } + + template + void CopyInto(const vtkm::cont::ArrayHandle& input, + vtkm::cont::ArrayHandle& output ) + { + output.Allocate( input.GetNumberOfValues() ); + std::copy( ArrayPortalToIteratorBegin(input.GetPortalConstControl()), + ArrayPortalToIteratorEnd(input.GetPortalConstControl()), + ArrayPortalToIteratorBegin(output.GetPortalControl()) ); + } + + template + void CopyInto(const T* input, vtkm::Id len, + vtkm::cont::ArrayHandle& output ) + { + output.Allocate( len ); + std::copy( input, input+len, + output.GetPortalControl().GetIteratorBegin() ); + } public: - VTKM_CONT_EXPORT - DataSetBuilderRectilinear() {} + VTKM_CONT_EXPORT + DataSetBuilderRectilinear() {} - //2D grids. - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(vtkm::Id nx, vtkm::Id ny, - T *xvals, T *yvals, - std::string coordNm="coords", std::string cellNm="cells") - { - T zvals = 0; - return Create(2, nx,ny, 1, xvals, yvals, &zvals, coordNm, cellNm); - } - - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(int dim, vtkm::Id nx, vtkm::Id ny, vtkm::Id nz, - T *xvals, T *yvals, T *zvals, - std::string coordNm, std::string cellNm) - { - VTKM_ASSERT_CONT(nx>1 && ny>1 && - ((dim==2 && nz==1)||(dim==3 && nz>=1))); - - vtkm::cont::ArrayHandle Xc, Yc, Zc; - DFA::Copy(vtkm::cont::make_ArrayHandle(xvals,nx), Xc); - DFA::Copy(vtkm::cont::make_ArrayHandle(yvals,ny), Yc); - DFA::Copy(vtkm::cont::make_ArrayHandle(zvals,nz), Zc); - - return BuildDataSet(dim, Xc,Yc,Zc, coordNm, cellNm); - } + //2D grids. + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(vtkm::Id nx, vtkm::Id ny, + T *xvals, T *yvals, + std::string coordNm="coords", std::string cellNm="cells") + { + T zvals = 0; + return Create(2, nx,ny, 1, xvals, yvals, &zvals, coordNm, cellNm); + } - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(const std::vector &xvals, const std::vector &yvals, - std::string coordNm="coords", std::string cellNm="cells") - { - std::vector zvals(1,0); - return BuildDataSet(2, xvals,yvals,zvals, coordNm,cellNm); - } - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(const vtkm::cont::ArrayHandle &xvals, - const vtkm::cont::ArrayHandle &yvals, - std::string coordNm="coords", std::string cellNm="cells") - { - VTKM_ASSERT_CONT(xvals.GetNumberOfValues()>1 && yvals.GetNumberOfValues()>1); + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(int dim, vtkm::Id nx, vtkm::Id ny, vtkm::Id nz, + T *xvals, T *yvals, T *zvals, + std::string coordNm, std::string cellNm) + { + VTKM_ASSERT_CONT(nx>1 && ny>1 && + ((dim==2 && nz==1)||(dim==3 && nz>=1))); - vtkm::cont::ArrayHandle zvals; - DFA::Copy(vtkm::cont::make_ArrayHandle(std::vector(1,0)), zvals); - return BuildDataSet(2, xvals,yvals,zvals, coordNm, cellNm); - } + vtkm::cont::ArrayHandle Xc, Yc, Zc; + CopyInto(xvals,nx,Xc); + CopyInto(yvals,ny,Yc); + CopyInto(zvals,nz,Zc); - //3D grids. - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(vtkm::Id nx, vtkm::Id ny, vtkm::Id nz, - T *xvals, T *yvals, T *zvals, - std::string coordNm="coords", std::string cellNm="cells") - { - return Create(3, nx,ny,nz, xvals, yvals, zvals, coordNm, cellNm); - } - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(const std::vector &xvals, - const std::vector &yvals, - const std::vector &zvals, - std::string coordNm="coords", std::string cellNm="cells") - { - return BuildDataSet(3, xvals, yvals, zvals, coordNm, cellNm); - } - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - Create(const vtkm::cont::ArrayHandle &xvals, - const vtkm::cont::ArrayHandle &yvals, - const vtkm::cont::ArrayHandle &zvals, - std::string coordNm="coords", std::string cellNm="cells") - { - VTKM_ASSERT_CONT(xvals.GetNumberOfValues()>1 && - yvals.GetNumberOfValues()>1 && - zvals.GetNumberOfValues()>1); - return BuildDataSet(3, xvals,yvals,zvals, coordNm, cellNm); - } + return BuildDataSet(dim, Xc,Yc,Zc, coordNm, cellNm); + } + + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(const std::vector &xvals, const std::vector &yvals, + std::string coordNm="coords", std::string cellNm="cells") + { + std::vector zvals(1,0); + return BuildDataSet(2, xvals,yvals,zvals, coordNm,cellNm); + } + + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(const vtkm::cont::ArrayHandle &xvals, + const vtkm::cont::ArrayHandle &yvals, + std::string coordNm="coords", std::string cellNm="cells") + { + VTKM_ASSERT_CONT(xvals.GetNumberOfValues()>1 && yvals.GetNumberOfValues()>1); + + vtkm::cont::ArrayHandle zvals; + zvals.Allocate(1); + zvals.GetPortalControl().Set(0,0.0); + return BuildDataSet(2, xvals,yvals,zvals, coordNm, cellNm); + } + + //3D grids. + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(vtkm::Id nx, vtkm::Id ny, vtkm::Id nz, + T *xvals, T *yvals, T *zvals, + std::string coordNm="coords", std::string cellNm="cells") + { + return Create(3, nx,ny,nz, xvals, yvals, zvals, coordNm, cellNm); + } + + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(const std::vector &xvals, + const std::vector &yvals, + const std::vector &zvals, + std::string coordNm="coords", std::string cellNm="cells") + { + return BuildDataSet(3, xvals, yvals, zvals, coordNm, cellNm); + } + + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + Create(const vtkm::cont::ArrayHandle &xvals, + const vtkm::cont::ArrayHandle &yvals, + const vtkm::cont::ArrayHandle &zvals, + std::string coordNm="coords", std::string cellNm="cells") + { + VTKM_ASSERT_CONT(xvals.GetNumberOfValues()>1 && + yvals.GetNumberOfValues()>1 && + zvals.GetNumberOfValues()>1); + return BuildDataSet(3, xvals,yvals,zvals, coordNm, cellNm); + } private: - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - BuildDataSet(int dim, - const std::vector &xvals, - const std::vector &yvals, - const std::vector &zvals, - std::string coordNm, std::string cellNm) - { - VTKM_ASSERT_CONT(xvals.size()>1 && yvals.size()>1 && - ((dim==2 && zvals.size()==1)||(dim==3 && zvals.size()>=1))); + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + BuildDataSet(int dim, + const std::vector &xvals, + const std::vector &yvals, + const std::vector &zvals, + std::string coordNm, std::string cellNm) + { + VTKM_ASSERT_CONT(xvals.size()>1 && yvals.size()>1 && + ((dim==2 && zvals.size()==1)||(dim==3 && zvals.size()>=1))); - vtkm::cont::ArrayHandle Xc, Yc, Zc; - DFA::Copy(vtkm::cont::make_ArrayHandle(xvals), Xc); - DFA::Copy(vtkm::cont::make_ArrayHandle(yvals), Yc); - DFA::Copy(vtkm::cont::make_ArrayHandle(zvals), Zc); - - return BuildDataSet(dim, Xc,Yc,Zc, coordNm, cellNm); + vtkm::cont::ArrayHandle Xc, Yc, Zc; + this->CopyInto(xvals, Xc); + this->CopyInto(yvals, Yc); + this->CopyInto(zvals, Zc); + + return BuildDataSet(dim, Xc,Yc,Zc, coordNm, cellNm); + } + + template + VTKM_CONT_EXPORT + vtkm::cont::DataSet + BuildDataSet(int dim, + const vtkm::cont::ArrayHandle &X, + const vtkm::cont::ArrayHandle &Y, + const vtkm::cont::ArrayHandle &Z, + std::string coordNm, std::string cellNm) + { + vtkm::cont::DataSet dataSet; + + //Convert all coordinates to floatDefault. + vtkm::cont::ArrayHandleCartesianProduct< + vtkm::cont::ArrayHandle, + vtkm::cont::ArrayHandle, + vtkm::cont::ArrayHandle > coords; + + vtkm::cont::ArrayHandle Xc, Yc, Zc; + this->CopyInto(X, Xc); + this->CopyInto(Y, Yc); + this->CopyInto(Z, Zc); + + coords = vtkm::cont::make_ArrayHandleCartesianProduct(Xc,Yc,Zc); + vtkm::cont::CoordinateSystem cs(coordNm, 1, coords); + dataSet.AddCoordinateSystem(cs); + + if (dim == 2) + { + vtkm::cont::CellSetStructured<2> cellSet(cellNm); + cellSet.SetPointDimensions(vtkm::make_Vec(Xc.GetNumberOfValues(), + Yc.GetNumberOfValues())); + dataSet.AddCellSet(cellSet); + } + else + { + vtkm::cont::CellSetStructured<3> cellSet(cellNm); + cellSet.SetPointDimensions(vtkm::make_Vec(Xc.GetNumberOfValues(), + Yc.GetNumberOfValues(), + Zc.GetNumberOfValues())); + dataSet.AddCellSet(cellSet); } - template - VTKM_CONT_EXPORT - vtkm::cont::DataSet - BuildDataSet(int dim, - const vtkm::cont::ArrayHandle &X, - const vtkm::cont::ArrayHandle &Y, - const vtkm::cont::ArrayHandle &Z, - std::string coordNm, std::string cellNm) - { - vtkm::cont::DataSet dataSet; - - //Convert all coordinates to floatDefault. - vtkm::cont::ArrayHandleCartesianProduct< - vtkm::cont::ArrayHandle, - vtkm::cont::ArrayHandle, - vtkm::cont::ArrayHandle > coords; - - vtkm::cont::ArrayHandle Xc, Yc, Zc; - DFA::Copy(X, Xc); - DFA::Copy(Y, Yc); - DFA::Copy(Z, Zc); - - coords = vtkm::cont::make_ArrayHandleCartesianProduct(Xc,Yc,Zc); - vtkm::cont::CoordinateSystem cs(coordNm, 1, coords); - dataSet.AddCoordinateSystem(cs); - - if (dim == 2) - { - vtkm::cont::CellSetStructured<2> cellSet(cellNm); - cellSet.SetPointDimensions(vtkm::make_Vec(Xc.GetNumberOfValues(), - Yc.GetNumberOfValues())); - dataSet.AddCellSet(cellSet); - } - else - { - vtkm::cont::CellSetStructured<3> cellSet(cellNm); - cellSet.SetPointDimensions(vtkm::make_Vec(Xc.GetNumberOfValues(), - Yc.GetNumberOfValues(), - Zc.GetNumberOfValues())); - dataSet.AddCellSet(cellSet); - } - - return dataSet; - } + return dataSet; + } }; } // namespace cont