2019-08-27 23:31:56 +00:00
|
|
|
//============================================================================
|
|
|
|
// Copyright (c) Kitware, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
// See LICENSE.txt for details.
|
2019-08-23 00:23:34 +00:00
|
|
|
//
|
2019-08-27 23:31:56 +00:00
|
|
|
// 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.
|
|
|
|
//============================================================================
|
2019-08-23 00:23:34 +00:00
|
|
|
|
2019-09-13 12:12:58 +00:00
|
|
|
#include <vtkm/cont/ArrayCopy.h>
|
2019-08-23 00:23:34 +00:00
|
|
|
#include <vtkm/source/Tangle.h>
|
2020-07-21 21:06:37 +00:00
|
|
|
#include <vtkm/worklet/WorkletMapTopology.h>
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
namespace vtkm
|
|
|
|
{
|
|
|
|
namespace source
|
|
|
|
{
|
|
|
|
namespace tangle
|
|
|
|
{
|
2019-09-13 18:45:49 +00:00
|
|
|
class TangleField : public vtkm::worklet::WorkletVisitPointsWithCells
|
2019-08-23 00:23:34 +00:00
|
|
|
{
|
|
|
|
public:
|
2019-09-13 18:45:49 +00:00
|
|
|
using ControlSignature = void(CellSetIn, FieldOut v);
|
|
|
|
using ExecutionSignature = void(ThreadIndices, _2);
|
2019-08-23 00:23:34 +00:00
|
|
|
using InputDomain = _1;
|
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
const vtkm::Vec3f CellDimsf;
|
|
|
|
const vtkm::Vec3f Mins;
|
|
|
|
const vtkm::Vec3f Maxs;
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
VTKM_CONT
|
2019-09-13 18:45:49 +00:00
|
|
|
TangleField(const vtkm::Id3& cdims, const vtkm::Vec3f& mins, const vtkm::Vec3f& maxs)
|
|
|
|
: CellDimsf(static_cast<vtkm::FloatDefault>(cdims[0]),
|
|
|
|
static_cast<vtkm::FloatDefault>(cdims[1]),
|
|
|
|
static_cast<vtkm::FloatDefault>(cdims[2]))
|
|
|
|
, Mins(mins)
|
|
|
|
, Maxs(maxs)
|
2019-08-23 00:23:34 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
template <typename ThreadIndexType>
|
|
|
|
VTKM_EXEC void operator()(const ThreadIndexType& threadIndex, vtkm::Float32& v) const
|
2019-08-23 00:23:34 +00:00
|
|
|
{
|
2019-09-13 18:45:49 +00:00
|
|
|
//We are operating on a 3d structured grid. This means that the threadIndex has
|
|
|
|
//efficiently computed the i,j,k of the point current point for us
|
|
|
|
const vtkm::Id3 ijk = threadIndex.GetInputIndex3D();
|
|
|
|
const vtkm::Vec3f xyzf = static_cast<vtkm::Vec3f>(ijk) / this->CellDimsf;
|
2019-08-23 00:23:34 +00:00
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
const vtkm::Vec3f_32 values = 3.0f * vtkm::Vec3f_32(Mins + (Maxs - Mins) * xyzf);
|
|
|
|
const vtkm::Float32& xx = values[0];
|
|
|
|
const vtkm::Float32& yy = values[1];
|
|
|
|
const vtkm::Float32& zz = values[2];
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
v = (xx * xx * xx * xx - 5.0f * xx * xx + yy * yy * yy * yy - 5.0f * yy * yy +
|
|
|
|
zz * zz * zz * zz - 5.0f * zz * zz + 11.8f) *
|
|
|
|
0.2f +
|
|
|
|
0.5f;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} // namespace tangle
|
|
|
|
|
2019-08-23 17:56:17 +00:00
|
|
|
vtkm::cont::DataSet Tangle::Execute() const
|
2019-08-23 00:23:34 +00:00
|
|
|
{
|
2019-09-13 18:45:49 +00:00
|
|
|
VTKM_LOG_SCOPE_FUNCTION(vtkm::cont::LogLevel::Perf);
|
|
|
|
|
2019-08-23 00:23:34 +00:00
|
|
|
vtkm::cont::DataSet dataSet;
|
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
const vtkm::Id3 pdims{ this->Dims + vtkm::Id3{ 1, 1, 1 } };
|
|
|
|
const vtkm::Vec3f mins = { -1.0f, -1.0f, -1.0f };
|
|
|
|
const vtkm::Vec3f maxs = { 1.0f, 1.0f, 1.0f };
|
2019-08-23 00:23:34 +00:00
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
vtkm::cont::CellSetStructured<3> cellSet;
|
|
|
|
cellSet.SetPointDimensions(pdims);
|
|
|
|
dataSet.SetCellSet(cellSet);
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> pointFieldArray;
|
2019-09-13 18:45:49 +00:00
|
|
|
this->Invoke(tangle::TangleField{ this->Dims, mins, maxs }, cellSet, pointFieldArray);
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::FloatDefault> cellFieldArray;
|
2019-09-13 18:45:49 +00:00
|
|
|
vtkm::cont::ArrayCopy(
|
|
|
|
vtkm::cont::make_ArrayHandleCounting<vtkm::Id>(0, 1, cellSet.GetNumberOfCells()),
|
|
|
|
cellFieldArray);
|
2019-08-23 00:23:34 +00:00
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
const vtkm::Vec3f origin(0.0f, 0.0f, 0.0f);
|
|
|
|
const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(this->Dims[0]),
|
|
|
|
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[1]),
|
|
|
|
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[2]));
|
2019-08-23 00:23:34 +00:00
|
|
|
|
2019-09-13 18:45:49 +00:00
|
|
|
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(pdims, origin, spacing);
|
2019-08-23 00:23:34 +00:00
|
|
|
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
|
|
|
|
dataSet.AddField(vtkm::cont::make_FieldPoint("nodevar", pointFieldArray));
|
2019-09-11 18:06:58 +00:00
|
|
|
dataSet.AddField(vtkm::cont::make_FieldCell("cellvar", cellFieldArray));
|
2019-08-23 00:23:34 +00:00
|
|
|
|
|
|
|
return dataSet;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace source
|
|
|
|
} // namespace vtkm
|