Merge topic 'source-point-dims'

aa7b83bb2 Handle random seed generation better for PerlinNoise
84bc72312 Make source parameters more clear

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Li-Ta Lo <ollie@lanl.gov>
Merge-request: !2933
This commit is contained in:
Kenneth Moreland 2022-12-04 14:27:13 +00:00 committed by Kitware Robot
commit 22e2e5ff32
27 changed files with 304 additions and 148 deletions

@ -118,7 +118,9 @@ void BuildInputDataSet(uint32_t cycle, bool isStructured, bool isMultiBlock, vtk
PointVectorsName = "perlinnoisegrad"; PointVectorsName = "perlinnoisegrad";
// Generate uniform dataset(s) // Generate uniform dataset(s)
const vtkm::Id3 dims{ dim, dim, dim }; vtkm::source::PerlinNoise noise;
noise.SetPointDimensions({ dim, dim, dim });
noise.SetSeed(static_cast<vtkm::IdComponent>(cycle));
if (isMultiBlock) if (isMultiBlock)
{ {
for (auto i = 0; i < 2; ++i) for (auto i = 0; i < 2; ++i)
@ -127,12 +129,9 @@ void BuildInputDataSet(uint32_t cycle, bool isStructured, bool isMultiBlock, vtk
{ {
for (auto k = 0; k < 2; ++k) for (auto k = 0; k < 2; ++k)
{ {
const vtkm::Vec3f origin{ static_cast<vtkm::FloatDefault>(i), noise.SetOrigin({ static_cast<vtkm::FloatDefault>(i),
static_cast<vtkm::FloatDefault>(j), static_cast<vtkm::FloatDefault>(j),
static_cast<vtkm::FloatDefault>(k) }; static_cast<vtkm::FloatDefault>(k) });
const vtkm::source::PerlinNoise noise{ dims,
origin,
static_cast<vtkm::IdComponent>(cycle) };
const auto dataset = noise.Execute(); const auto dataset = noise.Execute();
partitionedInputDataSet.AppendPartition(dataset); partitionedInputDataSet.AppendPartition(dataset);
} }
@ -141,7 +140,6 @@ void BuildInputDataSet(uint32_t cycle, bool isStructured, bool isMultiBlock, vtk
} }
else else
{ {
const vtkm::source::PerlinNoise noise{ dims, static_cast<vtkm::IdComponent>(cycle) };
inputDataSet = noise.Execute(); inputDataSet = noise.Execute();
} }

@ -39,9 +39,8 @@ vtkm::cont::InitializeResult Config;
void BenchRayTracing(::benchmark::State& state) void BenchRayTracing(::benchmark::State& state)
{ {
const vtkm::Id3 dims(128, 128, 128); vtkm::source::Tangle maker;
maker.SetPointDimensions({ 128, 128, 128 });
vtkm::source::Tangle maker(dims);
vtkm::cont::DataSet dataset = maker.Execute(); vtkm::cont::DataSet dataset = maker.Execute();
vtkm::cont::CoordinateSystem coords = dataset.GetCoordinateSystem(); vtkm::cont::CoordinateSystem coords = dataset.GetCoordinateSystem();

@ -0,0 +1,8 @@
# Setting source parameters is more clear
Originally, most of the sources used constructor parameters to set the
various options of the source. Although convenient, it was difficult to
keep track of what each parameter meant. To make the code more clear,
source parameters are now set with accessor functions (e.g.
`SetPointDimensions`). Although this makes code more verbose, it helps
prevent mistakes and makes the changes more resilient to future changes.

@ -34,7 +34,8 @@ int main(int argc, char* argv[])
{ {
vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict); vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
auto tangle = vtkm::source::Tangle(vtkm::Id3{ 50, 50, 50 }); vtkm::source::Tangle tangle;
tangle.SetPointDimensions({ 50, 50, 50 });
vtkm::cont::DataSet tangleData = tangle.Execute(); vtkm::cont::DataSet tangleData = tangle.Execute();
std::string fieldName = "tangle"; std::string fieldName = "tangle";

@ -54,7 +54,10 @@ void Test()
int cellsPerDimension = 8; int cellsPerDimension = 8;
// Generate AMR // Generate AMR
vtkm::source::Amr source(dim, cellsPerDimension, numberOfLevels); vtkm::source::Amr source;
source.SetDimension(dim);
source.SetNumberOfLevels(numberOfLevels);
source.SetCellsPerDimension(cellsPerDimension);
vtkm::cont::PartitionedDataSet amrDataSet = source.Execute(); vtkm::cont::PartitionedDataSet amrDataSet = source.Execute();
// one point for each partition // one point for each partition

@ -24,8 +24,8 @@ class TestCellSetConnectivity
public: public:
static void TestTangleIsosurface() static void TestTangleIsosurface()
{ {
vtkm::Id3 dims(4, 4, 4); vtkm::source::Tangle tangle;
vtkm::source::Tangle tangle(dims); tangle.SetCellDimensions({ 4, 4, 4 });
vtkm::cont::DataSet dataSet = tangle.Execute(); vtkm::cont::DataSet dataSet = tangle.Execute();
vtkm::filter::contour::Contour filter; vtkm::filter::contour::Contour filter;

@ -110,8 +110,8 @@ void TestContourFilterTangle()
{ {
std::cout << "Generate Image for Contour filter on a uniform tangle grid" << std::endl; std::cout << "Generate Image for Contour filter on a uniform tangle grid" << std::endl;
vtkm::Id3 dims(4, 4, 4); vtkm::source::Tangle tangle;
vtkm::source::Tangle tangle(dims); tangle.SetCellDimensions({ 4, 4, 4 });
vtkm::cont::DataSet dataSet = tangle.Execute(); vtkm::cont::DataSet dataSet = tangle.Execute();
vtkm::filter::contour::Contour contour; vtkm::filter::contour::Contour contour;

@ -24,7 +24,8 @@ void TestSliceStructuredPointsPlane()
{ {
std::cout << "Generate Image for Slice by plane on structured points" << std::endl; std::cout << "Generate Image for Slice by plane on structured points" << std::endl;
vtkm::source::Wavelet wavelet(vtkm::Id3(-8), vtkm::Id3(8)); vtkm::source::Wavelet wavelet;
wavelet.SetExtent(vtkm::Id3(-8), vtkm::Id3(8));
auto ds = wavelet.Execute(); auto ds = wavelet.Execute();
vtkm::Plane plane(vtkm::Plane::Vector{ 1, 1, 1 }); vtkm::Plane plane(vtkm::Plane::Vector{ 1, 1, 1 });
@ -45,7 +46,8 @@ void TestSliceStructuredPointsSphere()
{ {
std::cout << "Generate Image for Slice by sphere on structured points" << std::endl; std::cout << "Generate Image for Slice by sphere on structured points" << std::endl;
vtkm::source::Wavelet wavelet(vtkm::Id3(-8), vtkm::Id3(8)); vtkm::source::Wavelet wavelet;
wavelet.SetExtent(vtkm::Id3(-8), vtkm::Id3(8));
auto ds = wavelet.Execute(); auto ds = wavelet.Execute();
vtkm::Sphere sphere(8.5f); vtkm::Sphere sphere(8.5f);
@ -66,7 +68,8 @@ void TestSliceUnstructuredGridPlane()
{ {
std::cout << "Generate Image for Slice by plane on unstructured grid" << std::endl; std::cout << "Generate Image for Slice by plane on unstructured grid" << std::endl;
vtkm::source::Wavelet wavelet(vtkm::Id3(-8), vtkm::Id3(8)); vtkm::source::Wavelet wavelet;
wavelet.SetExtent(vtkm::Id3(-8), vtkm::Id3(8));
auto ds = wavelet.Execute(); auto ds = wavelet.Execute();
vtkm::filter::geometry_refinement::Tetrahedralize tetrahedralize; vtkm::filter::geometry_refinement::Tetrahedralize tetrahedralize;
ds = tetrahedralize.Execute(ds); ds = tetrahedralize.Execute(ds);
@ -89,7 +92,8 @@ void TestSliceUnstructuredGridCylinder()
{ {
std::cout << "Generate Image for Slice by cylinder on unstructured grid" << std::endl; std::cout << "Generate Image for Slice by cylinder on unstructured grid" << std::endl;
vtkm::source::Wavelet wavelet(vtkm::Id3(-8), vtkm::Id3(8)); vtkm::source::Wavelet wavelet;
wavelet.SetExtent(vtkm::Id3(-8), vtkm::Id3(8));
auto ds = wavelet.Execute(); auto ds = wavelet.Execute();
vtkm::filter::geometry_refinement::Tetrahedralize tetrahedralize; vtkm::filter::geometry_refinement::Tetrahedralize tetrahedralize;
ds = tetrahedralize.Execute(ds); ds = tetrahedralize.Execute(ds);

@ -30,8 +30,8 @@ public:
{ {
std::cout << "Testing Contour filter on a uniform grid" << std::endl; std::cout << "Testing Contour filter on a uniform grid" << std::endl;
vtkm::Id3 dims(4, 4, 4); vtkm::source::Tangle tangle;
vtkm::source::Tangle tangle(dims); tangle.SetCellDimensions({ 4, 4, 4 });
vtkm::filter::field_transform::GenerateIds genIds; vtkm::filter::field_transform::GenerateIds genIds;
genIds.SetUseFloat(true); genIds.SetUseFloat(true);
genIds.SetGeneratePointIds(false); genIds.SetGeneratePointIds(false);

@ -20,8 +20,8 @@ namespace
void TestEntropy() void TestEntropy()
{ {
///// make a data set ///// ///// make a data set /////
vtkm::Id3 dims(32, 32, 32); vtkm::source::Tangle tangle;
vtkm::source::Tangle tangle(dims); tangle.SetCellDimensions({ 32, 32, 32 });
vtkm::cont::DataSet dataSet = tangle.Execute(); vtkm::cont::DataSet dataSet = tangle.Execute();
vtkm::filter::density_estimate::Entropy entropyFilter; vtkm::filter::density_estimate::Entropy entropyFilter;

@ -77,7 +77,9 @@ void TryGenerateIds(
void TestGenerateIds() void TestGenerateIds()
{ {
vtkm::cont::DataSet input = vtkm::source::Tangle{ vtkm::Id3(8) }.Execute(); vtkm::source::Tangle tangle;
tangle.SetCellDimensions({ 8, 8, 8 });
vtkm::cont::DataSet input = tangle.Execute();
vtkm::filter::field_transform::GenerateIds filter; vtkm::filter::field_transform::GenerateIds filter;
TryGenerateIds(filter, input); TryGenerateIds(filter, input);

@ -113,7 +113,8 @@ vtkm::cont::DataSet Make3DExplicitSimpleCube()
vtkm::cont::DataSet Make3DWavelet() vtkm::cont::DataSet Make3DWavelet()
{ {
vtkm::source::Wavelet wavelet({ -25 }, { 25 }); vtkm::source::Wavelet wavelet;
wavelet.SetExtent({ -25 }, { 25 });
wavelet.SetFrequency({ 60, 30, 40 }); wavelet.SetFrequency({ 60, 30, 40 });
wavelet.SetMagnitude({ 5 }); wavelet.SetMagnitude({ 5 });

@ -24,7 +24,10 @@ void TestAmrArraysExecute(int dim, int numberOfLevels, int cellsPerDimension)
std::cout << "Generate Image for AMR" << std::endl; std::cout << "Generate Image for AMR" << std::endl;
// Generate AMR // Generate AMR
vtkm::source::Amr source(dim, cellsPerDimension, numberOfLevels); vtkm::source::Amr source;
source.SetDimension(dim);
source.SetNumberOfLevels(numberOfLevels);
source.SetCellsPerDimension(cellsPerDimension);
vtkm::cont::PartitionedDataSet amrDataSet = source.Execute(); vtkm::cont::PartitionedDataSet amrDataSet = source.Execute();
// std::cout << "amr " << std::endl; // std::cout << "amr " << std::endl;
// amrDataSet.PrintSummary(std::cout); // amrDataSet.PrintSummary(std::cout);

@ -93,7 +93,8 @@ void TestMultiBlockFilter()
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
vtkm::Id3 dims(10 + i, 10 + i, 10 + i); vtkm::Id3 dims(10 + i, 10 + i, 10 + i);
vtkm::source::Tangle tangle(dims); vtkm::source::Tangle tangle;
tangle.SetCellDimensions(dims);
pds.AppendPartition(tangle.Execute()); pds.AppendPartition(tangle.Execute());
} }

@ -30,8 +30,6 @@ Amr::Amr(vtkm::IdComponent dimension,
{ {
} }
Amr::~Amr() = default;
template <vtkm::IdComponent Dim> template <vtkm::IdComponent Dim>
vtkm::cont::DataSet Amr::GenerateDataSet(unsigned int level, unsigned int amrIndex) const vtkm::cont::DataSet Amr::GenerateDataSet(unsigned int level, unsigned int amrIndex) const
{ {
@ -53,10 +51,11 @@ vtkm::cont::DataSet Amr::GenerateDataSet(unsigned int level, unsigned int amrInd
center[2] = 0; center[2] = 0;
} }
vtkm::source::Wavelet waveletSource(-extent, extent); vtkm::source::Wavelet waveletSource;
waveletSource.SetOrigin(origin); waveletSource.SetOrigin(origin);
waveletSource.SetSpacing(spacing); waveletSource.SetSpacing(spacing);
waveletSource.SetCenter(center); waveletSource.SetCenter(center);
waveletSource.SetExtent(-extent, extent);
waveletSource.SetFrequency(frequency); waveletSource.SetFrequency(frequency);
waveletSource.SetStandardDeviation(deviation); waveletSource.SetStandardDeviation(deviation);
vtkm::cont::DataSet wavelet = waveletSource.Execute(); vtkm::cont::DataSet wavelet = waveletSource.Execute();

@ -58,22 +58,39 @@ namespace source
class VTKM_SOURCE_EXPORT Amr class VTKM_SOURCE_EXPORT Amr
{ {
public: public:
VTKM_CONT VTKM_CONT Amr() = default;
Amr(vtkm::IdComponent dimension = 2,
vtkm::IdComponent cellsPerDimension = 6,
vtkm::IdComponent numberOfLevels = 4);
VTKM_CONT
~Amr();
vtkm::cont::PartitionedDataSet Execute() const; VTKM_CONT VTKM_DEPRECATED(2.0, "Use Set* methods to set parameters.")
Amr(vtkm::IdComponent dimension,
vtkm::IdComponent cellsPerDimension = 6,
vtkm::IdComponent numberOfLevels = 4);
VTKM_CONT ~Amr() = default;
VTKM_CONT void SetDimension(vtkm::IdComponent dimension) { this->Dimension = dimension; }
VTKM_CONT vtkm::IdComponent GetDimension() const { return this->Dimension; }
VTKM_CONT void SetCellsPerDimension(vtkm::IdComponent cellsPerDimension)
{
this->CellsPerDimension = cellsPerDimension;
}
VTKM_CONT vtkm::IdComponent GetCellsPerDimension() const { return this->CellsPerDimension; }
VTKM_CONT void SetNumberOfLevels(vtkm::IdComponent numberOfLevels)
{
this->NumberOfLevels = numberOfLevels;
}
VTKM_CONT vtkm::IdComponent GetNumberOfLevels() const { return this->NumberOfLevels; }
VTKM_CONT vtkm::cont::PartitionedDataSet Execute() const;
private: private:
template <vtkm::IdComponent Dim> template <vtkm::IdComponent Dim>
vtkm::cont::DataSet GenerateDataSet(unsigned int level, unsigned int amrIndex) const; vtkm::cont::DataSet GenerateDataSet(unsigned int level, unsigned int amrIndex) const;
vtkm::IdComponent Dimension; vtkm::IdComponent Dimension = 2;
vtkm::IdComponent CellsPerDimension; vtkm::IdComponent CellsPerDimension = 6;
vtkm::IdComponent NumberOfLevels; vtkm::IdComponent NumberOfLevels = 4;
}; };
} //namespace source } //namespace source
} //namespace vtkm } //namespace vtkm

@ -10,13 +10,10 @@
#include <vtkm/source/Oscillator.h> #include <vtkm/source/Oscillator.h>
#include <vtkm/worklet/WorkletMapField.h> #include <vtkm/worklet/WorkletMapField.h>
namespace vtkm namespace
{ {
namespace source
{ struct Oscillation
namespace internal
{
struct Oscillator
{ {
vtkm::Vec3f Center; vtkm::Vec3f Center;
vtkm::FloatDefault Radius; vtkm::FloatDefault Radius;
@ -24,7 +21,7 @@ struct Oscillator
vtkm::FloatDefault Zeta; vtkm::FloatDefault Zeta;
}; };
class OscillatorSource : public vtkm::worklet::WorkletMapField class OscillatorWorklet : public vtkm::worklet::WorkletMapField
{ {
public: public:
typedef void ControlSignature(FieldIn, FieldOut); typedef void ControlSignature(FieldIn, FieldOut);
@ -40,7 +37,7 @@ public:
{ {
if (this->PeriodicOscillators.GetNumberOfComponents() < MAX_OSCILLATORS) if (this->PeriodicOscillators.GetNumberOfComponents() < MAX_OSCILLATORS)
{ {
this->PeriodicOscillators.Append(Oscillator{ { x, y, z }, radius, omega, zeta }); this->PeriodicOscillators.Append(Oscillation{ { x, y, z }, radius, omega, zeta });
} }
} }
@ -54,7 +51,7 @@ public:
{ {
if (this->DampedOscillators.GetNumberOfComponents() < MAX_OSCILLATORS) if (this->DampedOscillators.GetNumberOfComponents() < MAX_OSCILLATORS)
{ {
this->DampedOscillators.Append(Oscillator{ { x, y, z }, radius, omega, zeta }); this->DampedOscillators.Append(Oscillation{ { x, y, z }, radius, omega, zeta });
} }
} }
@ -68,7 +65,7 @@ public:
{ {
if (this->DecayingOscillators.GetNumberOfComponents() < MAX_OSCILLATORS) if (this->DecayingOscillators.GetNumberOfComponents() < MAX_OSCILLATORS)
{ {
this->DecayingOscillators.Append(Oscillator{ { x, y, z }, radius, omega, zeta }); this->DecayingOscillators.Append(Oscillation{ { x, y, z }, radius, omega, zeta });
} }
} }
@ -80,7 +77,7 @@ public:
{ {
vtkm::UInt8 oIdx; vtkm::UInt8 oIdx;
vtkm::FloatDefault t0, t, result = 0; vtkm::FloatDefault t0, t, result = 0;
const internal::Oscillator* oscillator; const Oscillation* oscillator;
t0 = 0.0; t0 = 0.0;
t = vtkm::FloatDefault(this->Time * 2 * 3.14159265358979323846); t = vtkm::FloatDefault(this->Time * 2 * 3.14159265358979323846);
@ -136,27 +133,64 @@ public:
private: private:
static constexpr vtkm::IdComponent MAX_OSCILLATORS = 10; static constexpr vtkm::IdComponent MAX_OSCILLATORS = 10;
vtkm::VecVariable<internal::Oscillator, MAX_OSCILLATORS> PeriodicOscillators; vtkm::VecVariable<Oscillation, MAX_OSCILLATORS> PeriodicOscillators;
vtkm::VecVariable<internal::Oscillator, MAX_OSCILLATORS> DampedOscillators; vtkm::VecVariable<Oscillation, MAX_OSCILLATORS> DampedOscillators;
vtkm::VecVariable<internal::Oscillator, MAX_OSCILLATORS> DecayingOscillators; vtkm::VecVariable<Oscillation, MAX_OSCILLATORS> DecayingOscillators;
vtkm::FloatDefault Time{}; vtkm::FloatDefault Time{};
}; // OscillatorSource }; // OscillatorWorklet
} // internal } // anonymous namespace
namespace vtkm
{
namespace source
{
//-----------------------------------------------------------------------------
struct Oscillator::InternalStruct
{
vtkm::Id3 PointDimensions = { 3, 3, 3 };
OscillatorWorklet Worklet;
};
//-----------------------------------------------------------------------------
Oscillator::Oscillator()
: Internals(new InternalStruct)
{
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Oscillator::Oscillator(vtkm::Id3 dims) Oscillator::Oscillator(vtkm::Id3 dims)
: Dims(dims) : Internals(new InternalStruct)
, Worklet(std::make_unique<internal::OscillatorSource>())
{ {
this->SetCellDimensions(dims);
} }
Oscillator::~Oscillator() = default; Oscillator::~Oscillator() = default;
//-----------------------------------------------------------------------------
void Oscillator::SetPointDimensions(vtkm::Id3 pointDimensions)
{
this->Internals->PointDimensions = pointDimensions;
}
vtkm::Id3 Oscillator::GetPointDimensions() const
{
return this->Internals->PointDimensions;
}
void Oscillator::SetCellDimensions(vtkm::Id3 cellDimensions)
{
this->SetPointDimensions(cellDimensions + vtkm::Id3(1));
}
vtkm::Id3 Oscillator::GetCellDimensions() const
{
return this->GetPointDimensions() - vtkm::Id3(1);
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void Oscillator::SetTime(vtkm::FloatDefault time) void Oscillator::SetTime(vtkm::FloatDefault time)
{ {
this->Worklet->SetTime(time); this->Internals->Worklet.SetTime(time);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -167,7 +201,7 @@ void Oscillator::AddPeriodic(vtkm::FloatDefault x,
vtkm::FloatDefault omega, vtkm::FloatDefault omega,
vtkm::FloatDefault zeta) vtkm::FloatDefault zeta)
{ {
this->Worklet->AddPeriodic(x, y, z, radius, omega, zeta); this->Internals->Worklet.AddPeriodic(x, y, z, radius, omega, zeta);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -178,7 +212,7 @@ void Oscillator::AddDamped(vtkm::FloatDefault x,
vtkm::FloatDefault omega, vtkm::FloatDefault omega,
vtkm::FloatDefault zeta) vtkm::FloatDefault zeta)
{ {
this->Worklet->AddDamped(x, y, z, radius, omega, zeta); this->Internals->Worklet.AddDamped(x, y, z, radius, omega, zeta);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -189,7 +223,7 @@ void Oscillator::AddDecaying(vtkm::FloatDefault x,
vtkm::FloatDefault omega, vtkm::FloatDefault omega,
vtkm::FloatDefault zeta) vtkm::FloatDefault zeta)
{ {
this->Worklet->AddDecaying(x, y, z, radius, omega, zeta); this->Internals->Worklet.AddDecaying(x, y, z, radius, omega, zeta);
} }
@ -200,22 +234,23 @@ vtkm::cont::DataSet Oscillator::DoExecute() const
vtkm::cont::DataSet dataSet; vtkm::cont::DataSet dataSet;
const vtkm::Id3 pdims{ this->Dims + vtkm::Id3{ 1, 1, 1 } };
vtkm::cont::CellSetStructured<3> cellSet; vtkm::cont::CellSetStructured<3> cellSet;
cellSet.SetPointDimensions(pdims); vtkm::Id3 pointDims = this->GetPointDimensions();
cellSet.SetPointDimensions(pointDims);
dataSet.SetCellSet(cellSet); dataSet.SetCellSet(cellSet);
vtkm::Id3 cellDims = this->GetCellDimensions();
const vtkm::Vec3f origin(0.0f, 0.0f, 0.0f); const vtkm::Vec3f origin(0.0f, 0.0f, 0.0f);
const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(this->Dims[0]), const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(cellDims[0]),
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[1]), 1.0f / static_cast<vtkm::FloatDefault>(cellDims[1]),
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[2])); 1.0f / static_cast<vtkm::FloatDefault>(cellDims[2]));
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(pdims, origin, spacing); vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(pointDims, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates)); dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
vtkm::cont::ArrayHandle<vtkm::FloatDefault> outArray; vtkm::cont::ArrayHandle<vtkm::FloatDefault> outArray;
this->Invoke(*(this->Worklet), coordinates, outArray); this->Invoke(this->Internals->Worklet, coordinates, outArray);
dataSet.AddField(vtkm::cont::make_FieldPoint("oscillating", outArray)); dataSet.AddField(vtkm::cont::make_FieldPoint("oscillating", outArray));
return dataSet; return dataSet;

@ -16,10 +16,6 @@ namespace vtkm
{ {
namespace source namespace source
{ {
namespace internal
{
class OscillatorSource;
}
/**\brief An analytical, time-varying uniform dataset with a point based array /**\brief An analytical, time-varying uniform dataset with a point based array
* *
@ -32,15 +28,22 @@ class OscillatorSource;
class VTKM_SOURCE_EXPORT Oscillator final : public vtkm::source::Source class VTKM_SOURCE_EXPORT Oscillator final : public vtkm::source::Source
{ {
public: public:
VTKM_CONT Oscillator();
///Construct a Oscillator with Cell Dimensions ///Construct a Oscillator with Cell Dimensions
VTKM_CONT VTKM_CONT VTKM_DEPRECATED(
explicit Oscillator(vtkm::Id3 dims); 2.0,
"Use SetCellDimensions or SetPointDimensions.") explicit Oscillator(vtkm::Id3 dims);
// We can not declare default destructor here since compiler does not know how // We can not declare default destructor here since compiler does not know how
// to create one for the Worklet at this point yet. However, the implementation // to create one for the Worklet at this point yet. However, the implementation
// in Oscillator.cxx does have ~Oscillator() = default; // in Oscillator.cxx does have ~Oscillator() = default;
VTKM_CONT VTKM_CONT ~Oscillator() override;
~Oscillator() override;
VTKM_CONT void SetPointDimensions(vtkm::Id3 pointDimensions);
VTKM_CONT vtkm::Id3 GetPointDimensions() const;
VTKM_CONT void SetCellDimensions(vtkm::Id3 pointDimensions);
VTKM_CONT vtkm::Id3 GetCellDimensions() const;
VTKM_CONT VTKM_CONT
void SetTime(vtkm::FloatDefault time); void SetTime(vtkm::FloatDefault time);
@ -72,8 +75,8 @@ public:
private: private:
VTKM_CONT vtkm::cont::DataSet DoExecute() const override; VTKM_CONT vtkm::cont::DataSet DoExecute() const override;
vtkm::Id3 Dims; struct InternalStruct;
std::unique_ptr<internal::OscillatorSource> Worklet; std::unique_ptr<InternalStruct> Internals;
}; };
} }
} }

@ -149,7 +149,26 @@ private:
VTKM_CONT void GeneratePermutations() VTKM_CONT void GeneratePermutations()
{ {
std::mt19937_64 rng; std::mt19937_64 rng;
rng.seed(this->Seed); if (this->Seed != 0)
{
rng.seed(this->Seed);
}
else
{
// If a seed has not been chosen, create a unique seed here. It is done here instead
// of the `PerlinNoise` source constructor for 2 reasons. First, `std::random_device`
// can be slow. If the user wants to specify a seed, it makes no sense to spend
// time generating a random seed only to overwrite it. Second, creating the seed
// here allows subsequent runs of the `PerlinNoise` source to have different random
// results if a seed is not specified.
//
// It is also worth noting that the current time is added to the random number.
// This is because the spec for std::random_device allows it to be deterministic
// if nondeterministic hardware is unavailable and the deterministic numbers can
// be the same for every execution of the program. Adding the current time is
// a fallback for that case.
rng.seed(std::random_device{}() + time(NULL));
}
std::uniform_int_distribution<vtkm::IdComponent> distribution(0, this->TableSize - 1); std::uniform_int_distribution<vtkm::IdComponent> distribution(0, this->TableSize - 1);
vtkm::cont::ArrayHandle<vtkm::Id> perms; vtkm::cont::ArrayHandle<vtkm::Id> perms;
@ -180,25 +199,30 @@ namespace source
{ {
PerlinNoise::PerlinNoise(vtkm::Id3 dims) PerlinNoise::PerlinNoise(vtkm::Id3 dims)
: PerlinNoise(dims, vtkm::Vec3f(0), static_cast<vtkm::IdComponent>(time(NULL))) : PerlinNoise()
{ {
this->SetCellDimensions(dims);
} }
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed) PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed)
: PerlinNoise(dims, vtkm::Vec3f(0), seed) : PerlinNoise()
{ {
this->SetCellDimensions(dims);
this->SetSeed(seed);
} }
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin) PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin)
: PerlinNoise(dims, origin, static_cast<vtkm::IdComponent>(time(NULL))) : PerlinNoise()
{ {
this->SetCellDimensions(dims);
this->SetOrigin(origin);
} }
PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed) PerlinNoise::PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed)
: Dims(dims)
, Origin(origin)
, Seed(seed)
{ {
this->SetCellDimensions(dims);
this->SetOrigin(origin);
this->SetSeed(seed);
} }
vtkm::cont::DataSet PerlinNoise::DoExecute() const vtkm::cont::DataSet PerlinNoise::DoExecute() const
@ -206,20 +230,19 @@ vtkm::cont::DataSet PerlinNoise::DoExecute() const
VTKM_LOG_SCOPE_FUNCTION(vtkm::cont::LogLevel::Perf); VTKM_LOG_SCOPE_FUNCTION(vtkm::cont::LogLevel::Perf);
vtkm::cont::DataSet dataSet; vtkm::cont::DataSet dataSet;
const vtkm::Id3 pdims{ this->Dims + vtkm::Id3{ 1, 1, 1 } }; const vtkm::Vec3f cellDims = this->GetCellDimensions();
const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(this->Dims[0]), const vtkm::Vec3f spacing(1.0f / cellDims[0], 1.0f / cellDims[1], 1.0f / cellDims[2]);
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[1]),
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[2]));
vtkm::cont::CellSetStructured<3> cellSet; vtkm::cont::CellSetStructured<3> cellSet;
cellSet.SetPointDimensions(pdims); cellSet.SetPointDimensions(this->PointDimensions);
dataSet.SetCellSet(cellSet); dataSet.SetCellSet(cellSet);
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(pdims, this->Origin, spacing); vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(
this->PointDimensions, this->Origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates)); dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
auto tableSize = static_cast<vtkm::IdComponent>( auto tableSize =
vtkm::Max(this->Dims[0], vtkm::Max(this->Dims[1], this->Dims[2]))); static_cast<vtkm::IdComponent>(vtkm::Max(cellDims[0], vtkm::Max(cellDims[1], cellDims[2])));
PerlinNoiseField noiseGenerator(tableSize, this->Seed); PerlinNoiseField noiseGenerator(tableSize, this->Seed);
noiseGenerator.SetOutputFieldName("perlinnoise"); noiseGenerator.SetOutputFieldName("perlinnoise");
dataSet = noiseGenerator.Execute(dataSet); dataSet = noiseGenerator.Execute(dataSet);

@ -29,22 +29,44 @@ namespace source
class VTKM_SOURCE_EXPORT PerlinNoise final : public vtkm::source::Source class VTKM_SOURCE_EXPORT PerlinNoise final : public vtkm::source::Source
{ {
public: public:
///Construct a PerlinNoise with Cell Dimensions VTKM_CONT PerlinNoise() = default;
VTKM_CONT ~PerlinNoise() = default;
VTKM_CONT PerlinNoise(const PerlinNoise&) = default;
VTKM_CONT PerlinNoise(PerlinNoise&&) = default;
VTKM_CONT PerlinNoise& operator=(const PerlinNoise&) = default;
VTKM_CONT PerlinNoise& operator=(PerlinNoise&&) = default;
VTKM_DEPRECATED(2.0, "Use SetCellDimensions or SetPointDimensions.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims); VTKM_CONT PerlinNoise(vtkm::Id3 dims);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions and SetSeed.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed); VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::IdComponent seed);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions and SetOrigin.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin); VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin);
VTKM_DEPRECATED(2.0, "Use Set*Dimensions, SetOrigin, and SetSeed.")
VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed); VTKM_CONT PerlinNoise(vtkm::Id3 dims, vtkm::Vec3f origin, vtkm::IdComponent seed);
vtkm::IdComponent GetSeed() const { return this->Seed; } VTKM_CONT vtkm::Id3 GetPointDimensions() const { return this->PointDimensions; }
VTKM_CONT void SetPointDimensions(vtkm::Id3 dims) { this->PointDimensions = dims; }
void SetSeed(vtkm::IdComponent seed) { this->Seed = seed; } VTKM_CONT vtkm::Id3 GetCellDimensions() const { return this->PointDimensions - vtkm::Id3(1); }
VTKM_CONT void SetCellDimensions(vtkm::Id3 dims) { this->PointDimensions = dims + vtkm::Id3(1); }
VTKM_CONT vtkm::Vec3f GetOrigin() const { return this->Origin; }
VTKM_CONT void SetOrigin(const vtkm::Vec3f& origin) { this->Origin = origin; }
/// \brief The seed used for the pseudorandom number generation of the noise.
///
/// If the seed is set to 0, then a new, unique seed is picked each time `Execute` is run.
VTKM_CONT vtkm::IdComponent GetSeed() const { return this->Seed; }
VTKM_CONT void SetSeed(vtkm::IdComponent seed) { this->Seed = seed; }
private: private:
vtkm::cont::DataSet DoExecute() const override; vtkm::cont::DataSet DoExecute() const override;
vtkm::Id3 Dims; vtkm::Id3 PointDimensions = { 16, 16, 16 };
vtkm::Vec3f Origin; vtkm::Vec3f Origin = { 0, 0, 0 };
vtkm::IdComponent Seed; vtkm::IdComponent Seed = 0;
}; };
} //namespace source } //namespace source
} //namespace vtkm } //namespace vtkm

@ -66,23 +66,25 @@ vtkm::cont::DataSet Tangle::DoExecute() const
vtkm::cont::DataSet dataSet; vtkm::cont::DataSet dataSet;
const vtkm::Id3 pdims{ this->Dims + vtkm::Id3{ 1, 1, 1 } };
const vtkm::Vec3f mins = { -1.0f, -1.0f, -1.0f }; const vtkm::Vec3f mins = { -1.0f, -1.0f, -1.0f };
const vtkm::Vec3f maxs = { 1.0f, 1.0f, 1.0f }; const vtkm::Vec3f maxs = { 1.0f, 1.0f, 1.0f };
vtkm::cont::CellSetStructured<3> cellSet; vtkm::cont::CellSetStructured<3> cellSet;
cellSet.SetPointDimensions(pdims); cellSet.SetPointDimensions(this->PointDimensions);
dataSet.SetCellSet(cellSet); dataSet.SetCellSet(cellSet);
vtkm::Id3 cellDims = this->GetCellDimensions();
vtkm::cont::ArrayHandle<vtkm::Float32> pointFieldArray; vtkm::cont::ArrayHandle<vtkm::Float32> pointFieldArray;
this->Invoke(tangle::TangleField{ this->Dims, mins, maxs }, cellSet, pointFieldArray); this->Invoke(tangle::TangleField{ cellDims, mins, maxs }, cellSet, pointFieldArray);
const vtkm::Vec3f origin(0.0f, 0.0f, 0.0f); const vtkm::Vec3f origin(0.0f, 0.0f, 0.0f);
const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(this->Dims[0]), const vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(cellDims[0]),
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[1]), 1.0f / static_cast<vtkm::FloatDefault>(cellDims[1]),
1.0f / static_cast<vtkm::FloatDefault>(this->Dims[2])); 1.0f / static_cast<vtkm::FloatDefault>(cellDims[2]));
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(pdims, origin, spacing); vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(
this->PointDimensions, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates)); dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
dataSet.AddField(vtkm::cont::make_FieldPoint("tangle", pointFieldArray)); dataSet.AddField(vtkm::cont::make_FieldPoint("tangle", pointFieldArray));

@ -35,17 +35,25 @@ namespace source
class VTKM_SOURCE_EXPORT Tangle final : public vtkm::source::Source class VTKM_SOURCE_EXPORT Tangle final : public vtkm::source::Source
{ {
public: public:
///Construct a Tangle with Cell Dimensions VTKM_CONT Tangle() = default;
VTKM_CONT VTKM_CONT ~Tangle() = default;
Tangle(vtkm::Id3 dims)
: Dims(dims) VTKM_DEPRECATED(2.0, "Use SetCellDimensions or SetPointDimensions.")
VTKM_CONT Tangle(vtkm::Id3 dims)
: PointDimensions(dims + vtkm::Id3(1))
{ {
} }
VTKM_CONT vtkm::Id3 GetPointDimensions() const { return this->PointDimensions; }
VTKM_CONT void SetPointDimensions(vtkm::Id3 dims) { this->PointDimensions = dims; }
VTKM_CONT vtkm::Id3 GetCellDimensions() const { return this->PointDimensions - vtkm::Id3(1); }
VTKM_CONT void SetCellDimensions(vtkm::Id3 dims) { this->PointDimensions = dims + vtkm::Id3(1); }
private: private:
vtkm::cont::DataSet DoExecute() const override; vtkm::cont::DataSet DoExecute() const override;
vtkm::Id3 Dims; vtkm::Id3 PointDimensions = { 16, 16, 16 };
}; };
} //namespace source } //namespace source
} //namespace vtkm } //namespace vtkm

@ -97,15 +97,8 @@ struct WaveletField : public vtkm::worklet::WorkletVisitPointsWithCells
} // namespace wavelet } // namespace wavelet
Wavelet::Wavelet(vtkm::Id3 minExtent, vtkm::Id3 maxExtent) Wavelet::Wavelet(vtkm::Id3 minExtent, vtkm::Id3 maxExtent)
: Center{ minExtent - ((minExtent - maxExtent) / 2) } : MinimumExtent(minExtent)
, Origin{ minExtent } , MaximumExtent(maxExtent)
, Spacing{ 1. }
, Frequency{ 60., 30., 40. }
, Magnitude{ 10., 18., 5. }
, MinimumExtent{ minExtent }
, MaximumExtent{ maxExtent }
, MaximumValue{ 255. }
, StandardDeviation{ 0.5 }
{ {
} }
@ -139,7 +132,7 @@ vtkm::cont::DataSet Wavelet::DoExecute() const
// Create points: // Create points:
const vtkm::Id3 dims{ this->MaximumExtent - this->MinimumExtent + vtkm::Id3{ 1 } }; const vtkm::Id3 dims{ this->MaximumExtent - this->MinimumExtent + vtkm::Id3{ 1 } };
vtkm::cont::CoordinateSystem coords{ "coordinates", dims, this->Origin, this->Spacing }; vtkm::cont::CoordinateSystem coords{ "coordinates", dims, this->GetOrigin(), this->Spacing };
// Compile the dataset: // Compile the dataset:
if (this->MaximumExtent[2] - this->MinimumExtent[2] < vtkm::Epsilon<vtkm::FloatDefault>()) if (this->MaximumExtent[2] - this->MinimumExtent[2] < vtkm::Epsilon<vtkm::FloatDefault>())

@ -13,6 +13,8 @@
#include <vtkm/source/Source.h> #include <vtkm/source/Source.h>
#include <vtkm/Math.h>
namespace vtkm namespace vtkm
{ {
namespace source namespace source
@ -59,28 +61,54 @@ namespace source
class VTKM_SOURCE_EXPORT Wavelet final : public vtkm::source::Source class VTKM_SOURCE_EXPORT Wavelet final : public vtkm::source::Source
{ {
public: public:
VTKM_CONT VTKM_CONT Wavelet() = default;
Wavelet(vtkm::Id3 minExtent = { -10 }, vtkm::Id3 maxExtent = { 10 }); VTKM_CONT ~Wavelet() = default;
VTKM_CONT void SetCenter(const vtkm::Vec<FloatDefault, 3>& center) { this->Center = center; } VTKM_DEPRECATED(2.0, "Use SetExtent.")
VTKM_CONT Wavelet(vtkm::Id3 minExtent, vtkm::Id3 maxExtent = { 10 });
VTKM_CONT void SetOrigin(const vtkm::Vec<FloatDefault, 3>& origin) { this->Origin = origin; } ///@{
/// \brief Specifies the center of the wavelet function.
///
/// Note that the center of the function can be anywhere in space including
/// outside the domain of the data created (as specified by the origin,
/// spacing and extent).
VTKM_CONT void SetCenter(const vtkm::Vec3f& center) { this->Center = center; }
VTKM_CONT vtkm::Vec3f GetCenter() const { return this->Center; }
///@}
VTKM_CONT void SetSpacing(const vtkm::Vec<FloatDefault, 3>& spacing) { this->Spacing = spacing; } ///@{
/// \brief Specifies the origin (lower left corner) of the dataset created.
VTKM_CONT void SetFrequency(const vtkm::Vec<FloatDefault, 3>& frequency) ///
/// If the origin is not specified, it will be placed such that extent
/// index (0, 0, 0) is at the coordinate system origin.
VTKM_CONT void SetOrigin(const vtkm::Vec3f& origin) { this->Origin = origin; }
VTKM_CONT vtkm::Vec3f GetOrigin() const
{ {
this->Frequency = frequency; if (!vtkm::IsNan(this->Origin[0]))
{
return this->Origin;
}
else
{
return this->MinimumExtent * this->Spacing;
}
} }
VTKM_CONT void SetMagnitude(const vtkm::Vec<FloatDefault, 3>& magnitude) VTKM_CONT void SetSpacing(const vtkm::Vec3f& spacing) { this->Spacing = spacing; }
{ VTKM_CONT vtkm::Vec3f GetSpacing() const { return this->Spacing; }
this->Magnitude = magnitude;
} VTKM_CONT void SetFrequency(const vtkm::Vec3f& frequency) { this->Frequency = frequency; }
VTKM_CONT vtkm::Vec3f GetFrequency() const { return this->Frequency; }
VTKM_CONT void SetMagnitude(const vtkm::Vec3f& magnitude) { this->Magnitude = magnitude; }
VTKM_CONT vtkm::Vec3f GetMagnitude() const { return this->Magnitude; }
VTKM_CONT void SetMinimumExtent(const vtkm::Id3& minExtent) { this->MinimumExtent = minExtent; } VTKM_CONT void SetMinimumExtent(const vtkm::Id3& minExtent) { this->MinimumExtent = minExtent; }
VTKM_CONT vtkm::Id3 GetMinimumExtent() const { return this->MinimumExtent; }
VTKM_CONT void SetMaximumExtent(const vtkm::Id3& maxExtent) { this->MaximumExtent = maxExtent; } VTKM_CONT void SetMaximumExtent(const vtkm::Id3& maxExtent) { this->MaximumExtent = maxExtent; }
VTKM_CONT vtkm::Id3 GetMaximumExtent() const { return this->MaximumExtent; }
VTKM_CONT void SetExtent(const vtkm::Id3& minExtent, const vtkm::Id3& maxExtent) VTKM_CONT void SetExtent(const vtkm::Id3& minExtent, const vtkm::Id3& maxExtent)
{ {
@ -89,11 +117,13 @@ public:
} }
VTKM_CONT void SetMaximumValue(const vtkm::FloatDefault& maxVal) { this->MaximumValue = maxVal; } VTKM_CONT void SetMaximumValue(const vtkm::FloatDefault& maxVal) { this->MaximumValue = maxVal; }
VTKM_CONT vtkm::FloatDefault GetMaximumValue() const { return this->MaximumValue; }
VTKM_CONT void SetStandardDeviation(const vtkm::FloatDefault& stdev) VTKM_CONT void SetStandardDeviation(const vtkm::FloatDefault& stdev)
{ {
this->StandardDeviation = stdev; this->StandardDeviation = stdev;
} }
VTKM_CONT vtkm::FloatDefault GetStandardDeviation() const { return this->StandardDeviation; }
private: private:
vtkm::cont::DataSet DoExecute() const override; vtkm::cont::DataSet DoExecute() const override;
@ -105,15 +135,15 @@ private:
template <vtkm::IdComponent Dim> template <vtkm::IdComponent Dim>
vtkm::cont::DataSet GenerateDataSet(vtkm::cont::CoordinateSystem coords) const; vtkm::cont::DataSet GenerateDataSet(vtkm::cont::CoordinateSystem coords) const;
vtkm::Vec3f Center; vtkm::Vec3f Center = { 0, 0, 0 };
vtkm::Vec3f Origin; vtkm::Vec3f Origin = { vtkm::Nan<vtkm::FloatDefault>() };
vtkm::Vec3f Spacing; vtkm::Vec3f Spacing = { 1, 1, 1 };
vtkm::Vec3f Frequency; vtkm::Vec3f Frequency = { 60.0f, 30.0f, 40.0f };
vtkm::Vec3f Magnitude; vtkm::Vec3f Magnitude = { 10.0f, 18.0f, 5.0f };
vtkm::Id3 MinimumExtent; vtkm::Id3 MinimumExtent = { -10, -10, -10 };
vtkm::Id3 MaximumExtent; vtkm::Id3 MaximumExtent = { 10, 10, 10 };
vtkm::FloatDefault MaximumValue; vtkm::FloatDefault MaximumValue = 255.0f;
vtkm::FloatDefault StandardDeviation; vtkm::FloatDefault StandardDeviation = 0.5f;
}; };
} //namespace source } //namespace source
} //namespace vtkm } //namespace vtkm

@ -24,7 +24,9 @@ namespace
void TestPerlinNoise() void TestPerlinNoise()
{ {
vtkm::source::PerlinNoise noiseSource(vtkm::Id3(16), 77698); vtkm::source::PerlinNoise noiseSource;
noiseSource.SetCellDimensions(vtkm::Id3(16));
noiseSource.SetSeed(77698);
vtkm::cont::DataSet noise = noiseSource.Execute(); vtkm::cont::DataSet noise = noiseSource.Execute();
noise.PrintSummary(std::cout); noise.PrintSummary(std::cout);

@ -18,7 +18,8 @@ void OscillatorSourceTest()
vtkm::cont::Timer timer; vtkm::cont::Timer timer;
timer.Start(); timer.Start();
vtkm::source::Oscillator source(vtkm::Id3{ 20, 20, 20 }); vtkm::source::Oscillator source;
source.SetPointDimensions({ 21, 21, 21 });
source.SetTime(0.5); source.SetTime(0.5);
source.AddDamped(0.25f, 0.25f, 0.25f, 0.5f, 0.1f, 0.2f); source.AddDamped(0.25f, 0.25f, 0.25f, 0.5f, 0.1f, 0.2f);
source.AddDecaying(0.5f, 0.5f, 0.5f, 0.35f, 0.2f, 0.1f); source.AddDecaying(0.5f, 0.5f, 0.5f, 0.35f, 0.2f, 0.1f);

@ -18,7 +18,8 @@ void TangleSourceTest()
vtkm::cont::Timer timer; vtkm::cont::Timer timer;
timer.Start(); timer.Start();
vtkm::source::Tangle source(vtkm::Id3{ 20, 20, 20 }); vtkm::source::Tangle source;
source.SetCellDimensions({ 20, 20, 20 });
vtkm::cont::DataSet ds = source.Execute(); vtkm::cont::DataSet ds = source.Execute();