Merge branch 'master' of gitlab.kitware.com:ayenpure/vtk-m into lcs

This commit is contained in:
Abhishek Yenpure 2019-08-08 14:21:29 -07:00
commit f5db0e85a0
219 changed files with 4217 additions and 4359 deletions

@ -115,11 +115,12 @@ if(VTKm_ENABLE_CUDA)
message(FATAL_ERROR "VTK-m CUDA support requires version 9.2+") message(FATAL_ERROR "VTK-m CUDA support requires version 9.2+")
endif() endif()
if (NOT TARGET vtkm_cuda OR NOT TARGET vtkm::cuda) if (NOT TARGET vtkm::cuda)
add_library(vtkm_cuda INTERFACE) add_library(vtkm_cuda INTERFACE)
add_library(vtkm::cuda ALIAS vtkm_cuda)
set_target_properties(vtkm_cuda PROPERTIES EXPORT_NAME vtkm::cuda) set_target_properties(vtkm_cuda PROPERTIES EXPORT_NAME vtkm::cuda)
install(TARGETS vtkm_cuda EXPORT ${VTKm_EXPORT_NAME})
install(TARGETS vtkm_cuda EXPORT ${VTKm_EXPORT_NAME})
# Reserve `INTERFACE_REQUIRES_STATIC_BUILDS` to potential work around issues # Reserve `INTERFACE_REQUIRES_STATIC_BUILDS` to potential work around issues
# where VTK-m doesn't work when building shared as virtual functions fail # where VTK-m doesn't work when building shared as virtual functions fail
# inside device code. We don't want to force BUILD_SHARED_LIBS to a specific # inside device code. We don't want to force BUILD_SHARED_LIBS to a specific
@ -248,11 +249,6 @@ if(VTKm_ENABLE_CUDA)
set_target_properties(vtkm_cuda PROPERTIES INTERFACE_CUDA_Architecture_Flags "${arch_flags}") set_target_properties(vtkm_cuda PROPERTIES INTERFACE_CUDA_Architecture_Flags "${arch_flags}")
endif() endif()
if (NOT TARGET vtkm::cuda)
add_library(vtkm::cuda ALIAS vtkm_cuda)
endif()
endif() endif()
if(NOT TARGET Threads::Threads) if(NOT TARGET Threads::Threads)

@ -130,4 +130,5 @@ function(vtkm_test_against_install dir)
set_tests_properties(${build_name} PROPERTIES LABELS ${test_label} ) set_tests_properties(${build_name} PROPERTIES LABELS ${test_label} )
set_tests_properties(${build_name} PROPERTIES FIXTURES_REQUIRED vtkm_installed) set_tests_properties(${build_name} PROPERTIES FIXTURES_REQUIRED vtkm_installed)
set_tests_properties(${build_name} PROPERTIES TIMEOUT 600)
endfunction() endfunction()

@ -62,6 +62,7 @@ VTK-m Requires:
+ Clang 3.3+ + Clang 3.3+
+ XCode 5.0+ + XCode 5.0+
+ MSVC 2015+ + MSVC 2015+
+ Intel 17.0.4+
+ [CMake](http://www.cmake.org/download/) + [CMake](http://www.cmake.org/download/)
+ CMake 3.8+ + CMake 3.8+
+ CMake 3.9+ (for OpenMP support) + CMake 3.9+ (for OpenMP support)
@ -98,7 +99,7 @@ Optional dependencies are:
VTK-m has been tested on the following configurations:c VTK-m has been tested on the following configurations:c
+ On Linux + On Linux
+ GCC 4.8.5, 5.4.0, 6.4.0, 7.3.0, Clang 5.0, 6.0, 7.0, Intel 17.0.4 + GCC 4.8.5, 5.4.0, 6.4.0, 7.3.0, Clang 5.0, 6.0, 7.0, Intel 17.0.4, Intel 19.0.0
+ CMake 3.13.3, 3.14.1 + CMake 3.13.3, 3.14.1
+ CUDA 9.2.148, 10.0.130, 10.1.105 + CUDA 9.2.148, 10.0.130, 10.1.105
+ TBB 4.4 U2, 2017 U7 + TBB 4.4 U2, 2017 U7
@ -120,13 +121,17 @@ to generate all the build rules for the project. The VTK-m source code is
available from the [VTK-m download page] or by directly cloning the [VTK-m available from the [VTK-m download page] or by directly cloning the [VTK-m
git repository]. git repository].
``` The basic procedure for building VTK-m is to unpack the source, create a
$ git clone https://gitlab.kitware.com/vtk/vtk-m.git build directory, run CMake in that build directory (pointing to the source)
and then build. Here are some example *nix commands for the process
(individual commands may vary).
```sh
$ tar xvzf ~/Downloads/vtk-m-v1.4.0.tar.gz
$ mkdir vtkm-build $ mkdir vtkm-build
$ cd vtkm-build $ cd vtkm-build
$ cmake-gui ../vtk-m $ cmake-gui ../vtk-m-v1.4.0
$ make -j<N> $ cmake --build -j . # Runs make (or other build program)
$ make test
``` ```
A more detailed description of building VTK-m is available in the [VTK-m A more detailed description of building VTK-m is available in the [VTK-m

@ -17,11 +17,9 @@
#include <vtkm/cont/CellSetStructured.h> #include <vtkm/cont/CellSetStructured.h>
#include <vtkm/cont/ImplicitFunctionHandle.h> #include <vtkm/cont/ImplicitFunctionHandle.h>
#include <vtkm/cont/Initialize.h> #include <vtkm/cont/Initialize.h>
#include <vtkm/cont/Invoker.h>
#include <vtkm/cont/Timer.h> #include <vtkm/cont/Timer.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/DispatcherMapTopology.h>
#include <vtkm/worklet/Invoker.h>
#include <vtkm/worklet/WorkletMapField.h> #include <vtkm/worklet/WorkletMapField.h>
#include <vtkm/worklet/WorkletMapTopology.h> #include <vtkm/worklet/WorkletMapTopology.h>
@ -189,7 +187,7 @@ public:
} }
}; };
class GenerateEdges : public vtkm::worklet::WorkletMapPointToCell class GenerateEdges : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, WholeArrayOut edgeIds); using ControlSignature = void(CellSetIn cellset, WholeArrayOut edgeIds);
@ -529,7 +527,7 @@ private:
Timer timer{ DeviceAdapter() }; Timer timer{ DeviceAdapter() };
timer.Start(); timer.Start();
vtkm::worklet::Invoker invoke(DeviceAdapter{}); vtkm::cont::Invoker invoke(DeviceAdapter{});
invoke(Mag{}, this->InputHandle, tempHandle1); invoke(Mag{}, this->InputHandle, tempHandle1);
invoke(Sin{}, tempHandle1, tempHandle2); invoke(Sin{}, tempHandle1, tempHandle2);
invoke(Square{}, tempHandle2, tempHandle1); invoke(Square{}, tempHandle2, tempHandle1);
@ -567,7 +565,7 @@ private:
Timer timer{ DeviceAdapter() }; Timer timer{ DeviceAdapter() };
timer.Start(); timer.Start();
vtkm::worklet::Invoker invoke(DeviceAdapter{}); vtkm::cont::Invoker invoke(DeviceAdapter{});
invoke(Mag{}, dinput, dtemp1); invoke(Mag{}, dinput, dtemp1);
invoke(Sin{}, dtemp1, dtemp2); invoke(Sin{}, dtemp1, dtemp2);
invoke(Square{}, dtemp2, dtemp1); invoke(Square{}, dtemp2, dtemp1);
@ -595,7 +593,7 @@ private:
Timer timer{ DeviceAdapter() }; Timer timer{ DeviceAdapter() };
timer.Start(); timer.Start();
vtkm::worklet::Invoker invoke(DeviceAdapter{}); vtkm::cont::Invoker invoke(DeviceAdapter{});
invoke(Mag{}, mInput, mTemp1); invoke(Mag{}, mInput, mTemp1);
invoke(Sin{}, mTemp1, mTemp2); invoke(Sin{}, mTemp1, mTemp2);
invoke(Square{}, mTemp2, mTemp1); invoke(Square{}, mTemp2, mTemp1);
@ -632,7 +630,7 @@ private:
Timer timer{ DeviceAdapter() }; Timer timer{ DeviceAdapter() };
timer.Start(); timer.Start();
vtkm::worklet::Invoker invoke(DeviceAdapter{}); vtkm::cont::Invoker invoke(DeviceAdapter{});
invoke(Mag{}, mInput, mTemp1); invoke(Mag{}, mInput, mTemp1);
invoke(Sin{}, mTemp1, mTemp2); invoke(Sin{}, mTemp1, mTemp2);
invoke(Square{}, mTemp2, mTemp1); invoke(Square{}, mTemp2, mTemp1);

@ -655,14 +655,14 @@ class BenchmarkFilters
{ // Why does CastAndCall insist on making the cellset const? { // Why does CastAndCall insist on making the cellset const?
using CellSetT = vtkm::cont::CellSetExplicit<T1, T2, T3, T4>; using CellSetT = vtkm::cont::CellSetExplicit<T1, T2, T3, T4>;
CellSetT& mcellSet = const_cast<CellSetT&>(cellSet); CellSetT& mcellSet = const_cast<CellSetT&>(cellSet);
mcellSet.ResetConnectivity(vtkm::TopologyElementTagCell{}, mcellSet.ResetConnectivity(vtkm::TopologyElementTagPoint{},
vtkm::TopologyElementTagPoint{}); vtkm::TopologyElementTagCell{});
} }
Timer timer{ DeviceAdapter() }; Timer timer{ DeviceAdapter() };
timer.Start(); timer.Start();
cellSet.PrepareForInput( cellSet.PrepareForInput(
DeviceAdapter(), vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}); DeviceAdapter(), vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{});
this->Time = timer.GetElapsedTime(); this->Time = timer.GetElapsedTime();
} }
}; };

@ -42,7 +42,7 @@ enum BenchmarkName
ALL = CELL_TO_POINT | POINT_TO_CELL | MC_CLASSIFY ALL = CELL_TO_POINT | POINT_TO_CELL | MC_CLASSIFY
}; };
class AveragePointToCell : public vtkm::worklet::WorkletMapPointToCell class AveragePointToCell : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(FieldInPoint inPoints, CellSetIn cellset, FieldOutCell outCells); using ControlSignature = void(FieldInPoint inPoints, CellSetIn cellset, FieldOutCell outCells);
@ -64,7 +64,7 @@ public:
} }
}; };
class AverageCellToPoint : public vtkm::worklet::WorkletMapCellToPoint class AverageCellToPoint : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
public: public:
using ControlSignature = void(FieldInCell inCells, CellSetIn topology, FieldOut outPoints); using ControlSignature = void(FieldInCell inCells, CellSetIn topology, FieldOut outPoints);
@ -91,7 +91,7 @@ public:
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
template <typename T> template <typename T>
class Classification : public vtkm::worklet::WorkletMapPointToCell class Classification : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(FieldInPoint inNodes, CellSetIn cellset, FieldOutCell outCaseId); using ControlSignature = void(FieldInPoint inNodes, CellSetIn cellset, FieldOutCell outCaseId);

@ -0,0 +1,15 @@
# Updating structured cell locators
VTK-m will mow allow locating containing cells for a point using `CellLocatorUniformGrid`
and `CellLocatorRectilinearGrid` for 2D grids.
Users are required to create the locator objects as they normally would.
However, the `FindCell` method in `vtkm::exec::CellLocator` still requires users
to pass a 3D point as an input.
Further, the structured grid locators no longer use the `vtkm::exec::WorldToParametricCoordinates`
method to return parametric coordinates, instead they use fast paths for locating
points in a cell of an axis-aligned grid.
Another change for the `CellLocatorRectilinearGrid` is that now it uses binary search
on individual component arrays to search for a point.

@ -0,0 +1,6 @@
# Invoker moved to vtkm::cont
Previously, `Invoker` was located in the `vtkm::worklet` namespace to convey
it was a replacement for using `vtkm::worklet::Dispatcher*`. In actuality
it should be in `vtkm::cont` as it is the proper way to launch worklets
for execution, and that shouldn't exist inside the `worklet` namespace.

@ -0,0 +1,18 @@
# `SurfaceNormals` filter can now orient normals.
The `OrientNormals` worklet has been added to the `SurfaceNormals` filter, and
is enabled by turning on the `AutoOrientNormals` option. This feature ensures
that all normals generated by the filter will point out of the dataset (or
inward if the `FlipNormals` option is true). In addition,
`SurfaceNormals` now has a `Consistency` option that forces all triangle
windings to be consistent with the cell normal direction (the cell points are
specified in counter-clockwise order around the normal).
This functionality is provided by the following new worklets:
* OrientNormals
* RunOrientCellNormals
* RunOrientPointNormals
* RunOrientPointAndCellNormals
* RunFlipNormals
* TriangleWinding

@ -0,0 +1,20 @@
# Updating particle status for advection
There are now special statuses for Particle, Integrator, and Evaluator.
The particle advection modules only supported statuses for particles and made it
difficult to handle advanced integtator statuses.
Now each of the three important modules return their own statuses
Particles have `vtkm::worklet::particleadvection::ParticleStatus`,
Integrators have `vtkm::worklet::particleadvection::IntegratorStatus`, and
Evaluators have `vtkm::worklet::particleadvection::EvaluatorStatus`.
Further, names of the statuses in `vtkm::worklet::particleadvection::ParticleStatus`
have changed
`ParticleStatus::STATUS_OK` is now `ParticleStatus::SUCCESS`, and there is another
status `ParticleStatus::TOOK_ANY_STEPS` which is active if the particle has taken
at least one step with the current data.
There are few more changes that allow particle advection in 2D structured grids.

@ -0,0 +1,35 @@
# Refactor topology mappings to clarify meaning.
The `From` and `To` nomenclature for topology mapping has been confusing for
both users and developers, especially at lower levels where the intention of
mapping attributes from one element to another is easily conflated with the
concept of mapping indices (which maps in the exact opposite direction).
These identifiers have been renamed to `VisitTopology` and `IncidentTopology`
to clarify the direction of the mapping. The order in which these template
parameters are specified for `WorkletMapTopology` have also been reversed,
since eventually there may be more than one `IncidentTopology`, and having
`IncidentTopology` at the end will allow us to replace it with a variadic
template parameter pack in the future.
Other implementation details supporting these worklets, include `Fetch` tags,
`Connectivity` classes, and methods on the various `CellSet` classes (such as
`PrepareForInput` have also reversed their template arguments. These will need
to be cautiously updated.
The convenience implementations of `WorkletMapTopology` have been renamed for
clarity as follows:
```
WorkletMapPointToCell --> WorkletVisitCellsWithPoints
WorkletMapCellToPoint --> WorkletVisitPointsWithCells
```
The `ControlSignature` tags have been renamed as follows:
```
FieldInTo --> FieldInVisit
FieldInFrom --> FieldInMap
FromCount --> IncidentElementCount
FromIndices --> IncidentElementIndices
```

@ -0,0 +1,7 @@
# Simplify examples
Lots of the examples were out of date or way too verbose. The examples have
been simplified and brought up to modern VTK-m conventions.
We have also added a "hello worklet" example to be a minimal example of
creating a working algorithm (wrapped in a filter) in VTK-m (and used).

@ -0,0 +1,31 @@
# Provide a simplified way to state allowed value types for VTK-m filters
Previously VTK-m filters used a specialization of `vtkm::filter::FilterTraits<>` to control
the acceptable input value types. For example if the `WarpVector` filter want to only allow
`vtkm::Vec3f_32` and `vtkm::Vec3f_64` it would use:
```cpp
namespace vtkm { namespace filter {
template <>
class FilterTraits<WarpVector>
{
public:
// WarpVector can only applies to Float and Double Vec3 arrays
using InputFieldTypeList = vtkm::TypeListTagFieldVec3;
};
}}
```
This increase the complexity of writing filters. To make this easier VTK-m now looks for
a `SupportedTypes` define on the filter when a `vtkm::filter::FilterTraits` specialization
doesn't exist. This allows filters to succinctly specify supported types, such as seen below
for the `WarpVector` filter.
```cpp
class WarpVector : public vtkm::filter::FilterField<WarpVector>
{
public:
using SupportedTypes = vtkm::TypeListTagFieldVec3;
...
};
```

@ -19,9 +19,8 @@ if(VTKm_ENABLE_EXAMPLES)
add_subdirectory(cosmotools) add_subdirectory(cosmotools)
add_subdirectory(demo) add_subdirectory(demo)
add_subdirectory(game_of_life) add_subdirectory(game_of_life)
add_subdirectory(hello_world) add_subdirectory(hello_worklet)
add_subdirectory(histogram) add_subdirectory(histogram)
add_subdirectory(isosurface)
add_subdirectory(lagrangian) add_subdirectory(lagrangian)
add_subdirectory(mesh_quality) add_subdirectory(mesh_quality)
add_subdirectory(multi_backend) add_subdirectory(multi_backend)
@ -29,8 +28,6 @@ if(VTKm_ENABLE_EXAMPLES)
add_subdirectory(particle_advection) add_subdirectory(particle_advection)
add_subdirectory(polyline_archimedean_helix) add_subdirectory(polyline_archimedean_helix)
add_subdirectory(redistribute_points) add_subdirectory(redistribute_points)
add_subdirectory(rendering)
add_subdirectory(streamline)
add_subdirectory(temporal_advection) add_subdirectory(temporal_advection)
add_subdirectory(tetrahedra) add_subdirectory(tetrahedra)
endif() endif()
@ -38,6 +35,6 @@ endif()
if (VTKm_ENABLE_TESTING) if (VTKm_ENABLE_TESTING)
# These need to be fast to build as they will # These need to be fast to build as they will
# be built each time we run the test # be built each time we run the test
vtkm_test_against_install(rendering) vtkm_test_against_install(demo)
vtkm_test_against_install(histogram) vtkm_test_against_install(histogram)
endif() endif()

@ -7,137 +7,26 @@
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#include <vtkm/cont/ArrayHandleCast.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/Initialize.h> #include <vtkm/cont/Initialize.h>
#include <vtkm/cont/Timer.h>
#include <vtkm/io/reader/VTKDataSetReader.h> #include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/io/writer/VTKDataSetWriter.h> #include <vtkm/io/writer/VTKDataSetWriter.h>
#include <vtkm/worklet/Clip.h> #include <vtkm/filter/ClipWithField.h>
#include <algorithm>
#include <fstream>
#include <iostream>
#include <stdexcept>
#include <string>
using FloatVec3 = vtkm::Vec3f_32;
namespace
{
struct FieldMapper
{
vtkm::cont::VariantArrayHandle& Output;
vtkm::worklet::Clip& Worklet;
bool IsCellField;
FieldMapper(vtkm::cont::VariantArrayHandle& output,
vtkm::worklet::Clip& worklet,
bool isCellField)
: Output(output)
, Worklet(worklet)
, IsCellField(isCellField)
{
}
template <typename ArrayType>
void operator()(const ArrayType& input) const
{
if (this->IsCellField)
{
this->Output = this->Worklet.ProcessCellField(input);
}
else
{
this->Output = this->Worklet.ProcessPointField(input);
}
}
};
} // end anon namespace
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice; vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
vtkm::cont::InitializeResult config = vtkm::cont::Initialize(argc, argv, opts);
if (argc < 4)
{
std::cout << "Usage: " << std::endl
<< "$ " << argv[0]
<< " [-d device] <input_vtk_file> [fieldName] <isoval> <output_vtk_file>"
<< std::endl;
return 1;
}
vtkm::io::reader::VTKDataSetReader reader(argv[1]); vtkm::cont::DataSet input = vtkm::cont::testing::MakeTestDataSet().Make3DExplicitDataSetCowNose();
vtkm::cont::DataSet input = reader.ReadDataSet();
vtkm::cont::Field scalarField = (argc == 5) ? input.GetField(argv[2]) : input.GetField(0); vtkm::filter::ClipWithField clipFilter;
clipFilter.SetActiveField("pointvar");
clipFilter.SetClipValue(20.0);
vtkm::cont::DataSet output = clipFilter.Execute(input);
vtkm::Float32 clipValue = std::stof(argv[argc - 2]); vtkm::io::writer::VTKDataSetWriter writer("out_data.vtk");
vtkm::worklet::Clip clip;
vtkm::cont::Timer total;
total.Start();
vtkm::cont::Timer timer;
timer.Start();
bool invertClip = false;
vtkm::cont::CellSetExplicit<> outputCellSet =
clip.Run(input.GetCellSet(0),
scalarField.GetData().ResetTypes(vtkm::TypeListTagScalarAll()),
clipValue,
invertClip);
vtkm::Float64 clipTime = timer.GetElapsedTime();
vtkm::cont::DataSet output;
output.AddCellSet(outputCellSet);
auto inCoords = input.GetCoordinateSystem(0).GetData();
timer.Start();
auto outCoords = clip.ProcessCellField(inCoords);
vtkm::Float64 processCoordinatesTime = timer.GetElapsedTime();
output.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", outCoords));
timer.Start();
for (vtkm::Id i = 0; i < input.GetNumberOfFields(); ++i)
{
vtkm::cont::Field inField = input.GetField(i);
bool isCellField;
switch (inField.GetAssociation())
{
case vtkm::cont::Field::Association::POINTS:
isCellField = false;
break;
case vtkm::cont::Field::Association::CELL_SET:
isCellField = true;
break;
default:
continue;
}
vtkm::cont::VariantArrayHandle outField;
FieldMapper fieldMapper(outField, clip, isCellField);
inField.GetData().CastAndCall(fieldMapper);
output.AddField(vtkm::cont::Field(inField.GetName(), inField.GetAssociation(), outField));
}
vtkm::Float64 processScalarsTime = timer.GetElapsedTime();
vtkm::Float64 totalTime = total.GetElapsedTime();
std::cout << "Timings: " << std::endl
<< "clip: " << clipTime << std::endl
<< "process coordinates: " << processCoordinatesTime << std::endl
<< "process scalars: " << processScalarsTime << std::endl
<< "Total: " << totalTime << std::endl;
vtkm::io::writer::VTKDataSetWriter writer(argv[argc - 1]);
writer.WriteDataSet(output); writer.WriteDataSet(output);
return 0; return 0;

@ -8,10 +8,8 @@
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#include <vtkm/cont/DeviceAdapter.h>
#include <vtkm/cont/Initialize.h> #include <vtkm/cont/Initialize.h>
#include <vtkm/cont/testing/MakeTestDataSet.h> #include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/cont/testing/Testing.h>
#include <vtkm/rendering/Actor.h> #include <vtkm/rendering/Actor.h>
#include <vtkm/rendering/CanvasRayTracer.h> #include <vtkm/rendering/CanvasRayTracer.h>
@ -19,57 +17,21 @@
#include <vtkm/rendering/Scene.h> #include <vtkm/rendering/Scene.h>
#include <vtkm/rendering/View3D.h> #include <vtkm/rendering/View3D.h>
#include <vtkm/io/reader/VTKDataSetReader.h>
#include <vtkm/cont/DataSetFieldAdd.h>
#include <vtkm/filter/MarchingCubes.h> #include <vtkm/filter/MarchingCubes.h>
#include <iostream> // This example creates a simple data set and uses VTK-m's rendering engine to render an image and
// write that image to a file. It then computes an isosurface on the input data set and renders
void makeScene(const vtkm::cont::DataSet& inputData, // this output data set in a separate image file
const vtkm::cont::ColorTable& colorTable,
const std::string& fieldName,
vtkm::rendering::Scene& scene)
{
scene.AddActor(vtkm::rendering::Actor(inputData.GetCellSet(),
inputData.GetCoordinateSystem(),
inputData.GetField(fieldName),
colorTable));
}
// This example reads an input vtk file specified on the command-line (or generates a default
// input data set if none is provided), uses VTK-m's rendering engine to render it to an
// output file using OS Mesa, instantiates an isosurface filter using VTK-m's filter
// mechanism, computes an isosurface on the input data set, packages the output of the filter
// in a new data set, and renders this output data set in a separate iamge file, again
// using VTK-m's rendering engine with OS Mesa.
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice; vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
vtkm::cont::InitializeResult config = vtkm::cont::Initialize(argc, argv, opts);
// Input variable declarations // Input variable declarations
vtkm::cont::DataSet inputData;
vtkm::Float32 isovalue;
std::string fieldName;
// Get input data from specified file, or generate test data set
if (argc < 3)
{
vtkm::cont::testing::MakeTestDataSet maker; vtkm::cont::testing::MakeTestDataSet maker;
inputData = maker.Make3DUniformDataSet0(); vtkm::cont::DataSet inputData = maker.Make3DUniformDataSet0();
isovalue = 100.0f; vtkm::Float32 isovalue = 100.0f;
fieldName = "pointvar"; std::string fieldName = "pointvar";
}
else
{
std::cout << "using: " << argv[1] << " as MarchingCubes input file" << std::endl;
vtkm::io::reader::VTKDataSetReader reader(argv[1]);
inputData = reader.ReadDataSet();
isovalue = static_cast<vtkm::Float32>(atof(argv[2]));
fieldName = "pointvar";
}
using Mapper = vtkm::rendering::MapperRayTracer; using Mapper = vtkm::rendering::MapperRayTracer;
using Canvas = vtkm::rendering::CanvasRayTracer; using Canvas = vtkm::rendering::CanvasRayTracer;
@ -77,7 +39,7 @@ int main(int argc, char* argv[])
// Set up a camera for rendering the input data // Set up a camera for rendering the input data
const vtkm::cont::CoordinateSystem coords = inputData.GetCoordinateSystem(); const vtkm::cont::CoordinateSystem coords = inputData.GetCoordinateSystem();
Mapper mapper; Mapper mapper;
vtkm::rendering::Camera camera = vtkm::rendering::Camera(); vtkm::rendering::Camera camera;
//Set3DView //Set3DView
vtkm::Bounds coordsBounds = coords.GetBounds(); vtkm::Bounds coordsBounds = coords.GetBounds();
@ -85,9 +47,9 @@ int main(int argc, char* argv[])
camera.ResetToBounds(coordsBounds); camera.ResetToBounds(coordsBounds);
vtkm::Vec3f_32 totalExtent; vtkm::Vec3f_32 totalExtent;
totalExtent[0] = vtkm::Float32(coordsBounds.X.Max - coordsBounds.X.Min); totalExtent[0] = vtkm::Float32(coordsBounds.X.Length());
totalExtent[1] = vtkm::Float32(coordsBounds.Y.Max - coordsBounds.Y.Min); totalExtent[1] = vtkm::Float32(coordsBounds.Y.Length());
totalExtent[2] = vtkm::Float32(coordsBounds.Z.Max - coordsBounds.Z.Min); totalExtent[2] = vtkm::Float32(coordsBounds.Z.Length());
vtkm::Float32 mag = vtkm::Magnitude(totalExtent); vtkm::Float32 mag = vtkm::Magnitude(totalExtent);
vtkm::Normalize(totalExtent); vtkm::Normalize(totalExtent);
camera.SetLookAt(totalExtent * (mag * .5f)); camera.SetLookAt(totalExtent * (mag * .5f));
@ -102,7 +64,11 @@ int main(int argc, char* argv[])
vtkm::rendering::Color bg(0.2f, 0.2f, 0.2f, 1.0f); vtkm::rendering::Color bg(0.2f, 0.2f, 0.2f, 1.0f);
Canvas canvas(512, 512); Canvas canvas(512, 512);
makeScene(inputData, colorTable, fieldName, scene); vtkm::rendering::Actor actor(inputData.GetCellSet(),
inputData.GetCoordinateSystem(),
inputData.GetField(fieldName),
colorTable);
scene.AddActor(actor);
// Create a view and use it to render the input data using OS Mesa // Create a view and use it to render the input data using OS Mesa
vtkm::rendering::View3D view(scene, mapper, canvas, camera, bg); vtkm::rendering::View3D view(scene, mapper, canvas, camera, bg);
view.Initialize(); view.Initialize();
@ -119,7 +85,15 @@ int main(int argc, char* argv[])
// Render a separate image with the output isosurface // Render a separate image with the output isosurface
std::cout << "about to render the results of the MarchingCubes filter" << std::endl; std::cout << "about to render the results of the MarchingCubes filter" << std::endl;
vtkm::rendering::Scene scene2; vtkm::rendering::Scene scene2;
makeScene(outputData, colorTable, fieldName, scene2); vtkm::rendering::Actor actor2(outputData.GetCellSet(),
outputData.GetCoordinateSystem(),
outputData.GetField(fieldName),
colorTable);
// By default, the actor will automatically scale the scalar range of the color table to match
// that of the data. However, we are coloring by the scalar that we just extracted a contour
// from, so we want the scalar range to match that of the previous image.
actor2.SetScalarRange(actor.GetScalarRange());
scene2.AddActor(actor2);
vtkm::rendering::View3D view2(scene2, mapper, canvas, camera, bg); vtkm::rendering::View3D view2(scene2, mapper, canvas, camera, bg);
view2.Initialize(); view2.Initialize();

@ -7,15 +7,15 @@
## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
## PURPOSE. See the above copyright notice for more information. ## PURPOSE. See the above copyright notice for more information.
##============================================================================ ##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR) cmake_minimum_required(VERSION 3.9...3.14 FATAL_ERROR)
project(UnifiedMemory CXX) project(HelloWorklet CXX)
#Find the VTK-m package #Find the VTK-m package
find_package(VTKm REQUIRED QUIET) find_package(VTKm REQUIRED QUIET)
if(TARGET vtkm::cuda) add_executable(HelloWorklet HelloWorklet.cxx)
add_executable(UnifiedMemory_CUDA UnifiedMemory.cu) target_link_libraries(HelloWorklet PRIVATE vtkm_filter)
target_link_libraries(UnifiedMemory_CUDA PRIVATE vtkm_filter)
vtkm_add_target_information(UnifiedMemory_CUDA MODIFY_CUDA_FLAGS)
endif()
vtkm_add_target_information(HelloWorklet
MODIFY_CUDA_FLAGS
DEVICE_SOURCES HelloWorklet.cxx)

@ -0,0 +1,103 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/worklet/WorkletMapField.h>
#include <vtkm/filter/FilterField.h>
#include <vtkm/filter/internal/CreateResult.h>
#include <vtkm/io/writer/VTKDataSetWriter.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/cont/Invoker.h>
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/VectorAnalysis.h>
namespace vtkm
{
namespace worklet
{
struct HelloWorklet : public vtkm::worklet::WorkletMapField
{
using ControlSignature = void(FieldIn inVector, FieldOut outMagnitude);
using ExecutionSignature = void(_1, _2);
VTKM_EXEC void operator()(const vtkm::Vec3f& inVector, vtkm::FloatDefault& outMagnitude) const
{
outMagnitude = vtkm::Magnitude(inVector);
}
};
}
} // namespace vtkm::worklet
namespace vtkm
{
namespace filter
{
class HelloField : public vtkm::filter::FilterField<HelloField>
{
public:
// Specify that this filter operates on 3-vectors
using SupportedTypes = vtkm::TypeListTagFieldVec3;
template <typename FieldType, typename Policy>
VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& inDataSet,
const FieldType& inField,
const vtkm::filter::FieldMetadata& fieldMetadata,
vtkm::filter::PolicyBase<Policy>)
{
VTKM_IS_ARRAY_HANDLE(FieldType);
//construct our output
vtkm::cont::ArrayHandle<vtkm::FloatDefault> outField;
//construct our invoker to launch worklets
vtkm::cont::Invoker invoker;
vtkm::worklet::HelloWorklet mag;
invoker(mag, inField, outField); //launch mag worklets
//construct output field information
if (this->GetOutputFieldName().empty())
{
this->SetOutputFieldName(fieldMetadata.GetName() + "_magnitude");
}
//return the result, which is the input data with the computed field added to it
return vtkm::filter::internal::CreateResult(inDataSet,
outField,
this->GetOutputFieldName(),
fieldMetadata.GetAssociation(),
fieldMetadata.GetCellSetName());
}
};
}
} // vtkm::filter
int main(int argc, char** argv)
{
vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
vtkm::cont::testing::MakeTestDataSet testDataMaker;
vtkm::cont::DataSet inputData = testDataMaker.Make3DExplicitDataSetCowNose();
vtkm::filter::HelloField helloField;
helloField.SetActiveField("point_vectors");
vtkm::cont::DataSet outputData = helloField.Execute(inputData);
vtkm::io::writer::VTKDataSetWriter writer("out_data.vtk");
writer.WriteDataSet(outputData);
return 0;
}

@ -1,29 +0,0 @@
##============================================================================
## 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.
##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(HelloWorld CXX)
#Find the VTK-m package
find_package(VTKm REQUIRED QUIET)
vtkm_find_gl(OPTIONAL GL GLUT GLEW)
if(TARGET OpenGL::GL AND
TARGET GLUT::GLUT AND
TARGET GLEW::GLEW)
set(gl_libs OpenGL::GL GLEW::GLEW GLUT::GLUT)
add_executable(HelloWorld HelloWorld.cxx LoadShaders.h)
target_link_libraries(HelloWorld PRIVATE vtkm_filter ${gl_libs})
vtkm_add_target_information(HelloWorld
MODIFY_CUDA_FLAGS
DEVICE_SOURCES HelloWorld.cxx)
endif()

@ -1,220 +0,0 @@
//============================================================================
// 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.
//============================================================================
// Must be included before any other GL includes:
#include <GL/glew.h>
#include <iostream>
#include <vtkm/Math.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/cont/Timer.h>
#include <vtkm/interop/TransferToOpenGL.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/WorkletMapField.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
//OpenGL Graphics includes
//glew needs to go before glut
//that is why this is after the TransferToOpenGL include
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "LoadShaders.h"
template <typename T>
struct HelloVTKMInterop
{
vtkm::Vec2i_32 Dims;
GLuint ProgramId;
GLuint VAOId;
vtkm::interop::BufferState VBOState;
vtkm::interop::BufferState ColorState;
vtkm::cont::Timer Timer;
std::vector<vtkm::Vec<T, 3>> InputData;
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> InHandle;
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> OutCoords;
vtkm::cont::ArrayHandle<vtkm::Vec4ui_8> OutColors;
HelloVTKMInterop(vtkm::Int32 width, vtkm::Int32 height)
: Dims(256, 256)
, ProgramId()
, VAOId()
, VBOState()
, ColorState()
, Timer()
, InputData()
, InHandle()
, OutCoords()
, OutColors()
{
Timer.Start();
int dim = 256;
this->InputData.reserve(static_cast<std::size_t>(dim * dim));
for (int i = 0; i < dim; ++i)
{
for (int j = 0; j < dim; ++j)
{
vtkm::Vec<T, 3> t(2.f * (static_cast<T>(i) / static_cast<T>(dim)) - 1.f,
0.f,
2.f * (static_cast<T>(j) / static_cast<T>(dim)) - 1.f);
this->InputData.push_back(t);
}
}
this->Dims = vtkm::Vec2i_32(dim, dim);
this->InHandle = vtkm::cont::make_ArrayHandle(this->InputData);
glGenVertexArrays(1, &this->VAOId);
glBindVertexArray(this->VAOId);
this->ProgramId = LoadShaders();
glUseProgram(this->ProgramId);
glClearColor(.08f, .08f, .08f, 0.f);
glViewport(0, 0, width, height);
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
vtkm::Int32 arraySize = this->Dims[0] * this->Dims[1];
//precomputed based on 1027x768 render window size
vtkm::Float32 mvp[16] = { -1.79259f, 0.f, 0.f, 0.f, 0.f, 1.26755f,
-0.721392f, -0.707107f, 0.f, 1.26755f, 0.721392f, 0.707107f,
0.f, 0.f, 1.24076f, 1.41421f };
GLint unifLoc = glGetUniformLocation(this->ProgramId, "MVP");
glUniformMatrix4fv(unifLoc, 1, GL_FALSE, mvp);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, *this->VBOState.GetHandle());
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, *this->ColorState.GetHandle());
glColorPointer(4, GL_UNSIGNED_BYTE, 0, 0);
glDrawArrays(GL_POINTS, 0, arraySize);
glDisableClientState(GL_COLOR_ARRAY);
glDisableVertexAttribArray(0);
}
struct GenerateSurfaceWorklet : public vtkm::worklet::WorkletMapField
{
vtkm::Float32 t;
GenerateSurfaceWorklet(vtkm::Float32 st)
: t(st)
{
}
using ControlSignature = void(FieldIn, FieldOut, FieldOut);
using ExecutionSignature = void(_1, _2, _3);
VTKM_EXEC
void operator()(const vtkm::Vec<T, 3>& input,
vtkm::Vec<T, 3>& output,
vtkm::Vec4ui_8& color) const
{
output[0] = input[0];
output[1] = 0.25f * vtkm::Sin(input[0] * 10.f + t) * vtkm::Cos(input[2] * 10.f + t);
output[2] = input[2];
color[0] = 0;
color[1] = static_cast<vtkm::UInt8>(160 + 96 * vtkm::Sin(input[0] * 10.f + t));
color[2] = static_cast<vtkm::UInt8>(160 + 96 * vtkm::Cos(input[2] * 5.f + t));
color[3] = 255;
}
};
void renderFrame()
{
using DispatcherType = vtkm::worklet::DispatcherMapField<GenerateSurfaceWorklet>;
vtkm::Float32 t = static_cast<vtkm::Float32>(this->Timer.GetElapsedTime());
GenerateSurfaceWorklet worklet(t);
DispatcherType(worklet).Invoke(this->InHandle, this->OutCoords, this->OutColors);
vtkm::interop::TransferToOpenGL(this->OutCoords, this->VBOState);
vtkm::interop::TransferToOpenGL(this->OutColors, this->ColorState);
this->render();
if (t > 10)
{
//after 10seconds quit the demo
exit(0);
}
}
};
//global static so that glut callback can access it
HelloVTKMInterop<vtkm::Float32>* helloWorld = nullptr;
// Render the output using simple OpenGL
void run()
{
helloWorld->renderFrame();
glutSwapBuffers();
}
void idle()
{
glutPostRedisplay();
}
int main(int argc, char** argv)
{
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
std::cout << "Running Hello World example: " << std::endl;
glewExperimental = GL_TRUE;
glutInit(&argc, argv);
const vtkm::UInt32 width = 1024;
const vtkm::UInt32 height = 768;
glutInitWindowSize(width, height);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("VTK-m Hello World OpenGL Interop");
GLenum err = glewInit();
if (GLEW_OK != err)
{
std::cout << "glewInit failed\n";
}
HelloVTKMInterop<vtkm::Float32> hw(width, height);
helloWorld = &hw;
glutDisplayFunc(run);
glutIdleFunc(idle);
glutMainLoop();
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,119 +0,0 @@
//============================================================================
// 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.
//============================================================================
#ifndef LOAD_SHADERS
#define LOAD_SHADERS
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
namespace shaders
{
static std::string const& make_fragment_shader_code()
{
static std::string const data = "#version 120\n"
"void main(void)"
"{"
" gl_FragColor = gl_Color;"
"}";
return data;
}
static std::string const& make_vertex_shader_code()
{
static std::string const data = "#version 120\n"
"attribute vec3 posAttr;"
"uniform mat4 MVP;"
"void main()"
"{"
" vec4 pos = vec4( posAttr, 1.0 );"
" gl_FrontColor = gl_Color;"
" gl_Position = MVP * pos;"
"}";
return data;
}
}
inline GLuint LoadShaders()
{
// Create the shaders
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
// Get the Vertex Shader code
std::string VertexShaderCode = shaders::make_vertex_shader_code();
// Get the Fragment Shader code
std::string FragmentShaderCode = shaders::make_fragment_shader_code();
GLint Result = GL_FALSE;
int InfoLogLength;
// Compile Vertex Shader
std::cout << "Compiling vertex shader" << std::endl;
char const* VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer, nullptr);
glCompileShader(VertexShaderID);
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> VertexShaderErrorMessage(static_cast<std::size_t>(InfoLogLength));
if (VertexShaderErrorMessage.size() > 0)
{
glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]);
std::cout << &VertexShaderErrorMessage[0] << std::endl;
}
// Compile Fragment Shader
std::cout << "Compiling fragment shader" << std::endl;
char const* FragmentSourcePointer = FragmentShaderCode.c_str();
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, nullptr);
glCompileShader(FragmentShaderID);
// Check Fragment Shader
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> FragmentShaderErrorMessage(static_cast<std::size_t>(InfoLogLength));
if (FragmentShaderErrorMessage.size() > 0)
{
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]);
std::cout << &FragmentShaderErrorMessage[0] << std::endl;
}
// Link the program
std::cout << "Linking program" << std::endl;
GLuint ProgramID = glCreateProgram();
glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID);
glLinkProgram(ProgramID);
// Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ProgramErrorMessage(static_cast<std::size_t>(InfoLogLength));
if (ProgramErrorMessage.size() > 0)
{
glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]);
std::cout << &ProgramErrorMessage[0] << std::endl;
}
glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID);
return ProgramID;
}
#endif

@ -11,7 +11,6 @@
#define vtk_m_examples_histogram_HistogramMPI_h #define vtk_m_examples_histogram_HistogramMPI_h
#include <vtkm/filter/FilterField.h> #include <vtkm/filter/FilterField.h>
#include <vtkm/filter/FilterTraits.h>
namespace example namespace example
{ {
@ -23,6 +22,11 @@ namespace example
class HistogramMPI : public vtkm::filter::FilterField<HistogramMPI> class HistogramMPI : public vtkm::filter::FilterField<HistogramMPI>
{ {
public: public:
//currently the HistogramMPI filter only works on scalar data.
//this mainly has to do with getting the ranges for each bin
//would require returning a more complex value type
using SupportedTypes = vtkm::TypeListTagScalarAll;
//Construct a HistogramMPI with a default of 10 bins //Construct a HistogramMPI with a default of 10 bins
VTKM_CONT VTKM_CONT
HistogramMPI(); HistogramMPI();
@ -82,23 +86,6 @@ private:
}; };
} // namespace example } // namespace example
namespace vtkm
{
namespace filter
{
template <>
class FilterTraits<example::HistogramMPI>
{ //currently the HistogramMPI filter only works on scalar data.
//this mainly has to do with getting the ranges for each bin
//would require returning a more complex value type
public:
using InputFieldTypeList = vtkm::TypeListTagScalarAll;
};
}
} // namespace vtkm::filter
#include "HistogramMPI.hxx" #include "HistogramMPI.hxx"
#endif // vtk_m_filter_Histogram_h #endif // vtk_m_filter_Histogram_h

@ -1,28 +0,0 @@
##============================================================================
## 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.
##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(IsoSurface CXX)
#Find the VTK-m package
find_package(VTKm REQUIRED QUIET)
vtkm_find_gl(OPTIONAL GL GLUT GLEW)
if(TARGET OpenGL::GL AND
TARGET GLUT::GLUT AND
TARGET GLEW::GLEW)
set(gl_libs OpenGL::GL OpenGL::GLU GLEW::GLEW GLUT::GLUT)
add_executable(IsosurfaceUniformGrid IsosurfaceUniformGrid.cxx quaternion.h)
target_link_libraries(IsosurfaceUniformGrid PRIVATE vtkm_filter ${gl_libs})
vtkm_add_target_information(IsosurfaceUniformGrid
MODIFY_CUDA_FLAGS
DEVICE_SOURCES IsosurfaceUniformGrid.cxx)
endif()

@ -1,284 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/filter/MarchingCubes.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/Math.h>
#include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/CellSetExplicit.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/Initialize.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "quaternion.h"
#include <vector>
static vtkm::Id3 dims(256, 256, 256);
static vtkm::cont::ArrayHandle<vtkm::Vec3f_32> verticesArray, normalsArray;
static vtkm::cont::ArrayHandle<vtkm::Float32> scalarsArray;
static Quaternion qrot;
static int lastx, lasty;
static int mouse_state = 1;
namespace
{
// Define the tangle field for the input data
class TangleField : public vtkm::worklet::WorkletMapField
{
public:
using ControlSignature = void(FieldIn vertexId, FieldOut v);
using ExecutionSignature = void(_1, _2);
using InputDomain = _1;
const vtkm::Id xdim, ydim, zdim;
const vtkm::Float32 xmin, ymin, zmin, xmax, ymax, zmax;
const vtkm::Id cellsPerLayer;
VTKM_CONT
TangleField(const vtkm::Id3 dims, const vtkm::Float32 mins[3], const vtkm::Float32 maxs[3])
: xdim(dims[0])
, ydim(dims[1])
, zdim(dims[2])
, xmin(mins[0])
, ymin(mins[1])
, zmin(mins[2])
, xmax(maxs[0])
, ymax(maxs[1])
, zmax(maxs[2])
, cellsPerLayer((xdim) * (ydim)){};
VTKM_EXEC
void operator()(const vtkm::Id& vertexId, vtkm::Float32& v) const
{
const vtkm::Id x = vertexId % (xdim);
const vtkm::Id y = (vertexId / (xdim)) % (ydim);
const vtkm::Id z = vertexId / cellsPerLayer;
const vtkm::Float32 fx = static_cast<vtkm::Float32>(x) / static_cast<vtkm::Float32>(xdim - 1);
const vtkm::Float32 fy = static_cast<vtkm::Float32>(y) / static_cast<vtkm::Float32>(xdim - 1);
const vtkm::Float32 fz = static_cast<vtkm::Float32>(z) / static_cast<vtkm::Float32>(xdim - 1);
const vtkm::Float32 xx = 3.0f * (xmin + (xmax - xmin) * (fx));
const vtkm::Float32 yy = 3.0f * (ymin + (ymax - ymin) * (fy));
const vtkm::Float32 zz = 3.0f * (zmin + (zmax - zmin) * (fz));
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;
}
};
// Construct an input data set using the tangle field worklet
vtkm::cont::DataSet MakeIsosurfaceTestDataSet(vtkm::Id3 dims)
{
vtkm::cont::DataSet dataSet;
const vtkm::Id3 vdims(dims[0] + 1, dims[1] + 1, dims[2] + 1);
vtkm::Float32 mins[3] = { -1.0f, -1.0f, -1.0f };
vtkm::Float32 maxs[3] = { 1.0f, 1.0f, 1.0f };
vtkm::cont::ArrayHandle<vtkm::Float32> fieldArray;
vtkm::cont::ArrayHandleCounting<vtkm::Id> vertexCountImplicitArray(
0, 1, vdims[0] * vdims[1] * vdims[2]);
vtkm::worklet::DispatcherMapField<TangleField> tangleFieldDispatcher(
TangleField(vdims, mins, maxs));
tangleFieldDispatcher.Invoke(vertexCountImplicitArray, fieldArray);
vtkm::Vec3f origin(0.0f, 0.0f, 0.0f);
vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(dims[0]),
1.0f / static_cast<vtkm::FloatDefault>(dims[2]),
1.0f / static_cast<vtkm::FloatDefault>(dims[1]));
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
dataSet.AddField(
vtkm::cont::Field("nodevar", vtkm::cont::Field::Association::POINTS, fieldArray));
static const vtkm::IdComponent ndim = 3;
vtkm::cont::CellSetStructured<ndim> cellSet("cells");
cellSet.SetPointDimensions(vdims);
dataSet.AddCellSet(cellSet);
return dataSet;
}
}
// Initialize the OpenGL state
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
vtkm::Float32 white[] = { 0.8f, 0.8f, 0.8f, 1.0f };
vtkm::Float32 black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
vtkm::Float32 lightPos[] = { 10.0f, 10.0f, 10.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, white);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glLightfv(GL_LIGHT0, GL_SPECULAR, black);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
// Render the output using simple OpenGL
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glPushMatrix();
float rotationMatrix[16];
qrot.getRotMat(rotationMatrix);
glMultMatrixf(rotationMatrix);
glTranslatef(-0.5f, -0.5f, -0.5f);
glColor3f(0.1f, 0.1f, 0.6f);
glBegin(GL_TRIANGLES);
for (vtkm::IdComponent i = 0; i < verticesArray.GetNumberOfValues(); i++)
{
vtkm::Vec3f_32 curNormal = normalsArray.GetPortalConstControl().Get(i);
vtkm::Vec3f_32 curVertex = verticesArray.GetPortalConstControl().Get(i);
glNormal3f(curNormal[0], curNormal[1], curNormal[2]);
glVertex3f(curVertex[0], curVertex[1], curVertex[2]);
}
glEnd();
glPopMatrix();
glutSwapBuffers();
}
// Allow rotations of the view
void mouseMove(int x, int y)
{
vtkm::Float32 dx = static_cast<vtkm::Float32>(x - lastx);
vtkm::Float32 dy = static_cast<vtkm::Float32>(y - lasty);
if (mouse_state == 0)
{
Quaternion newRotX;
newRotX.setEulerAngles(-0.2f * dx * vtkm::Pi_180f(), 0.0f, 0.0f);
qrot.mul(newRotX);
Quaternion newRotY;
newRotY.setEulerAngles(0.0f, 0.0f, -0.2f * dy * vtkm::Pi_180f());
qrot.mul(newRotY);
}
lastx = x;
lasty = y;
glutPostRedisplay();
}
// Respond to mouse button
void mouseCall(int button, int state, int x, int y)
{
if (button == 0)
mouse_state = state;
if ((button == 0) && (state == 0))
{
lastx = x;
lasty = y;
}
}
// Compute and render an isosurface for a uniform grid example
int main(int argc, char* argv[])
{
//parse out all vtk-m related command line options
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
vtkm::cont::DataSet dataSet = MakeIsosurfaceTestDataSet(dims);
vtkm::filter::MarchingCubes filter;
filter.SetGenerateNormals(true);
filter.SetMergeDuplicatePoints(false);
filter.SetIsoValue(0, 0.1);
filter.SetActiveField("nodevar");
filter.SetFieldsToPass({ "nodevar" });
vtkm::cont::DataSet outputData = filter.Execute(dataSet);
//need to extract vertices, normals, and scalars
using VertType = vtkm::cont::ArrayHandle<vtkm::Vec3f_32>;
vtkm::cont::CoordinateSystem coords = outputData.GetCoordinateSystem();
verticesArray = coords.GetData().Cast<VertType>();
normalsArray = outputData.GetField("normals").GetData().Cast<VertType>();
scalarsArray =
outputData.GetField("nodevar").GetData().Cast<vtkm::cont::ArrayHandle<vtkm::Float32>>();
std::cout << "Number of output vertices: " << verticesArray.GetNumberOfValues() << std::endl;
std::cout << "vertices: ";
vtkm::cont::printSummary_ArrayHandle(verticesArray, std::cout);
std::cout << std::endl;
std::cout << "normals: ";
vtkm::cont::printSummary_ArrayHandle(normalsArray, std::cout);
std::cout << std::endl;
std::cout << "scalars: ";
vtkm::cont::printSummary_ArrayHandle(scalarsArray, std::cout);
std::cout << std::endl;
lastx = lasty = 0;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1000, 1000);
glutCreateWindow("VTK-m Isosurface");
initializeGL();
glutDisplayFunc(displayCall);
glutMotionFunc(mouseMove);
glutMouseFunc(mouseCall);
glutMainLoop();
verticesArray.ReleaseResources();
normalsArray.ReleaseResources();
scalarsArray.ReleaseResources();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,107 +0,0 @@
//============================================================================
// 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.
//============================================================================
/*
* quaternion.h
*
* Created on: Oct 10, 2014
* Author: csewell
*/
#ifndef QUATERNION_H_
#define QUATERNION_H_
#include <math.h>
#include <stdlib.h>
class Quaternion
{
public:
Quaternion()
{
x = y = z = 0.0;
w = 1.0;
}
Quaternion(double ax, double ay, double az, double aw)
: x(ax)
, y(ay)
, z(az)
, w(aw){};
void set(double ax, double ay, double az, double aw)
{
x = ax;
y = ay;
z = az;
w = aw;
}
void normalize()
{
float norm = static_cast<float>(sqrt(x * x + y * y + z * z + w * w));
if (norm > 0.00001)
{
x /= norm;
y /= norm;
z /= norm;
w /= norm;
}
}
void mul(Quaternion q)
{
double tx, ty, tz, tw;
tx = w * q.x + x * q.w + y * q.z - z * q.y;
ty = w * q.y + y * q.w + z * q.x - x * q.z;
tz = w * q.z + z * q.w + x * q.y - y * q.x;
tw = w * q.w - x * q.x - y * q.y - z * q.z;
x = tx;
y = ty;
z = tz;
w = tw;
}
void setEulerAngles(float pitch, float yaw, float roll)
{
w = cos(pitch / 2.0) * cos(yaw / 2.0) * cos(roll / 2.0) -
sin(pitch / 2.0) * sin(yaw / 2.0) * sin(roll / 2.0);
x = sin(pitch / 2.0) * sin(yaw / 2.0) * cos(roll / 2.0) +
cos(pitch / 2.0) * cos(yaw / 2.0) * sin(roll / 2.0);
y = sin(pitch / 2.0) * cos(yaw / 2.0) * cos(roll / 2.0) +
cos(pitch / 2.0) * sin(yaw / 2.0) * sin(roll / 2.0);
z = cos(pitch / 2.0) * sin(yaw / 2.0) * cos(roll / 2.0) -
sin(pitch / 2.0) * cos(yaw / 2.0) * sin(roll / 2.0);
normalize();
}
void getRotMat(float* m) const
{
for (int i = 0; i < 16; i++)
{
m[i] = 0.0;
}
m[0] = static_cast<float>(1.0 - 2.0 * y * y - 2.0 * z * z);
m[1] = static_cast<float>(2.0 * x * y - 2.0 * z * w);
m[2] = static_cast<float>(2.0 * x * z + 2.0 * y * w);
m[4] = static_cast<float>(2.0 * x * y + 2.0 * z * w);
m[5] = static_cast<float>(1.0 - 2.0 * x * x - 2.0 * z * z);
m[6] = static_cast<float>(2.0 * y * z - 2.0 * x * w);
m[8] = static_cast<float>(2.0 * x * z - 2.0 * y * w);
m[9] = static_cast<float>(2.0 * y * z + 2.0 * x * w);
m[10] = static_cast<float>(1.0 - 2.0 * x * x - 2.0 * y * y);
m[15] = 1.0;
}
double x, y, z, w;
};
#endif /* QUATERNION_H_ */

@ -97,7 +97,8 @@ void multiblock_processing(TaskQueue<vtkm::cont::MultiBlock>& queue)
} }
catch (const vtkm::cont::ErrorBadValue& error) catch (const vtkm::cont::ErrorBadValue& error)
{ {
std::cerr << "gradient filter failed!" << std::endl; std::cerr << "Gradient filter failed!" << std::endl;
std::cerr << error.GetMessage() << std::endl;
break; break;
} }
} }

@ -10,9 +10,7 @@
#ifndef vtk_m_examples_multibackend_MultiDeviceGradient_h #ifndef vtk_m_examples_multibackend_MultiDeviceGradient_h
#define vtk_m_examples_multibackend_MultiDeviceGradient_h #define vtk_m_examples_multibackend_MultiDeviceGradient_h
#include <vtkm/filter/FilterField.h> #include <vtkm/filter/FilterField.h>
#include <vtkm/filter/FilterTraits.h>
#include "TaskQueue.h" #include "TaskQueue.h"
@ -27,6 +25,9 @@ using RuntimeTaskQueue = TaskQueue<std::function<void()>>;
class MultiDeviceGradient : public vtkm::filter::FilterField<MultiDeviceGradient> class MultiDeviceGradient : public vtkm::filter::FilterField<MultiDeviceGradient>
{ {
public: public:
using SupportedTypes =
vtkm::ListTagBase<vtkm::Float32, vtkm::Float64, vtkm::Vec3f_32, vtkm::Vec3f_64>;
//Construct a MultiDeviceGradient and worker pool //Construct a MultiDeviceGradient and worker pool
VTKM_CONT VTKM_CONT
MultiDeviceGradient(); MultiDeviceGradient();
@ -54,25 +55,6 @@ private:
std::vector<std::thread> Workers; std::vector<std::thread> Workers;
}; };
namespace vtkm
{
namespace filter
{
template <>
class FilterTraits<MultiDeviceGradient>
{
public:
struct TypeListTagGradientInputs
: vtkm::ListTagBase<vtkm::Float32, vtkm::Float64, vtkm::Vec3f_32, vtkm::Vec3f_64>
{
};
using InputFieldTypeList = TypeListTagGradientInputs;
};
}
} // namespace vtkm::filter
#ifndef vtk_m_examples_multibackend_MultiDeviceGradient_cxx #ifndef vtk_m_examples_multibackend_MultiDeviceGradient_cxx
extern template vtkm::cont::MultiBlock MultiDeviceGradient::PrepareForExecution< extern template vtkm::cont::MultiBlock MultiDeviceGradient::PrepareForExecution<
vtkm::filter::PolicyDefault>(const vtkm::cont::MultiBlock&, vtkm::filter::PolicyDefault>(const vtkm::cont::MultiBlock&,

@ -11,8 +11,10 @@ cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(PolyLineArchimedeanHelix CXX) project(PolyLineArchimedeanHelix CXX)
find_package(VTKm REQUIRED QUIET) find_package(VTKm REQUIRED QUIET)
if (VTKm_ENABLE_RENDERING)
add_executable(PolyLineArchimedeanHelix PolyLineArchimedeanHelix.cxx) add_executable(PolyLineArchimedeanHelix PolyLineArchimedeanHelix.cxx)
if(TARGET vtkm::cuda) if(TARGET vtkm::cuda)
set_source_files_properties(PolyLineArchimedeanHelix.cxx PROPERTIES LANGUAGE "CUDA") set_source_files_properties(PolyLineArchimedeanHelix.cxx PROPERTIES LANGUAGE "CUDA")
endif() endif()
target_link_libraries(PolyLineArchimedeanHelix PRIVATE vtkm_filter vtkm_cont vtkm_rendering) target_link_libraries(PolyLineArchimedeanHelix PRIVATE vtkm_filter vtkm_cont vtkm_rendering)
endif()

@ -99,7 +99,7 @@ void TubeThatSpiral(vtkm::FloatDefault radius, vtkm::Id numLineSegments, vtkm::I
vtkm::cont::DataSetFieldAdd dsfa; vtkm::cont::DataSetFieldAdd dsfa;
std::vector<vtkm::FloatDefault> v(tubePoints.GetNumberOfValues()); std::vector<vtkm::FloatDefault> v(static_cast<std::size_t>(tubePoints.GetNumberOfValues()));
// The first value is a cap: // The first value is a cap:
v[0] = 0; v[0] = 0;
for (vtkm::Id i = 1; i < vtkm::Id(v.size()); i += numSides) for (vtkm::Id i = 1; i < vtkm::Id(v.size()); i += numSides)
@ -108,7 +108,7 @@ void TubeThatSpiral(vtkm::FloatDefault radius, vtkm::Id numLineSegments, vtkm::I
vtkm::FloatDefault r = a + b * t; vtkm::FloatDefault r = a + b * t;
for (vtkm::Id j = i; j < i + numSides && j < vtkm::Id(v.size()); ++j) for (vtkm::Id j = i; j < i + numSides && j < vtkm::Id(v.size()); ++j)
{ {
v[j] = r; v[static_cast<std::size_t>(j)] = r;
} }
} }
// Point at the end cap should be the same color as the surroundings: // Point at the end cap should be the same color as the surroundings:

@ -1,26 +0,0 @@
##============================================================================
## 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.
##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(RenderingExample CXX)
#Find the VTK-m package
find_package(VTKm REQUIRED QUIET)
if(NOT TARGET vtkm_rendering OR NOT VTKm_ENABLE_GL_CONTEXT)
return()
endif()
vtkm_find_gl(OPTIONAL GLUT)
if(NOT TARGET GLUT::GLUT)
return()
endif()
add_executable(RenderingExample Rendering.cxx)
target_link_libraries(RenderingExample PRIVATE vtkm_rendering GLUT::GLUT)

@ -1,144 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/Math.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/testing/MakeTestDataSet.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <vtkm/rendering/internal/OpenGLHeaders.h> //Required for compile....
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <vtkm/cont/ColorTable.h>
#include <vtkm/rendering/CanvasGL.h>
#include <vtkm/rendering/MapperGL.h>
#include <vtkm/rendering/View3D.h>
vtkm::rendering::View3D* view = nullptr;
const vtkm::Int32 W = 512, H = 512;
int buttonStates[3] = { GLUT_UP, GLUT_UP, GLUT_UP };
bool shiftKey = false;
int lastx = -1, lasty = -1;
void reshape(int, int)
{
//Don't allow resizing window.
glutReshapeWindow(W, H);
}
// Render the output using simple OpenGL
void displayCall()
{
view->Paint();
glutSwapBuffers();
}
// Allow rotations of the camera
void mouseMove(int x, int y)
{
const vtkm::Id width = view->GetCanvas().GetWidth();
const vtkm::Id height = view->GetCanvas().GetHeight();
//Map to XY
y = static_cast<int>(height - y);
if (lastx != -1 && lasty != -1)
{
vtkm::Float32 x1 = vtkm::Float32(lastx * 2) / vtkm::Float32(width) - 1.0f;
vtkm::Float32 y1 = vtkm::Float32(lasty * 2) / vtkm::Float32(height) - 1.0f;
vtkm::Float32 x2 = vtkm::Float32(x * 2) / vtkm::Float32(width) - 1.0f;
vtkm::Float32 y2 = vtkm::Float32(y * 2) / vtkm::Float32(height) - 1.0f;
if (buttonStates[0] == GLUT_DOWN)
{
if (shiftKey)
view->GetCamera().Pan(x2 - x1, y2 - y1);
else
view->GetCamera().TrackballRotate(x1, y1, x2, y2);
}
else if (buttonStates[1] == GLUT_DOWN)
view->GetCamera().Zoom(y2 - y1);
}
lastx = x;
lasty = y;
glutPostRedisplay();
}
// Respond to mouse button
void mouseCall(int button, int state, int vtkmNotUsed(x), int vtkmNotUsed(y))
{
int modifiers = glutGetModifiers();
shiftKey = modifiers & GLUT_ACTIVE_SHIFT;
buttonStates[button] = state;
//std::cout<<"Buttons: "<<buttonStates[0]<<" "<<buttonStates[1]<<" "<<buttonStates[2]<<" SHIFT= "<<shiftKey<<std::endl;
//mouse down, reset.
if (buttonStates[button] == GLUT_DOWN)
{
lastx = -1;
lasty = -1;
}
}
// Compute and render an isosurface for a uniform grid example
int main(int argc, char* argv[])
{
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
vtkm::cont::testing::MakeTestDataSet maker;
vtkm::cont::DataSet ds = maker.Make3DUniformDataSet0();
lastx = lasty = -1;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(W, H);
glutCreateWindow("VTK-m Rendering");
glutDisplayFunc(displayCall);
glutMotionFunc(mouseMove);
glutMouseFunc(mouseCall);
glutReshapeFunc(reshape);
vtkm::rendering::Color bg(0.2f, 0.2f, 0.2f, 1.0f);
vtkm::rendering::CanvasGL canvas;
vtkm::rendering::MapperGL mapper;
vtkm::rendering::Scene scene;
scene.AddActor(vtkm::rendering::Actor(ds.GetCellSet(),
ds.GetCoordinateSystem(),
ds.GetField("pointvar"),
vtkm::cont::ColorTable("inferno")));
//Create vtkm rendering stuff.
view = new vtkm::rendering::View3D(scene, mapper, canvas, bg);
view->Initialize();
glutMainLoop();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,28 +0,0 @@
##============================================================================
## 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.
##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(Streamline CXX)
#Find the VTK-m package
find_package(VTKm REQUIRED QUIET)
vtkm_find_gl(OPTIONAL GL GLUT GLEW)
if(TARGET OpenGL::GL AND
TARGET GLUT::GLUT AND
TARGET GLEW::GLEW)
set(gl_libs OpenGL::GL OpenGL::GLU GLEW::GLEW GLUT::GLUT)
add_executable(StreamLineUniformGrid StreamLineUniformGrid.cxx)
target_link_libraries(StreamLineUniformGrid PRIVATE vtkm_filter ${gl_libs})
vtkm_add_target_information(StreamLineUniformGrid
MODIFY_CUDA_FLAGS
DEVICE_SOURCES StreamLineUniformGrid.cxx)
endif()

@ -1,283 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/Math.h>
#include <vtkm/cont/ArrayCopy.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/StreamLineUniformGrid.h>
#include <vtkm/cont/testing/Testing.h>
#include <fstream>
#include <math.h>
#include <vector>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "../isosurface/quaternion.h"
// Output data set shared with opengl
static vtkm::worklet::StreamLineFilterUniformGrid<vtkm::Float32>* streamLineFilter;
static vtkm::cont::DataSet outDataSet;
// Input parameters
const vtkm::Id nSeeds = 25;
const vtkm::Id nSteps = 2000;
const vtkm::Float32 tStep = 0.5f;
const vtkm::Id direction = vtkm::worklet::streamline::BOTH;
// Point location of vertices from a CastAndCall but needs a static cast eventually
static vtkm::cont::ArrayHandle<vtkm::Vec3f_32> vertexArray;
// OpenGL display variables
Quaternion qrot;
int lastx, lasty;
int mouse_state = 1;
//
// Initialize the OpenGL state
//
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
float white[] = { 0.8f, 0.8f, 0.8f, 1.0f };
float black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
float lightPos[] = { 10.0f, 10.0f, 10.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, white);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glLightfv(GL_LIGHT0, GL_SPECULAR, black);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
//
// Render the output using simple OpenGL
//
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, 1.0f, 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glLineWidth(1.0f);
glPushMatrix();
float rotationMatrix[16];
qrot.getRotMat(rotationMatrix);
glMultMatrixf(rotationMatrix);
glTranslatef(-0.5f, -0.5f, -0.5f);
// Get the cell set, coordinate system and coordinate data
vtkm::cont::CellSetExplicit<> cellSet;
outDataSet.GetCellSet(0).CopyTo(cellSet);
auto coordArray = outDataSet.GetCoordinateSystem().GetData();
vtkm::Id numberOfCells = cellSet.GetNumberOfCells();
vtkm::cont::ArrayCopy(coordArray, vertexArray);
// Each cell is a polyline
glColor3f(1.0f, 0.0f, 0.0f);
for (vtkm::Id polyline = 0; polyline < numberOfCells; polyline++)
{
vtkm::Vec<vtkm::Id, nSteps> polylineIndices;
vtkm::IdComponent numIndices = cellSet.GetNumberOfPointsInCell(polyline);
cellSet.GetIndices(polyline, polylineIndices);
glBegin(GL_LINE_STRIP);
for (vtkm::IdComponent i = 0; i < numIndices; i++)
{
vtkm::Vec3f_32 pt = vertexArray.GetPortalConstControl().Get(polylineIndices[i]);
glVertex3f(pt[0], pt[1], pt[2]);
}
glEnd();
}
glPopMatrix();
glutSwapBuffers();
}
// Allow rotations of the view
void mouseMove(int x, int y)
{
vtkm::Float32 dx = static_cast<vtkm::Float32>(x - lastx);
vtkm::Float32 dy = static_cast<vtkm::Float32>(y - lasty);
if (mouse_state == 0)
{
Quaternion newRotX;
newRotX.setEulerAngles(-0.2f * dx * vtkm::Pi_180f(), 0.0f, 0.0f);
qrot.mul(newRotX);
Quaternion newRotY;
newRotY.setEulerAngles(0.0f, 0.0f, -0.2f * dy * vtkm::Pi_180f());
qrot.mul(newRotY);
}
lastx = x;
lasty = y;
glutPostRedisplay();
}
// Respond to mouse button
void mouseCall(int button, int state, int x, int y)
{
if (button == 0)
mouse_state = state;
if ((button == 0) && (state == 0))
{
lastx = x;
lasty = y;
}
}
namespace
{
template <typename T>
VTKM_EXEC_CONT vtkm::Vec<T, 3> Normalize(vtkm::Vec<T, 3> v)
{
T magnitude = static_cast<T>(sqrt(vtkm::dot(v, v)));
T zero = static_cast<T>(0.0);
T one = static_cast<T>(1.0);
if (magnitude == zero)
return vtkm::make_Vec(zero, zero, zero);
else
return one / magnitude * v;
}
}
// Run streamlines on a uniform grid of vector data
int main(int argc, char* argv[])
{
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice;
auto config = vtkm::cont::Initialize(argc, argv, opts);
std::cout << "StreamLineUniformGrid Example" << std::endl;
std::cout << "Parameters are [options] fileName [numSeeds maxSteps timeStep direction]"
<< std::endl
<< std::endl;
std::cout << "Direction is FORWARD=0 BACKWARD=1 BOTH=2" << std::endl << std::endl;
std::cout << "File is expected to be binary with xdim ydim zdim as 32 bit integers " << std::endl;
std::cout << "followed by vector data per dimension point as 32 bit float" << std::endl;
std::cout << config.Usage << std::endl;
// Read in the vector data for testing
FILE* pFile = fopen(argv[1], "rb");
if (pFile == nullptr)
perror("Error opening file");
size_t ret_code = 0;
// Size of the dataset
int dims[3];
ret_code = fread(dims, sizeof(int), 3, pFile);
if (ret_code != 3)
{
perror("Error reading size of data");
fclose(pFile);
return 0;
}
const vtkm::Id3 vdims(dims[0], dims[1], dims[2]);
// Read vector data at each point of the uniform grid and store
vtkm::Id nElements = vdims[0] * vdims[1] * vdims[2] * 3;
float* data = new float[static_cast<std::size_t>(nElements)];
ret_code = fread(data, sizeof(float), static_cast<std::size_t>(nElements), pFile);
if (ret_code != static_cast<size_t>(nElements))
{
perror("Error reading vector data");
fclose(pFile);
return 0;
}
//We are done with the file now, so release the file descriptor
fclose(pFile);
std::vector<vtkm::Vec3f_32> field;
for (vtkm::Id i = 0; i < nElements; i++)
{
vtkm::Float32 x = data[i];
vtkm::Float32 y = data[++i];
vtkm::Float32 z = data[++i];
vtkm::Vec3f_32 vecData(x, y, z);
field.push_back(Normalize(vecData));
}
vtkm::cont::ArrayHandle<vtkm::Vec3f_32> fieldArray;
fieldArray = vtkm::cont::make_ArrayHandle(field);
// Construct the input dataset (uniform) to hold the input and set vector data
vtkm::cont::DataSet inDataSet;
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims);
inDataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
inDataSet.AddField(
vtkm::cont::Field("vecData", vtkm::cont::Field::Association::POINTS, fieldArray));
vtkm::cont::CellSetStructured<3> inCellSet("cells");
inCellSet.SetPointDimensions(vtkm::make_Vec(vdims[0], vdims[1], vdims[2]));
inDataSet.AddCellSet(inCellSet);
// Create and run the filter
streamLineFilter = new vtkm::worklet::StreamLineFilterUniformGrid<vtkm::Float32>();
outDataSet = streamLineFilter->Run(inDataSet, direction, nSeeds, nSteps, tStep);
// Render the output dataset of polylines
lastx = lasty = 0;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1000, 1000);
glutCreateWindow("VTK-m Uniform 3D StreamLines");
initializeGL();
glutDisplayFunc(displayCall);
glutMotionFunc(mouseMove);
glutMouseFunc(mouseCall);
glutMainLoop();
delete streamLineFilter;
outDataSet.Clear();
vertexArray.ReleaseResources();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

Binary file not shown.

@ -1,23 +0,0 @@
##============================================================================
## 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.
##============================================================================
cmake_minimum_required(VERSION 3.8...3.14 FATAL_ERROR)
project(TauTiming CXX)
#Find the VTK-m package
find_package(VTKm REQUIRED QUIET)
if(TARGET vtkm_rendering)
add_executable(Tau_timing TauTiming.cxx)
vtkm_add_target_information(Tau_timing
MODIFY_CUDA_FLAGS
DEVICE_SOURCES TauTiming.cxx)
target_link_libraries(Tau_timing vtkm_cont)
endif()

@ -1,478 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/filter/MarchingCubes.h>
#include <vtkm/io/reader/VTKDataSetReader.h>
#include <vtkm/io/writer/VTKDataSetWriter.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/ExternalFaces.h>
#include <vtkm/worklet/StreamLineUniformGrid.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/DataSetBuilderUniform.h>
#include <vtkm/cont/DataSetFieldAdd.h>
#include <vtkm/cont/Initiailize.h>
#include <vtkm/cont/testing/Testing.h>
#include <vtkm/rendering/Actor.h>
#include <vtkm/rendering/CanvasRayTracer.h>
#include <vtkm/rendering/MapperRayTracer.h>
#include <vtkm/rendering/MapperVolume.h>
#include <vtkm/rendering/Scene.h>
#include <vtkm/rendering/View3D.h>
#include <vtkm/rendering/testing/RenderTest.h>
#include <vtkm/worklet/StreamLineUniformGrid.h>
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/io/writer/VTKDataSetWriter.h>
static bool printProgress = true;
template <typename T>
VTKM_EXEC_CONT vtkm::Vec<T, 3> Normalize(vtkm::Vec<T, 3> v)
{
T magnitude = static_cast<T>(sqrt(vtkm::dot(v, v)));
T zero = static_cast<T>(0.0);
T one = static_cast<T>(1.0);
if (magnitude == zero)
return vtkm::make_Vec(zero, zero, zero);
else
return one / magnitude * v;
}
class TangleField : public vtkm::worklet::WorkletMapField
{
public:
using ControlSignature = void(FieldIn vertexId, FieldOut v);
using ExecutionSignature = void(_1, _2);
using InputDomain = _1;
const vtkm::Id xdim, ydim, zdim;
const vtkm::FloatDefault xmin, ymin, zmin, xmax, ymax, zmax;
const vtkm::Id cellsPerLayer;
VTKM_CONT
TangleField(const vtkm::Id3 dims,
const vtkm::FloatDefault mins[3],
const vtkm::FloatDefault maxs[3])
: xdim(dims[0])
, ydim(dims[1])
, zdim(dims[2])
, xmin(mins[0])
, ymin(mins[1])
, zmin(mins[2])
, xmax(maxs[0])
, ymax(maxs[1])
, zmax(maxs[2])
, cellsPerLayer((xdim) * (ydim))
{
}
VTKM_EXEC
void operator()(const vtkm::Id& vertexId, vtkm::Float32& v) const
{
const vtkm::Id x = vertexId % (xdim);
const vtkm::Id y = (vertexId / (xdim)) % (ydim);
const vtkm::Id z = vertexId / cellsPerLayer;
const vtkm::FloatDefault fx =
static_cast<vtkm::FloatDefault>(x) / static_cast<vtkm::FloatDefault>(xdim - 1);
const vtkm::FloatDefault fy =
static_cast<vtkm::FloatDefault>(y) / static_cast<vtkm::FloatDefault>(xdim - 1);
const vtkm::FloatDefault fz =
static_cast<vtkm::FloatDefault>(z) / static_cast<vtkm::FloatDefault>(xdim - 1);
const vtkm::Float32 xx = 3.0f * vtkm::Float32(xmin + (xmax - xmin) * (fx));
const vtkm::Float32 yy = 3.0f * vtkm::Float32(ymin + (ymax - ymin) * (fy));
const vtkm::Float32 zz = 3.0f * vtkm::Float32(zmin + (zmax - zmin) * (fz));
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;
}
};
vtkm::cont::DataSet CreateTestDataSet(vtkm::Id3 dims)
{
vtkm::cont::DataSet dataSet;
const vtkm::Id3 vdims(dims[0] + 1, dims[1] + 1, dims[2] + 1);
vtkm::FloatDefault mins[3] = { -1.0f, -1.0f, -1.0f };
vtkm::FloatDefault maxs[3] = { 1.0f, 1.0f, 1.0f };
static const vtkm::IdComponent ndim = 3;
vtkm::cont::CellSetStructured<ndim> cellSet("cells");
cellSet.SetPointDimensions(vdims);
dataSet.AddCellSet(cellSet);
vtkm::Vec3f origin(0.0f, 0.0f, 0.0f);
vtkm::Vec3f spacing(1.0f / static_cast<vtkm::FloatDefault>(dims[0]),
1.0f / static_cast<vtkm::FloatDefault>(dims[2]),
1.0f / static_cast<vtkm::FloatDefault>(dims[1]));
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
vtkm::cont::ArrayHandle<vtkm::Float32> scalarVar;
vtkm::cont::ArrayHandleIndex vertexCountImplicitArray(vdims[0] * vdims[1] * vdims[2]);
vtkm::worklet::DispatcherMapField<TangleField> tangleFieldDispatcher(
TangleField(vdims, mins, maxs));
tangleFieldDispatcher.Invoke(vertexCountImplicitArray, scalarVar);
dataSet.AddField(
vtkm::cont::Field(std::string("scalar"), vtkm::cont::Field::Association::POINTS, scalarVar));
return dataSet;
}
void TestMarchingCubesUniformGrid(int d)
{
vtkm::Id3 dims(d, d, d);
std::cout << "Marching cubes with gridsize = " << dims << std::endl;
vtkm::cont::DataSet dataSet = CreateTestDataSet(dims);
//vtkm::io::writer::VTKDataSetWriter wrt("ds.vtk");
//wrt.WriteDataSet(dataSet);
int N = 100;
vtkm::Float32 v0 = -.8f, v1 = 24.0f;
vtkm::Float32 dv = (v1 - v0) / (vtkm::Float32)(N - 1);
for (int i = 0; i < N; i++)
{
vtkm::filter::ResultDataSet result;
vtkm::filter::MarchingCubes mc;
mc.SetGenerateNormals(true);
vtkm::Float32 val = v0 + i * dv;
//std::cout<<i<<": "<<val<<std::endl;
if (N == 1)
val = 0.5f;
mc.SetIsoValue(val);
//mc.SetMergeDuplicatePoints(false);
result = mc.Execute(dataSet, dataSet.GetField("nodevar"));
const vtkm::cont::DataSet& out = result.GetDataSet();
}
//std::cout<<"Number of points in isosurface: "<<out.GetCoordinateSystem().GetData().GetNumberOfValues()<<std::endl;
}
void TestStreamlineUniformGrid(int d)
{
/*
vtkm::Id3 dims(d,d,d);
std::cout<<"Streamline with gridsize = "<<dims<<std::endl;
vtkm::cont::DataSet dataSet = MakeIsosurfaceTestDataSet(dims);
vtkm::cont::ArrayHandle<vtkm::Vec3f_32> result;
PointGrad<vtkm::Float32> func(dataSet, "nodevar", result);
vtkm::cont::CastAndCall(dataSet.GetCellSet(), func);
printSummary_ArrayHandle(result, std::cout);
*/
}
void CreateData(int d)
{
vtkm::Id3 dims(d, d, d);
vtkm::cont::DataSet dataSet = CreateTestDataSet(dims);
char tmp[64];
sprintf(tmp, "regular_%d.vtk", d);
std::string fname = tmp;
std::cout << fname << std::endl;
vtkm::io::writer::VTKDataSetWriter wrt(fname);
wrt.WriteDataSet(dataSet);
}
void MarchingCubesTest(const vtkm::cont::DataSet& ds, int N)
{
std::cout << "Marching Cubes test: " << N << std::endl;
vtkm::Range range;
ds.GetField(0).GetRange(&range, VTKM_DEFAULT_DEVICE_ADAPTER_TAG());
int nv = 10;
vtkm::Float32 v0 = range.Min, v1 = range.Max;
vtkm::Float32 dv = (v1 - v0) / (vtkm::Float32)(nv - 1);
std::cout << "Field range: (" << v0 << "," << v1 << ") dv= " << dv << std::endl;
vtkm::filter::MarchingCubes mc;
mc.SetGenerateNormals(true);
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout << " " << i << " of " << N << std::endl;
for (int j = 0; j < nv; j++)
{
vtkm::filter::ResultDataSet result;
//vtkm::Float32 val = v0 + i*dv;
//std::cout<<i<<": "<<val<<std::endl;
mc.SetIsoValue(v0 + j * dv);
//mc.SetMergeDuplicatePoints(false);
result = mc.Execute(ds, ds.GetField(0));
const vtkm::cont::DataSet& out = result.GetDataSet();
}
}
#if 0
vtkm::Float32 v0 = range.Min, v1 = range.Max;
vtkm::Float32 dv = (v1-v0)/(vtkm::Float32)(N-1);
std::cout<<"Field range: ("<<v0<<","<<v1<<") dv= "<<dv<<std::endl;
#if 0
vtkm::filter::MarchingCubes mc;
mc.SetGenerateNormals(true);
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout<<" "<<i<<" of "<<N<<std::endl;
vtkm::filter::ResultDataSet result;
//vtkm::Float32 val = v0 + i*dv;
//std::cout<<i<<": "<<val<<std::endl;
mc.SetIsoValue(v0 + i*dv);
//mc.SetMergeDuplicatePoints(false);
result = mc.Execute(ds, ds.GetField(0));
const vtkm::cont::DataSet &out = result.GetDataSet();
}
#endif
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout<<" "<<i<<" of "<<N<<std::endl;
vtkm::filter::ResultDataSet result;
vtkm::filter::MarchingCubes mc;
mc.SetGenerateNormals(true);
//vtkm::Float32 val = v0 + i*dv;
//std::cout<<i<<": "<<val<<std::endl;
mc.SetIsoValue(v0 + i*dv);
//mc.SetMergeDuplicatePoints(false);
result = mc.Execute(ds, ds.GetField(0));
const vtkm::cont::DataSet &out = result.GetDataSet();
}
#endif
/*
vtkm::filter::ResultDataSet result;
vtkm::filter::MarchingCubes mc;
mc.SetGenerateNormals(true);
//vtkm::Float32 val = v0 + i*dv;
//std::cout<<i<<": "<<val<<std::endl;
mc.SetIsoValue(0.5f);
result = mc.Execute(ds, ds.GetField(0));
const vtkm::cont::DataSet &out = result.GetDataSet();
vtkm::io::writer::VTKDataSetWriter wrt("iso.vtk");
wrt.WriteDataSet(out);
*/
}
static vtkm::cont::DataSet createUniform(const vtkm::cont::DataSet& ds)
{
vtkm::cont::DataSetBuilderUniform builder;
vtkm::cont::DataSetFieldAdd fieldAdd;
vtkm::cont::DataSet out = builder.Create(vtkm::Id3(50, 50, 50));
fieldAdd.AddPointField(out, ds.GetField(0).GetName(), ds.GetField(0).GetData());
out.PrintSummary(std::cout);
return out;
}
void StreamlineTest(vtkm::cont::DataSet& ds, int N)
{
const vtkm::Id nSeeds = 25000;
const vtkm::Id nSteps = 20000;
const vtkm::Float32 tStep = 0.05f;
const vtkm::Id direction = vtkm::worklet::internal::FORWARD; //vtkm::worklet::internal::BOTH;
vtkm::worklet::StreamLineFilterUniformGrid<vtkm::Float32>* streamLineFilter;
streamLineFilter = new vtkm::worklet::StreamLineFilterUniformGrid<vtkm::Float32>();
std::cout << "Streamline test: " << N << std::endl;
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout << " " << i << " of " << N << std::endl;
vtkm::cont::DataSet out;
out = streamLineFilter->Run(ds, direction, nSeeds, nSteps, tStep);
}
}
void RenderRTTest(const vtkm::cont::DataSet& ds, int N)
{
std::cout << "Ray Tracing test: " << N << std::endl;
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout << " " << i << " of " << N << std::endl;
using M = vtkm::rendering::MapperRayTracer;
using C = vtkm::rendering::CanvasRayTracer;
using V3 = vtkm::rendering::View3D;
//std::cout<<"Render: "<<i<<std::endl;
vtkm::cont::ColorTable colorTable("inferno");
vtkm::rendering::testing::Render<M, C, V3>(ds, "scalar", colorTable);
}
}
void RenderVolTest(const vtkm::cont::DataSet& ds, int N)
{
std::cout << "Volume Rendering test :" << N << std::endl;
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout << " " << i << " of " << N << std::endl;
using M = vtkm::rendering::MapperVolume;
using C = vtkm::rendering::CanvasRayTracer;
using V3 = vtkm::rendering::View3D;
//std::cout<<"Render: "<<i<<std::endl;
vtkm::cont::ColorTable colorTable("inferno");
vtkm::rendering::testing::Render<M, C, V3>(ds, "scalar", colorTable);
}
}
void ExternalFacesTest(const vtkm::cont::DataSet& ds, int N)
{
std::cout << "External Face test: " << N << std::endl;
for (int i = 0; i < N; i++)
{
if (printProgress && i % 10 == 0)
std::cout << " " << i << " of " << N << std::endl;
vtkm::cont::CellSetExplicit<> inCellSet;
//vtkm::cont::CellSetSingleType<> inCellSet;
ds.GetCellSet(0).CopyTo(inCellSet);
vtkm::cont::CellSetExplicit<> outCellSet("cells");
//vtkm::cont::CellSetSingleType<> outCellSet("cells");
//Run the External Faces worklet
vtkm::worklet::ExternalFaces().Run(inCellSet, outCellSet, VTKM_DEFAULT_DEVICE_ADAPTER_TAG());
vtkm::cont::DataSet outDataSet;
for (vtkm::IdComponent i = 0; i < ds.GetNumberOfCoordinateSystems(); ++i)
outDataSet.AddCoordinateSystem(ds.GetCoordinateSystem(i));
outDataSet.AddCellSet(outCellSet);
}
}
/*
Notes:
render: 256 reg and rect. 100 iterations.
expl: external faces requires non-SingleType explicit. Forced reader to use this.
streamlines: vector field must be named "vecData"
*/
int main(int argc, char** argv)
{
// Process vtk-m general args
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice;
auto config = vtkm::cont::Initialize(argc, argv, opts);
if (argc != 5)
{
std::cout << "Error: " << argv[0]
<< " [options] <algo:iso/sl/ext/rt/vol> N SZ <ftype:reg/rect/expl>" << std::endl;
std::cout << "General Options: \n" << config.Usage << std::endl;
return -1;
}
std::string alg = argv[1];
int N = atoi(argv[2]);
if (alg == "sl")
{
char fname[64];
sprintf(fname, "../data/tornado.vec");
std::cout << "Reading file: " << fname << std::endl;
FILE* pFile = fopen(fname, "rb");
int dims[3];
size_t ret_code = fread(dims, sizeof(int), 3, pFile);
const vtkm::Id3 vdims(dims[0], dims[1], dims[2]);
vtkm::Id nElements = vdims[0] * vdims[1] * vdims[2] * 3;
float* data = new float[static_cast<std::size_t>(nElements)];
ret_code = fread(data, sizeof(float), static_cast<std::size_t>(nElements), pFile);
fclose(pFile);
std::vector<vtkm::Vec3f_32> field;
for (vtkm::Id i = 0; i < nElements; i++)
{
vtkm::Float32 x = data[i];
vtkm::Float32 y = data[++i];
vtkm::Float32 z = data[++i];
vtkm::Vec3f_32 vecData(x, y, z);
field.push_back(Normalize(vecData));
}
vtkm::cont::ArrayHandle<vtkm::Vec3f_32> fieldArray;
fieldArray = vtkm::cont::make_ArrayHandle(field);
// Construct the input dataset (uniform) to hold the input and set vector data
vtkm::cont::DataSet ds;
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims);
ds.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
ds.AddField(vtkm::cont::Field("vec", vtkm::cont::Field::Association::POINTS, fieldArray));
vtkm::cont::CellSetStructured<3> inCellSet("cells");
inCellSet.SetPointDimensions(vtkm::make_Vec(vdims[0], vdims[1], vdims[2]));
ds.AddCellSet(inCellSet);
StreamlineTest(ds, N);
return 0;
}
else
{
int sz = atoi(argv[3]);
std::string ftype = argv[4];
char fname[64];
sprintf(fname, "../data/s%s_%d.vtk", ftype.c_str(), sz);
std::cout << "FNAME= " << fname << std::endl;
vtkm::cont::DataSet ds;
if (sz < 0)
{
vtkm::cont::testing::MakeTestDataSet dataSetMaker;
ds = dataSetMaker.Make3DExplicitDataSet5();
}
else
{
std::cout << "Reading file: " << fname << std::endl;
vtkm::io::reader::VTKDataSetReader rdr(fname);
ds = rdr.ReadDataSet();
}
if (alg == "iso")
MarchingCubesTest(ds, N);
else if (alg == "ext")
ExternalFacesTest(ds, N);
else if (alg == "rt")
RenderRTTest(ds, N);
else if (alg == "vol")
RenderVolTest(ds, N);
return 0;
}
}

@ -12,35 +12,17 @@ project(Tetrahedra CXX)
#Find the VTK-m package #Find the VTK-m package
find_package(VTKm REQUIRED QUIET) find_package(VTKm REQUIRED QUIET)
vtkm_find_gl(OPTIONAL GL GLUT GLEW)
if(TARGET OpenGL::GL AND add_executable(Tetrahedralize Tetrahedralize.cxx)
TARGET GLUT::GLUT AND target_link_libraries(Tetrahedralize PRIVATE vtkm_filter)
TARGET GLEW::GLEW)
set(gl_libs OpenGL::GL OpenGL::GLU GLEW::GLEW GLUT::GLUT) vtkm_add_target_information(Tetrahedralize
add_executable(TetrahedralizeExplicitGrid TetrahedralizeExplicitGrid.cxx)
add_executable(TriangulateExplicitGrid TriangulateExplicitGrid.cxx)
add_executable(TetrahedralizeUniformGrid TetrahedralizeUniformGrid.cxx)
add_executable(TriangulateUniformGrid TriangulateUniformGrid.cxx)
target_link_libraries(TetrahedralizeExplicitGrid PRIVATE vtkm_filter ${gl_libs})
target_link_libraries(TriangulateExplicitGrid PRIVATE vtkm_filter ${gl_libs})
target_link_libraries(TetrahedralizeUniformGrid PRIVATE vtkm_filter ${gl_libs})
target_link_libraries(TriangulateUniformGrid PRIVATE vtkm_filter ${gl_libs})
vtkm_add_target_information(TetrahedralizeExplicitGrid
MODIFY_CUDA_FLAGS MODIFY_CUDA_FLAGS
DEVICE_SOURCES TetrahedralizeExplicitGrid.cxx) DEVICE_SOURCES Tetrahedralize.cxx)
vtkm_add_target_information(TriangulateExplicitGrid
MODIFY_CUDA_FLAGS
DEVICE_SOURCES TriangulateExplicitGrid.cxx)
vtkm_add_target_information(TetrahedralizeUniformGrid
MODIFY_CUDA_FLAGS
DEVICE_SOURCES TetrahedralizeUniformGrid.cxx)
vtkm_add_target_information(TriangulateUniformGrid
MODIFY_CUDA_FLAGS
DEVICE_SOURCES TriangulateUniformGrid.cxx)
endif() add_executable(Triangulate Triangulate.cxx)
target_link_libraries(Triangulate PRIVATE vtkm_filter)
vtkm_add_target_information(Triangulate
MODIFY_CUDA_FLAGS
DEVICE_SOURCES Triangulate.cxx)

@ -0,0 +1,32 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/cont/Initialize.h>
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/io/writer/VTKDataSetWriter.h>
#include <vtkm/filter/Tetrahedralize.h>
int main(int argc, char* argv[])
{
vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
vtkm::cont::DataSet input =
vtkm::cont::testing::MakeTestDataSet().Make3DUniformDataSet3(vtkm::Id3(25, 25, 25));
vtkm::filter::Tetrahedralize tetrahedralizeFilter;
vtkm::cont::DataSet output = tetrahedralizeFilter.Execute(input);
vtkm::io::writer::VTKDataSetWriter writer("out_tets.vtk");
writer.WriteDataSet(output);
return 0;
}

@ -1,284 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/Math.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/DataSetBuilderExplicit.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/filter/Tetrahedralize.h>
#include <vtkm/cont/testing/Testing.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "../isosurface/quaternion.h"
namespace
{
// Takes input uniform grid and outputs unstructured grid of tets
static vtkm::cont::DataSet outDataSet;
// OpenGL display variables
Quaternion qrot;
int lastx, lasty;
int mouse_state = 1;
} // anonymous namespace
//
// Test 3D explicit dataset
//
vtkm::cont::DataSet MakeTetrahedralizeExplicitDataSet()
{
vtkm::cont::DataSetBuilderExplicitIterative builder;
builder.Begin();
builder.AddPoint(0, 0, 0);
builder.AddPoint(1, 0, 0);
builder.AddPoint(2, 0, 0);
builder.AddPoint(3, 0, 0);
builder.AddPoint(0, 1, 0);
builder.AddPoint(1, 1, 0);
builder.AddPoint(2, 1, 0);
builder.AddPoint(2.5, 1.0, 0.0);
builder.AddPoint(0, 2, 0);
builder.AddPoint(1, 2, 0);
builder.AddPoint(0.5, 0.5, 1.0);
builder.AddPoint(1, 0, 1);
builder.AddPoint(2, 0, 1);
builder.AddPoint(3, 0, 1);
builder.AddPoint(1, 1, 1);
builder.AddPoint(2, 1, 1);
builder.AddPoint(2.5, 1.0, 1.0);
builder.AddPoint(0.5, 1.5, 1.0);
builder.AddCell(vtkm::CELL_SHAPE_TETRA);
builder.AddCellPoint(0);
builder.AddCellPoint(1);
builder.AddCellPoint(5);
builder.AddCellPoint(10);
builder.AddCell(vtkm::CELL_SHAPE_HEXAHEDRON);
builder.AddCellPoint(1);
builder.AddCellPoint(2);
builder.AddCellPoint(6);
builder.AddCellPoint(5);
builder.AddCellPoint(11);
builder.AddCellPoint(12);
builder.AddCellPoint(15);
builder.AddCellPoint(14);
builder.AddCell(vtkm::CELL_SHAPE_WEDGE);
builder.AddCellPoint(2);
builder.AddCellPoint(3);
builder.AddCellPoint(7);
builder.AddCellPoint(12);
builder.AddCellPoint(13);
builder.AddCellPoint(16);
builder.AddCell(vtkm::CELL_SHAPE_PYRAMID);
builder.AddCellPoint(4);
builder.AddCellPoint(5);
builder.AddCellPoint(9);
builder.AddCellPoint(8);
builder.AddCellPoint(17);
return builder.Create();
}
//
// Initialize the OpenGL state
//
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
float white[] = { 0.8f, 0.8f, 0.8f, 1.0f };
float black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
float lightPos[] = { 10.0f, 10.0f, 10.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, white);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glLightfv(GL_LIGHT0, GL_SPECULAR, black);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
//
// Render the output using simple OpenGL
//
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 40.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.5f, 2.0f, 6.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glPushMatrix();
float rotationMatrix[16];
qrot.getRotMat(rotationMatrix);
glMultMatrixf(rotationMatrix);
glTranslatef(-0.5f, -0.5f, -0.5f);
// Get cell set and the number of cells and vertices
vtkm::cont::CellSetSingleType<> cellSet;
outDataSet.GetCellSet(0).CopyTo(cellSet);
vtkm::Id numberOfCells = cellSet.GetNumberOfCells();
auto vertexArray = outDataSet.GetCoordinateSystem().GetData();
// Draw the five tetrahedra belonging to each hexadron
vtkm::Float32 color[5][3] = { { 1.0f, 0.0f, 0.0f },
{ 0.0f, 1.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 1.0f, 0.0f } };
for (vtkm::Id tetra = 0; tetra < numberOfCells; tetra++)
{
vtkm::Id indx = tetra % 5;
glColor3f(color[indx][0], color[indx][1], color[indx][2]);
// Get the indices of the vertices that make up this tetrahedron
vtkm::Id4 tetIndices;
cellSet.GetIndices(tetra, tetIndices);
// Get the vertex points for this tetrahedron
auto pt0 = vertexArray.GetPortalConstControl().Get(tetIndices[0]);
auto pt1 = vertexArray.GetPortalConstControl().Get(tetIndices[1]);
auto pt2 = vertexArray.GetPortalConstControl().Get(tetIndices[2]);
auto pt3 = vertexArray.GetPortalConstControl().Get(tetIndices[3]);
// Draw the tetrahedron filled with alternating colors
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glVertex3d(pt3[0], pt3[1], pt3[2]);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glEnd();
// Draw the tetrahedron wireframe
glColor3f(1.0f, 1.0f, 1.0f);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glVertex3d(pt3[0], pt3[1], pt3[2]);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glEnd();
}
glPopMatrix();
glutSwapBuffers();
}
// Allow rotations of the view
void mouseMove(int x, int y)
{
vtkm::Float32 dx = static_cast<vtkm::Float32>(x - lastx);
vtkm::Float32 dy = static_cast<vtkm::Float32>(y - lasty);
if (mouse_state == 0)
{
Quaternion newRotX;
newRotX.setEulerAngles(-0.2f * dx * vtkm::Pi_180f(), 0.0f, 0.0f);
qrot.mul(newRotX);
Quaternion newRotY;
newRotY.setEulerAngles(0.0f, 0.0f, -0.2f * dy * vtkm::Pi_180f());
qrot.mul(newRotY);
}
lastx = x;
lasty = y;
glutPostRedisplay();
}
// Respond to mouse button
void mouseCall(int button, int state, int x, int y)
{
if (button == 0)
mouse_state = state;
if ((button == 0) && (state == 0))
{
lastx = x;
lasty = y;
}
}
// Tetrahedralize and render uniform grid example
int main(int argc, char* argv[])
{
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
std::cout << "TetrahedralizeExplicitGrid Example" << std::endl;
// Create the input explicit cell set
vtkm::cont::DataSet inDataSet = MakeTetrahedralizeExplicitDataSet();
vtkm::cont::CellSetExplicit<> inCellSet;
inDataSet.GetCellSet(0).CopyTo(inCellSet);
// Convert cells to tetrahedra
vtkm::filter::Tetrahedralize tetrahedralize;
outDataSet = tetrahedralize.Execute(inDataSet);
// Render the output dataset of tets
lastx = lasty = 0;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1000, 1000);
glutCreateWindow("VTK-m Explicit Tetrahedralize");
initializeGL();
glutDisplayFunc(displayCall);
glutMotionFunc(mouseMove);
glutMouseFunc(mouseCall);
glutMainLoop();
outDataSet.Clear();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,268 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/Math.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/filter/Tetrahedralize.h>
#include <vtkm/cont/testing/Testing.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include "../isosurface/quaternion.h"
// Default size of the example
static vtkm::Id3 dims(4, 4, 4);
static vtkm::Id cellsToDisplay = 64;
// Takes input uniform grid and outputs unstructured grid of tets
static vtkm::cont::DataSet tetDataSet;
// OpenGL display variables
static Quaternion qrot;
static int lastx, lasty;
static int mouse_state = 1;
//
// Construct an input data set with uniform grid of indicated dimensions, origin and spacing
//
vtkm::cont::DataSet MakeTetrahedralizeTestDataSet(vtkm::Id3 dim)
{
vtkm::cont::DataSet dataSet;
// Place uniform grid on a set physical space so OpenGL drawing is easier
const vtkm::Id3 vdims(dim[0] + 1, dim[1] + 1, dim[2] + 1);
const vtkm::Vec3f_32 origin = vtkm::make_Vec(0.0f, 0.0f, 0.0f);
const vtkm::Vec3f_32 spacing = vtkm::make_Vec(1.0f / static_cast<vtkm::Float32>(dim[0]),
1.0f / static_cast<vtkm::Float32>(dim[1]),
1.0f / static_cast<vtkm::Float32>(dim[2]));
// Generate coordinate system
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
// Generate cell set
vtkm::cont::CellSetStructured<3> cellSet("cells");
cellSet.SetPointDimensions(vdims);
dataSet.AddCellSet(cellSet);
return dataSet;
}
//
// Initialize the OpenGL state
//
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
float white[] = { 0.8f, 0.8f, 0.8f, 1.0f };
float black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
float lightPos[] = { 10.0f, 10.0f, 10.5f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, white);
glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
glLightfv(GL_LIGHT0, GL_SPECULAR, black);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
//
// Render the output using simple OpenGL
//
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0f, 0.0f, 3.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
glLineWidth(3.0f);
glPushMatrix();
float rotationMatrix[16];
qrot.getRotMat(rotationMatrix);
glMultMatrixf(rotationMatrix);
glTranslatef(-0.5f, -0.5f, -0.5f);
// Get the cell set, coordinate system and coordinate data
vtkm::cont::CellSetSingleType<> cellSet;
tetDataSet.GetCellSet(0).CopyTo(cellSet);
auto vertexArray = tetDataSet.GetCoordinateSystem().GetData();
// Draw the five tetrahedra belonging to each hexadron
vtkm::Id tetra = 0;
vtkm::Float32 color[5][3] = { { 1.0f, 0.0f, 0.0f },
{ 0.0f, 1.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 1.0f, 0.0f } };
for (vtkm::Id hex = 0; hex < cellsToDisplay; hex++)
{
for (vtkm::Id j = 0; j < 5; j++)
{
vtkm::Id indx = tetra % 5;
glColor3f(color[indx][0], color[indx][1], color[indx][2]);
// Get the indices of the vertices that make up this tetrahedron
vtkm::Id4 tetIndices;
cellSet.GetIndices(tetra, tetIndices);
// Get the vertex points for this tetrahedron
auto pt0 = vertexArray.GetPortalConstControl().Get(tetIndices[0]);
auto pt1 = vertexArray.GetPortalConstControl().Get(tetIndices[1]);
auto pt2 = vertexArray.GetPortalConstControl().Get(tetIndices[2]);
auto pt3 = vertexArray.GetPortalConstControl().Get(tetIndices[3]);
// Draw the tetrahedron filled with alternating colors
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glVertex3d(pt3[0], pt3[1], pt3[2]);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glEnd();
// Draw the tetrahedron wireframe
glColor3f(1.0f, 1.0f, 1.0f);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_STRIP);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glVertex3d(pt3[0], pt3[1], pt3[2]);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glEnd();
tetra++;
}
}
glPopMatrix();
glutSwapBuffers();
}
// Allow rotations of the view
void mouseMove(int x, int y)
{
vtkm::Float32 dx = static_cast<vtkm::Float32>(x - lastx);
vtkm::Float32 dy = static_cast<vtkm::Float32>(y - lasty);
if (mouse_state == 0)
{
Quaternion newRotX;
newRotX.setEulerAngles(-0.2f * dx * vtkm::Pi_180f(), 0.0f, 0.0f);
qrot.mul(newRotX);
Quaternion newRotY;
newRotY.setEulerAngles(0.0f, 0.0f, -0.2f * dy * vtkm::Pi_180f());
qrot.mul(newRotY);
}
lastx = x;
lasty = y;
glutPostRedisplay();
}
// Respond to mouse button
void mouseCall(int button, int state, int x, int y)
{
if (button == 0)
mouse_state = state;
if ((button == 0) && (state == 0))
{
lastx = x;
lasty = y;
}
}
// Tetrahedralize and render uniform grid example
int main(int argc, char* argv[])
{
// Process vtk-m general args
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice;
auto config = vtkm::cont::Initialize(argc, argv, opts);
std::cout << "TetrahedralizeUniformGrid Example" << std::endl;
std::cout << "Parameters are [options] [xdim ydim zdim [# of cellsToDisplay]]" << std::endl;
std::cout << config.Usage << std::endl << std::endl;
// Set the problem size and number of cells to display from command line
if (argc >= 4)
{
dims[0] = atoi(argv[1]);
dims[1] = atoi(argv[2]);
dims[2] = atoi(argv[3]);
cellsToDisplay = dims[0] * dims[1] * dims[2];
}
if (argc == 5)
{
cellsToDisplay = atoi(argv[4]);
}
// Create the input uniform cell set
vtkm::cont::DataSet inDataSet = MakeTetrahedralizeTestDataSet(dims);
vtkm::filter::Tetrahedralize tetrahedralize;
tetDataSet = tetrahedralize.Execute(inDataSet);
// Render the output dataset of tets
lastx = lasty = 0;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1000, 1000);
glutCreateWindow("VTK-m Uniform Tetrahedralize");
initializeGL();
glutDisplayFunc(displayCall);
glutMotionFunc(mouseMove);
glutMouseFunc(mouseCall);
glutMainLoop();
tetDataSet.Clear();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -0,0 +1,31 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/cont/Initialize.h>
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/io/writer/VTKDataSetWriter.h>
#include <vtkm/filter/Triangulate.h>
int main(int argc, char* argv[])
{
vtkm::cont::Initialize(argc, argv, vtkm::cont::InitializeOptions::Strict);
vtkm::cont::DataSet input = vtkm::cont::testing::MakeTestDataSet().Make2DUniformDataSet2();
vtkm::filter::Triangulate triangulateFilter;
vtkm::cont::DataSet output = triangulateFilter.Execute(input);
vtkm::io::writer::VTKDataSetWriter writer("out_tris.vtk");
writer.WriteDataSet(output);
return 0;
}

@ -1,201 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/cont/CellSetExplicit.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/DataSetBuilderExplicit.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/filter/Triangulate.h>
#include <vtkm/cont/testing/Testing.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
namespace
{
// Takes input uniform grid and outputs unstructured grid of triangles
static vtkm::cont::DataSet outDataSet;
} // anonymous namespace
//
// Construct an input data set with uniform grid of indicated dimensions, origin and spacing
//
vtkm::cont::DataSet MakeTriangulateExplicitDataSet()
{
vtkm::cont::DataSetBuilderExplicitIterative builder;
builder.Begin();
builder.AddPoint(0, 0, 0); // 0
builder.AddPoint(1, 0, 0); // 1
builder.AddPoint(2, 0, 0); // 2
builder.AddPoint(3, 0, 0); // 3
builder.AddPoint(0, 1, 0); // 4
builder.AddPoint(1, 1, 0); // 5
builder.AddPoint(2, 1, 0); // 6
builder.AddPoint(3, 1, 0); // 7
builder.AddPoint(0, 2, 0); // 8
builder.AddPoint(1, 2, 0); // 9
builder.AddPoint(2, 2, 0); // 10
builder.AddPoint(3, 2, 0); // 11
builder.AddPoint(0, 3, 0); // 12
builder.AddPoint(3, 3, 0); // 13
builder.AddPoint(1, 4, 0); // 14
builder.AddPoint(2, 4, 0); // 15
builder.AddCell(vtkm::CELL_SHAPE_TRIANGLE);
builder.AddCellPoint(0);
builder.AddCellPoint(1);
builder.AddCellPoint(5);
builder.AddCell(vtkm::CELL_SHAPE_QUAD);
builder.AddCellPoint(1);
builder.AddCellPoint(2);
builder.AddCellPoint(6);
builder.AddCellPoint(5);
builder.AddCell(vtkm::CELL_SHAPE_QUAD);
builder.AddCellPoint(5);
builder.AddCellPoint(6);
builder.AddCellPoint(10);
builder.AddCellPoint(9);
builder.AddCell(vtkm::CELL_SHAPE_QUAD);
builder.AddCellPoint(4);
builder.AddCellPoint(5);
builder.AddCellPoint(9);
builder.AddCellPoint(8);
builder.AddCell(vtkm::CELL_SHAPE_TRIANGLE);
builder.AddCellPoint(2);
builder.AddCellPoint(3);
builder.AddCellPoint(7);
builder.AddCell(vtkm::CELL_SHAPE_QUAD);
builder.AddCellPoint(6);
builder.AddCellPoint(7);
builder.AddCellPoint(11);
builder.AddCellPoint(10);
builder.AddCell(vtkm::CELL_SHAPE_POLYGON);
builder.AddCellPoint(9);
builder.AddCellPoint(10);
builder.AddCellPoint(13);
builder.AddCellPoint(15);
builder.AddCellPoint(14);
builder.AddCellPoint(12);
return builder.Create();
}
//
// Initialize the OpenGL state
//
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5f, 3.5f, -0.5f, 4.5f, -1.0f, 1.0f);
}
//
// Render the output using simple OpenGL
//
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(3.0f);
// Get cell set and the number of cells and vertices
vtkm::cont::CellSetSingleType<> cellSet;
outDataSet.GetCellSet(0).CopyTo(cellSet);
vtkm::Id numberOfCells = cellSet.GetNumberOfCells();
auto vertexArray = outDataSet.GetCoordinateSystem().GetData();
// Draw the two triangles belonging to each quad
vtkm::Float32 color[4][3] = {
{ 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }
};
for (vtkm::Id triangle = 0; triangle < numberOfCells; triangle++)
{
vtkm::Id indx = triangle % 4;
glColor3f(color[indx][0], color[indx][1], color[indx][2]);
// Get the indices of the vertices that make up this triangle
vtkm::Id3 triIndices;
cellSet.GetIndices(triangle, triIndices);
// Get the vertex points for this triangle
vtkm::Vec3f_64 pt0 = vertexArray.GetPortalConstControl().Get(triIndices[0]);
vtkm::Vec3f_64 pt1 = vertexArray.GetPortalConstControl().Get(triIndices[1]);
vtkm::Vec3f_64 pt2 = vertexArray.GetPortalConstControl().Get(triIndices[2]);
// Draw the triangle filled with alternating colors
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLES);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glEnd();
}
glFlush();
}
// Triangulate and render explicit grid example
int main(int argc, char* argv[])
{
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
std::cout << "TrianguleExplicitGrid Example" << std::endl;
// Create the input uniform cell set
vtkm::cont::DataSet inDataSet = MakeTriangulateExplicitDataSet();
vtkm::cont::CellSetExplicit<> inCellSet;
inDataSet.GetCellSet(0).CopyTo(inCellSet);
// Convert 2D explicit cells to triangles
vtkm::filter::Triangulate triangulate;
outDataSet = triangulate.Execute(inDataSet);
// Render the output dataset of tets
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(1000, 1000);
glutInitWindowPosition(100, 100);
glutCreateWindow("VTK-m Explicit Triangulate");
initializeGL();
glutDisplayFunc(displayCall);
glutMainLoop();
outDataSet.Clear();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,171 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/Math.h>
#include <vtkm/cont/DataSet.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/filter/Triangulate.h>
#include <vtkm/cont/testing/Testing.h>
//Suppress warnings about glut being deprecated on OSX
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#if defined(__APPLE__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
// Default size of the example
static vtkm::Id2 dims(4, 4);
static vtkm::Id cellsToDisplay = 16;
// Takes input uniform grid and outputs unstructured grid of triangles
static vtkm::cont::DataSet triDataSet;
//
// Construct an input data set with uniform grid of indicated dimensions, origin and spacing
//
vtkm::cont::DataSet MakeTriangulateTestDataSet(vtkm::Id2 dim)
{
vtkm::cont::DataSet dataSet;
// Place uniform grid on a set physical space so OpenGL drawing is easier
const vtkm::Id3 vdims(dim[0] + 1, dim[1] + 1, 1);
const vtkm::Vec3f_32 origin = vtkm::make_Vec(0.0f, 0.0f, 0.0f);
const vtkm::Vec3f_32 spacing = vtkm::make_Vec(
1.0f / static_cast<vtkm::Float32>(dim[0]), 1.0f / static_cast<vtkm::Float32>(dim[1]), 0.0f);
// Generate coordinate system
vtkm::cont::ArrayHandleUniformPointCoordinates coordinates(vdims, origin, spacing);
dataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", coordinates));
// Generate cell set
vtkm::cont::CellSetStructured<2> cellSet("cells");
cellSet.SetPointDimensions(vtkm::make_Vec(dim[0] + 1, dim[1] + 1));
dataSet.AddCellSet(cellSet);
return dataSet;
}
//
// Initialize the OpenGL state
//
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5f, 1.5f, -0.5f, 1.5f, -1.0f, 1.0f);
}
//
// Render the output using simple OpenGL
//
void displayCall()
{
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(3.0f);
// Get the cellset, coordinate system and coordinate data
vtkm::cont::CellSetSingleType<> cellSet;
triDataSet.GetCellSet(0).CopyTo(cellSet);
auto vertexArray = triDataSet.GetCoordinateSystem().GetData();
// Draw the two triangles belonging to each quad
vtkm::Id triangle = 0;
vtkm::Float32 color[4][3] = {
{ 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }
};
for (vtkm::Id quad = 0; quad < cellsToDisplay; quad++)
{
for (vtkm::Id j = 0; j < 2; j++)
{
vtkm::Id indx = triangle % 4;
glColor3f(color[indx][0], color[indx][1], color[indx][2]);
// Get the indices of the vertices that make up this triangle
vtkm::Id3 triIndices;
cellSet.GetIndices(triangle, triIndices);
// Get the vertex points for this triangle
vtkm::Vec3f_64 pt0 = vertexArray.GetPortalConstControl().Get(triIndices[0]);
vtkm::Vec3f_64 pt1 = vertexArray.GetPortalConstControl().Get(triIndices[1]);
vtkm::Vec3f_64 pt2 = vertexArray.GetPortalConstControl().Get(triIndices[2]);
// Draw the triangle filled with alternating colors
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_TRIANGLES);
glVertex3d(pt0[0], pt0[1], pt0[2]);
glVertex3d(pt1[0], pt1[1], pt1[2]);
glVertex3d(pt2[0], pt2[1], pt2[2]);
glEnd();
triangle++;
}
}
glFlush();
}
// Triangulate and render uniform grid example
int main(int argc, char* argv[])
{
// Process vtk-m general args
auto opts = vtkm::cont::InitializeOptions::DefaultAnyDevice;
auto config = vtkm::cont::Initialize(argc, argv, opts);
std::cout << "TrianguleUniformGrid Example" << std::endl;
std::cout << "Parameters are [options] [xdim ydim [# of cellsToDisplay]]" << std::endl;
std::cout << config.Usage << std::endl << std::endl;
// Set the problem size and number of cells to display from command line
if (argc >= 3)
{
dims[0] = atoi(argv[1]);
dims[1] = atoi(argv[2]);
cellsToDisplay = dims[0] * dims[1];
}
if (argc == 4)
{
cellsToDisplay = atoi(argv[3]);
}
// Create the input uniform cell set
vtkm::cont::DataSet inDataSet = MakeTriangulateTestDataSet(dims);
// Convert uniform quad to triangle
vtkm::filter::Triangulate triangulate;
triDataSet = triangulate.Execute(inDataSet);
// Render the output dataset of tets
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(1000, 1000);
glutInitWindowPosition(100, 100);
glutCreateWindow("VTK-m Uniform Triangulate");
initializeGL();
glutDisplayFunc(displayCall);
glutMainLoop();
triDataSet.Clear();
return 0;
}
#if (defined(VTKM_GCC) || defined(VTKM_CLANG))
#pragma GCC diagnostic pop
#endif

@ -1,126 +0,0 @@
//============================================================================
// 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.
//============================================================================
#include <vtkm/cont/ArrayHandleStreaming.h>
#include <vtkm/cont/Initialize.h>
#include <vtkm/cont/Logging.h> //for GetHumanReadableSize
#include <vtkm/filter/MarchingCubes.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/DispatcherStreamingMapField.h>
#include <vtkm/Math.h>
#include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/Timer.h>
#include <vtkm/cont/cuda/internal/CudaAllocator.h>
namespace vtkm
{
namespace worklet
{
class SineWorklet : public vtkm::worklet::WorkletMapField
{
public:
using ControlSignature = void(FieldIn, FieldOut);
using ExecutionSignature = _2(_1, WorkIndex);
VTKM_EXEC
vtkm::Float32 operator()(vtkm::Int64 x, vtkm::Id&) const
{
return (vtkm::Sin(static_cast<vtkm::Float32>(x)));
}
};
}
}
// Run a simple worklet, and compute an isosurface
int main(int argc, char* argv[])
{
auto opts =
vtkm::cont::InitializeOptions::DefaultAnyDevice | vtkm::cont::InitializeOptions::Strict;
vtkm::cont::Initialize(argc, argv, opts);
vtkm::Int64 N = 4 * 512 * 512 * 512;
if (argc > 1)
{
N = atoi(argv[1]);
}
std::cout << "Testing streaming worklet on "
<< vtkm::cont::GetHumanReadableSize(N * sizeof(vtkm::Int64)) << std::endl;
std::vector<vtkm::Int64> data(N);
for (vtkm::Int64 i = 0; i < N; i++)
data[i] = i;
using DeviceTag = vtkm::cont::DeviceAdapterTagCuda;
const bool usingManagedMemory = vtkm::cont::cuda::internal::CudaAllocator::UsingManagedMemory();
vtkm::worklet::SineWorklet sineWorklet;
if (usingManagedMemory)
{
vtkm::cont::ArrayHandle<vtkm::Int64> input = vtkm::cont::make_ArrayHandle(data);
vtkm::cont::ArrayHandle<vtkm::Float32> output;
std::cout << "Testing with unified memory" << std::endl;
vtkm::worklet::DispatcherMapField<vtkm::worklet::SineWorklet> dispatcher(sineWorklet);
dispatcher.SetDevice(DeviceTag{});
//run once to get the CUDA code warmed up
dispatcher.Invoke(input, output);
vtkm::cont::Timer timer{ DeviceTag() };
timer.Start();
for (int i = 0; i < 3; ++i)
{
dispatcher.Invoke(input, output);
std::cout << output.GetPortalConstControl().Get(output.GetNumberOfValues() - 1) << std::endl;
}
vtkm::Float64 elapsedTime = timer.GetElapsedTime();
std::cout << "Time for 3 iterations with managed memory: " << elapsedTime << std::endl;
}
if (usingManagedMemory)
{ //disable managed memory if it is enabled to get
//the correct performance numbers on GPU's that support managed memory
vtkm::cont::cuda::internal::CudaAllocator::ForceManagedMemoryOff();
}
vtkm::Id NBlocks = (N * sizeof(vtkm::Int64)) / (1 << 25);
NBlocks = std::max(vtkm::Id(1), NBlocks);
vtkm::worklet::DispatcherStreamingMapField<vtkm::worklet::SineWorklet> dispatcher(sineWorklet);
dispatcher.SetNumberOfBlocks(NBlocks);
vtkm::cont::ArrayHandle<vtkm::Int64> input = vtkm::cont::make_ArrayHandle(data);
vtkm::cont::ArrayHandle<vtkm::Float32> output;
std::cout << "Testing with streaming (without unified memory) with " << NBlocks << " blocks"
<< std::endl;
//run once to get the CUDA code warmed up
dispatcher.Invoke(input, output);
vtkm::cont::Timer timer{ DeviceTag() };
timer.Start();
for (int i = 0; i < 3; ++i)
{
dispatcher.Invoke(input, output);
std::cout << output.GetPortalConstControl().Get(output.GetNumberOfValues() - 1) << std::endl;
}
vtkm::Float64 elapsedTime = timer.GetElapsedTime();
std::cout << "Time for 3 iterations: " << elapsedTime << std::endl;
return 0;
}

@ -89,6 +89,7 @@ set(headers
FieldRangeGlobalCompute.h FieldRangeGlobalCompute.h
ImplicitFunctionHandle.h ImplicitFunctionHandle.h
Initialize.h Initialize.h
Invoker.h
Logging.h Logging.h
MultiBlock.h MultiBlock.h
PointLocator.h PointLocator.h

@ -22,9 +22,8 @@
#include <vtkm/cont/DeviceAdapterAlgorithm.h> #include <vtkm/cont/DeviceAdapterAlgorithm.h>
#include <vtkm/cont/ErrorBadDevice.h> #include <vtkm/cont/ErrorBadDevice.h>
#include <vtkm/exec/CellLocatorBoundingIntervalHierarchyExec.h> #include <vtkm/exec/CellLocatorBoundingIntervalHierarchyExec.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/DispatcherMapTopology.h> #include <vtkm/cont/Invoker.h>
#include <vtkm/worklet/Invoker.h>
#include <vtkm/worklet/WorkletMapField.h> #include <vtkm/worklet/WorkletMapField.h>
#include <vtkm/worklet/WorkletMapTopology.h> #include <vtkm/worklet/WorkletMapTopology.h>
@ -87,7 +86,7 @@ void CalculatePlaneSplitCost(vtkm::IdComponent planeIndex,
vtkm::IdComponent index, vtkm::IdComponent index,
vtkm::IdComponent numTotalPlanes) vtkm::IdComponent numTotalPlanes)
{ {
vtkm::worklet::Invoker invoker; vtkm::cont::Invoker invoker;
// Make candidate split plane array // Make candidate split plane array
vtkm::cont::ArrayHandle<vtkm::FloatDefault> splitPlanes; vtkm::cont::ArrayHandle<vtkm::FloatDefault> splitPlanes;
@ -182,7 +181,7 @@ IdArrayHandle CalculateSplitScatterIndices(const IdArrayHandle& cellIds,
const IdArrayHandle& leqFlags, const IdArrayHandle& leqFlags,
const IdArrayHandle& segmentIds) const IdArrayHandle& segmentIds)
{ {
vtkm::worklet::Invoker invoker; vtkm::cont::Invoker invoker;
// Count total number of true flags preceding in segment // Count total number of true flags preceding in segment
IdArrayHandle trueFlagCounts; IdArrayHandle trueFlagCounts;
@ -230,7 +229,7 @@ CellLocatorBoundingIntervalHierarchy::~CellLocatorBoundingIntervalHierarchy() =
void CellLocatorBoundingIntervalHierarchy::Build() void CellLocatorBoundingIntervalHierarchy::Build()
{ {
vtkm::worklet::Invoker invoker; vtkm::cont::Invoker invoker;
vtkm::cont::DynamicCellSet cellSet = this->GetCellSet(); vtkm::cont::DynamicCellSet cellSet = this->GetCellSet();
vtkm::Id numCells = cellSet.GetNumberOfCells(); vtkm::Id numCells = cellSet.GetNumberOfCells();

@ -35,7 +35,7 @@ void CellLocatorRectilinearGrid::Build()
vtkm::cont::DynamicCellSet cellSet = this->GetCellSet(); vtkm::cont::DynamicCellSet cellSet = this->GetCellSet();
if (!coords.GetData().IsType<RectilinearType>()) if (!coords.GetData().IsType<RectilinearType>())
throw vtkm::cont::ErrorInternal("Coordinates are not rectilinear."); throw vtkm::cont::ErrorBadType("Coordinates are not rectilinear type.");
if (cellSet.IsSameType(Structured2DType())) if (cellSet.IsSameType(Structured2DType()))
{ {
@ -55,7 +55,7 @@ void CellLocatorRectilinearGrid::Build()
} }
else else
{ {
throw vtkm::cont::ErrorInternal("Cells are not structured."); throw vtkm::cont::ErrorBadType("Cells are not 2D or 3D structured type.");
} }
} }

@ -14,7 +14,7 @@
#include <vtkm/cont/ArrayHandleConstant.h> #include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/ArrayHandleTransform.h> #include <vtkm/cont/ArrayHandleTransform.h>
#include <vtkm/worklet/Invoker.h> #include <vtkm/cont/Invoker.h>
#include <vtkm/worklet/WorkletMapField.h> #include <vtkm/worklet/WorkletMapField.h>
#include <vtkm/worklet/WorkletMapTopology.h> #include <vtkm/worklet/WorkletMapTopology.h>
@ -135,7 +135,7 @@ private:
bool DoneFlag; bool DoneFlag;
}; };
class CountBinsL1 : public vtkm::worklet::WorkletMapPointToCell class CountBinsL1 : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, FieldInPoint coords, FieldOutCell bincount); using ControlSignature = void(CellSetIn cellset, FieldInPoint coords, FieldOutCell bincount);
@ -158,7 +158,7 @@ private:
Grid L1Grid; Grid L1Grid;
}; };
class FindBinsL1 : public vtkm::worklet::WorkletMapPointToCell class FindBinsL1 : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, using ControlSignature = void(CellSetIn cellset,
@ -218,7 +218,7 @@ private:
vtkm::FloatDefault Density; vtkm::FloatDefault Density;
}; };
class CountBinsL2 : public vtkm::worklet::WorkletMapPointToCell class CountBinsL2 : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, using ControlSignature = void(CellSetIn cellset,
@ -253,7 +253,7 @@ private:
Grid L1Grid; Grid L1Grid;
}; };
class FindBinsL2 : public vtkm::worklet::WorkletMapPointToCell class FindBinsL2 : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, using ControlSignature = void(CellSetIn cellset,
@ -346,7 +346,7 @@ namespace cont
/// ///
VTKM_CONT void CellLocatorUniformBins::Build() VTKM_CONT void CellLocatorUniformBins::Build()
{ {
vtkm::worklet::Invoker invoke; vtkm::cont::Invoker invoke;
auto cellset = this->GetCellSet(); auto cellset = this->GetCellSet();
const auto& coords = this->GetCoordinates(); const auto& coords = this->GetCoordinates();

@ -99,8 +99,8 @@ private:
using CellSetP2CExecType = using CellSetP2CExecType =
decltype(std::declval<CellSetType>().PrepareForInput(DeviceAdapter{}, decltype(std::declval<CellSetType>().PrepareForInput(DeviceAdapter{},
vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{},
vtkm::TopologyElementTagCell{})); vtkm::TopologyElementTagPoint{}));
// TODO: This function may return false positives for non 3D cells as the // TODO: This function may return false positives for non 3D cells as the
// tests are done on the projection of the point on the cell. Extra checks // tests are done on the projection of the point on the cell. Extra checks
@ -140,8 +140,8 @@ public:
, CellCount(cellCount.PrepareForInput(DeviceAdapter{})) , CellCount(cellCount.PrepareForInput(DeviceAdapter{}))
, CellIds(cellIds.PrepareForInput(DeviceAdapter{})) , CellIds(cellIds.PrepareForInput(DeviceAdapter{}))
, CellSet(cellSet.PrepareForInput(DeviceAdapter{}, , CellSet(cellSet.PrepareForInput(DeviceAdapter{},
vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{},
vtkm::TopologyElementTagCell{})) vtkm::TopologyElementTagPoint{}))
, Coords(coords.GetData().PrepareForInput(DeviceAdapter{})) , Coords(coords.GetData().PrepareForInput(DeviceAdapter{}))
{ {
} }

@ -33,7 +33,7 @@ void CellLocatorUniformGrid::Build()
vtkm::cont::DynamicCellSet cellSet = this->GetCellSet(); vtkm::cont::DynamicCellSet cellSet = this->GetCellSet();
if (!coords.GetData().IsType<UniformType>()) if (!coords.GetData().IsType<UniformType>())
throw vtkm::cont::ErrorInternal("Coordinates are not uniform."); throw vtkm::cont::ErrorBadType("Coordinates are not uniform type.");
if (cellSet.IsSameType(Structured2DType())) if (cellSet.IsSameType(Structured2DType()))
{ {
@ -50,26 +50,26 @@ void CellLocatorUniformGrid::Build()
} }
else else
{ {
throw vtkm::cont::ErrorInternal("Cells are not structured."); throw vtkm::cont::ErrorBadType("Cells are not 2D or 3D structured type.");
} }
UniformType uniformCoords = coords.GetData().Cast<UniformType>(); UniformType uniformCoords = coords.GetData().Cast<UniformType>();
this->Origin = uniformCoords.GetPortalConstControl().GetOrigin(); this->Origin = uniformCoords.GetPortalConstControl().GetOrigin();
vtkm::Vec<vtkm::FloatDefault, 3> spacing = uniformCoords.GetPortalConstControl().GetSpacing(); vtkm::Vec3f spacing = uniformCoords.GetPortalConstControl().GetSpacing();
vtkm::Vec<vtkm::FloatDefault, 3> unitLength; vtkm::Vec3f unitLength;
unitLength[0] = static_cast<vtkm::FloatDefault>(PointDims[0] - 1); unitLength[0] = static_cast<vtkm::FloatDefault>(this->PointDims[0] - 1);
unitLength[1] = static_cast<vtkm::FloatDefault>(PointDims[1] - 1); unitLength[1] = static_cast<vtkm::FloatDefault>(this->PointDims[1] - 1);
unitLength[2] = static_cast<vtkm::FloatDefault>(PointDims[2] - 1); unitLength[2] = static_cast<vtkm::FloatDefault>(this->PointDims[2] - 1);
this->MaxPoint = Origin + spacing * unitLength; this->MaxPoint = this->Origin + spacing * unitLength;
this->InvSpacing[0] = 1.f / spacing[0]; this->InvSpacing[0] = 1.f / spacing[0];
this->InvSpacing[1] = 1.f / spacing[1]; this->InvSpacing[1] = 1.f / spacing[1];
this->InvSpacing[2] = 1.f / spacing[2]; this->InvSpacing[2] = 1.f / spacing[2];
this->CellDims[0] = PointDims[0] - 1; this->CellDims[0] = this->PointDims[0] - 1;
this->CellDims[1] = PointDims[1] - 1; this->CellDims[1] = this->PointDims[1] - 1;
this->CellDims[2] = PointDims[2] - 1; this->CellDims[2] = this->PointDims[2] - 1;
} }
namespace namespace

@ -34,9 +34,9 @@ protected:
private: private:
vtkm::Id3 CellDims; vtkm::Id3 CellDims;
vtkm::Id3 PointDims; vtkm::Id3 PointDims;
vtkm::Vec<vtkm::FloatDefault, 3> Origin; vtkm::Vec3f Origin;
vtkm::Vec<vtkm::FloatDefault, 3> InvSpacing; vtkm::Vec3f InvSpacing;
vtkm::Vec<vtkm::FloatDefault, 3> MaxPoint; vtkm::Vec3f MaxPoint;
bool Is3D = true; bool Is3D = true;
mutable vtkm::cont::VirtualObjectHandle<vtkm::exec::CellLocator> ExecutionObjectHandle; mutable vtkm::cont::VirtualObjectHandle<vtkm::exec::CellLocator> ExecutionObjectHandle;

@ -28,7 +28,7 @@ namespace cont
namespace detail namespace detail
{ {
template <typename CellSetType, typename FromTopology, typename ToTopology> template <typename CellSetType, typename VisitTopology, typename IncidentTopology>
struct CellSetExplicitConnectivityChooser struct CellSetExplicitConnectivityChooser
{ {
using ConnectivityType = vtkm::cont::internal::ConnectivityExplicitInternals<>; using ConnectivityType = vtkm::cont::internal::ConnectivityExplicitInternals<>;
@ -63,13 +63,13 @@ class VTKM_ALWAYS_EXPORT CellSetExplicit : public CellSet
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>; OffsetsStorageTag>;
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
struct ConnectivityChooser struct ConnectivityChooser
{ {
using ConnectivityType = using ConnectivityType =
typename detail::CellSetExplicitConnectivityChooser<Thisclass, typename detail::CellSetExplicitConnectivityChooser<Thisclass,
FromTopology, VisitTopology,
ToTopology>::ConnectivityType; IncidentTopology>::ConnectivityType;
using ShapeArrayType = typename ConnectivityType::ShapeArrayType; using ShapeArrayType = typename ConnectivityType::ShapeArrayType;
using NumIndicesArrayType = typename ConnectivityType::NumIndicesArrayType; using NumIndicesArrayType = typename ConnectivityType::NumIndicesArrayType;
@ -77,25 +77,26 @@ class VTKM_ALWAYS_EXPORT CellSetExplicit : public CellSet
using IndexOffsetArrayType = typename ConnectivityType::IndexOffsetArrayType; using IndexOffsetArrayType = typename ConnectivityType::IndexOffsetArrayType;
}; };
using PointToCellInternalsType = using VisitCellsWithPointsInternalsType =
typename ConnectivityChooser<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell>::ConnectivityType;
using CellToPointInternalsType =
typename ConnectivityChooser<vtkm::TopologyElementTagCell, typename ConnectivityChooser<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint>::ConnectivityType; vtkm::TopologyElementTagPoint>::ConnectivityType;
using VisitPointsWithCellsInternalsType =
typename ConnectivityChooser<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell>::ConnectivityType;
public: public:
using SchedulingRangeType = vtkm::Id; using SchedulingRangeType = vtkm::Id;
//point to cell is used when iterating cells and asking for point properties //point to cell is used when iterating cells and asking for point properties
using PointToCellConnectivityType = using VisitCellsWithPointsConnectivityType =
ConnectivityChooser<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell>; ConnectivityChooser<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint>;
using ShapeArrayType = typename PointToCellConnectivityType::ShapeArrayType; using ShapeArrayType = typename VisitCellsWithPointsConnectivityType::ShapeArrayType;
using NumIndicesArrayType = typename PointToCellConnectivityType::NumIndicesArrayType; using NumIndicesArrayType = typename VisitCellsWithPointsConnectivityType::NumIndicesArrayType;
using ConnectivityArrayType = typename PointToCellConnectivityType::ConnectivityArrayType; using ConnectivityArrayType =
using IndexOffsetArrayType = typename PointToCellConnectivityType::IndexOffsetArrayType; typename VisitCellsWithPointsConnectivityType::ConnectivityArrayType;
using IndexOffsetArrayType = typename VisitCellsWithPointsConnectivityType::IndexOffsetArrayType;
VTKM_CONT CellSetExplicit(const std::string& name = std::string()); VTKM_CONT CellSetExplicit(const std::string& name = std::string());
VTKM_CONT CellSetExplicit(const Thisclass& src); VTKM_CONT CellSetExplicit(const Thisclass& src);
@ -148,14 +149,14 @@ public:
const vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>& offsets = const vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>& offsets =
vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>()); vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>());
template <typename DeviceAdapter, typename FromTopology, typename ToTopology> template <typename DeviceAdapter, typename VisitTopology, typename IncidentTopology>
struct ExecutionTypes struct ExecutionTypes
{ {
VTKM_IS_DEVICE_ADAPTER_TAG(DeviceAdapter); VTKM_IS_DEVICE_ADAPTER_TAG(DeviceAdapter);
VTKM_IS_TOPOLOGY_ELEMENT_TAG(FromTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(VisitTopology);
VTKM_IS_TOPOLOGY_ELEMENT_TAG(ToTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(IncidentTopology);
using ConnectivityTypes = ConnectivityChooser<FromTopology, ToTopology>; using ConnectivityTypes = ConnectivityChooser<VisitTopology, IncidentTopology>;
using ShapePortalType = typename ConnectivityTypes::ShapeArrayType::template ExecutionTypes< using ShapePortalType = typename ConnectivityTypes::ShapeArrayType::template ExecutionTypes<
DeviceAdapter>::PortalConst; DeviceAdapter>::PortalConst;
@ -175,82 +176,85 @@ public:
IndexOffsetPortalType>; IndexOffsetPortalType>;
}; };
template <typename Device, typename FromTopology, typename ToTopology> template <typename Device, typename VisitTopology, typename IncidentTopology>
typename ExecutionTypes<Device, FromTopology, ToTopology>::ExecObjectType typename ExecutionTypes<Device, VisitTopology, IncidentTopology>::ExecObjectType
PrepareForInput(Device, FromTopology, ToTopology) const; PrepareForInput(Device, VisitTopology, IncidentTopology) const;
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT const typename ConnectivityChooser<FromTopology, ToTopology>::ShapeArrayType& VTKM_CONT const typename ConnectivityChooser<VisitTopology, IncidentTopology>::ShapeArrayType&
GetShapesArray(FromTopology, ToTopology) const; GetShapesArray(VisitTopology, IncidentTopology) const;
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT const typename ConnectivityChooser<FromTopology, ToTopology>::NumIndicesArrayType& VTKM_CONT const typename ConnectivityChooser<VisitTopology,
GetNumIndicesArray(FromTopology, ToTopology) const; IncidentTopology>::NumIndicesArrayType&
GetNumIndicesArray(VisitTopology, IncidentTopology) const;
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT const typename ConnectivityChooser<FromTopology, ToTopology>::ConnectivityArrayType& VTKM_CONT const typename ConnectivityChooser<VisitTopology,
GetConnectivityArray(FromTopology, ToTopology) const; IncidentTopology>::ConnectivityArrayType&
GetConnectivityArray(VisitTopology, IncidentTopology) const;
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT const typename ConnectivityChooser<FromTopology, ToTopology>::IndexOffsetArrayType& VTKM_CONT const typename ConnectivityChooser<VisitTopology,
GetIndexOffsetArray(FromTopology, ToTopology) const; IncidentTopology>::IndexOffsetArrayType&
GetIndexOffsetArray(VisitTopology, IncidentTopology) const;
// Can be used to check if e.g. CellToPoint table is built. // Can be used to check if e.g. CellToPoint table is built.
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT bool HasConnectivity(FromTopology from, ToTopology to) const VTKM_CONT bool HasConnectivity(VisitTopology from, IncidentTopology to) const
{ {
return this->HasConnectivityImpl(from, to); return this->HasConnectivityImpl(from, to);
} }
// Can be used to reset a connectivity table, mostly useful for benchmarking. // Can be used to reset a connectivity table, mostly useful for benchmarking.
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT void ResetConnectivity(FromTopology from, ToTopology to) VTKM_CONT void ResetConnectivity(VisitTopology from, IncidentTopology to)
{ {
this->ResetConnectivityImpl(from, to); this->ResetConnectivityImpl(from, to);
} }
protected: protected:
VTKM_CONT void BuildConnectivity(vtkm::cont::DeviceAdapterId,
vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell) const;
VTKM_CONT void BuildConnectivity(vtkm::cont::DeviceAdapterId, VTKM_CONT void BuildConnectivity(vtkm::cont::DeviceAdapterId,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint) const; vtkm::TopologyElementTagPoint) const;
VTKM_CONT bool HasConnectivityImpl(vtkm::TopologyElementTagPoint, VTKM_CONT void BuildConnectivity(vtkm::cont::DeviceAdapterId,
vtkm::TopologyElementTagCell) const vtkm::TopologyElementTagPoint,
{ vtkm::TopologyElementTagCell) const;
return this->Data->PointToCell.ElementsValid;
}
VTKM_CONT bool HasConnectivityImpl(vtkm::TopologyElementTagCell, VTKM_CONT bool HasConnectivityImpl(vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint) const vtkm::TopologyElementTagPoint) const
{ {
return this->Data->CellToPoint.ElementsValid; return this->Data->VisitCellsWithPoints.ElementsValid;
} }
VTKM_CONT void ResetConnectivityImpl(vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell) VTKM_CONT bool HasConnectivityImpl(vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell) const
{
return this->Data->VisitPointsWithCells.ElementsValid;
}
VTKM_CONT void ResetConnectivityImpl(vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint)
{ {
// Reset entire cell set // Reset entire cell set
this->Data->PointToCell = PointToCellInternalsType{}; this->Data->VisitCellsWithPoints = VisitCellsWithPointsInternalsType{};
this->Data->CellToPoint = CellToPointInternalsType{}; this->Data->VisitPointsWithCells = VisitPointsWithCellsInternalsType{};
this->Data->ConnectivityAdded = -1; this->Data->ConnectivityAdded = -1;
this->Data->NumberOfCellsAdded = -1; this->Data->NumberOfCellsAdded = -1;
this->Data->NumberOfPoints = 0; this->Data->NumberOfPoints = 0;
} }
VTKM_CONT void ResetConnectivityImpl(vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint) VTKM_CONT void ResetConnectivityImpl(vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell)
{ {
this->Data->CellToPoint = CellToPointInternalsType{}; this->Data->VisitPointsWithCells = VisitPointsWithCellsInternalsType{};
} }
// Store internals in a shared pointer so shallow copies stay consistent. // Store internals in a shared pointer so shallow copies stay consistent.
// See #2268. // See #2268.
struct Internals struct Internals
{ {
PointToCellInternalsType PointToCell; VisitCellsWithPointsInternalsType VisitCellsWithPoints;
CellToPointInternalsType CellToPoint; VisitPointsWithCellsInternalsType VisitPointsWithCells;
// These are used in the AddCell and related methods to incrementally add // These are used in the AddCell and related methods to incrementally add
// cells. They need to be protected as subclasses of CellSetExplicit // cells. They need to be protected as subclasses of CellSetExplicit
@ -271,28 +275,28 @@ protected:
std::shared_ptr<Internals> Data; std::shared_ptr<Internals> Data;
private: private:
const PointToCellInternalsType& GetConnectivity(vtkm::TopologyElementTagPoint, const VisitCellsWithPointsInternalsType& GetConnectivity(vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell) const
{
return this->Data->PointToCell;
}
const PointToCellInternalsType& GetConnectivity(vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell)
{
return this->Data->PointToCell;
}
const CellToPointInternalsType& GetConnectivity(vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint) const vtkm::TopologyElementTagPoint) const
{ {
return this->Data->CellToPoint; return this->Data->VisitCellsWithPoints;
} }
const CellToPointInternalsType& GetConnectivity(vtkm::TopologyElementTagCell, const VisitCellsWithPointsInternalsType& GetConnectivity(vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint) vtkm::TopologyElementTagPoint)
{ {
return this->Data->CellToPoint; return this->Data->VisitCellsWithPoints;
}
const VisitPointsWithCellsInternalsType& GetConnectivity(vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell) const
{
return this->Data->VisitPointsWithCells;
}
const VisitPointsWithCellsInternalsType& GetConnectivity(vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell)
{
return this->Data->VisitPointsWithCells;
} }
}; };
@ -302,8 +306,8 @@ namespace detail
template <typename Storage1, typename Storage2, typename Storage3, typename Storage4> template <typename Storage1, typename Storage2, typename Storage3, typename Storage4>
struct CellSetExplicitConnectivityChooser< struct CellSetExplicitConnectivityChooser<
vtkm::cont::CellSetExplicit<Storage1, Storage2, Storage3, Storage4>, vtkm::cont::CellSetExplicit<Storage1, Storage2, Storage3, Storage4>,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell> vtkm::TopologyElementTagPoint>
{ {
using ConnectivityType = using ConnectivityType =
vtkm::cont::internal::ConnectivityExplicitInternals<Storage1, Storage2, Storage3, Storage4>; vtkm::cont::internal::ConnectivityExplicitInternals<Storage1, Storage2, Storage3, Storage4>;
@ -311,8 +315,8 @@ struct CellSetExplicitConnectivityChooser<
template <typename CellSetType> template <typename CellSetType>
struct CellSetExplicitConnectivityChooser<CellSetType, struct CellSetExplicitConnectivityChooser<CellSetType,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint> vtkm::TopologyElementTagCell>
{ {
//only specify the shape type as it will be constant as everything //only specify the shape type as it will be constant as everything
//is a vertex. otherwise use the defaults. //is a vertex. otherwise use the defaults.
@ -376,13 +380,13 @@ public:
vtkmdiy::save(bb, cs.GetName()); vtkmdiy::save(bb, cs.GetName());
vtkmdiy::save(bb, cs.GetNumberOfPoints()); vtkmdiy::save(bb, cs.GetNumberOfPoints());
vtkmdiy::save( vtkmdiy::save(
bb, cs.GetShapesArray(vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{})); bb, cs.GetShapesArray(vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}));
vtkmdiy::save( vtkmdiy::save(
bb, cs.GetNumIndicesArray(vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{})); bb, cs.GetNumIndicesArray(vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}));
vtkmdiy::save( vtkmdiy::save(
bb, cs.GetConnectivityArray(vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{})); bb, cs.GetConnectivityArray(vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}));
vtkmdiy::save( vtkmdiy::save(
bb, cs.GetIndexOffsetArray(vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{})); bb, cs.GetIndexOffsetArray(vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}));
} }
static VTKM_CONT void load(BinaryBuffer& bb, Type& cs) static VTKM_CONT void load(BinaryBuffer& bb, Type& cs)

@ -104,10 +104,10 @@ void CellSetExplicit<ShapeStorageTag,
OffsetsStorageTag>::PrintSummary(std::ostream& out) const OffsetsStorageTag>::PrintSummary(std::ostream& out) const
{ {
out << " ExplicitCellSet: " << this->Name << std::endl; out << " ExplicitCellSet: " << this->Name << std::endl;
out << " PointToCell: " << std::endl; out << " VisitCellsWithPoints: " << std::endl;
this->Data->PointToCell.PrintSummary(out); this->Data->VisitCellsWithPoints.PrintSummary(out);
out << " CellToPoint: " << std::endl; out << " VisitPointsWithCells: " << std::endl;
this->Data->CellToPoint.PrintSummary(out); this->Data->VisitPointsWithCells.PrintSummary(out);
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
@ -119,8 +119,8 @@ void CellSetExplicit<ShapeStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetStorageTag>::ReleaseResourcesExecution() OffsetStorageTag>::ReleaseResourcesExecution()
{ {
this->Data->PointToCell.ReleaseResourcesExecution(); this->Data->VisitCellsWithPoints.ReleaseResourcesExecution();
this->Data->CellToPoint.ReleaseResourcesExecution(); this->Data->VisitPointsWithCells.ReleaseResourcesExecution();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -134,7 +134,7 @@ vtkm::Id CellSetExplicit<ShapeStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetNumberOfCells() const OffsetsStorageTag>::GetNumberOfCells() const
{ {
return this->Data->PointToCell.GetNumberOfElements(); return this->Data->VisitCellsWithPoints.GetNumberOfElements();
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
@ -224,7 +224,7 @@ VTKM_CONT vtkm::IdComponent
CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>:: CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>::
GetNumberOfPointsInCell(vtkm::Id cellIndex) const GetNumberOfPointsInCell(vtkm::Id cellIndex) const
{ {
return this->Data->PointToCell.NumIndices.GetPortalConstControl().Get(cellIndex); return this->Data->VisitCellsWithPoints.NumIndices.GetPortalConstControl().Get(cellIndex);
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
@ -236,7 +236,7 @@ VTKM_CONT vtkm::UInt8 CellSetExplicit<ShapeStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetCellShape(vtkm::Id cellIndex) const OffsetsStorageTag>::GetCellShape(vtkm::Id cellIndex) const
{ {
return this->Data->PointToCell.Shapes.GetPortalConstControl().Get(cellIndex); return this->Data->VisitCellsWithPoints.Shapes.GetPortalConstControl().Get(cellIndex);
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
@ -248,12 +248,12 @@ VTKM_CONT void
CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>:: CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>::
GetIndices(vtkm::Id index, vtkm::Vec<vtkm::Id, ItemTupleLength>& ids) const GetIndices(vtkm::Id index, vtkm::Vec<vtkm::Id, ItemTupleLength>& ids) const
{ {
this->Data->PointToCell.BuildIndexOffsets(vtkm::cont::DeviceAdapterTagAny{}); this->Data->VisitCellsWithPoints.BuildIndexOffsets(vtkm::cont::DeviceAdapterTagAny{});
vtkm::IdComponent numIndices = this->GetNumberOfPointsInCell(index); vtkm::IdComponent numIndices = this->GetNumberOfPointsInCell(index);
vtkm::Id start = this->Data->PointToCell.IndexOffsets.GetPortalConstControl().Get(index); vtkm::Id start = this->Data->VisitCellsWithPoints.IndexOffsets.GetPortalConstControl().Get(index);
for (vtkm::IdComponent i = 0; i < numIndices && i < ItemTupleLength; i++) for (vtkm::IdComponent i = 0; i < numIndices && i < ItemTupleLength; i++)
{ {
ids[i] = this->Data->PointToCell.Connectivity.GetPortalConstControl().Get(start + i); ids[i] = this->Data->VisitCellsWithPoints.Connectivity.GetPortalConstControl().Get(start + i);
} }
} }
@ -265,16 +265,18 @@ VTKM_CONT void
CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>:: CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>::
GetIndices(vtkm::Id index, vtkm::cont::ArrayHandle<vtkm::Id>& ids) const GetIndices(vtkm::Id index, vtkm::cont::ArrayHandle<vtkm::Id>& ids) const
{ {
this->Data->PointToCell.BuildIndexOffsets(vtkm::cont::DeviceAdapterTagAny{}); this->Data->VisitCellsWithPoints.BuildIndexOffsets(vtkm::cont::DeviceAdapterTagAny{});
vtkm::IdComponent numIndices = this->GetNumberOfPointsInCell(index); vtkm::IdComponent numIndices = this->GetNumberOfPointsInCell(index);
ids.Allocate(numIndices); ids.Allocate(numIndices);
vtkm::Id start = this->Data->PointToCell.IndexOffsets.GetPortalConstControl().Get(index); vtkm::Id start = this->Data->VisitCellsWithPoints.IndexOffsets.GetPortalConstControl().Get(index);
vtkm::cont::ArrayHandle<vtkm::Id>::PortalControl idPortal = ids.GetPortalControl(); vtkm::cont::ArrayHandle<vtkm::Id>::PortalControl idPortal = ids.GetPortalControl();
auto PtCellPortal = this->Data->PointToCell.Connectivity.GetPortalConstControl(); auto PtCellPortal = this->Data->VisitCellsWithPoints.Connectivity.GetPortalConstControl();
for (vtkm::IdComponent i = 0; i < numIndices && i < numIndices; i++) for (vtkm::IdComponent i = 0; i < numIndices && i < numIndices; i++)
{
idPortal.Set(i, PtCellPortal.Get(start + i)); idPortal.Set(i, PtCellPortal.Get(start + i));
} }
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -288,10 +290,10 @@ VTKM_CONT void CellSetExplicit<ShapeStorageTag,
OffsetsStorageTag>::PrepareToAddCells(vtkm::Id numCells, OffsetsStorageTag>::PrepareToAddCells(vtkm::Id numCells,
vtkm::Id connectivityMaxLen) vtkm::Id connectivityMaxLen)
{ {
this->Data->PointToCell.Shapes.Allocate(numCells); this->Data->VisitCellsWithPoints.Shapes.Allocate(numCells);
this->Data->PointToCell.NumIndices.Allocate(numCells); this->Data->VisitCellsWithPoints.NumIndices.Allocate(numCells);
this->Data->PointToCell.Connectivity.Allocate(connectivityMaxLen); this->Data->VisitCellsWithPoints.Connectivity.Allocate(connectivityMaxLen);
this->Data->PointToCell.IndexOffsets.Allocate(numCells); this->Data->VisitCellsWithPoints.IndexOffsets.Allocate(numCells);
this->Data->NumberOfCellsAdded = 0; this->Data->NumberOfCellsAdded = 0;
this->Data->ConnectivityAdded = 0; this->Data->ConnectivityAdded = 0;
} }
@ -314,27 +316,28 @@ CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, O
throw vtkm::cont::ErrorBadValue("Not enough indices given to CellSetSingleType::AddCell."); throw vtkm::cont::ErrorBadValue("Not enough indices given to CellSetSingleType::AddCell.");
} }
if (this->Data->NumberOfCellsAdded >= this->Data->PointToCell.Shapes.GetNumberOfValues()) if (this->Data->NumberOfCellsAdded >= this->Data->VisitCellsWithPoints.Shapes.GetNumberOfValues())
{ {
throw vtkm::cont::ErrorBadValue("Added more cells then expected."); throw vtkm::cont::ErrorBadValue("Added more cells then expected.");
} }
if (this->Data->ConnectivityAdded + numVertices > if (this->Data->ConnectivityAdded + numVertices >
this->Data->PointToCell.Connectivity.GetNumberOfValues()) this->Data->VisitCellsWithPoints.Connectivity.GetNumberOfValues())
{ {
throw vtkm::cont::ErrorBadValue( throw vtkm::cont::ErrorBadValue(
"Connectivity increased passed estimated maximum connectivity."); "Connectivity increased passed estimated maximum connectivity.");
} }
this->Data->PointToCell.Shapes.GetPortalControl().Set(this->Data->NumberOfCellsAdded, cellType); this->Data->VisitCellsWithPoints.Shapes.GetPortalControl().Set(this->Data->NumberOfCellsAdded,
this->Data->PointToCell.NumIndices.GetPortalControl().Set(this->Data->NumberOfCellsAdded, cellType);
this->Data->VisitCellsWithPoints.NumIndices.GetPortalControl().Set(this->Data->NumberOfCellsAdded,
numVertices); numVertices);
for (vtkm::IdComponent iVec = 0; iVec < numVertices; ++iVec) for (vtkm::IdComponent iVec = 0; iVec < numVertices; ++iVec)
{ {
this->Data->PointToCell.Connectivity.GetPortalControl().Set( this->Data->VisitCellsWithPoints.Connectivity.GetPortalControl().Set(
this->Data->ConnectivityAdded + iVec, Traits::GetComponent(ids, iVec)); this->Data->ConnectivityAdded + iVec, Traits::GetComponent(ids, iVec));
} }
this->Data->PointToCell.IndexOffsets.GetPortalControl().Set(this->Data->NumberOfCellsAdded, this->Data->VisitCellsWithPoints.IndexOffsets.GetPortalControl().Set(
this->Data->ConnectivityAdded); this->Data->NumberOfCellsAdded, this->Data->ConnectivityAdded);
this->Data->NumberOfCellsAdded++; this->Data->NumberOfCellsAdded++;
this->Data->ConnectivityAdded += numVertices; this->Data->ConnectivityAdded += numVertices;
} }
@ -349,9 +352,9 @@ VTKM_CONT void CellSetExplicit<ShapeStorageTag,
OffsetsStorageTag>::CompleteAddingCells(vtkm::Id numPoints) OffsetsStorageTag>::CompleteAddingCells(vtkm::Id numPoints)
{ {
this->Data->NumberOfPoints = numPoints; this->Data->NumberOfPoints = numPoints;
this->Data->PointToCell.Connectivity.Shrink(this->Data->ConnectivityAdded); this->Data->VisitCellsWithPoints.Connectivity.Shrink(this->Data->ConnectivityAdded);
this->Data->PointToCell.ElementsValid = true; this->Data->VisitCellsWithPoints.ElementsValid = true;
this->Data->PointToCell.IndexOffsetsValid = true; this->Data->VisitCellsWithPoints.IndexOffsetsValid = true;
if (this->Data->NumberOfCellsAdded != this->GetNumberOfCells()) if (this->Data->NumberOfCellsAdded != this->GetNumberOfCells())
{ {
@ -377,20 +380,20 @@ CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, O
const vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>& offsets) const vtkm::cont::ArrayHandle<vtkm::Id, OffsetsStorageTag>& offsets)
{ {
this->Data->NumberOfPoints = numPoints; this->Data->NumberOfPoints = numPoints;
this->Data->PointToCell.Shapes = cellTypes; this->Data->VisitCellsWithPoints.Shapes = cellTypes;
this->Data->PointToCell.NumIndices = numIndices; this->Data->VisitCellsWithPoints.NumIndices = numIndices;
this->Data->PointToCell.Connectivity = connectivity; this->Data->VisitCellsWithPoints.Connectivity = connectivity;
this->Data->PointToCell.ElementsValid = true; this->Data->VisitCellsWithPoints.ElementsValid = true;
if (offsets.GetNumberOfValues() == cellTypes.GetNumberOfValues()) if (offsets.GetNumberOfValues() == cellTypes.GetNumberOfValues())
{ {
this->Data->PointToCell.IndexOffsets = offsets; this->Data->VisitCellsWithPoints.IndexOffsets = offsets;
this->Data->PointToCell.IndexOffsetsValid = true; this->Data->VisitCellsWithPoints.IndexOffsetsValid = true;
} }
else else
{ {
this->Data->PointToCell.IndexOffsetsValid = false; this->Data->VisitCellsWithPoints.IndexOffsetsValid = false;
if (offsets.GetNumberOfValues() != 0) if (offsets.GetNumberOfValues() != 0)
{ {
throw vtkm::cont::ErrorBadValue("Explicit cell offsets array unexpected size. " throw vtkm::cont::ErrorBadValue("Explicit cell offsets array unexpected size. "
@ -398,7 +401,7 @@ CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, O
} }
} }
this->ResetConnectivity(TopologyElementTagCell{}, TopologyElementTagPoint{}); this->ResetConnectivity(TopologyElementTagPoint{}, TopologyElementTagCell{});
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -407,19 +410,22 @@ template <typename ShapeStorageTag,
typename NumIndicesStorageTag, typename NumIndicesStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename OffsetsStorageTag> typename OffsetsStorageTag>
template <typename Device, typename FromTopology, typename ToTopology> template <typename Device, typename VisitTopology, typename IncidentTopology>
auto CellSetExplicit<ShapeStorageTag, auto CellSetExplicit<ShapeStorageTag,
NumIndicesStorageTag, NumIndicesStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::PrepareForInput(Device, FromTopology, ToTopology) const -> OffsetsStorageTag>::PrepareForInput(Device,
typename ExecutionTypes<Device, FromTopology, ToTopology>::ExecObjectType VisitTopology,
IncidentTopology) const ->
typename ExecutionTypes<Device, VisitTopology, IncidentTopology>::ExecObjectType
{ {
this->BuildConnectivity(Device{}, FromTopology(), ToTopology()); this->BuildConnectivity(Device{}, VisitTopology(), IncidentTopology());
const auto& connectivity = this->GetConnectivity(FromTopology(), ToTopology()); const auto& connectivity = this->GetConnectivity(VisitTopology(), IncidentTopology());
VTKM_ASSERT(connectivity.ElementsValid); VTKM_ASSERT(connectivity.ElementsValid);
using ExecObjType = typename ExecutionTypes<Device, FromTopology, ToTopology>::ExecObjectType; using ExecObjType =
typename ExecutionTypes<Device, VisitTopology, IncidentTopology>::ExecObjectType;
return ExecObjType(connectivity.Shapes.PrepareForInput(Device()), return ExecObjType(connectivity.Shapes.PrepareForInput(Device()),
connectivity.NumIndices.PrepareForInput(Device()), connectivity.NumIndices.PrepareForInput(Device()),
connectivity.Connectivity.PrepareForInput(Device()), connectivity.Connectivity.PrepareForInput(Device()),
@ -432,63 +438,64 @@ template <typename ShapeStorageTag,
typename NumIndicesStorageTag, typename NumIndicesStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename OffsetsStorageTag> typename OffsetsStorageTag>
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT auto CellSetExplicit<ShapeStorageTag, VTKM_CONT auto CellSetExplicit<ShapeStorageTag,
NumIndicesStorageTag, NumIndicesStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetShapesArray(FromTopology, ToTopology) const OffsetsStorageTag>::GetShapesArray(VisitTopology,
-> const typename ConnectivityChooser<FromTopology, ToTopology>::ShapeArrayType& IncidentTopology) const -> const
typename ConnectivityChooser<VisitTopology, IncidentTopology>::ShapeArrayType&
{ {
this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, FromTopology(), ToTopology()); this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, VisitTopology(), IncidentTopology());
return this->GetConnectivity(FromTopology(), ToTopology()).Shapes; return this->GetConnectivity(VisitTopology(), IncidentTopology()).Shapes;
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
typename NumIndicesStorageTag, typename NumIndicesStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename OffsetsStorageTag> typename OffsetsStorageTag>
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT auto CellSetExplicit<ShapeStorageTag, VTKM_CONT auto CellSetExplicit<ShapeStorageTag,
NumIndicesStorageTag, NumIndicesStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetNumIndicesArray(FromTopology, OffsetsStorageTag>::GetNumIndicesArray(VisitTopology,
ToTopology) const -> const IncidentTopology) const
typename ConnectivityChooser<FromTopology, ToTopology>::NumIndicesArrayType& -> const typename ConnectivityChooser<VisitTopology, IncidentTopology>::NumIndicesArrayType&
{ {
this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, FromTopology(), ToTopology()); this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, VisitTopology(), IncidentTopology());
return this->GetConnectivity(FromTopology(), ToTopology()).NumIndices; return this->GetConnectivity(VisitTopology(), IncidentTopology()).NumIndices;
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
typename NumIndicesStorageTag, typename NumIndicesStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename OffsetsStorageTag> typename OffsetsStorageTag>
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT auto CellSetExplicit<ShapeStorageTag, VTKM_CONT auto CellSetExplicit<ShapeStorageTag,
NumIndicesStorageTag, NumIndicesStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetConnectivityArray(FromTopology, OffsetsStorageTag>::GetConnectivityArray(VisitTopology,
ToTopology) const -> const IncidentTopology) const
typename ConnectivityChooser<FromTopology, ToTopology>::ConnectivityArrayType& -> const typename ConnectivityChooser<VisitTopology, IncidentTopology>::ConnectivityArrayType&
{ {
this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, FromTopology(), ToTopology()); this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, VisitTopology(), IncidentTopology());
return this->GetConnectivity(FromTopology(), ToTopology()).Connectivity; return this->GetConnectivity(VisitTopology(), IncidentTopology()).Connectivity;
} }
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
typename NumIndicesStorageTag, typename NumIndicesStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename OffsetsStorageTag> typename OffsetsStorageTag>
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
VTKM_CONT auto CellSetExplicit<ShapeStorageTag, VTKM_CONT auto CellSetExplicit<ShapeStorageTag,
NumIndicesStorageTag, NumIndicesStorageTag,
ConnectivityStorageTag, ConnectivityStorageTag,
OffsetsStorageTag>::GetIndexOffsetArray(FromTopology, OffsetsStorageTag>::GetIndexOffsetArray(VisitTopology,
ToTopology) const -> const IncidentTopology) const
typename ConnectivityChooser<FromTopology, ToTopology>::IndexOffsetArrayType& -> const typename ConnectivityChooser<VisitTopology, IncidentTopology>::IndexOffsetArrayType&
{ {
this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, FromTopology(), ToTopology()); this->BuildConnectivity(vtkm::cont::DeviceAdapterTagAny{}, VisitTopology(), IncidentTopology());
return this->GetConnectivity(FromTopology(), ToTopology()).IndexOffsets; return this->GetConnectivity(VisitTopology(), IncidentTopology()).IndexOffsets;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -521,13 +528,13 @@ void CellSetExplicit<ShapeStorageTag,
} }
// TODO: implement actual deep-copy of the arrays // TODO: implement actual deep-copy of the arrays
auto pt = vtkm::TopologyElementTagPoint{};
auto ct = vtkm::TopologyElementTagCell{}; auto ct = vtkm::TopologyElementTagCell{};
auto pt = vtkm::TopologyElementTagPoint{};
this->Fill(other->GetNumberOfPoints(), this->Fill(other->GetNumberOfPoints(),
other->GetShapesArray(pt, ct), other->GetShapesArray(ct, pt),
other->GetNumIndicesArray(pt, ct), other->GetNumIndicesArray(ct, pt),
other->GetConnectivityArray(pt, ct), other->GetConnectivityArray(ct, pt),
other->GetIndexOffsetArray(pt, ct)); other->GetIndexOffsetArray(ct, pt));
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -535,32 +542,33 @@ void CellSetExplicit<ShapeStorageTag,
namespace detail namespace detail
{ {
template <typename PointToCellConnectivity> template <typename VisitCellsWithPointsConnectivity>
struct BuildPointToCellConnectivityFunctor struct BuildVisitCellsWithPointsConnectivityFunctor
{ {
explicit BuildPointToCellConnectivityFunctor(PointToCellConnectivity& pointToCell) explicit BuildVisitCellsWithPointsConnectivityFunctor(VisitCellsWithPointsConnectivity& obj)
: PointToCell(&pointToCell) : VisitCellsWithPoints(&obj)
{ {
} }
template <typename Device> template <typename Device>
bool operator()(Device) const bool operator()(Device) const
{ {
this->PointToCell->BuildIndexOffsets(Device()); this->VisitCellsWithPoints->BuildIndexOffsets(Device());
return true; return true;
} }
PointToCellConnectivity* PointToCell; VisitCellsWithPointsConnectivity* VisitCellsWithPoints;
}; };
template <typename PointToCellConnectivity, typename CellToPointConnectivity> template <typename VisitCellsWithPointsConnectivity, typename VisitPointsWithCellsConnectivity>
struct BuildCellToPointConnectivityFunctor struct BuildVisitPointsWithCellsConnectivityFunctor
{ {
BuildCellToPointConnectivityFunctor(PointToCellConnectivity& pointToCell, BuildVisitPointsWithCellsConnectivityFunctor(
CellToPointConnectivity& cellToPoint, VisitCellsWithPointsConnectivity& visitCellsWithPoints,
VisitPointsWithCellsConnectivity& visitPointsWithCells,
vtkm::Id numberOfPoints) vtkm::Id numberOfPoints)
: PointToCell(&pointToCell) : VisitCellsWithPoints(&visitCellsWithPoints)
, CellToPoint(&cellToPoint) , VisitPointsWithCells(&visitPointsWithCells)
, NumberOfPoints(numberOfPoints) , NumberOfPoints(numberOfPoints)
{ {
} }
@ -568,15 +576,15 @@ struct BuildCellToPointConnectivityFunctor
template <typename Device> template <typename Device>
bool operator()(Device) const bool operator()(Device) const
{ {
this->PointToCell->BuildIndexOffsets(Device()); this->VisitCellsWithPoints->BuildIndexOffsets(Device());
internal::ComputeCellToPointConnectivity( internal::ComputeVisitPointsWithCellsConnectivity(
*this->CellToPoint, *this->PointToCell, this->NumberOfPoints, Device()); *this->VisitPointsWithCells, *this->VisitCellsWithPoints, this->NumberOfPoints, Device());
this->CellToPoint->BuildIndexOffsets(Device()); this->VisitPointsWithCells->BuildIndexOffsets(Device());
return true; return true;
} }
PointToCellConnectivity* PointToCell; VisitCellsWithPointsConnectivity* VisitCellsWithPoints;
CellToPointConnectivity* CellToPoint; VisitPointsWithCellsConnectivity* VisitPointsWithCells;
vtkm::Id NumberOfPoints; vtkm::Id NumberOfPoints;
}; };
@ -589,19 +597,20 @@ template <typename ShapeStorageTag,
VTKM_CONT void VTKM_CONT void
CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>:: CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>::
BuildConnectivity(vtkm::cont::DeviceAdapterId device, BuildConnectivity(vtkm::cont::DeviceAdapterId device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell) const vtkm::TopologyElementTagPoint) const
{ {
using PointToCellConnectivity = using VisitCellsWithPointsConnectivity =
typename ConnectivityChooser<vtkm::TopologyElementTagPoint, typename ConnectivityChooser<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell>::ConnectivityType; vtkm::TopologyElementTagPoint>::ConnectivityType;
VTKM_ASSERT(this->Data->PointToCell.ElementsValid); VTKM_ASSERT(this->Data->VisitCellsWithPoints.ElementsValid);
if (!this->Data->PointToCell.IndexOffsetsValid) if (!this->Data->VisitCellsWithPoints.IndexOffsetsValid)
{ {
auto self = const_cast<Thisclass*>(this); auto self = const_cast<Thisclass*>(this);
auto functor = auto functor =
detail::BuildPointToCellConnectivityFunctor<PointToCellConnectivity>(self->Data->PointToCell); detail::BuildVisitCellsWithPointsConnectivityFunctor<VisitCellsWithPointsConnectivity>(
self->Data->VisitCellsWithPoints);
if (!vtkm::cont::TryExecuteOnDevice(device, functor)) if (!vtkm::cont::TryExecuteOnDevice(device, functor))
{ {
throw vtkm::cont::ErrorExecution("Failed to run BuildConnectivity."); throw vtkm::cont::ErrorExecution("Failed to run BuildConnectivity.");
@ -616,22 +625,26 @@ template <typename ShapeStorageTag,
VTKM_CONT void VTKM_CONT void
CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>:: CellSetExplicit<ShapeStorageTag, NumIndicesStorageTag, ConnectivityStorageTag, OffsetsStorageTag>::
BuildConnectivity(vtkm::cont::DeviceAdapterId device, BuildConnectivity(vtkm::cont::DeviceAdapterId device,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint) const vtkm::TopologyElementTagCell) const
{ {
using PointToCellConnectivity = using VisitCellsWithPointsConnectivity =
typename ConnectivityChooser<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell>::ConnectivityType;
using CellToPointConnectivity =
typename ConnectivityChooser<vtkm::TopologyElementTagCell, typename ConnectivityChooser<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagPoint>::ConnectivityType; vtkm::TopologyElementTagPoint>::ConnectivityType;
using VisitPointsWithCellsConnectivity =
typename ConnectivityChooser<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagCell>::ConnectivityType;
if (!this->Data->CellToPoint.ElementsValid || !this->Data->CellToPoint.IndexOffsetsValid) if (!this->Data->VisitPointsWithCells.ElementsValid ||
!this->Data->VisitPointsWithCells.IndexOffsetsValid)
{ {
auto self = const_cast<Thisclass*>(this); auto self = const_cast<Thisclass*>(this);
auto functor = auto functor =
detail::BuildCellToPointConnectivityFunctor<PointToCellConnectivity, CellToPointConnectivity>( detail::BuildVisitPointsWithCellsConnectivityFunctor<VisitCellsWithPointsConnectivity,
self->Data->PointToCell, self->Data->CellToPoint, this->Data->NumberOfPoints); VisitPointsWithCellsConnectivity>(
self->Data->VisitCellsWithPoints,
self->Data->VisitPointsWithCells,
this->Data->NumberOfPoints);
if (!vtkm::cont::TryExecuteOnDevice(device, functor)) if (!vtkm::cont::TryExecuteOnDevice(device, functor))
{ {
throw vtkm::cont::ErrorExecution("Failed to run BuildConnectivity."); throw vtkm::cont::ErrorExecution("Failed to run BuildConnectivity.");

@ -95,8 +95,8 @@ vtkm::IdComponent CellSetExtrude::GetNumberOfPointsInCell(vtkm::Id) const
void CellSetExtrude::GetCellPointIds(vtkm::Id id, vtkm::Id* ptids) const void CellSetExtrude::GetCellPointIds(vtkm::Id id, vtkm::Id* ptids) const
{ {
auto conn = this->PrepareForInput(vtkm::cont::DeviceAdapterTagSerial{}, auto conn = this->PrepareForInput(vtkm::cont::DeviceAdapterTagSerial{},
vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{},
vtkm::TopologyElementTagCell{}); vtkm::TopologyElementTagPoint{});
auto indices = conn.GetIndices(id); auto indices = conn.GetIndices(id);
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
{ {

@ -16,9 +16,9 @@
#include <vtkm/cont/ArrayHandleCounting.h> #include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/ArrayHandleExtrudeCoords.h> #include <vtkm/cont/ArrayHandleExtrudeCoords.h>
#include <vtkm/cont/CellSet.h> #include <vtkm/cont/CellSet.h>
#include <vtkm/cont/Invoker.h>
#include <vtkm/exec/ConnectivityExtrude.h> #include <vtkm/exec/ConnectivityExtrude.h>
#include <vtkm/exec/arg/ThreadIndicesExtrude.h> #include <vtkm/exec/arg/ThreadIndicesExtrude.h>
#include <vtkm/worklet/Invoker.h>
#include <vtkm/worklet/WorkletMapField.h> #include <vtkm/worklet/WorkletMapField.h>
namespace vtkm namespace vtkm
@ -68,30 +68,30 @@ public:
template <typename DeviceAdapter> template <typename DeviceAdapter>
using ConnectivityC2P = vtkm::exec::ReverseConnectivityExtrude<DeviceAdapter>; using ConnectivityC2P = vtkm::exec::ReverseConnectivityExtrude<DeviceAdapter>;
template <typename DeviceAdapter, typename FromTopology, typename ToTopology> template <typename DeviceAdapter, typename VisitTopology, typename IncidentTopology>
struct ExecutionTypes; struct ExecutionTypes;
template <typename DeviceAdapter> template <typename DeviceAdapter>
struct ExecutionTypes<DeviceAdapter, vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell> struct ExecutionTypes<DeviceAdapter, vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint>
{ {
using ExecObjectType = ConnectivityP2C<DeviceAdapter>; using ExecObjectType = ConnectivityP2C<DeviceAdapter>;
}; };
template <typename DeviceAdapter> template <typename DeviceAdapter>
struct ExecutionTypes<DeviceAdapter, vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint> struct ExecutionTypes<DeviceAdapter, vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell>
{ {
using ExecObjectType = ConnectivityC2P<DeviceAdapter>; using ExecObjectType = ConnectivityC2P<DeviceAdapter>;
}; };
template <typename Device> template <typename Device>
ConnectivityP2C<Device> PrepareForInput(Device, ConnectivityP2C<Device> PrepareForInput(Device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell) const; vtkm::TopologyElementTagPoint) const;
template <typename Device> template <typename Device>
ConnectivityC2P<Device> PrepareForInput(Device, ConnectivityC2P<Device> PrepareForInput(Device,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint) const; vtkm::TopologyElementTagCell) const;
private: private:
template <typename Device> template <typename Device>

@ -50,7 +50,7 @@ namespace cont
template <typename Device> template <typename Device>
VTKM_CONT void CellSetExtrude::BuildReverseConnectivity(Device) VTKM_CONT void CellSetExtrude::BuildReverseConnectivity(Device)
{ {
vtkm::worklet::Invoker invoke(Device{}); vtkm::cont::Invoker invoke(Device{});
// create a mapping of where each key is the point id and the value // create a mapping of where each key is the point id and the value
// is the cell id. We // is the cell id. We
@ -87,8 +87,8 @@ VTKM_CONT void CellSetExtrude::BuildReverseConnectivity(Device)
template <typename Device> template <typename Device>
CellSetExtrude::ConnectivityP2C<Device> CellSetExtrude::PrepareForInput( CellSetExtrude::ConnectivityP2C<Device> CellSetExtrude::PrepareForInput(
Device, Device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell) const vtkm::TopologyElementTagPoint) const
{ {
return ConnectivityP2C<Device>(this->Connectivity.PrepareForInput(Device{}), return ConnectivityP2C<Device>(this->Connectivity.PrepareForInput(Device{}),
this->NextNode.PrepareForInput(Device{}), this->NextNode.PrepareForInput(Device{}),
@ -102,8 +102,8 @@ CellSetExtrude::ConnectivityP2C<Device> CellSetExtrude::PrepareForInput(
template <typename Device> template <typename Device>
VTKM_CONT CellSetExtrude::ConnectivityC2P<Device> CellSetExtrude::PrepareForInput( VTKM_CONT CellSetExtrude::ConnectivityC2P<Device> CellSetExtrude::PrepareForInput(
Device, Device,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint) const vtkm::TopologyElementTagCell) const
{ {
if (!this->ReverseConnectivityBuilt) if (!this->ReverseConnectivityBuilt)
{ {

@ -35,10 +35,10 @@ namespace cont
namespace internal namespace internal
{ {
class CellSetPermutationPointToCellHelpers class CellSetPermutationVisitCellsWithPointsHelpers
{ {
public: public:
struct WriteNumIndices : public vtkm::worklet::WorkletMapPointToCell struct WriteNumIndices : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutCell numIndices); using ControlSignature = void(CellSetIn cellset, FieldOutCell numIndices);
using ExecutionSignature = void(PointCount, _2); using ExecutionSignature = void(PointCount, _2);
@ -50,7 +50,7 @@ public:
} }
}; };
struct WriteConnectivity : public vtkm::worklet::WorkletMapPointToCell struct WriteConnectivity : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutCell connectivity); using ControlSignature = void(CellSetIn cellset, FieldOutCell connectivity);
using ExecutionSignature = void(PointCount, PointIndices, _2); using ExecutionSignature = void(PointCount, PointIndices, _2);
@ -112,7 +112,7 @@ public:
// default for CellSetPermutations of any cell type // default for CellSetPermutations of any cell type
template <typename CellSetPermutationType> template <typename CellSetPermutationType>
class CellSetPermutationPointToCell class CellSetPermutationVisitCellsWithPoints
{ {
public: public:
using ConnectivityArrays = vtkm::cont::internal::ConnectivityExplicitInternals<>; using ConnectivityArrays = vtkm::cont::internal::ConnectivityExplicitInternals<>;
@ -123,10 +123,11 @@ public:
ConnectivityArrays conn; ConnectivityArrays conn;
vtkm::Id connectivityLength = 0; vtkm::Id connectivityLength = 0;
conn.NumIndices = CellSetPermutationPointToCellHelpers::GetNumIndicesArray(cellset, Device{}); conn.NumIndices =
conn.IndexOffsets = CellSetPermutationPointToCellHelpers::GetIndexOffsetsArray( CellSetPermutationVisitCellsWithPointsHelpers::GetNumIndicesArray(cellset, Device{});
conn.IndexOffsets = CellSetPermutationVisitCellsWithPointsHelpers::GetIndexOffsetsArray(
conn.NumIndices, connectivityLength, Device{}); conn.NumIndices, connectivityLength, Device{});
conn.Connectivity = CellSetPermutationPointToCellHelpers::GetConnectivityArray( conn.Connectivity = CellSetPermutationVisitCellsWithPointsHelpers::GetConnectivityArray(
cellset, conn.IndexOffsets, connectivityLength, Device{}); cellset, conn.IndexOffsets, connectivityLength, Device{});
return conn; return conn;
@ -135,7 +136,7 @@ public:
// Specialization for CellSetExplicit/CellSetSingleType // Specialization for CellSetExplicit/CellSetSingleType
template <typename S1, typename S2, typename S3, typename S4, typename PermutationArrayHandleType> template <typename S1, typename S2, typename S3, typename S4, typename PermutationArrayHandleType>
class CellSetPermutationPointToCell< class CellSetPermutationVisitCellsWithPoints<
CellSetPermutation<CellSetExplicit<S1, S2, S3, S4>, PermutationArrayHandleType>> CellSetPermutation<CellSetExplicit<S1, S2, S3, S4>, PermutationArrayHandleType>>
{ {
private: private:
@ -160,10 +161,10 @@ public:
conn.NumIndices = conn.NumIndices =
NumIndicesArrayType(cellset.GetValidCellIds(), NumIndicesArrayType(cellset.GetValidCellIds(),
cellset.GetFullCellSet().GetNumIndicesArray( cellset.GetFullCellSet().GetNumIndicesArray(
vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell())); vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()));
conn.IndexOffsets = CellSetPermutationPointToCellHelpers::GetIndexOffsetsArray( conn.IndexOffsets = CellSetPermutationVisitCellsWithPointsHelpers::GetIndexOffsetsArray(
conn.NumIndices, connectivityLength, Device{}); conn.NumIndices, connectivityLength, Device{});
conn.Connectivity = CellSetPermutationPointToCellHelpers::GetConnectivityArray( conn.Connectivity = CellSetPermutationVisitCellsWithPointsHelpers::GetConnectivityArray(
cellset, conn.IndexOffsets, connectivityLength, Device{}); cellset, conn.IndexOffsets, connectivityLength, Device{});
return conn; return conn;
@ -172,7 +173,7 @@ public:
// Specialization for CellSetStructured // Specialization for CellSetStructured
template <vtkm::IdComponent DIMENSION, typename PermutationArrayHandleType> template <vtkm::IdComponent DIMENSION, typename PermutationArrayHandleType>
class CellSetPermutationPointToCell< class CellSetPermutationVisitCellsWithPoints<
CellSetPermutation<CellSetStructured<DIMENSION>, PermutationArrayHandleType>> CellSetPermutation<CellSetStructured<DIMENSION>, PermutationArrayHandleType>>
{ {
private: private:
@ -197,7 +198,7 @@ public:
ConnectivityArrays conn; ConnectivityArrays conn;
conn.NumIndices = make_ArrayHandleConstant(numPointsInCell, numberOfCells); conn.NumIndices = make_ArrayHandleConstant(numPointsInCell, numberOfCells);
conn.IndexOffsets = ArrayHandleCounting<vtkm::Id>(0, numPointsInCell, numberOfCells); conn.IndexOffsets = ArrayHandleCounting<vtkm::Id>(0, numPointsInCell, numberOfCells);
conn.Connectivity = CellSetPermutationPointToCellHelpers::GetConnectivityArray( conn.Connectivity = CellSetPermutationVisitCellsWithPointsHelpers::GetConnectivityArray(
cellset, conn.IndexOffsets, connectivityLength, Device{}); cellset, conn.IndexOffsets, connectivityLength, Device{});
return conn; return conn;
@ -281,7 +282,7 @@ public:
{ {
this->ValidCellIds.ReleaseResourcesExecution(); this->ValidCellIds.ReleaseResourcesExecution();
this->FullCellSet.ReleaseResourcesExecution(); this->FullCellSet.ReleaseResourcesExecution();
this->CellToPoint.ReleaseResourcesExecution(); this->VisitPointsWithCells.ReleaseResourcesExecution();
} }
VTKM_CONT VTKM_CONT
@ -337,11 +338,11 @@ public:
return this->FullCellSet.GetNumberOfPoints(); return this->FullCellSet.GetNumberOfPoints();
} }
template <typename Device, typename FromTopology, typename ToTopology> template <typename Device, typename VisitTopology, typename IncidentTopology>
struct ExecutionTypes; struct ExecutionTypes;
template <typename Device> template <typename Device>
struct ExecutionTypes<Device, vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell> struct ExecutionTypes<Device, vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint>
{ {
VTKM_IS_DEVICE_ADAPTER_TAG(Device); VTKM_IS_DEVICE_ADAPTER_TAG(Device);
@ -349,15 +350,15 @@ public:
typename PermutationArrayHandleType::template ExecutionTypes<Device>::PortalConst; typename PermutationArrayHandleType::template ExecutionTypes<Device>::PortalConst;
using OrigExecObjectType = typename OriginalCellSetType::template ExecutionTypes< using OrigExecObjectType = typename OriginalCellSetType::template ExecutionTypes<
Device, Device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell>::ExecObjectType; vtkm::TopologyElementTagPoint>::ExecObjectType;
using ExecObjectType = using ExecObjectType =
vtkm::exec::ConnectivityPermutedPointToCell<ExecPortalType, OrigExecObjectType>; vtkm::exec::ConnectivityPermutedVisitCellsWithPoints<ExecPortalType, OrigExecObjectType>;
}; };
template <typename Device> template <typename Device>
struct ExecutionTypes<Device, vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint> struct ExecutionTypes<Device, vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell>
{ {
VTKM_IS_DEVICE_ADAPTER_TAG(Device); VTKM_IS_DEVICE_ADAPTER_TAG(Device);
@ -368,47 +369,48 @@ public:
using IndexOffsetPortalType = using IndexOffsetPortalType =
typename vtkm::cont::ArrayHandle<vtkm::Id>::template ExecutionTypes<Device>::PortalConst; typename vtkm::cont::ArrayHandle<vtkm::Id>::template ExecutionTypes<Device>::PortalConst;
using ExecObjectType = vtkm::exec::ConnectivityPermutedCellToPoint<ConnectiviyPortalType, using ExecObjectType =
vtkm::exec::ConnectivityPermutedVisitPointsWithCells<ConnectiviyPortalType,
NumIndicesPortalType, NumIndicesPortalType,
IndexOffsetPortalType>; IndexOffsetPortalType>;
}; };
template <typename Device> template <typename Device>
VTKM_CONT typename ExecutionTypes<Device, VTKM_CONT typename ExecutionTypes<Device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell>::ExecObjectType vtkm::TopologyElementTagPoint>::ExecObjectType
PrepareForInput(Device device, PrepareForInput(Device device,
vtkm::TopologyElementTagPoint from, vtkm::TopologyElementTagCell from,
vtkm::TopologyElementTagCell to) const vtkm::TopologyElementTagPoint to) const
{ {
using ConnectivityType = typename ExecutionTypes<Device, using ConnectivityType = typename ExecutionTypes<Device,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell>::ExecObjectType; vtkm::TopologyElementTagPoint>::ExecObjectType;
return ConnectivityType(this->ValidCellIds.PrepareForInput(device), return ConnectivityType(this->ValidCellIds.PrepareForInput(device),
this->FullCellSet.PrepareForInput(device, from, to)); this->FullCellSet.PrepareForInput(device, from, to));
} }
template <typename Device> template <typename Device>
VTKM_CONT typename ExecutionTypes<Device, VTKM_CONT typename ExecutionTypes<Device,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint>::ExecObjectType vtkm::TopologyElementTagCell>::ExecObjectType
PrepareForInput(Device device, vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint) const PrepareForInput(Device device, vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell) const
{ {
if (!this->CellToPoint.ElementsValid) if (!this->VisitPointsWithCells.ElementsValid)
{ {
auto pointToCell = auto pointToCell =
internal::CellSetPermutationPointToCell<CellSetPermutation>::Get(*this, device); internal::CellSetPermutationVisitCellsWithPoints<CellSetPermutation>::Get(*this, device);
internal::ComputeCellToPointConnectivity( internal::ComputeVisitPointsWithCellsConnectivity(
this->CellToPoint, pointToCell, this->GetNumberOfPoints(), device); this->VisitPointsWithCells, pointToCell, this->GetNumberOfPoints(), device);
this->CellToPoint.BuildIndexOffsets(device); this->VisitPointsWithCells.BuildIndexOffsets(device);
} }
using ConnectivityType = typename ExecutionTypes<Device, using ConnectivityType = typename ExecutionTypes<Device,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint>::ExecObjectType; vtkm::TopologyElementTagCell>::ExecObjectType;
return ConnectivityType(this->CellToPoint.Connectivity.PrepareForInput(device), return ConnectivityType(this->VisitPointsWithCells.Connectivity.PrepareForInput(device),
this->CellToPoint.NumIndices.PrepareForInput(device), this->VisitPointsWithCells.NumIndices.PrepareForInput(device),
this->CellToPoint.IndexOffsets.PrepareForInput(device)); this->VisitPointsWithCells.IndexOffsets.PrepareForInput(device));
} }
VTKM_CONT VTKM_CONT
@ -421,12 +423,12 @@ public:
} }
private: private:
using CellToPointConnectivity = vtkm::cont::internal::ConnectivityExplicitInternals< using VisitPointsWithCellsConnectivity = vtkm::cont::internal::ConnectivityExplicitInternals<
typename ArrayHandleConstant<vtkm::UInt8>::StorageTag>; typename ArrayHandleConstant<vtkm::UInt8>::StorageTag>;
PermutationArrayHandleType ValidCellIds; PermutationArrayHandleType ValidCellIds;
OriginalCellSetType FullCellSet; OriginalCellSetType FullCellSet;
mutable CellToPointConnectivity CellToPoint; mutable VisitPointsWithCellsConnectivity VisitPointsWithCells;
}; };
template <typename CellSetType, template <typename CellSetType,

@ -80,7 +80,7 @@ public:
{ {
this->CellShapeAsId = vtkm::CELL_SHAPE_EMPTY; this->CellShapeAsId = vtkm::CELL_SHAPE_EMPTY;
this->Data->PointToCell.Connectivity.Allocate(connectivityMaxLen); this->Data->VisitCellsWithPoints.Connectivity.Allocate(connectivityMaxLen);
this->Data->NumberOfCellsAdded = 0; this->Data->NumberOfCellsAdded = 0;
this->Data->ConnectivityAdded = 0; this->Data->ConnectivityAdded = 0;
@ -101,7 +101,7 @@ public:
} }
if (this->Data->ConnectivityAdded + numVertices > if (this->Data->ConnectivityAdded + numVertices >
this->Data->PointToCell.Connectivity.GetNumberOfValues()) this->Data->VisitCellsWithPoints.Connectivity.GetNumberOfValues())
{ {
throw vtkm::cont::ErrorBadValue( throw vtkm::cont::ErrorBadValue(
"Connectivity increased passed estimated maximum connectivity."); "Connectivity increased passed estimated maximum connectivity.");
@ -131,7 +131,7 @@ public:
} }
for (vtkm::IdComponent iVert = 0; iVert < numVertices; ++iVert) for (vtkm::IdComponent iVert = 0; iVert < numVertices; ++iVert)
{ {
this->Data->PointToCell.Connectivity.GetPortalControl().Set( this->Data->VisitCellsWithPoints.Connectivity.GetPortalControl().Set(
this->Data->ConnectivityAdded + iVert, Traits::GetComponent(ids, iVert)); this->Data->ConnectivityAdded + iVert, Traits::GetComponent(ids, iVert));
} }
this->Data->NumberOfCellsAdded++; this->Data->NumberOfCellsAdded++;
@ -143,19 +143,19 @@ public:
void CompleteAddingCells(vtkm::Id numPoints) void CompleteAddingCells(vtkm::Id numPoints)
{ {
this->Data->NumberOfPoints = numPoints; this->Data->NumberOfPoints = numPoints;
this->PointToCell.Connectivity.Shrink(this->ConnectivityAdded); this->VisitCellsWithPoints.Connectivity.Shrink(this->ConnectivityAdded);
vtkm::Id numCells = this->NumberOfCellsAdded; vtkm::Id numCells = this->NumberOfCellsAdded;
this->PointToCell.Shapes = this->VisitCellsWithPoints.Shapes =
vtkm::cont::make_ArrayHandleConstant(this->GetCellShape(0), numCells); vtkm::cont::make_ArrayHandleConstant(this->GetCellShape(0), numCells);
this->PointToCell.NumIndices = this->VisitCellsWithPoints.NumIndices =
vtkm::cont::make_ArrayHandleConstant(this->NumberOfPointsPerCell, numCells); vtkm::cont::make_ArrayHandleConstant(this->NumberOfPointsPerCell, numCells);
this->PointToCell.IndexOffsets = vtkm::cont::make_ArrayHandleCounting( this->VisitCellsWithPoints.IndexOffsets = vtkm::cont::make_ArrayHandleCounting(
vtkm::Id(0), static_cast<vtkm::Id>(this->NumberOfPointsPerCell), numCells); vtkm::Id(0), static_cast<vtkm::Id>(this->NumberOfPointsPerCell), numCells);
this->PointToCell.ElementsValid = true; this->VisitCellsWithPoints.ElementsValid = true;
this->PointToCell.IndexOffsetsValid = true; this->VisitCellsWithPoints.IndexOffsetsValid = true;
if (this->ExpectedNumberOfCellsAdded != this->GetNumberOfCells()) if (this->ExpectedNumberOfCellsAdded != this->GetNumberOfCells())
{ {
@ -179,17 +179,18 @@ public:
this->CheckNumberOfPointsPerCell(numberOfPointsPerCell); this->CheckNumberOfPointsPerCell(numberOfPointsPerCell);
const vtkm::Id numCells = connectivity.GetNumberOfValues() / numberOfPointsPerCell; const vtkm::Id numCells = connectivity.GetNumberOfValues() / numberOfPointsPerCell;
VTKM_ASSERT((connectivity.GetNumberOfValues() % numberOfPointsPerCell) == 0); VTKM_ASSERT((connectivity.GetNumberOfValues() % numberOfPointsPerCell) == 0);
this->Data->PointToCell.Shapes = vtkm::cont::make_ArrayHandleConstant(shapeId, numCells); this->Data->VisitCellsWithPoints.Shapes =
this->Data->PointToCell.NumIndices = vtkm::cont::make_ArrayHandleConstant(shapeId, numCells);
this->Data->VisitCellsWithPoints.NumIndices =
vtkm::cont::make_ArrayHandleConstant(numberOfPointsPerCell, numCells); vtkm::cont::make_ArrayHandleConstant(numberOfPointsPerCell, numCells);
this->Data->PointToCell.IndexOffsets = vtkm::cont::make_ArrayHandleCounting( this->Data->VisitCellsWithPoints.IndexOffsets = vtkm::cont::make_ArrayHandleCounting(
vtkm::Id(0), static_cast<vtkm::Id>(numberOfPointsPerCell), numCells); vtkm::Id(0), static_cast<vtkm::Id>(numberOfPointsPerCell), numCells);
this->Data->PointToCell.Connectivity = connectivity; this->Data->VisitCellsWithPoints.Connectivity = connectivity;
this->Data->PointToCell.ElementsValid = true; this->Data->VisitCellsWithPoints.ElementsValid = true;
this->Data->PointToCell.IndexOffsetsValid = true; this->Data->VisitCellsWithPoints.IndexOffsetsValid = true;
this->ResetConnectivity(TopologyElementTagCell{}, TopologyElementTagPoint{}); this->ResetConnectivity(TopologyElementTagPoint{}, TopologyElementTagCell{});
} }
VTKM_CONT VTKM_CONT
@ -224,10 +225,10 @@ public:
virtual void PrintSummary(std::ostream& out) const override virtual void PrintSummary(std::ostream& out) const override
{ {
out << " CellSetSingleType: " << this->Name << " Type " << this->CellShapeAsId << std::endl; out << " CellSetSingleType: " << this->Name << " Type " << this->CellShapeAsId << std::endl;
out << " PointToCell: " << std::endl; out << " VisitCellsWithPoints: " << std::endl;
this->Data->PointToCell.PrintSummary(out); this->Data->VisitCellsWithPoints.PrintSummary(out);
out << " CellToPoint: " << std::endl; out << " VisitPointsWithCells: " << std::endl;
this->Data->CellToPoint.PrintSummary(out); this->Data->VisitPointsWithCells.PrintSummary(out);
} }
private: private:
@ -308,7 +309,7 @@ public:
vtkmdiy::save(bb, cs.GetCellShape(0)); vtkmdiy::save(bb, cs.GetCellShape(0));
vtkmdiy::save(bb, cs.GetNumberOfPointsInCell(0)); vtkmdiy::save(bb, cs.GetNumberOfPointsInCell(0));
vtkmdiy::save( vtkmdiy::save(
bb, cs.GetConnectivityArray(vtkm::TopologyElementTagPoint{}, vtkm::TopologyElementTagCell{})); bb, cs.GetConnectivityArray(vtkm::TopologyElementTagCell{}, vtkm::TopologyElementTagPoint{}));
} }
static VTKM_CONT void load(BinaryBuffer& bb, Type& cs) static VTKM_CONT void load(BinaryBuffer& bb, Type& cs)

@ -115,18 +115,19 @@ public:
template <typename TopologyElement> template <typename TopologyElement>
SchedulingRangeType GetSchedulingRange(TopologyElement) const; SchedulingRangeType GetSchedulingRange(TopologyElement) const;
template <typename DeviceAdapter, typename FromTopology, typename ToTopology> template <typename DeviceAdapter, typename VisitTopology, typename IncidentTopology>
struct ExecutionTypes struct ExecutionTypes
{ {
VTKM_IS_DEVICE_ADAPTER_TAG(DeviceAdapter); VTKM_IS_DEVICE_ADAPTER_TAG(DeviceAdapter);
VTKM_IS_TOPOLOGY_ELEMENT_TAG(FromTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(VisitTopology);
VTKM_IS_TOPOLOGY_ELEMENT_TAG(ToTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(IncidentTopology);
using ExecObjectType = vtkm::exec::ConnectivityStructured<FromTopology, ToTopology, Dimension>; using ExecObjectType =
vtkm::exec::ConnectivityStructured<VisitTopology, IncidentTopology, Dimension>;
}; };
template <typename DeviceAdapter, typename FromTopology, typename ToTopology> template <typename DeviceAdapter, typename VisitTopology, typename IncidentTopology>
typename ExecutionTypes<DeviceAdapter, FromTopology, ToTopology>::ExecObjectType typename ExecutionTypes<DeviceAdapter, VisitTopology, IncidentTopology>::ExecObjectType
PrepareForInput(DeviceAdapter, FromTopology, ToTopology) const; PrepareForInput(DeviceAdapter, VisitTopology, IncidentTopology) const;
void PrintSummary(std::ostream& out) const override; void PrintSummary(std::ostream& out) const override;

@ -57,13 +57,16 @@ typename CellSetStructured<DIMENSION>::SchedulingRangeType
} }
template <vtkm::IdComponent DIMENSION> template <vtkm::IdComponent DIMENSION>
template <typename DeviceAdapter, typename FromTopology, typename ToTopology> template <typename DeviceAdapter, typename VisitTopology, typename IncidentTopology>
typename CellSetStructured< typename CellSetStructured<DIMENSION>::template ExecutionTypes<DeviceAdapter,
DIMENSION>::template ExecutionTypes<DeviceAdapter, FromTopology, ToTopology>::ExecObjectType VisitTopology,
CellSetStructured<DIMENSION>::PrepareForInput(DeviceAdapter, FromTopology, ToTopology) const IncidentTopology>::ExecObjectType
CellSetStructured<DIMENSION>::PrepareForInput(DeviceAdapter,
VisitTopology,
IncidentTopology) const
{ {
using ConnectivityType = using ConnectivityType =
typename ExecutionTypes<DeviceAdapter, FromTopology, ToTopology>::ExecObjectType; typename ExecutionTypes<DeviceAdapter, VisitTopology, IncidentTopology>::ExecObjectType;
return ConnectivityType(this->Structure); return ConnectivityType(this->Structure);
} }

@ -15,7 +15,7 @@
#include <vtkm/cont/TryExecute.h> #include <vtkm/cont/TryExecute.h>
#include <vtkm/cont/VirtualObjectHandle.h> #include <vtkm/cont/VirtualObjectHandle.h>
#include <vtkm/worklet/Invoker.h> #include <vtkm/cont/Invoker.h>
#include <vtkm/worklet/colorconversion/LookupTable.h> #include <vtkm/worklet/colorconversion/LookupTable.h>
#include <vtkm/worklet/colorconversion/Portals.h> #include <vtkm/worklet/colorconversion/Portals.h>
#include <vtkm/worklet/colorconversion/TransferFunction.h> #include <vtkm/worklet/colorconversion/TransferFunction.h>
@ -79,7 +79,7 @@ struct map_color_table
inline bool operator()(DeviceAdapter device, ColorTable&& colors, Args&&... args) const inline bool operator()(DeviceAdapter device, ColorTable&& colors, Args&&... args) const
{ {
vtkm::worklet::colorconversion::TransferFunction transfer(colors->PrepareForExecution(device)); vtkm::worklet::colorconversion::TransferFunction transfer(colors->PrepareForExecution(device));
vtkm::worklet::Invoker invoke(device); vtkm::cont::Invoker invoke(device);
invoke(transfer, std::forward<Args>(args)...); invoke(transfer, std::forward<Args>(args)...);
return true; return true;
} }
@ -97,7 +97,7 @@ bool ColorTable::Map(const vtkm::cont::ArrayHandle<T, S>& values,
return false; return false;
} }
vtkm::worklet::colorconversion::LookupTable lookupTable(samples); vtkm::worklet::colorconversion::LookupTable lookupTable(samples);
vtkm::worklet::Invoker invoke(vtkm::cont::DeviceAdapterTagAny{}); vtkm::cont::Invoker invoke(vtkm::cont::DeviceAdapterTagAny{});
invoke(lookupTable, values, samples.Samples, rgbaOut); invoke(lookupTable, values, samples.Samples, rgbaOut);
return true; return true;
} }
@ -112,7 +112,7 @@ bool ColorTable::Map(const vtkm::cont::ArrayHandle<T, S>& values,
return false; return false;
} }
vtkm::worklet::colorconversion::LookupTable lookupTable(samples); vtkm::worklet::colorconversion::LookupTable lookupTable(samples);
vtkm::worklet::Invoker invoke(vtkm::cont::DeviceAdapterTagAny{}); vtkm::cont::Invoker invoke(vtkm::cont::DeviceAdapterTagAny{});
invoke(lookupTable, values, samples.Samples, rgbOut); invoke(lookupTable, values, samples.Samples, rgbOut);
return true; return true;
} }

@ -7,8 +7,8 @@
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_worklet_Invoker_h #ifndef vtk_m_cont_Invoker_h
#define vtk_m_worklet_Invoker_h #define vtk_m_cont_Invoker_h
#include <vtkm/worklet/DispatcherMapField.h> #include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/DispatcherMapTopology.h> #include <vtkm/worklet/DispatcherMapTopology.h>
@ -19,7 +19,7 @@
namespace vtkm namespace vtkm
{ {
namespace worklet namespace cont
{ {
@ -56,15 +56,16 @@ struct Invoker
/// Optional second parameter is the scatter type associated with the worklet. /// Optional second parameter is the scatter type associated with the worklet.
/// Any additional parameters are the ControlSignature arguments for the worklet. /// Any additional parameters are the ControlSignature arguments for the worklet.
/// ///
template <typename Worklet, template <
typename Worklet,
typename T, typename T,
typename... Args, typename... Args,
typename std::enable_if< typename std::enable_if<std::is_base_of<worklet::internal::ScatterBase,
std::is_base_of<internal::ScatterBase, internal::detail::remove_cvref<T>>::value, worklet::internal::detail::remove_cvref<T>>::value,
int>::type* = nullptr> int>::type* = nullptr>
inline void operator()(Worklet&& worklet, T&& scatter, Args&&... args) const inline void operator()(Worklet&& worklet, T&& scatter, Args&&... args) const
{ {
using WorkletType = internal::detail::remove_cvref<Worklet>; using WorkletType = worklet::internal::detail::remove_cvref<Worklet>;
using DispatcherType = typename WorkletType::template Dispatcher<WorkletType>; using DispatcherType = typename WorkletType::template Dispatcher<WorkletType>;
DispatcherType dispatcher(worklet, scatter); DispatcherType dispatcher(worklet, scatter);
@ -76,15 +77,16 @@ struct Invoker
/// Optional second parameter is the scatter type associated with the worklet. /// Optional second parameter is the scatter type associated with the worklet.
/// Any additional parameters are the ControlSignature arguments for the worklet. /// Any additional parameters are the ControlSignature arguments for the worklet.
/// ///
template <typename Worklet, template <
typename Worklet,
typename T, typename T,
typename... Args, typename... Args,
typename std::enable_if< typename std::enable_if<!std::is_base_of<worklet::internal::ScatterBase,
!std::is_base_of<internal::ScatterBase, internal::detail::remove_cvref<T>>::value, worklet::internal::detail::remove_cvref<T>>::value,
int>::type* = nullptr> int>::type* = nullptr>
inline void operator()(Worklet&& worklet, T&& t, Args&&... args) const inline void operator()(Worklet&& worklet, T&& t, Args&&... args) const
{ {
using WorkletType = internal::detail::remove_cvref<Worklet>; using WorkletType = worklet::internal::detail::remove_cvref<Worklet>;
using DispatcherType = typename WorkletType::template Dispatcher<WorkletType>; using DispatcherType = typename WorkletType::template Dispatcher<WorkletType>;
DispatcherType dispatcher(worklet); DispatcherType dispatcher(worklet);

@ -191,6 +191,18 @@
/// \param deviceId The device tag / id for the device on which the functor /// \param deviceId The device tag / id for the device on which the functor
/// failed. /// failed.
/// \def VTKM_DEFINE_USER_LOG_LEVEL(name, offset)
/// \brief Convenience macro for creating a custom log level that is usable
/// in the other macros. If logging is disabled this macro does nothing.
/// \param name The name to give the new log level
/// \param offset The offset from the vtkm::cont::LogLevel::UserFirst value
/// from the LogLevel enum. Additionally moduloed against the
/// vtkm::cont::LogLevel::UserLast value
/// \note This macro is to be used for quickly setting log levels. For a
/// more maintainable solution it is recommended to create a custom enum class
/// and then cast appropriately, as described here:
/// https://gitlab.kitware.com/vtk/vtk-m/issues/358#note_550157
#if defined(VTKM_ENABLE_LOGGING) #if defined(VTKM_ENABLE_LOGGING)
#define VTKM_LOG_S(level, ...) VLOG_S(static_cast<loguru::Verbosity>(level)) << __VA_ARGS__ #define VTKM_LOG_S(level, ...) VLOG_S(static_cast<loguru::Verbosity>(level)) << __VA_ARGS__
@ -237,6 +249,14 @@
VTKM_LOG_S(vtkm::cont::LogLevel::Error, "Failing device: " << deviceId.GetName()); \ VTKM_LOG_S(vtkm::cont::LogLevel::Error, "Failing device: " << deviceId.GetName()); \
VTKM_LOG_S(vtkm::cont::LogLevel::Error, "The failing device has been disabled.") VTKM_LOG_S(vtkm::cont::LogLevel::Error, "The failing device has been disabled.")
// Custom log level
#define VTKM_DEFINE_USER_LOG_LEVEL(name, offset) \
static constexpr vtkm::cont::LogLevel name = static_cast<vtkm::cont::LogLevel>( \
static_cast<typename std::underlying_type<vtkm::cont::LogLevel>::type>( \
vtkm::cont::LogLevel::UserFirst) + \
offset % static_cast<typename std::underlying_type<vtkm::cont::LogLevel>::type>( \
vtkm::cont::LogLevel::UserLast))
#else // VTKM_ENABLE_LOGGING #else // VTKM_ENABLE_LOGGING
#define VTKM_LOG_S(level, ...) #define VTKM_LOG_S(level, ...)
@ -248,6 +268,7 @@
#define VTKM_LOG_ERROR_CONTEXT(desc, data) #define VTKM_LOG_ERROR_CONTEXT(desc, data)
#define VTKM_LOG_CAST_SUCC(inObj, outObj) #define VTKM_LOG_CAST_SUCC(inObj, outObj)
#define VTKM_LOG_CAST_FAIL(inObj, outType) #define VTKM_LOG_CAST_FAIL(inObj, outType)
#define VTKM_DEFINE_USER_LOG_LEVEL(name, offset)
// Always emitted. When logging is disabled, std::cerr is used. // Always emitted. When logging is disabled, std::cerr is used.

@ -28,26 +28,29 @@ namespace arg
/// \c TransportTagCellSetIn is a tag used with the \c Transport class to /// \c TransportTagCellSetIn is a tag used with the \c Transport class to
/// transport topology objects for input data. /// transport topology objects for input data.
/// ///
template <typename FromTopology, typename ToTopology> template <typename VisitTopology, typename IncidentTopology>
struct TransportTagCellSetIn struct TransportTagCellSetIn
{ {
}; };
template <typename FromTopology, typename ToTopology, typename ContObjectType, typename Device> template <typename VisitTopology,
struct Transport<vtkm::cont::arg::TransportTagCellSetIn<FromTopology, ToTopology>, typename IncidentTopology,
typename ContObjectType,
typename Device>
struct Transport<vtkm::cont::arg::TransportTagCellSetIn<VisitTopology, IncidentTopology>,
ContObjectType, ContObjectType,
Device> Device>
{ {
VTKM_IS_CELL_SET(ContObjectType); VTKM_IS_CELL_SET(ContObjectType);
using ExecObjectType = decltype( using ExecObjectType = decltype(
std::declval<ContObjectType>().PrepareForInput(Device(), FromTopology(), ToTopology())); std::declval<ContObjectType>().PrepareForInput(Device(), VisitTopology(), IncidentTopology()));
template <typename InputDomainType> template <typename InputDomainType>
VTKM_CONT ExecObjectType VTKM_CONT ExecObjectType
operator()(const ContObjectType& object, const InputDomainType&, vtkm::Id, vtkm::Id) const operator()(const ContObjectType& object, const InputDomainType&, vtkm::Id, vtkm::Id) const
{ {
return object.PrepareForInput(Device(), FromTopology(), ToTopology()); return object.PrepareForInput(Device(), VisitTopology(), IncidentTopology());
} }
}; };
} }

@ -59,15 +59,14 @@ void TransportWholeCellSetIn(Device)
contObject.AddCell(vtkm::CELL_SHAPE_QUAD, 4, vtkm::make_Vec<vtkm::Id>(2, 1, 3, 4)); contObject.AddCell(vtkm::CELL_SHAPE_QUAD, 4, vtkm::make_Vec<vtkm::Id>(2, 1, 3, 4));
contObject.CompleteAddingCells(nVerts); contObject.CompleteAddingCells(nVerts);
using FromType = vtkm::TopologyElementTagPoint; using IncidentTopology = vtkm::TopologyElementTagPoint;
using ToType = vtkm::TopologyElementTagCell; using VisitTopology = vtkm::TopologyElementTagCell;
using ExecObjectType = using ExecObjectType = typename vtkm::cont::CellSetExplicit<>::
typename vtkm::cont::CellSetExplicit<>::template ExecutionTypes<Device, template ExecutionTypes<Device, VisitTopology, IncidentTopology>::ExecObjectType;
FromType,
ToType>::ExecObjectType;
vtkm::cont::arg::Transport<vtkm::cont::arg::TransportTagCellSetIn<FromType, ToType>, vtkm::cont::arg::Transport<
vtkm::cont::arg::TransportTagCellSetIn<VisitTopology, IncidentTopology>,
vtkm::cont::CellSetExplicit<>, vtkm::cont::CellSetExplicit<>,
Device> Device>
transport; transport;

@ -320,7 +320,11 @@ private:
vtkm::Int32 rVal = this->LocalPopCount; vtkm::Int32 rVal = this->LocalPopCount;
for (int delta = 1; delta < activeSize; delta *= 2) for (int delta = 1; delta < activeSize; delta *= 2)
{ {
rVal += activeLanes.shfl_down(rVal, delta); const vtkm::Int32 shflVal = activeLanes.shfl_down(rVal, delta);
if (activeRank + delta < activeSize)
{
rVal += shflVal;
}
} }
if (activeRank == 0) if (activeRank == 0)
@ -511,7 +515,11 @@ private:
vtkm::Int32 rVal = this->LocalPopCount; vtkm::Int32 rVal = this->LocalPopCount;
for (int delta = 1; delta < activeSize; delta *= 2) for (int delta = 1; delta < activeSize; delta *= 2)
{ {
rVal += activeLanes.shfl_down(rVal, delta); const vtkm::Int32 shflVal = activeLanes.shfl_down(rVal, delta);
if (activeRank + delta < activeSize)
{
rVal += shflVal;
}
} }
if (activeRank == 0) if (activeRank == 0)

@ -225,9 +225,9 @@ struct ConnIdxToCellIdCalcSingleType
vtkm::Id operator()(vtkm::Id inIdx) const { return inIdx / this->CellSize; } vtkm::Id operator()(vtkm::Id inIdx) const { return inIdx / this->CellSize; }
}; };
template <typename PointToCell, typename CellToPoint, typename Device> template <typename VisitCellsWithPoints, typename VisitPointsWithCells, typename Device>
void ComputeCellToPointConnectivity(CellToPoint& cell2Point, void ComputeVisitPointsWithCellsConnectivity(VisitPointsWithCells& cell2Point,
const PointToCell& point2Cell, const VisitCellsWithPoints& point2Cell,
vtkm::Id numberOfPoints, vtkm::Id numberOfPoints,
Device) Device)
{ {
@ -258,7 +258,7 @@ void ComputeCellToPointConnectivity(CellToPoint& cell2Point,
rConnSize, rConnSize,
Device()); Device());
// Set the CellToPoint information // Set the VisitPointsWithCells information
cell2Point.Shapes = vtkm::cont::make_ArrayHandleConstant( cell2Point.Shapes = vtkm::cont::make_ArrayHandleConstant(
static_cast<vtkm::UInt8>(CELL_SHAPE_VERTEX), numberOfPoints); static_cast<vtkm::UInt8>(CELL_SHAPE_VERTEX), numberOfPoints);
cell2Point.ElementsValid = true; cell2Point.ElementsValid = true;
@ -269,10 +269,10 @@ void ComputeCellToPointConnectivity(CellToPoint& cell2Point,
template <typename ShapeStorageTag, template <typename ShapeStorageTag,
typename ConnectivityStorageTag, typename ConnectivityStorageTag,
typename IndexOffsetStorageTag, typename IndexOffsetStorageTag,
typename CellToPoint, typename VisitPointsWithCells,
typename Device> typename Device>
void ComputeCellToPointConnectivity( void ComputeVisitPointsWithCellsConnectivity(
CellToPoint& cell2Point, VisitPointsWithCells& cell2Point,
const ConnectivityExplicitInternals< const ConnectivityExplicitInternals<
ShapeStorageTag, ShapeStorageTag,
vtkm::cont::ArrayHandleConstant<vtkm::IdComponent>::StorageTag, // nIndices vtkm::cont::ArrayHandleConstant<vtkm::IdComponent>::StorageTag, // nIndices
@ -309,7 +309,7 @@ void ComputeCellToPointConnectivity(
rConnSize, rConnSize,
Device()); Device());
// Set the CellToPoint information // Set the VisitPointsWithCells information
cell2Point.Shapes = vtkm::cont::make_ArrayHandleConstant( cell2Point.Shapes = vtkm::cont::make_ArrayHandleConstant(
static_cast<vtkm::UInt8>(CELL_SHAPE_VERTEX), numberOfPoints); static_cast<vtkm::UInt8>(CELL_SHAPE_VERTEX), numberOfPoints);
cell2Point.ElementsValid = true; cell2Point.ElementsValid = true;

@ -18,6 +18,8 @@
#include <vtkm/cont/DataSetBuilderUniform.h> #include <vtkm/cont/DataSetBuilderUniform.h>
#include <vtkm/cont/DataSetFieldAdd.h> #include <vtkm/cont/DataSetFieldAdd.h>
#include <vtkm/cont/testing/Testing.h>
#include <numeric> #include <numeric>
namespace vtkm namespace vtkm
@ -1551,9 +1553,19 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DExplicitDataSetCowNose()
std::vector<vtkm::Float32> cellvar(connectivitySize / 3); std::vector<vtkm::Float32> cellvar(connectivitySize / 3);
std::iota(cellvar.begin(), cellvar.end(), 132.f); std::iota(cellvar.begin(), cellvar.end(), 132.f);
vtkm::cont::ArrayHandle<vtkm::Vec3f> pointvec;
pointvec.Allocate(nVerts);
SetPortal(pointvec.GetPortalControl());
vtkm::cont::ArrayHandle<vtkm::Vec3f> cellvec;
cellvec.Allocate(connectivitySize / 3);
SetPortal(cellvec.GetPortalControl());
vtkm::cont::DataSetFieldAdd dsf; vtkm::cont::DataSetFieldAdd dsf;
dsf.AddPointField(dataSet, "pointvar", pointvar); dsf.AddPointField(dataSet, "pointvar", pointvar);
dsf.AddCellField(dataSet, "cellvar", cellvar, "cells"); dsf.AddCellField(dataSet, "cellvar", cellvar, "cells");
dsf.AddPointField(dataSet, "point_vectors", pointvec);
dsf.AddCellField(dataSet, "cell_vectors", cellvec, "cells");
return dataSet; return dataSet;
} }

@ -235,8 +235,8 @@ struct TestEqualCellSet
const vtkm::cont::CellSetExplicit<ShapeST, CountST, ConnectivityST, OffsetST>& cs2, const vtkm::cont::CellSetExplicit<ShapeST, CountST, ConnectivityST, OffsetST>& cs2,
TestEqualResult& result) const TestEqualResult& result) const
{ {
vtkm::TopologyElementTagPoint p2cFrom{}; vtkm::TopologyElementTagCell visitTopo{};
vtkm::TopologyElementTagCell p2cTo{}; vtkm::TopologyElementTagPoint incidentTopo{};
if (cs1.GetName() != cs2.GetName()) if (cs1.GetName() != cs2.GetName())
{ {
@ -249,30 +249,30 @@ struct TestEqualCellSet
return; return;
} }
result = test_equal_ArrayHandles(cs1.GetShapesArray(p2cFrom, p2cTo), result = test_equal_ArrayHandles(cs1.GetShapesArray(visitTopo, incidentTopo),
cs2.GetShapesArray(p2cFrom, p2cTo)); cs2.GetShapesArray(visitTopo, incidentTopo));
if (!result) if (!result)
{ {
result.PushMessage("shapes arrays don't match"); result.PushMessage("shapes arrays don't match");
return; return;
} }
result = test_equal_ArrayHandles(cs1.GetNumIndicesArray(p2cFrom, p2cTo), result = test_equal_ArrayHandles(cs1.GetNumIndicesArray(visitTopo, incidentTopo),
cs2.GetNumIndicesArray(p2cFrom, p2cTo)); cs2.GetNumIndicesArray(visitTopo, incidentTopo));
if (!result) if (!result)
{ {
result.PushMessage("counts arrays don't match"); result.PushMessage("counts arrays don't match");
return; return;
} }
result = test_equal_ArrayHandles(cs1.GetConnectivityArray(p2cFrom, p2cTo), result = test_equal_ArrayHandles(cs1.GetConnectivityArray(visitTopo, incidentTopo),
cs2.GetConnectivityArray(p2cFrom, p2cTo)); cs2.GetConnectivityArray(visitTopo, incidentTopo));
if (!result) if (!result)
{ {
result.PushMessage("connectivity arrays don't match"); result.PushMessage("connectivity arrays don't match");
return; return;
} }
result = test_equal_ArrayHandles(cs1.GetIndexOffsetArray(p2cFrom, p2cTo), result = test_equal_ArrayHandles(cs1.GetIndexOffsetArray(visitTopo, incidentTopo),
cs2.GetIndexOffsetArray(p2cFrom, p2cTo)); cs2.GetIndexOffsetArray(visitTopo, incidentTopo));
if (!result) if (!result)
{ {
result.PushMessage("offsets arrays don't match"); result.PushMessage("offsets arrays don't match");

@ -14,14 +14,13 @@
#include <vtkm/cont/ArrayHandleCounting.h> #include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/BitField.h> #include <vtkm/cont/BitField.h>
#include <vtkm/cont/DeviceAdapterAlgorithm.h> #include <vtkm/cont/DeviceAdapterAlgorithm.h>
#include <vtkm/cont/Invoker.h>
#include <vtkm/cont/RuntimeDeviceTracker.h> #include <vtkm/cont/RuntimeDeviceTracker.h>
#include <vtkm/cont/testing/Testing.h> #include <vtkm/cont/testing/Testing.h>
#include <vtkm/exec/FunctorBase.h> #include <vtkm/exec/FunctorBase.h>
#include <vtkm/worklet/Invoker.h>
#include <cstdio> #include <cstdio>
#define DEVICE_ASSERT_MSG(cond, message) \ #define DEVICE_ASSERT_MSG(cond, message) \
@ -599,7 +598,7 @@ struct TestingBitField
auto falseArray = vtkm::cont::make_ArrayHandleCounting<vtkm::Id>(13, 2, NUM_BITS); auto falseArray = vtkm::cont::make_ArrayHandleCounting<vtkm::Id>(13, 2, NUM_BITS);
vtkm::cont::ArrayHandle<vtkm::Id> output; vtkm::cont::ArrayHandle<vtkm::Id> output;
vtkm::worklet::Invoker invoke; vtkm::cont::Invoker invoke;
invoke(ConditionalMergeWorklet{}, condArray, trueArray, falseArray, output); invoke(ConditionalMergeWorklet{}, condArray, trueArray, falseArray, output);
auto condVals = condArray.GetPortalConstControl(); auto condVals = condArray.GetPortalConstControl();
@ -625,7 +624,7 @@ struct TestingBitField
auto falseArray = vtkm::cont::make_ArrayHandleCounting<vtkm::Id>(13, 2, NUM_BITS); auto falseArray = vtkm::cont::make_ArrayHandleCounting<vtkm::Id>(13, 2, NUM_BITS);
vtkm::cont::ArrayHandle<vtkm::Id> output; vtkm::cont::ArrayHandle<vtkm::Id> output;
vtkm::worklet::Invoker invoke; vtkm::cont::Invoker invoke;
invoke(ConditionalMergeWorklet2{}, condBits, trueArray, falseArray, output); invoke(ConditionalMergeWorklet2{}, condBits, trueArray, falseArray, output);
auto condVals = condBits.GetPortalConstControl(); auto condVals = condBits.GetPortalConstControl();
@ -672,4 +671,4 @@ public:
} }
} // namespace vtkm::cont::testing } // namespace vtkm::cont::testing
#endif //vtk_m_cont_testing_TestingArrayHandles_h #endif // vtk_m_cont_testing_TestingBitFields_h

@ -37,7 +37,7 @@ using PointType = vtkm::Vec3f;
std::default_random_engine RandomGenerator; std::default_random_engine RandomGenerator;
class ParametricToWorldCoordinates : public vtkm::worklet::WorkletMapPointToCell class ParametricToWorldCoordinates : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, using ControlSignature = void(CellSetIn cellset,

@ -103,11 +103,11 @@ private:
vtkm::Id correctConnectivity[] = { 0, 0, 1, 0, 1, 1, 1 }; vtkm::Id correctConnectivity[] = { 0, 0, 1, 0, 1, 1, 1 };
vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapes = vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapes =
cellset.GetShapesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetShapesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
vtkm::cont::ArrayHandle<vtkm::IdComponent> numIndices = vtkm::cont::ArrayHandle<vtkm::IdComponent> numIndices =
cellset.GetNumIndicesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetNumIndicesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
vtkm::cont::ArrayHandle<vtkm::Id> conn = vtkm::cont::ArrayHandle<vtkm::Id> conn =
cellset.GetConnectivityArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetConnectivityArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
VTKM_TEST_ASSERT(TestArrayHandle(shapes, correctShapes, numPoints), "Got incorrect shapes"); VTKM_TEST_ASSERT(TestArrayHandle(shapes, correctShapes, numPoints), "Got incorrect shapes");
VTKM_TEST_ASSERT(TestArrayHandle(numIndices, correctNumIndices, numPoints), VTKM_TEST_ASSERT(TestArrayHandle(numIndices, correctNumIndices, numPoints),

@ -104,11 +104,11 @@ private:
//verify that the point to cell connectivity types are correct //verify that the point to cell connectivity types are correct
vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapesPointToCell = vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapesPointToCell =
cellset.GetShapesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell()); cellset.GetShapesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint());
vtkm::cont::ArrayHandleConstant<vtkm::IdComponent> numIndicesPointToCell = vtkm::cont::ArrayHandleConstant<vtkm::IdComponent> numIndicesPointToCell =
cellset.GetNumIndicesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell()); cellset.GetNumIndicesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint());
vtkm::cont::ArrayHandle<vtkm::Id> connPointToCell = vtkm::cont::ArrayHandle<vtkm::Id> connPointToCell =
cellset.GetConnectivityArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell()); cellset.GetConnectivityArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint());
VTKM_TEST_ASSERT(shapesPointToCell.GetNumberOfValues() == 3, "Wrong number of shapes"); VTKM_TEST_ASSERT(shapesPointToCell.GetNumberOfValues() == 3, "Wrong number of shapes");
VTKM_TEST_ASSERT(numIndicesPointToCell.GetNumberOfValues() == 3, "Wrong number of indices"); VTKM_TEST_ASSERT(numIndicesPointToCell.GetNumberOfValues() == 3, "Wrong number of indices");
@ -117,11 +117,11 @@ private:
//verify that the cell to point connectivity types are correct //verify that the cell to point connectivity types are correct
//note the handle storage types differ compared to point to cell //note the handle storage types differ compared to point to cell
vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapesCellToPoint = vtkm::cont::ArrayHandleConstant<vtkm::UInt8> shapesCellToPoint =
cellset.GetShapesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetShapesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
vtkm::cont::ArrayHandle<vtkm::IdComponent> numIndicesCellToPoint = vtkm::cont::ArrayHandle<vtkm::IdComponent> numIndicesCellToPoint =
cellset.GetNumIndicesArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetNumIndicesArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
vtkm::cont::ArrayHandle<vtkm::Id> connCellToPoint = vtkm::cont::ArrayHandle<vtkm::Id> connCellToPoint =
cellset.GetConnectivityArray(vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint()); cellset.GetConnectivityArray(vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell());
VTKM_TEST_ASSERT(shapesCellToPoint.GetNumberOfValues() == 5, "Wrong number of shapes"); VTKM_TEST_ASSERT(shapesCellToPoint.GetNumberOfValues() == 5, "Wrong number of shapes");
VTKM_TEST_ASSERT(numIndicesCellToPoint.GetNumberOfValues() == 5, "Wrong number of indices"); VTKM_TEST_ASSERT(numIndicesCellToPoint.GetNumberOfValues() == 5, "Wrong number of indices");

@ -2483,6 +2483,17 @@ private:
testRandomMask(0xffffffff); testRandomMask(0xffffffff);
testRandomMask(0x1c0fd395); testRandomMask(0x1c0fd395);
testRandomMask(0xdeadbeef); testRandomMask(0xdeadbeef);
// This case was causing issues on CUDA:
{
BitField bits;
Algorithm::Fill(bits, false, 32 * 32);
auto portal = bits.GetPortalControl();
portal.SetWord(2, 0x00100000ul);
portal.SetWord(8, 0x00100010ul);
portal.SetWord(11, 0x10000000ul);
testIndexArray(bits);
}
} }
static VTKM_CONT void TestCountSetBits() static VTKM_CONT void TestCountSetBits()
@ -2562,6 +2573,17 @@ private:
testRandomMask(0xffffffff); testRandomMask(0xffffffff);
testRandomMask(0x1c0fd395); testRandomMask(0x1c0fd395);
testRandomMask(0xdeadbeef); testRandomMask(0xdeadbeef);
// This case was causing issues on CUDA:
{
BitField bits;
Algorithm::Fill(bits, false, 32 * 32);
auto portal = bits.GetPortalControl();
portal.SetWord(2, 0x00100000ul);
portal.SetWord(8, 0x00100010ul);
portal.SetWord(11, 0x10000000ul);
verifyPopCount(bits);
}
} }
template <typename WordType> template <typename WordType>

@ -37,8 +37,8 @@ namespace implicit_function_detail
class EvaluateImplicitFunction : public vtkm::worklet::WorkletMapField class EvaluateImplicitFunction : public vtkm::worklet::WorkletMapField
{ {
public: public:
using ControlSignature = void(FieldIn, FieldOut); using ControlSignature = void(FieldIn, FieldOut, FieldOut);
using ExecutionSignature = void(_1, _2); using ExecutionSignature = void(_1, _2, _3);
EvaluateImplicitFunction(const vtkm::ImplicitFunction* function) EvaluateImplicitFunction(const vtkm::ImplicitFunction* function)
: Function(function) : Function(function)
@ -46,9 +46,10 @@ public:
} }
template <typename VecType, typename ScalarType> template <typename VecType, typename ScalarType>
VTKM_EXEC void operator()(const VecType& point, ScalarType& val) const VTKM_EXEC void operator()(const VecType& point, ScalarType& val, VecType& gradient) const
{ {
val = this->Function->Value(point); val = this->Function->Value(point);
gradient = this->Function->Gradient(point);
} }
private: private:
@ -59,6 +60,7 @@ template <typename DeviceAdapter>
void EvaluateOnCoordinates(vtkm::cont::CoordinateSystem points, void EvaluateOnCoordinates(vtkm::cont::CoordinateSystem points,
const vtkm::cont::ImplicitFunctionHandle& function, const vtkm::cont::ImplicitFunctionHandle& function,
vtkm::cont::ArrayHandle<vtkm::FloatDefault>& values, vtkm::cont::ArrayHandle<vtkm::FloatDefault>& values,
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>>& gradients,
DeviceAdapter device) DeviceAdapter device)
{ {
using EvalDispatcher = vtkm::worklet::DispatcherMapField<EvaluateImplicitFunction>; using EvalDispatcher = vtkm::worklet::DispatcherMapField<EvaluateImplicitFunction>;
@ -66,12 +68,12 @@ void EvaluateOnCoordinates(vtkm::cont::CoordinateSystem points,
EvaluateImplicitFunction eval(function.PrepareForExecution(device)); EvaluateImplicitFunction eval(function.PrepareForExecution(device));
EvalDispatcher dispatcher(eval); EvalDispatcher dispatcher(eval);
dispatcher.SetDevice(DeviceAdapter()); dispatcher.SetDevice(DeviceAdapter());
dispatcher.Invoke(points, values); dispatcher.Invoke(points, values, gradients);
} }
template <std::size_t N> template <typename ItemType, std::size_t N>
bool TestArrayEqual(const vtkm::cont::ArrayHandle<vtkm::FloatDefault>& result, bool TestArrayEqual(const vtkm::cont::ArrayHandle<ItemType>& result,
const std::array<vtkm::FloatDefault, N>& expected) const std::array<ItemType, N>& expected)
{ {
bool success = false; bool success = false;
auto portal = result.GetPortalConstControl(); auto portal = result.GetPortalConstControl();
@ -103,6 +105,12 @@ bool TestArrayEqual(const vtkm::cont::ArrayHandle<vtkm::FloatDefault>& result,
std::cout << ", " << portal.Get(i); std::cout << ", " << portal.Get(i);
} }
std::cout << "\n"; std::cout << "\n";
std::cout << "expected: " << expected[0];
for (vtkm::Id i = 1; i < count; ++i)
{
std::cout << ", " << expected[static_cast<std::size_t>(i)];
}
std::cout << "\n";
} }
} }
@ -137,18 +145,32 @@ private:
<< vtkm::cont::DeviceAdapterTraits<DeviceAdapter>::GetName() << "\n"; << vtkm::cont::DeviceAdapterTraits<DeviceAdapter>::GetName() << "\n";
vtkm::cont::ArrayHandle<vtkm::FloatDefault> values; vtkm::cont::ArrayHandle<vtkm::FloatDefault> values;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> gradients;
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), this->Input.GetCoordinateSystem(0),
vtkm::cont::make_ImplicitFunctionHandle( vtkm::cont::make_ImplicitFunctionHandle(
vtkm::Box({ 0.0f, -0.5f, -0.5f }, { 1.5f, 1.5f, 0.5f })), vtkm::Box({ 0.0f, -0.5f, -0.5f }, { 1.5f, 1.5f, 0.5f })),
values, values,
gradients,
device); device);
std::array<vtkm::FloatDefault, 8> expected = { std::array<vtkm::FloatDefault, 8> expected = {
{ 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.5f } { 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.5f }
}; };
std::array<vtkm::Vec<vtkm::FloatDefault, 3>, 8> expectedGradients = {
{ { -1.0f, 0.0f, 0.0f },
{ 1.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f },
{ 0.0f, 0.0f, 1.0f },
{ -1.0f, 0.0f, 0.0f },
{ 1.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f },
{ 0.0f, 0.0f, 1.0f } }
};
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected), VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
} }
template <typename DeviceAdapter> template <typename DeviceAdapter>
@ -163,17 +185,31 @@ private:
cylinder.SetRadius(1.0f); cylinder.SetRadius(1.0f);
vtkm::cont::ArrayHandle<vtkm::FloatDefault> values; vtkm::cont::ArrayHandle<vtkm::FloatDefault> values;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> gradients;
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), this->Input.GetCoordinateSystem(0),
vtkm::cont::ImplicitFunctionHandle(&cylinder, false), vtkm::cont::ImplicitFunctionHandle(&cylinder, false),
values, values,
gradients,
device); device);
std::array<vtkm::FloatDefault, 8> expected = { std::array<vtkm::FloatDefault, 8> expected = {
{ 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f } { 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f }
}; };
std::array<vtkm::Vec<vtkm::FloatDefault, 3>, 8> expectedGradients = {
{ { 0.0f, 0.0f, -2.0f },
{ 2.0f, 0.0f, -2.0f },
{ 2.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, -2.0f },
{ 2.0f, 0.0f, -2.0f },
{ 2.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.0f } }
};
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected), VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
} }
template <typename DeviceAdapter> template <typename DeviceAdapter>
@ -196,17 +232,31 @@ private:
frustum.CreateFromPoints(points); frustum.CreateFromPoints(points);
vtkm::cont::ArrayHandle<vtkm::FloatDefault> values; vtkm::cont::ArrayHandle<vtkm::FloatDefault> values;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> gradients;
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), this->Input.GetCoordinateSystem(0),
vtkm::cont::make_ImplicitFunctionHandle(frustum), vtkm::cont::make_ImplicitFunctionHandle(frustum),
values, values,
gradients,
device); device);
std::array<vtkm::FloatDefault, 8> expected = { std::array<vtkm::FloatDefault, 8> expected = {
{ 0.0f, 0.0f, 0.0f, 0.0f, 0.316228f, 0.316228f, -0.316228f, 0.316228f } { 0.0f, 0.0f, 0.0f, 0.0f, 0.316228f, 0.316228f, -0.316228f, 0.316228f }
}; };
std::array<vtkm::Vec<vtkm::FloatDefault, 3>, 8> expectedGradients = {
{ { 0.0f, -1.0f, 0.0f },
{ 0.0f, -1.0f, 0.0f },
{ 0.0f, -1.0f, 0.0f },
{ 0.0f, -1.0f, 0.0f },
{ 0.0f, 0.316228f, -0.948683f },
{ 0.0f, 0.316228f, -0.948683f },
{ 0.948683f, -0.316228f, 0.0f },
{ -0.948683f, 0.316228f, 0.0f } }
};
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected), VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
} }
template <typename DeviceAdapter> template <typename DeviceAdapter>
@ -220,22 +270,43 @@ private:
auto plane = static_cast<vtkm::Plane*>(planeHandle.Get()); auto plane = static_cast<vtkm::Plane*>(planeHandle.Get());
vtkm::cont::ArrayHandle<vtkm::FloatDefault> values; vtkm::cont::ArrayHandle<vtkm::FloatDefault> values;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> gradients;
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), planeHandle, values, device); this->Input.GetCoordinateSystem(0), planeHandle, values, gradients, device);
std::array<vtkm::FloatDefault, 8> expected1 = { std::array<vtkm::FloatDefault, 8> expected = {
{ -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f } { -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f }
}; };
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected1), std::array<vtkm::Vec<vtkm::FloatDefault, 3>, 8> expectedGradients = {
{ { 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f } }
};
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
plane->SetNormal({ -1.0f, 0.0f, -1.0f }); plane->SetNormal({ -1.0f, 0.0f, -1.0f });
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), planeHandle, values, device); this->Input.GetCoordinateSystem(0), planeHandle, values, gradients, device);
std::array<vtkm::FloatDefault, 8> expected2 = { expected = { { 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f } };
{ 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f } expectedGradients = { { { -1.0f, 0.0f, -1.0f },
}; { -1.0f, 0.0f, -1.0f },
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected2), { -1.0f, 0.0f, -1.0f },
{ -1.0f, 0.0f, -1.0f },
{ -1.0f, 0.0f, -1.0f },
{ -1.0f, 0.0f, -1.0f },
{ -1.0f, 0.0f, -1.0f },
{ -1.0f, 0.0f, -1.0f } } };
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
} }
template <typename DeviceAdapter> template <typename DeviceAdapter>
@ -245,17 +316,31 @@ private:
<< vtkm::cont::DeviceAdapterTraits<DeviceAdapter>::GetName() << "\n"; << vtkm::cont::DeviceAdapterTraits<DeviceAdapter>::GetName() << "\n";
vtkm::cont::ArrayHandle<vtkm::FloatDefault> values; vtkm::cont::ArrayHandle<vtkm::FloatDefault> values;
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> gradients;
implicit_function_detail::EvaluateOnCoordinates( implicit_function_detail::EvaluateOnCoordinates(
this->Input.GetCoordinateSystem(0), this->Input.GetCoordinateSystem(0),
vtkm::cont::make_ImplicitFunctionHandle<vtkm::Sphere>(vtkm::make_Vec(0.0f, 0.0f, 0.0f), 1.0f), vtkm::cont::make_ImplicitFunctionHandle<vtkm::Sphere>(vtkm::make_Vec(0.0f, 0.0f, 0.0f), 1.0f),
values, values,
gradients,
device); device);
std::array<vtkm::FloatDefault, 8> expected = { std::array<vtkm::FloatDefault, 8> expected = {
{ -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 1.0f } { -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 1.0f }
}; };
std::array<vtkm::Vec<vtkm::FloatDefault, 3>, 8> expectedGradients = {
{ { 0.0f, 0.0f, 0.0f },
{ 2.0f, 0.0f, 0.0f },
{ 2.0f, 0.0f, 2.0f },
{ 0.0f, 0.0f, 2.0f },
{ 0.0f, 2.0f, 0.0f },
{ 2.0f, 2.0f, 0.0f },
{ 2.0f, 2.0f, 2.0f },
{ 0.0f, 2.0f, 2.0f } }
};
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected), VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(values, expected),
"Result does not match expected values"); "Result does not match expected values");
VTKM_TEST_ASSERT(implicit_function_detail::TestArrayEqual(gradients, expectedGradients),
"Result does not match expected gradients values");
} }
vtkm::cont::DataSet Input; vtkm::cont::DataSet Input;

@ -82,7 +82,7 @@ vtkm::cont::DataSet MakeTestDataSetCurvilinear()
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class ParametricToWorldCoordinates : public vtkm::worklet::WorkletMapPointToCell class ParametricToWorldCoordinates : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
public: public:
using ControlSignature = void(CellSetIn cellset, using ControlSignature = void(CellSetIn cellset,

@ -65,7 +65,7 @@ vtkm::cont::CellSetExplicit<> MakeTestCellSet2()
return cs; return cs;
} }
struct WorkletPointToCell : public vtkm::worklet::WorkletMapPointToCell struct WorkletPointToCell : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutCell numPoints); using ControlSignature = void(CellSetIn cellset, FieldOutCell numPoints);
using ExecutionSignature = void(PointIndices, _2); using ExecutionSignature = void(PointIndices, _2);
@ -78,7 +78,7 @@ struct WorkletPointToCell : public vtkm::worklet::WorkletMapPointToCell
} }
}; };
struct WorkletCellToPoint : public vtkm::worklet::WorkletMapCellToPoint struct WorkletCellToPoint : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutPoint numCells); using ControlSignature = void(CellSetIn cellset, FieldOutPoint numCells);
using ExecutionSignature = void(CellIndices, _2); using ExecutionSignature = void(CellIndices, _2);
@ -159,24 +159,24 @@ void TestCellSetExplicit()
std::cout << "\tTesting CellToPoint table caching\n"; std::cout << "\tTesting CellToPoint table caching\n";
cellset = MakeTestCellSet2(); cellset = MakeTestCellSet2();
VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(PointTag{}, CellTag{})), VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(CellTag{}, PointTag{})),
"PointToCell table missing."); "PointToCell table missing.");
VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(!cellset.HasConnectivity(CellTag{}, PointTag{})), VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(!cellset.HasConnectivity(PointTag{}, CellTag{})),
"CellToPoint table exists before PrepareForInput."); "CellToPoint table exists before PrepareForInput.");
// Test a raw PrepareForInput call: // Test a raw PrepareForInput call:
cellset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial{}, CellTag{}, PointTag{}); cellset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial{}, PointTag{}, CellTag{});
VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(CellTag{}, PointTag{})), VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(PointTag{}, CellTag{})),
"CellToPoint table missing after PrepareForInput."); "CellToPoint table missing after PrepareForInput.");
cellset.ResetConnectivity(CellTag{}, PointTag{}); cellset.ResetConnectivity(PointTag{}, CellTag{});
VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(!cellset.HasConnectivity(CellTag{}, PointTag{})), VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(!cellset.HasConnectivity(PointTag{}, CellTag{})),
"CellToPoint table exists after resetting."); "CellToPoint table exists after resetting.");
// Test a PrepareForInput wrapped inside a dispatch (See #268) // Test a PrepareForInput wrapped inside a dispatch (See #268)
vtkm::worklet::DispatcherMapTopology<WorkletCellToPoint>().Invoke(cellset, result); vtkm::worklet::DispatcherMapTopology<WorkletCellToPoint>().Invoke(cellset, result);
VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(CellTag{}, PointTag{})), VTKM_TEST_ASSERT(VTKM_PASS_COMMAS(cellset.HasConnectivity(PointTag{}, CellTag{})),
"CellToPoint table missing after CellToPoint worklet exec."); "CellToPoint table missing after CellToPoint worklet exec.");
} }

@ -25,7 +25,7 @@ std::vector<int> topology = { 0, 2, 1 };
std::vector<int> nextNode = { 0, 1, 2 }; std::vector<int> nextNode = { 0, 1, 2 };
struct CopyTopo : public vtkm::worklet::WorkletMapPointToCell struct CopyTopo : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
typedef void ControlSignature(CellSetIn, FieldOutCell); typedef void ControlSignature(CellSetIn, FieldOutCell);
typedef _2 ExecutionSignature(CellShape, PointIndices); typedef _2 ExecutionSignature(CellShape, PointIndices);
@ -36,7 +36,7 @@ struct CopyTopo : public vtkm::worklet::WorkletMapPointToCell
} }
}; };
struct CopyReverseCellCount : public vtkm::worklet::WorkletMapCellToPoint struct CopyReverseCellCount : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
typedef void ControlSignature(CellSetIn, FieldOutPoint); typedef void ControlSignature(CellSetIn, FieldOutPoint);
typedef _2 ExecutionSignature(CellShape, CellCount, CellIndices); typedef _2 ExecutionSignature(CellShape, CellCount, CellIndices);

@ -20,7 +20,7 @@
namespace namespace
{ {
struct WorkletPointToCell : public vtkm::worklet::WorkletMapPointToCell struct WorkletPointToCell : public vtkm::worklet::WorkletVisitCellsWithPoints
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutCell numPoints); using ControlSignature = void(CellSetIn cellset, FieldOutCell numPoints);
using ExecutionSignature = void(PointIndices, _2); using ExecutionSignature = void(PointIndices, _2);
@ -33,7 +33,7 @@ struct WorkletPointToCell : public vtkm::worklet::WorkletMapPointToCell
} }
}; };
struct WorkletCellToPoint : public vtkm::worklet::WorkletMapCellToPoint struct WorkletCellToPoint : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
using ControlSignature = void(CellSetIn cellset, FieldOutPoint numCells); using ControlSignature = void(CellSetIn cellset, FieldOutPoint numCells);
using ExecutionSignature = void(CellIndices, _2); using ExecutionSignature = void(CellIndices, _2);
@ -46,7 +46,7 @@ struct WorkletCellToPoint : public vtkm::worklet::WorkletMapCellToPoint
} }
}; };
struct CellsOfPoint : public vtkm::worklet::WorkletMapCellToPoint struct CellsOfPoint : public vtkm::worklet::WorkletVisitPointsWithCells
{ {
using ControlSignature = void(CellSetIn cellset, FieldInPoint offset, WholeArrayOut cellIds); using ControlSignature = void(CellSetIn cellset, FieldInPoint offset, WholeArrayOut cellIds);
using ExecutionSignature = void(CellIndices, _2, _3); using ExecutionSignature = void(CellIndices, _2, _3);

@ -105,13 +105,13 @@ void TestDataSet_Explicit()
subset.PrintSummary(std::cout); subset.PrintSummary(std::cout);
using ExecObjectType = SubsetType::ExecutionTypes<vtkm::cont::DeviceAdapterTagSerial, using ExecObjectType = SubsetType::ExecutionTypes<vtkm::cont::DeviceAdapterTagSerial,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell>::ExecObjectType; vtkm::TopologyElementTagPoint>::ExecObjectType;
ExecObjectType execConnectivity; ExecObjectType execConnectivity;
execConnectivity = subset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), execConnectivity = subset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagCell()); vtkm::TopologyElementTagPoint());
//run a basic for-each topology algorithm on this //run a basic for-each topology algorithm on this
vtkm::cont::ArrayHandle<vtkm::Float32> result; vtkm::cont::ArrayHandle<vtkm::Float32> result;
@ -154,7 +154,7 @@ void TestDataSet_Structured2D()
//verify that PrepareForInput exists //verify that PrepareForInput exists
subset.PrepareForInput( subset.PrepareForInput(
DeviceAdapterTag(), vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell()); DeviceAdapterTag(), vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint());
//run a basic for-each topology algorithm on this //run a basic for-each topology algorithm on this
vtkm::cont::ArrayHandle<vtkm::Float32> result; vtkm::cont::ArrayHandle<vtkm::Float32> result;
@ -193,8 +193,8 @@ void TestDataSet_Structured3D()
//verify that PrepareForInput exists //verify that PrepareForInput exists
subset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), subset.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagCell()); vtkm::TopologyElementTagPoint());
//run a basic for-each topology algorithm on this //run a basic for-each topology algorithm on this
vtkm::cont::ArrayHandle<vtkm::Float32> result; vtkm::cont::ArrayHandle<vtkm::Float32> result;

@ -77,14 +77,14 @@ static void TwoDimRectilinearTest()
VTKM_TEST_ASSERT(shape == vtkm::CELL_SHAPE_QUAD, "Incorrect element type."); VTKM_TEST_ASSERT(shape == vtkm::CELL_SHAPE_QUAD, "Incorrect element type.");
} }
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 2>
pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagCell());
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 2> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 2>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagPoint()); vtkm::TopologyElementTagPoint());
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 2>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagCell());
vtkm::Id cells[2][4] = { { 0, 1, 4, 3 }, { 1, 2, 5, 4 } }; vtkm::Id cells[2][4] = { { 0, 1, 4, 3 }, { 1, 2, 5, 4 } };
for (vtkm::Id cellIndex = 0; cellIndex < 2; cellIndex++) for (vtkm::Id cellIndex = 0; cellIndex < 2; cellIndex++)
@ -164,10 +164,10 @@ static void ThreeDimRectilinearTest()
} }
//Test regular connectivity. //Test regular connectivity.
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 3> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 3>
pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagCell()); vtkm::TopologyElementTagPoint());
vtkm::Id expectedPointIds[8] = { 0, 1, 4, 3, 6, 7, 10, 9 }; vtkm::Id expectedPointIds[8] = { 0, 1, 4, 3, 6, 7, 10, 9 };
vtkm::Vec<vtkm::Id, 8> retrievedPointIds = pointToCell.GetIndices(vtkm::Id3(0)); vtkm::Vec<vtkm::Id, 8> retrievedPointIds = pointToCell.GetIndices(vtkm::Id3(0));
for (vtkm::IdComponent localPointIndex = 0; localPointIndex < 8; localPointIndex++) for (vtkm::IdComponent localPointIndex = 0; localPointIndex < 8; localPointIndex++)
@ -176,10 +176,10 @@ static void ThreeDimRectilinearTest()
"Incorrect point ID for cell"); "Incorrect point ID for cell");
} }
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 3> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 3>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagPoint()); vtkm::TopologyElementTagCell());
vtkm::Id retrievedCellIds[6] = { 0, -1, -1, -1, -1, -1 }; vtkm::Id retrievedCellIds[6] = { 0, -1, -1, -1, -1, -1 };
vtkm::VecVariable<vtkm::Id, 6> expectedCellIds = cellToPoint.GetIndices(vtkm::Id3(0)); vtkm::VecVariable<vtkm::Id, 6> expectedCellIds = cellToPoint.GetIndices(vtkm::Id3(0));
VTKM_TEST_ASSERT(expectedCellIds.GetNumberOfComponents() <= 6, VTKM_TEST_ASSERT(expectedCellIds.GetNumberOfComponents() <= 6,

@ -80,14 +80,14 @@ static void TwoDimUniformTest()
VTKM_TEST_ASSERT(shape == vtkm::CELL_SHAPE_QUAD, "Incorrect element type."); VTKM_TEST_ASSERT(shape == vtkm::CELL_SHAPE_QUAD, "Incorrect element type.");
} }
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 2>
pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagCell());
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 2> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 2>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagPoint()); vtkm::TopologyElementTagPoint());
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 2>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagCell());
vtkm::Id cells[2][4] = { { 0, 1, 4, 3 }, { 1, 2, 5, 4 } }; vtkm::Id cells[2][4] = { { 0, 1, 4, 3 }, { 1, 2, 5, 4 } };
for (vtkm::Id cellIndex = 0; cellIndex < 2; cellIndex++) for (vtkm::Id cellIndex = 0; cellIndex < 2; cellIndex++)
@ -174,10 +174,10 @@ static void ThreeDimUniformTest()
} }
//Test uniform connectivity. //Test uniform connectivity.
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 3> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 3>
pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), pointToCell = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagPoint(), vtkm::TopologyElementTagCell(),
vtkm::TopologyElementTagCell()); vtkm::TopologyElementTagPoint());
vtkm::Id expectedPointIds[8] = { 0, 1, 4, 3, 6, 7, 10, 9 }; vtkm::Id expectedPointIds[8] = { 0, 1, 4, 3, 6, 7, 10, 9 };
vtkm::Vec<vtkm::Id, 8> retrievedPointIds = pointToCell.GetIndices(vtkm::Id3(0)); vtkm::Vec<vtkm::Id, 8> retrievedPointIds = pointToCell.GetIndices(vtkm::Id3(0));
for (vtkm::IdComponent localPointIndex = 0; localPointIndex < 8; localPointIndex++) for (vtkm::IdComponent localPointIndex = 0; localPointIndex < 8; localPointIndex++)
@ -186,10 +186,10 @@ static void ThreeDimUniformTest()
"Incorrect point ID for cell"); "Incorrect point ID for cell");
} }
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 3> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 3>
cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(), cellToPoint = cellSet.PrepareForInput(vtkm::cont::DeviceAdapterTagSerial(),
vtkm::TopologyElementTagCell(), vtkm::TopologyElementTagPoint(),
vtkm::TopologyElementTagPoint()); vtkm::TopologyElementTagCell());
vtkm::Id retrievedCellIds[6] = { 0, -1, -1, -1, -1, -1 }; vtkm::Id retrievedCellIds[6] = { 0, -1, -1, -1, -1, -1 };
vtkm::VecVariable<vtkm::Id, 6> expectedCellIds = cellToPoint.GetIndices(vtkm::Id3(0)); vtkm::VecVariable<vtkm::Id, 6> expectedCellIds = cellToPoint.GetIndices(vtkm::Id3(0));
VTKM_TEST_ASSERT(expectedCellIds.GetNumberOfComponents() <= 6, VTKM_TEST_ASSERT(expectedCellIds.GetNumberOfComponents() <= 6,

@ -59,6 +59,25 @@ void ErrorContext()
std::cerr << vtkm::cont::GetLogErrorContext() << "\n"; std::cerr << vtkm::cont::GetLogErrorContext() << "\n";
} }
void UserDefined()
{
VTKM_DEFINE_USER_LOG_LEVEL(CustomLevel, 0);
VTKM_DEFINE_USER_LOG_LEVEL(CustomLevel2, 2);
VTKM_DEFINE_USER_LOG_LEVEL(AnotherCustomLevel2, 2);
VTKM_DEFINE_USER_LOG_LEVEL(BigLevel, 300);
vtkm::cont::SetStderrLogLevel(vtkm::cont::LogLevel::UserLast);
VTKM_LOG_S(CustomLevel, "CustomLevel");
VTKM_LOG_S(CustomLevel2, "CustomLevel2");
VTKM_LOG_S(AnotherCustomLevel2, "AnotherCustomLevel2");
vtkm::cont::SetStderrLogLevel(vtkm::cont::LogLevel::UserFirst);
VTKM_LOG_S(BigLevel, "BigLevel"); // should log nothing
vtkm::cont::SetStderrLogLevel(vtkm::cont::LogLevel::UserLast);
VTKM_LOG_S(BigLevel, "BigLevel");
}
void RunTests() void RunTests()
{ {
VTKM_LOG_F(vtkm::cont::LogLevel::Info, "Running tests."); VTKM_LOG_F(vtkm::cont::LogLevel::Info, "Running tests.");
@ -68,6 +87,9 @@ void RunTests()
VTKM_LOG_S(vtkm::cont::LogLevel::Info, "Running ErrorContext test..."); VTKM_LOG_S(vtkm::cont::LogLevel::Info, "Running ErrorContext test...");
ErrorContext(); ErrorContext();
VTKM_LOG_S(vtkm::cont::LogLevel::Info, "Running UserDefined test...");
UserDefined();
} }
} // end anon namespace } // end anon namespace

@ -15,7 +15,7 @@ using namespace vtkm::cont::testing::serialization;
namespace namespace
{ {
using FieldTypeList = vtkm::ListTagBase<vtkm::Float32>; using FieldTypeList = vtkm::ListTagBase<vtkm::Float32, vtkm::Vec3f>;
using CellSetTypes = vtkm::ListTagBase<vtkm::cont::CellSetExplicit<>, using CellSetTypes = vtkm::ListTagBase<vtkm::cont::CellSetExplicit<>,
vtkm::cont::CellSetSingleType<>, vtkm::cont::CellSetSingleType<>,
vtkm::cont::CellSetStructured<1>, vtkm::cont::CellSetStructured<1>,

@ -71,7 +71,7 @@ public:
DeviceAdapter) DeviceAdapter)
: Nodes(nodes.PrepareForInput(DeviceAdapter())) : Nodes(nodes.PrepareForInput(DeviceAdapter()))
, CellIds(cellIds.PrepareForInput(DeviceAdapter())) , CellIds(cellIds.PrepareForInput(DeviceAdapter()))
, CellSet(cellSet.PrepareForInput(DeviceAdapter(), FromType(), ToType())) , CellSet(cellSet.PrepareForInput(DeviceAdapter(), VisitType(), IncidentType()))
, Coords(coords.PrepareForInput(DeviceAdapter())) , Coords(coords.PrepareForInput(DeviceAdapter()))
{ {
} }
@ -243,13 +243,14 @@ private:
return success && vtkm::exec::CellInside(parametric, cellShape); return success && vtkm::exec::CellInside(parametric, cellShape);
} }
using FromType = vtkm::TopologyElementTagPoint; using VisitType = vtkm::TopologyElementTagCell;
using ToType = vtkm::TopologyElementTagCell; using IncidentType = vtkm::TopologyElementTagPoint;
using NodePortal = typename NodeArrayHandle::template ExecutionTypes<DeviceAdapter>::PortalConst; using NodePortal = typename NodeArrayHandle::template ExecutionTypes<DeviceAdapter>::PortalConst;
using CellIdPortal = using CellIdPortal =
typename CellIdArrayHandle::template ExecutionTypes<DeviceAdapter>::PortalConst; typename CellIdArrayHandle::template ExecutionTypes<DeviceAdapter>::PortalConst;
using CellSetPortal = using CellSetPortal = typename CellSetType::template ExecutionTypes<DeviceAdapter,
typename CellSetType::template ExecutionTypes<DeviceAdapter, FromType, ToType>::ExecObjectType; VisitType,
IncidentType>::ExecObjectType;
using CoordsPortal = typename vtkm::cont::ArrayHandleVirtualCoordinates::template ExecutionTypes< using CoordsPortal = typename vtkm::cont::ArrayHandleVirtualCoordinates::template ExecutionTypes<
DeviceAdapter>::PortalConst; DeviceAdapter>::PortalConst;

@ -32,11 +32,10 @@ template <typename DeviceAdapter, vtkm::IdComponent dimensions>
class VTKM_ALWAYS_EXPORT CellLocatorRectilinearGrid final : public vtkm::exec::CellLocator class VTKM_ALWAYS_EXPORT CellLocatorRectilinearGrid final : public vtkm::exec::CellLocator
{ {
private: private:
using FromType = vtkm::TopologyElementTagPoint; using VisitType = vtkm::TopologyElementTagCell;
using ToType = vtkm::TopologyElementTagCell; using IncidentType = vtkm::TopologyElementTagPoint;
using CellSetPortal = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, using CellSetPortal = vtkm::exec::ConnectivityStructured<VisitType, IncidentType, dimensions>;
vtkm::TopologyElementTagCell,
dimensions>;
using AxisHandle = vtkm::cont::ArrayHandle<vtkm::FloatDefault>; using AxisHandle = vtkm::cont::ArrayHandle<vtkm::FloatDefault>;
using RectilinearType = using RectilinearType =
vtkm::cont::ArrayHandleCartesianProduct<AxisHandle, AxisHandle, AxisHandle>; vtkm::cont::ArrayHandleCartesianProduct<AxisHandle, AxisHandle, AxisHandle>;
@ -53,24 +52,25 @@ public:
DeviceAdapter) DeviceAdapter)
: PlaneSize(planeSize) : PlaneSize(planeSize)
, RowSize(rowSize) , RowSize(rowSize)
, CellSet(cellSet.PrepareForInput(DeviceAdapter(), FromType(), ToType())) , CellSet(cellSet.PrepareForInput(DeviceAdapter(), VisitType(), IncidentType()))
, Coords(coords.PrepareForInput(DeviceAdapter())) , Coords(coords.PrepareForInput(DeviceAdapter()))
, PointDimensions(cellSet.GetPointDimensions()) , PointDimensions(cellSet.GetPointDimensions())
{ {
this->AxisPortals[0] = Coords.GetFirstPortal(); this->AxisPortals[0] = this->Coords.GetFirstPortal();
this->MinPoint[0] = coords.GetPortalConstControl().GetFirstPortal().Get(0); this->MinPoint[0] = coords.GetPortalConstControl().GetFirstPortal().Get(0);
this->MaxPoint[0] = coords.GetPortalConstControl().GetFirstPortal().Get(PointDimensions[0] - 1); this->MaxPoint[0] =
coords.GetPortalConstControl().GetFirstPortal().Get(this->PointDimensions[0] - 1);
this->AxisPortals[1] = Coords.GetSecondPortal(); this->AxisPortals[1] = this->Coords.GetSecondPortal();
this->MinPoint[1] = coords.GetPortalConstControl().GetSecondPortal().Get(0); this->MinPoint[1] = coords.GetPortalConstControl().GetSecondPortal().Get(0);
this->MaxPoint[1] = this->MaxPoint[1] =
coords.GetPortalConstControl().GetSecondPortal().Get(PointDimensions[1] - 1); coords.GetPortalConstControl().GetSecondPortal().Get(this->PointDimensions[1] - 1);
if (dimensions == 3) if (dimensions == 3)
{ {
this->AxisPortals[2] = Coords.GetThirdPortal(); this->AxisPortals[2] = this->Coords.GetThirdPortal();
this->MinPoint[2] = coords.GetPortalConstControl().GetThirdPortal().Get(0); this->MinPoint[2] = coords.GetPortalConstControl().GetThirdPortal().Get(0);
this->MaxPoint[2] = this->MaxPoint[2] =
coords.GetPortalConstControl().GetThirdPortal().Get(PointDimensions[2] - 1); coords.GetPortalConstControl().GetThirdPortal().Get(this->PointDimensions[2] - 1);
} }
} }
} }
@ -89,10 +89,11 @@ inline bool IsInside(const vtkm::Vec3f& point) const
inside = false; inside = false;
if (point[1] < this->MinPoint[1] || point[1] > this->MaxPoint[1]) if (point[1] < this->MinPoint[1] || point[1] > this->MaxPoint[1])
inside = false; inside = false;
if (dimensions == 2) if (dimensions == 3)
return inside; {
if (point[2] < this->MinPoint[2] || point[2] > this->MaxPoint[2]) if (point[2] < this->MinPoint[2] || point[2] > this->MaxPoint[2])
inside = false; inside = false;
}
return inside; return inside;
} }
@ -103,7 +104,7 @@ void FindCell(const vtkm::Vec3f& point,
const vtkm::exec::FunctorBase& worklet) const override const vtkm::exec::FunctorBase& worklet) const override
{ {
(void)worklet; //suppress unused warning (void)worklet; //suppress unused warning
if (!IsInside(point)) if (!this->IsInside(point))
{ {
cellId = -1; cellId = -1;
return; return;
@ -120,12 +121,12 @@ void FindCell(const vtkm::Vec3f& point,
// //
if (point[dim] == MaxPoint[dim]) if (point[dim] == MaxPoint[dim])
{ {
logicalCell[dim] = PointDimensions[dim] - 2; logicalCell[dim] = this->PointDimensions[dim] - 2;
continue; continue;
} }
vtkm::Id minIndex = 0; vtkm::Id minIndex = 0;
vtkm::Id maxIndex = PointDimensions[dim] - 1; vtkm::Id maxIndex = this->PointDimensions[dim] - 1;
vtkm::FloatDefault minVal; vtkm::FloatDefault minVal;
vtkm::FloatDefault maxVal; vtkm::FloatDefault maxVal;
minVal = this->AxisPortals[dim].Get(minIndex); minVal = this->AxisPortals[dim].Get(minIndex);
@ -146,9 +147,6 @@ void FindCell(const vtkm::Vec3f& point,
} }
} }
logicalCell[dim] = minIndex; logicalCell[dim] = minIndex;
//printf("Min Index [%d] : %lld\n", dim, minIndex);
//printf("Max Index [%d] : %lld\n", dim, maxIndex);
//printf("Logical [%d] : %lld\n", dim, logicalCell[dim]);
parametric[dim] = (point[dim] - minVal) / (maxVal - minVal); parametric[dim] = (point[dim] - minVal) / (maxVal - minVal);
} }
// Get the actual cellId, from the logical cell index of the cell // Get the actual cellId, from the logical cell index of the cell

@ -31,11 +31,9 @@ template <typename DeviceAdapter, vtkm::IdComponent dimensions>
class VTKM_ALWAYS_EXPORT CellLocatorUniformGrid final : public vtkm::exec::CellLocator class VTKM_ALWAYS_EXPORT CellLocatorUniformGrid final : public vtkm::exec::CellLocator
{ {
private: private:
using FromType = vtkm::TopologyElementTagPoint; using VisitType = vtkm::TopologyElementTagCell;
using ToType = vtkm::TopologyElementTagCell; using IncidentType = vtkm::TopologyElementTagPoint;
using CellSetPortal = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, using CellSetPortal = vtkm::exec::ConnectivityStructured<VisitType, IncidentType, dimensions>;
vtkm::TopologyElementTagCell,
dimensions>;
using CoordsPortal = typename vtkm::cont::ArrayHandleVirtualCoordinates::template ExecutionTypes< using CoordsPortal = typename vtkm::cont::ArrayHandleVirtualCoordinates::template ExecutionTypes<
DeviceAdapter>::PortalConst; DeviceAdapter>::PortalConst;
@ -43,9 +41,9 @@ public:
VTKM_CONT VTKM_CONT
CellLocatorUniformGrid(const vtkm::Id3 cellDims, CellLocatorUniformGrid(const vtkm::Id3 cellDims,
const vtkm::Id3 pointDims, const vtkm::Id3 pointDims,
const vtkm::Vec<vtkm::FloatDefault, 3> origin, const vtkm::Vec3f origin,
const vtkm::Vec<vtkm::FloatDefault, 3> invSpacing, const vtkm::Vec3f invSpacing,
const vtkm::Vec<vtkm::FloatDefault, 3> maxPoint, const vtkm::Vec3f maxPoint,
const vtkm::cont::ArrayHandleVirtualCoordinates& coords, const vtkm::cont::ArrayHandleVirtualCoordinates& coords,
DeviceAdapter) DeviceAdapter)
: CellDims(cellDims) : CellDims(cellDims)
@ -63,8 +61,7 @@ public:
// troublesome with CUDA __host__ __device__ markup. // troublesome with CUDA __host__ __device__ markup.
} }
template <typename T> VTKM_EXEC inline bool IsInside(const vtkm::Vec3f& point) const
VTKM_EXEC inline bool IsInside(const vtkm::Vec<T, 3>& point) const
{ {
bool inside = true; bool inside = true;
if (point[0] < this->Origin[0] || point[0] > this->MaxPoint[0]) if (point[0] < this->Origin[0] || point[0] > this->MaxPoint[0])
@ -83,7 +80,7 @@ public:
const vtkm::exec::FunctorBase& worklet) const override const vtkm::exec::FunctorBase& worklet) const override
{ {
(void)worklet; //suppress unused warning (void)worklet; //suppress unused warning
if (!IsInside(point)) if (!this->IsInside(point))
{ {
cellId = -1; cellId = -1;
return; return;
@ -91,9 +88,9 @@ public:
// Get the Cell Id from the point. // Get the Cell Id from the point.
vtkm::Id3 logicalCell(0, 0, 0); vtkm::Id3 logicalCell(0, 0, 0);
vtkm::Vec<vtkm::FloatDefault, 3> temp; vtkm::Vec3f temp;
temp = point - Origin; temp = point - this->Origin;
temp = temp * InvSpacing; temp = temp * this->InvSpacing;
//make sure that if we border the upper edge, we sample the correct cell //make sure that if we border the upper edge, we sample the correct cell
logicalCell = temp; logicalCell = temp;
@ -119,9 +116,9 @@ public:
private: private:
vtkm::Id3 CellDims; vtkm::Id3 CellDims;
vtkm::Id3 PointDims; vtkm::Id3 PointDims;
vtkm::Vec<vtkm::FloatDefault, 3> Origin; vtkm::Vec3f Origin;
vtkm::Vec<vtkm::FloatDefault, 3> InvSpacing; vtkm::Vec3f InvSpacing;
vtkm::Vec<vtkm::FloatDefault, 3> MaxPoint; vtkm::Vec3f MaxPoint;
CoordsPortal Coords; CoordsPortal Coords;
}; };
} }

@ -22,28 +22,29 @@ namespace exec
{ {
template <typename PermutationPortal, typename OriginalConnectivity> template <typename PermutationPortal, typename OriginalConnectivity>
class ConnectivityPermutedPointToCell class ConnectivityPermutedVisitCellsWithPoints
{ {
public: public:
using SchedulingRangeType = typename OriginalConnectivity::SchedulingRangeType; using SchedulingRangeType = typename OriginalConnectivity::SchedulingRangeType;
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT VTKM_EXEC_CONT
ConnectivityPermutedPointToCell() ConnectivityPermutedVisitCellsWithPoints()
: Portal() : Portal()
, Connectivity() , Connectivity()
{ {
} }
VTKM_EXEC_CONT VTKM_EXEC_CONT
ConnectivityPermutedPointToCell(const PermutationPortal& portal, const OriginalConnectivity& src) ConnectivityPermutedVisitCellsWithPoints(const PermutationPortal& portal,
const OriginalConnectivity& src)
: Portal(portal) : Portal(portal)
, Connectivity(src) , Connectivity(src)
{ {
} }
VTKM_EXEC_CONT VTKM_EXEC_CONT
ConnectivityPermutedPointToCell(const ConnectivityPermutedPointToCell& src) ConnectivityPermutedVisitCellsWithPoints(const ConnectivityPermutedVisitCellsWithPoints& src)
: Portal(src.Portal) : Portal(src.Portal)
, Connectivity(src.Connectivity) , Connectivity(src.Connectivity)
{ {
@ -82,16 +83,16 @@ public:
template <typename ConnectivityPortalType, template <typename ConnectivityPortalType,
typename NumIndicesPortalType, typename NumIndicesPortalType,
typename IndexOffsetPortalType> typename IndexOffsetPortalType>
class ConnectivityPermutedCellToPoint class ConnectivityPermutedVisitPointsWithCells
{ {
public: public:
using SchedulingRangeType = vtkm::Id; using SchedulingRangeType = vtkm::Id;
using IndicesType = vtkm::VecFromPortal<ConnectivityPortalType>; using IndicesType = vtkm::VecFromPortal<ConnectivityPortalType>;
using CellShapeTag = vtkm::CellShapeTagVertex; using CellShapeTag = vtkm::CellShapeTagVertex;
ConnectivityPermutedCellToPoint() = default; ConnectivityPermutedVisitPointsWithCells() = default;
ConnectivityPermutedCellToPoint(const ConnectivityPortalType& connectivity, ConnectivityPermutedVisitPointsWithCells(const ConnectivityPortalType& connectivity,
const NumIndicesPortalType& numIndices, const NumIndicesPortalType& numIndices,
const IndexOffsetPortalType& indexOffset) const IndexOffsetPortalType& indexOffset)
: Connectivity(connectivity) : Connectivity(connectivity)

@ -20,16 +20,16 @@ namespace vtkm
namespace exec namespace exec
{ {
template <typename FromTopology, typename ToTopology, vtkm::IdComponent Dimension> template <typename VisitTopology, typename IncidentTopology, vtkm::IdComponent Dimension>
class ConnectivityStructured class ConnectivityStructured
{ {
VTKM_IS_TOPOLOGY_ELEMENT_TAG(FromTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(VisitTopology);
VTKM_IS_TOPOLOGY_ELEMENT_TAG(ToTopology); VTKM_IS_TOPOLOGY_ELEMENT_TAG(IncidentTopology);
using InternalsType = vtkm::internal::ConnectivityStructuredInternals<Dimension>; using InternalsType = vtkm::internal::ConnectivityStructuredInternals<Dimension>;
using Helper = using Helper =
vtkm::internal::ConnectivityStructuredIndexHelper<FromTopology, ToTopology, Dimension>; vtkm::internal::ConnectivityStructuredIndexHelper<VisitTopology, IncidentTopology, Dimension>;
public: public:
using SchedulingRangeType = typename InternalsType::SchedulingRangeType; using SchedulingRangeType = typename InternalsType::SchedulingRangeType;
@ -53,7 +53,8 @@ public:
} }
VTKM_EXEC_CONT VTKM_EXEC_CONT
ConnectivityStructured(const ConnectivityStructured<ToTopology, FromTopology, Dimension>& src) ConnectivityStructured(
const ConnectivityStructured<IncidentTopology, VisitTopology, Dimension>& src)
: Internals(src.Internals) : Internals(src.Internals)
{ {
} }
@ -115,7 +116,7 @@ public:
return this->Internals.GetGlobalPointIndexStart(); return this->Internals.GetGlobalPointIndexStart();
} }
friend class ConnectivityStructured<ToTopology, FromTopology, Dimension>; friend class ConnectivityStructured<IncidentTopology, VisitTopology, Dimension>;
private: private:
InternalsType Internals; InternalsType Internals;

@ -27,7 +27,7 @@ namespace exec
/// This class contains a public method named RaiseError that can be called in /// This class contains a public method named RaiseError that can be called in
/// the execution environment to signal a problem. /// the execution environment to signal a problem.
/// ///
class VTKM_NEVER_EXPORT FunctorBase class VTKM_ALWAYS_EXPORT FunctorBase
{ {
public: public:
VTKM_EXEC_CONT VTKM_EXEC_CONT

@ -25,8 +25,8 @@ set(headers
FetchTagCellSetIn.h FetchTagCellSetIn.h
FetchTagKeysIn.h FetchTagKeysIn.h
FetchTagWholeCellSetIn.h FetchTagWholeCellSetIn.h
FromCount.h IncidentElementCount.h
FromIndices.h IncidentElementIndices.h
InputIndex.h InputIndex.h
OutputIndex.h OutputIndex.h
ThreadIndices.h ThreadIndices.h

@ -13,7 +13,7 @@
#include <vtkm/exec/ConnectivityExtrude.h> #include <vtkm/exec/ConnectivityExtrude.h>
#include <vtkm/exec/arg/FetchTagArrayDirectIn.h> #include <vtkm/exec/arg/FetchTagArrayDirectIn.h>
#include <vtkm/exec/arg/FetchTagArrayTopologyMapIn.h> #include <vtkm/exec/arg/FetchTagArrayTopologyMapIn.h>
#include <vtkm/exec/arg/FromIndices.h> #include <vtkm/exec/arg/IncidentElementIndices.h>
//optimized fetches for ArrayPortalExtrude for //optimized fetches for ArrayPortalExtrude for
// - 3D Scheduling // - 3D Scheduling
@ -28,7 +28,7 @@ namespace arg
//Optimized fetch for point ids when iterating the cells ConnectivityExtrude //Optimized fetch for point ids when iterating the cells ConnectivityExtrude
template <typename FetchType, typename Device, typename ExecObjectType> template <typename FetchType, typename Device, typename ExecObjectType>
struct Fetch<FetchType, struct Fetch<FetchType,
vtkm::exec::arg::AspectTagFromIndices, vtkm::exec::arg::AspectTagIncidentElementIndices,
vtkm::exec::arg::ThreadIndicesTopologyMap<vtkm::exec::ConnectivityExtrude<Device>>, vtkm::exec::arg::ThreadIndicesTopologyMap<vtkm::exec::ConnectivityExtrude<Device>>,
ExecObjectType> ExecObjectType>
{ {
@ -42,7 +42,7 @@ struct Fetch<FetchType,
ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const
{ {
// std::cout << "opimized fetch for point ids" << std::endl; // std::cout << "opimized fetch for point ids" << std::endl;
const auto& xgcidx = indices.GetIndicesFrom(); const auto& xgcidx = indices.GetIndicesIncident();
const vtkm::Id offset1 = (xgcidx.Planes[0] * xgcidx.NumberOfPointsPerPlane); const vtkm::Id offset1 = (xgcidx.Planes[0] * xgcidx.NumberOfPointsPerPlane);
const vtkm::Id offset2 = (xgcidx.Planes[1] * xgcidx.NumberOfPointsPerPlane); const vtkm::Id offset2 = (xgcidx.Planes[1] * xgcidx.NumberOfPointsPerPlane);
ValueType result; ValueType result;
@ -78,7 +78,7 @@ struct Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
ValueType Load(const ThreadIndicesType& indices, const PortalType& portal) ValueType Load(const ThreadIndicesType& indices, const PortalType& portal)
{ {
// std::cout << "opimized fetch for point values" << std::endl; // std::cout << "opimized fetch for point values" << std::endl;
const auto& xgcidx = indices.GetIndicesFrom(); const auto& xgcidx = indices.GetIndicesIncident();
const vtkm::Id offset1 = (xgcidx.Planes[0] * xgcidx.NumberOfPointsPerPlane); const vtkm::Id offset1 = (xgcidx.Planes[0] * xgcidx.NumberOfPointsPerPlane);
const vtkm::Id offset2 = (xgcidx.Planes[1] * xgcidx.NumberOfPointsPerPlane); const vtkm::Id offset2 = (xgcidx.Planes[1] * xgcidx.NumberOfPointsPerPlane);
ValueType result; ValueType result;
@ -115,7 +115,7 @@ struct Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
ValueType Load(const ThreadIndicesType& indices, const vtkm::exec::ArrayPortalExtrude<T>& points) ValueType Load(const ThreadIndicesType& indices, const vtkm::exec::ArrayPortalExtrude<T>& points)
{ {
// std::cout << "opimized fetch for point coordinates" << std::endl; // std::cout << "opimized fetch for point coordinates" << std::endl;
return points.GetWedge(indices.GetIndicesFrom()); return points.GetWedge(indices.GetIndicesIncident());
} }
VTKM_EXEC VTKM_EXEC
@ -144,7 +144,7 @@ struct Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
const vtkm::exec::ArrayPortalExtrudePlane<T>& portal) const vtkm::exec::ArrayPortalExtrudePlane<T>& portal)
{ {
// std::cout << "opimized fetch for point coordinates" << std::endl; // std::cout << "opimized fetch for point coordinates" << std::endl;
return portal.GetWedge(indices.GetIndicesFrom()); return portal.GetWedge(indices.GetIndicesIncident());
} }
VTKM_EXEC VTKM_EXEC

@ -56,9 +56,9 @@ struct FetchArrayTopologyMapInImplementation
{ {
using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>; using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>;
// ThreadIndicesTopologyMap has special "from" indices that are stored in a // ThreadIndicesTopologyMap has special incident element indices that are
// Vec-like object. // stored in a Vec-like object.
using IndexVecType = typename ThreadIndicesType::IndicesFromType; using IndexVecType = typename ThreadIndicesType::IndicesIncidentType;
// The FieldExecObjectType is expected to behave like an ArrayPortal. // The FieldExecObjectType is expected to behave like an ArrayPortal.
using PortalType = FieldExecObjectType; using PortalType = FieldExecObjectType;
@ -73,7 +73,7 @@ struct FetchArrayTopologyMapInImplementation
// pointer that will stay around during the time the Vec is valid. Thus, we // pointer that will stay around during the time the Vec is valid. Thus, we
// should make sure that indices is a reference that goes up the stack at // should make sure that indices is a reference that goes up the stack at
// least as far as the returned VecFromPortalPermute is used. // least as far as the returned VecFromPortalPermute is used.
return ValueType(indices.GetIndicesFromPointer(), field); return ValueType(indices.GetIndicesIncidentPointer(), field);
} }
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_SUPPRESS_EXEC_WARNINGS
@ -84,7 +84,7 @@ struct FetchArrayTopologyMapInImplementation
// pointer that will stay around during the time the Vec is valid. Thus, we // pointer that will stay around during the time the Vec is valid. Thus, we
// should make sure that indices is a reference that goes up the stack at // should make sure that indices is a reference that goes up the stack at
// least as far as the returned VecFromPortalPermute is used. // least as far as the returned VecFromPortalPermute is used.
return ValueType(indices.GetIndicesFromPointer(), field); return ValueType(indices.GetIndicesIncidentPointer(), field);
} }
}; };
@ -130,14 +130,14 @@ static inline VTKM_EXEC vtkm::VecAxisAlignedPointCoordinates<3> make_VecAxisAlig
template <vtkm::IdComponent NumDimensions> template <vtkm::IdComponent NumDimensions>
struct FetchArrayTopologyMapInImplementation< struct FetchArrayTopologyMapInImplementation<
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
NumDimensions>, NumDimensions>,
vtkm::internal::ArrayPortalUniformPointCoordinates> vtkm::internal::ArrayPortalUniformPointCoordinates>
{ {
using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
NumDimensions>; NumDimensions>;
using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>; using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>;
@ -157,18 +157,18 @@ struct FetchArrayTopologyMapInImplementation<
template <typename PermutationPortal, vtkm::IdComponent NumDimensions> template <typename PermutationPortal, vtkm::IdComponent NumDimensions>
struct FetchArrayTopologyMapInImplementation< struct FetchArrayTopologyMapInImplementation<
vtkm::exec::ConnectivityPermutedPointToCell< vtkm::exec::ConnectivityPermutedVisitCellsWithPoints<
PermutationPortal, PermutationPortal,
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
NumDimensions>>, NumDimensions>>,
vtkm::internal::ArrayPortalUniformPointCoordinates> vtkm::internal::ArrayPortalUniformPointCoordinates>
{ {
using ConnectivityType = vtkm::exec::ConnectivityPermutedPointToCell< using ConnectivityType = vtkm::exec::ConnectivityPermutedVisitCellsWithPoints<
PermutationPortal, PermutationPortal,
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
NumDimensions>>; NumDimensions>>;
using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>; using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>;

@ -7,8 +7,8 @@
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_exec_arg_FromCount_h #ifndef vtk_m_exec_arg_IncidentElementCount_h
#define vtk_m_exec_arg_FromCount_h #define vtk_m_exec_arg_IncidentElementCount_h
#include <vtkm/exec/arg/ExecutionSignatureTagBase.h> #include <vtkm/exec/arg/ExecutionSignatureTagBase.h>
#include <vtkm/exec/arg/Fetch.h> #include <vtkm/exec/arg/Fetch.h>
@ -21,32 +21,32 @@ namespace exec
namespace arg namespace arg
{ {
/// \brief Aspect tag to use for getting the from count. /// \brief Aspect tag to use for getting the incident element count.
/// ///
/// The \c AspectTagFromCount aspect tag causes the \c Fetch class to obtain /// The \c AspectTagIncidentElementCount aspect tag causes the \c Fetch class to
/// the number of indices that map to the current topology element. /// obtain the number of indices that map to the current topology element.
/// ///
struct AspectTagFromCount struct AspectTagIncidentElementCount
{ {
}; };
/// \brief The \c ExecutionSignature tag to get the number of from elements. /// \brief The \c ExecutionSignature tag to get the number of incident elements.
/// ///
/// In a topology map, there are \em from and \em to topology elements /// In a topology map, there are \em visited and \em incident topology elements
/// specified. The scheduling occurs on the \em to elements, and for each \em /// specified. The scheduling occurs on the \em visited elements, and for each
/// to element there is some number of incident \em from elements that are /// \em visited element there is some number of incident \em incident elements
/// accessible. This \c ExecutionSignature tag provides the number of these \em /// that are accessible. This \c ExecutionSignature tag provides the number of
/// from elements that are accessible. /// these \em incident elements that are accessible.
/// ///
struct FromCount : vtkm::exec::arg::ExecutionSignatureTagBase struct IncidentElementCount : vtkm::exec::arg::ExecutionSignatureTagBase
{ {
static constexpr vtkm::IdComponent INDEX = 1; static constexpr vtkm::IdComponent INDEX = 1;
using AspectTag = vtkm::exec::arg::AspectTagFromCount; using AspectTag = vtkm::exec::arg::AspectTagIncidentElementCount;
}; };
template <typename FetchTag, typename ConnectivityType, typename ExecObjectType> template <typename FetchTag, typename ConnectivityType, typename ExecObjectType>
struct Fetch<FetchTag, struct Fetch<FetchTag,
vtkm::exec::arg::AspectTagFromCount, vtkm::exec::arg::AspectTagIncidentElementCount,
vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>, vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>,
ExecObjectType> ExecObjectType>
{ {
@ -58,7 +58,7 @@ struct Fetch<FetchTag,
VTKM_EXEC VTKM_EXEC
ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const
{ {
return indices.GetIndicesFrom().GetNumberOfComponents(); return indices.GetIndicesIncident().GetNumberOfComponents();
} }
VTKM_EXEC VTKM_EXEC
@ -71,4 +71,4 @@ struct Fetch<FetchTag,
} }
} // namespace vtkm::exec::arg } // namespace vtkm::exec::arg
#endif //vtk_m_exec_arg_FromCount_h #endif //vtk_m_exec_arg_IncidentElementCount_h

@ -7,8 +7,8 @@
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_exec_arg_FromIndices_h #ifndef vtk_m_exec_arg_IncidentElementIndices_h
#define vtk_m_exec_arg_FromIndices_h #define vtk_m_exec_arg_IncidentElementIndices_h
#include <vtkm/exec/arg/ExecutionSignatureTagBase.h> #include <vtkm/exec/arg/ExecutionSignatureTagBase.h>
#include <vtkm/exec/arg/Fetch.h> #include <vtkm/exec/arg/Fetch.h>
@ -21,44 +21,45 @@ namespace exec
namespace arg namespace arg
{ {
/// \brief Aspect tag to use for getting the from indices. /// \brief Aspect tag to use for getting the visited indices.
/// ///
/// The \c AspectTagFromIndices aspect tag causes the \c Fetch class to obtain /// The \c AspectTagIncidentElementIndices aspect tag causes the \c Fetch class
/// the indices that map to the current topology element. /// to obtain the indices that map to the current topology element.
/// ///
struct AspectTagFromIndices struct AspectTagIncidentElementIndices
{ {
}; };
/// \brief The \c ExecutionSignature tag to get the indices of from elements. /// \brief The \c ExecutionSignature tag to get the indices of visited elements.
/// ///
/// In a topology map, there are \em from and \em to topology elements /// In a topology map, there are \em visited and \em incident topology elements
/// specified. The scheduling occurs on the \em to elements, and for each \em /// specified. The scheduling occurs on the \em visited elements, and for each
/// to element there is some number of incident \em from elements that are /// \em visited element there is some number of incident \em incident elements
/// accessible. This \c ExecutionSignature tag provides the indices of these /// that are accessible. This \c ExecutionSignature tag provides the indices of
/// \em from elements that are accessible. /// the \em incident elements that are incident to the current \em visited
/// element.
/// ///
struct FromIndices : vtkm::exec::arg::ExecutionSignatureTagBase struct IncidentElementIndices : vtkm::exec::arg::ExecutionSignatureTagBase
{ {
static constexpr vtkm::IdComponent INDEX = 1; static constexpr vtkm::IdComponent INDEX = 1;
using AspectTag = vtkm::exec::arg::AspectTagFromIndices; using AspectTag = vtkm::exec::arg::AspectTagIncidentElementIndices;
}; };
template <typename FetchTag, typename ConnectivityType, typename ExecObjectType> template <typename FetchTag, typename ConnectivityType, typename ExecObjectType>
struct Fetch<FetchTag, struct Fetch<FetchTag,
vtkm::exec::arg::AspectTagFromIndices, vtkm::exec::arg::AspectTagIncidentElementIndices,
vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>, vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>,
ExecObjectType> ExecObjectType>
{ {
using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>; using ThreadIndicesType = vtkm::exec::arg::ThreadIndicesTopologyMap<ConnectivityType>;
using ValueType = typename ThreadIndicesType::IndicesFromType; using ValueType = typename ThreadIndicesType::IndicesIncidentType;
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC VTKM_EXEC
ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const ValueType Load(const ThreadIndicesType& indices, const ExecObjectType&) const
{ {
return indices.GetIndicesFrom(); return indices.GetIndicesIncident();
} }
VTKM_EXEC VTKM_EXEC
@ -71,4 +72,4 @@ struct Fetch<FetchTag,
} }
} // namespace vtkm::exec::arg } // namespace vtkm::exec::arg
#endif //vtk_m_exec_arg_FromIndices_h #endif //vtk_m_exec_arg_IncidentElementIndices_h

@ -29,7 +29,7 @@ class ThreadIndicesTopologyMap<vtkm::exec::ConnectivityExtrude<Device>>
public: public:
using CellShapeTag = typename ConnectivityType::CellShapeTag; using CellShapeTag = typename ConnectivityType::CellShapeTag;
using IndicesFromType = typename ConnectivityType::IndicesType; using IndicesIncidentType = typename ConnectivityType::IndicesType;
using LogicalIndexType = typename ConnectivityType::SchedulingRangeType; using LogicalIndexType = typename ConnectivityType::SchedulingRangeType;
@ -49,7 +49,7 @@ public:
this->OutputIndex = index; this->OutputIndex = index;
this->VisitIndex = 0; this->VisitIndex = 0;
this->LogicalIndex = logicalIndex; this->LogicalIndex = logicalIndex;
this->IndicesFrom = connectivity.GetIndices(logicalIndex); this->IndicesIncident = connectivity.GetIndices(logicalIndex);
//this->CellShape = connectivity.GetCellShape(index); //this->CellShape = connectivity.GetCellShape(index);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -70,7 +70,7 @@ public:
this->OutputIndex = index; this->OutputIndex = index;
this->VisitIndex = 0; this->VisitIndex = 0;
this->LogicalIndex = logicalIndex; this->LogicalIndex = logicalIndex;
this->IndicesFrom = connectivity.GetIndices(logicalIndex); this->IndicesIncident = connectivity.GetIndices(logicalIndex);
//this->CellShape = connectivity.GetCellShape(index); //this->CellShape = connectivity.GetCellShape(index);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -128,7 +128,7 @@ public:
/// containing the indices to the "from" elements. /// containing the indices to the "from" elements.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType& GetIndicesFrom() const { return this->IndicesFrom; } const IndicesIncidentType& GetIndicesIncident() const { return this->IndicesIncident; }
/// \brief The input indices of the "from" elements in pointer form. /// \brief The input indices of the "from" elements in pointer form.
/// ///
@ -140,7 +140,7 @@ public:
/// not go out of scope, at which time the returned pointer becomes invalid. /// not go out of scope, at which time the returned pointer becomes invalid.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType* GetIndicesFromPointer() const { return &this->IndicesFrom; } const IndicesIncidentType* GetIndicesIncidentPointer() const { return &this->IndicesIncident; }
/// \brief The shape of the input cell. /// \brief The shape of the input cell.
/// ///
@ -158,7 +158,7 @@ private:
vtkm::IdComponent VisitIndex; vtkm::IdComponent VisitIndex;
vtkm::Id OutputIndex; vtkm::Id OutputIndex;
LogicalIndexType LogicalIndex; LogicalIndexType LogicalIndex;
IndicesFromType IndicesFrom; IndicesIncidentType IndicesIncident;
//CellShapeTag CellShape; //CellShapeTag CellShape;
vtkm::Id GlobalThreadIndexOffset; vtkm::Id GlobalThreadIndexOffset;
}; };
@ -171,7 +171,7 @@ class ThreadIndicesTopologyMap<vtkm::exec::ReverseConnectivityExtrude<Device>>
public: public:
using CellShapeTag = typename ConnectivityType::CellShapeTag; using CellShapeTag = typename ConnectivityType::CellShapeTag;
using IndicesFromType = typename ConnectivityType::IndicesType; using IndicesIncidentType = typename ConnectivityType::IndicesType;
using LogicalIndexType = typename ConnectivityType::SchedulingRangeType; using LogicalIndexType = typename ConnectivityType::SchedulingRangeType;
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_SUPPRESS_EXEC_WARNINGS
@ -191,7 +191,7 @@ public:
this->OutputIndex = index; this->OutputIndex = index;
this->VisitIndex = 0; this->VisitIndex = 0;
this->LogicalIndex = logicalIndex; this->LogicalIndex = logicalIndex;
this->IndicesFrom = connectivity.GetIndices(logicalIndex); this->IndicesIncident = connectivity.GetIndices(logicalIndex);
//this->CellShape = connectivity.GetCellShape(index); //this->CellShape = connectivity.GetCellShape(index);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -209,7 +209,7 @@ public:
this->OutputIndex = index; this->OutputIndex = index;
this->VisitIndex = 0; this->VisitIndex = 0;
this->LogicalIndex = logicalIndex; this->LogicalIndex = logicalIndex;
this->IndicesFrom = connectivity.GetIndices(logicalIndex); this->IndicesIncident = connectivity.GetIndices(logicalIndex);
//this->CellShape = connectivity.GetCellShape(index); //this->CellShape = connectivity.GetCellShape(index);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -266,7 +266,7 @@ public:
/// containing the indices to the "from" elements. /// containing the indices to the "from" elements.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType& GetIndicesFrom() const { return this->IndicesFrom; } const IndicesIncidentType& GetIndicesIncident() const { return this->IndicesIncident; }
/// \brief The input indices of the "from" elements in pointer form. /// \brief The input indices of the "from" elements in pointer form.
/// ///
@ -278,7 +278,7 @@ public:
/// not go out of scope, at which time the returned pointer becomes invalid. /// not go out of scope, at which time the returned pointer becomes invalid.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType* GetIndicesFromPointer() const { return &this->IndicesFrom; } const IndicesIncidentType* GetIndicesIncidentPointer() const { return &this->IndicesIncident; }
/// \brief The shape of the input cell. /// \brief The shape of the input cell.
/// ///
@ -296,7 +296,7 @@ private:
vtkm::IdComponent VisitIndex; vtkm::IdComponent VisitIndex;
vtkm::Id OutputIndex; vtkm::Id OutputIndex;
LogicalIndexType LogicalIndex; LogicalIndexType LogicalIndex;
IndicesFromType IndicesFrom; IndicesIncidentType IndicesIncident;
//CellShapeTag CellShape; //CellShapeTag CellShape;
vtkm::Id GlobalThreadIndexOffset; vtkm::Id GlobalThreadIndexOffset;
}; };

@ -58,15 +58,15 @@ public:
template <vtkm::IdComponent Dimension> template <vtkm::IdComponent Dimension>
VTKM_EXEC ThreadIndicesPointNeighborhood( VTKM_EXEC ThreadIndicesPointNeighborhood(
const vtkm::Id3& outIndex, const vtkm::Id3& outIndex,
const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
Dimension>& connectivity, Dimension>& connectivity,
vtkm::Id globalThreadIndexOffset = 0) vtkm::Id globalThreadIndexOffset = 0)
: State(outIndex, detail::To3D(connectivity.GetPointDimensions())) : State(outIndex, detail::To3D(connectivity.GetPointDimensions()))
, GlobalThreadIndexOffset(globalThreadIndexOffset) , GlobalThreadIndexOffset(globalThreadIndexOffset)
{ {
using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
Dimension>; Dimension>;
using ConnRangeType = typename ConnectivityType::SchedulingRangeType; using ConnRangeType = typename ConnectivityType::SchedulingRangeType;
const ConnRangeType index = detail::Deflate(outIndex, ConnRangeType()); const ConnRangeType index = detail::Deflate(outIndex, ConnRangeType());
@ -82,8 +82,8 @@ public:
vtkm::Id inputIndex, vtkm::Id inputIndex,
vtkm::IdComponent visitIndex, vtkm::IdComponent visitIndex,
vtkm::Id outputIndex, vtkm::Id outputIndex,
const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
Dimension>& connectivity, Dimension>& connectivity,
vtkm::Id globalThreadIndexOffset = 0) vtkm::Id globalThreadIndexOffset = 0)
: State(detail::To3D(connectivity.FlatToLogicalToIndex(inputIndex)), : State(detail::To3D(connectivity.FlatToLogicalToIndex(inputIndex)),

@ -73,9 +73,9 @@ static inline VTKM_EXEC vtkm::Id2 Deflate(const vtkm::Id3& index, vtkm::Id2)
/// \brief Container for thread indices in a topology map /// \brief Container for thread indices in a topology map
/// ///
/// This specialization of \c ThreadIndices adds extra indices that deal with /// This specialization of \c ThreadIndices adds extra indices that deal with
/// topology maps. In particular, it saves the indices used to map the "from" /// topology maps. In particular, it saves the incident element indices. The
/// elements in the map. The input and output indices from the superclass are /// input and output indices from the superclass are considered to be indexing
/// considered to be indexing the "to" elements. /// the visited elements.
/// ///
/// This class is templated on the type that stores the connectivity (such /// This class is templated on the type that stores the connectivity (such
/// as \c ConnectivityExplicit or \c ConnectivityStructured). /// as \c ConnectivityExplicit or \c ConnectivityStructured).
@ -86,7 +86,7 @@ class ThreadIndicesTopologyMap : public vtkm::exec::arg::ThreadIndicesBasic
using Superclass = vtkm::exec::arg::ThreadIndicesBasic; using Superclass = vtkm::exec::arg::ThreadIndicesBasic;
public: public:
using IndicesFromType = typename ConnectivityType::IndicesType; using IndicesIncidentType = typename ConnectivityType::IndicesType;
using CellShapeTag = typename ConnectivityType::CellShapeTag; using CellShapeTag = typename ConnectivityType::CellShapeTag;
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_SUPPRESS_EXEC_WARNINGS
@ -102,24 +102,24 @@ public:
// of the domain will match the connectivity type used here. If there is // of the domain will match the connectivity type used here. If there is
// a compile error here about a type mismatch, chances are a worklet has // a compile error here about a type mismatch, chances are a worklet has
// set its input domain incorrectly. // set its input domain incorrectly.
, IndicesFrom(connectivity.GetIndices(inputIndex)) , IndicesIncident(connectivity.GetIndices(inputIndex))
, CellShape(connectivity.GetCellShape(inputIndex)) , CellShape(connectivity.GetCellShape(inputIndex))
{ {
} }
/// \brief The input indices of the "from" elements. /// \brief The indices of the incident elements.
/// ///
/// A topology map has "from" and "to" elements (for example from points to /// A topology map has "visited" and "incident" elements (e.g. points, cells,
/// cells). For each worklet invocation, there is exactly one "to" element, /// etc). For each worklet invocation, there is exactly one visited element,
/// but can be several "from" element. This method returns a Vec-like object /// but there can be several incident elements. This method returns a Vec-like
/// containing the indices to the "from" elements. /// object containing the indices to the incident elements.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType& GetIndicesFrom() const { return this->IndicesFrom; } const IndicesIncidentType& GetIndicesIncident() const { return this->IndicesIncident; }
/// \brief The input indices of the "from" elements in pointer form. /// \brief The input indices of the incident elements in pointer form.
/// ///
/// Returns the same object as GetIndicesFrom except that it returns a /// Returns the same object as GetIndicesIncident except that it returns a
/// pointer to the internally held object rather than a reference or copy. /// pointer to the internally held object rather than a reference or copy.
/// Since the from indices can be a sizeable Vec (8 entries is common), it is /// Since the from indices can be a sizeable Vec (8 entries is common), it is
/// best not to have a bunch a copies. Thus, you can pass around a pointer /// best not to have a bunch a copies. Thus, you can pass around a pointer
@ -127,7 +127,7 @@ public:
/// not go out of scope, at which time the returned pointer becomes invalid. /// not go out of scope, at which time the returned pointer becomes invalid.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType* GetIndicesFromPointer() const { return &this->IndicesFrom; } const IndicesIncidentType* GetIndicesIncidentPointer() const { return &this->IndicesIncident; }
/// \brief The shape of the input cell. /// \brief The shape of the input cell.
/// ///
@ -140,19 +140,20 @@ public:
CellShapeTag GetCellShape() const { return this->CellShape; } CellShapeTag GetCellShape() const { return this->CellShape; }
private: private:
IndicesFromType IndicesFrom; IndicesIncidentType IndicesIncident;
CellShapeTag CellShape; CellShapeTag CellShape;
}; };
// Specialization for structured connectivity types. // Specialization for structured connectivity types.
template <typename FromTopology, typename ToTopology, vtkm::IdComponent Dimension> template <typename VisitTopology, typename IncidentTopology, vtkm::IdComponent Dimension>
class ThreadIndicesTopologyMap< class ThreadIndicesTopologyMap<
vtkm::exec::ConnectivityStructured<FromTopology, ToTopology, Dimension>> vtkm::exec::ConnectivityStructured<VisitTopology, IncidentTopology, Dimension>>
{ {
using ConnectivityType = vtkm::exec::ConnectivityStructured<FromTopology, ToTopology, Dimension>; using ConnectivityType =
vtkm::exec::ConnectivityStructured<VisitTopology, IncidentTopology, Dimension>;
public: public:
using IndicesFromType = typename ConnectivityType::IndicesType; using IndicesIncidentType = typename ConnectivityType::IndicesType;
using CellShapeTag = typename ConnectivityType::CellShapeTag; using CellShapeTag = typename ConnectivityType::CellShapeTag;
using LogicalIndexType = typename ConnectivityType::SchedulingRangeType; using LogicalIndexType = typename ConnectivityType::SchedulingRangeType;
@ -168,7 +169,7 @@ public:
this->VisitIndex = visitIndex; this->VisitIndex = visitIndex;
this->OutputIndex = outIndex; this->OutputIndex = outIndex;
this->LogicalIndex = connectivity.FlatToLogicalToIndex(this->InputIndex); this->LogicalIndex = connectivity.FlatToLogicalToIndex(this->InputIndex);
this->IndicesFrom = connectivity.GetIndices(this->LogicalIndex); this->IndicesIncident = connectivity.GetIndices(this->LogicalIndex);
this->CellShape = connectivity.GetCellShape(this->InputIndex); this->CellShape = connectivity.GetCellShape(this->InputIndex);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -188,7 +189,7 @@ public:
this->OutputIndex = index; this->OutputIndex = index;
this->VisitIndex = 0; this->VisitIndex = 0;
this->LogicalIndex = logicalIndex; this->LogicalIndex = logicalIndex;
this->IndicesFrom = connectivity.GetIndices(logicalIndex); this->IndicesIncident = connectivity.GetIndices(logicalIndex);
this->CellShape = connectivity.GetCellShape(index); this->CellShape = connectivity.GetCellShape(index);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -247,19 +248,19 @@ public:
VTKM_EXEC VTKM_EXEC
vtkm::Id GetGlobalIndex() const { return (this->GlobalThreadIndexOffset + this->OutputIndex); } vtkm::Id GetGlobalIndex() const { return (this->GlobalThreadIndexOffset + this->OutputIndex); }
/// \brief The input indices of the "from" elements. /// \brief The indices of the incident elements.
/// ///
/// A topology map has "from" and "to" elements (for example from points to /// A topology map has "visited" and "incident" elements (e.g. points, cells,
/// cells). For each worklet invocation, there is exactly one "to" element, /// etc). For each worklet invocation, there is exactly one visited element,
/// but can be several "from" element. This method returns a Vec-like object /// but there can be several incident elements. This method returns a
/// containing the indices to the "from" elements. /// Vec-like object containing the indices to the incident elements.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType& GetIndicesFrom() const { return this->IndicesFrom; } const IndicesIncidentType& GetIndicesIncident() const { return this->IndicesIncident; }
/// \brief The input indices of the "from" elements in pointer form. /// \brief The input indices of the incident elements in pointer form.
/// ///
/// Returns the same object as GetIndicesFrom except that it returns a /// Returns the same object as GetIndicesIncident except that it returns a
/// pointer to the internally held object rather than a reference or copy. /// pointer to the internally held object rather than a reference or copy.
/// Since the from indices can be a sizeable Vec (8 entries is common), it is /// Since the from indices can be a sizeable Vec (8 entries is common), it is
/// best not to have a bunch a copies. Thus, you can pass around a pointer /// best not to have a bunch a copies. Thus, you can pass around a pointer
@ -267,7 +268,7 @@ public:
/// not go out of scope, at which time the returned pointer becomes invalid. /// not go out of scope, at which time the returned pointer becomes invalid.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType* GetIndicesFromPointer() const { return &this->IndicesFrom; } const IndicesIncidentType* GetIndicesIncidentPointer() const { return &this->IndicesIncident; }
/// \brief The shape of the input cell. /// \brief The shape of the input cell.
/// ///
@ -285,29 +286,29 @@ private:
vtkm::IdComponent VisitIndex; vtkm::IdComponent VisitIndex;
vtkm::Id OutputIndex; vtkm::Id OutputIndex;
LogicalIndexType LogicalIndex; LogicalIndexType LogicalIndex;
IndicesFromType IndicesFrom; IndicesIncidentType IndicesIncident;
CellShapeTag CellShape; CellShapeTag CellShape;
vtkm::Id GlobalThreadIndexOffset; vtkm::Id GlobalThreadIndexOffset;
}; };
// Specialization for permuted structured connectivity types. // Specialization for permuted structured connectivity types.
template <typename PermutationPortal, vtkm::IdComponent Dimension> template <typename PermutationPortal, vtkm::IdComponent Dimension>
class ThreadIndicesTopologyMap<vtkm::exec::ConnectivityPermutedPointToCell< class ThreadIndicesTopologyMap<vtkm::exec::ConnectivityPermutedVisitCellsWithPoints<
PermutationPortal, PermutationPortal,
vtkm::exec:: vtkm::exec::
ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, Dimension>>> ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, Dimension>>>
{ {
using PermutedConnectivityType = vtkm::exec::ConnectivityPermutedPointToCell< using PermutedConnectivityType = vtkm::exec::ConnectivityPermutedVisitCellsWithPoints<
PermutationPortal, PermutationPortal,
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
Dimension>>; Dimension>>;
using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, using ConnectivityType = vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
Dimension>; Dimension>;
public: public:
using IndicesFromType = typename ConnectivityType::IndicesType; using IndicesIncidentType = typename ConnectivityType::IndicesType;
using CellShapeTag = typename ConnectivityType::CellShapeTag; using CellShapeTag = typename ConnectivityType::CellShapeTag;
using LogicalIndexType = typename ConnectivityType::SchedulingRangeType; using LogicalIndexType = typename ConnectivityType::SchedulingRangeType;
@ -325,7 +326,7 @@ public:
const vtkm::Id permutedIndex = permutation.Portal.Get(this->InputIndex); const vtkm::Id permutedIndex = permutation.Portal.Get(this->InputIndex);
this->LogicalIndex = permutation.Connectivity.FlatToLogicalToIndex(permutedIndex); this->LogicalIndex = permutation.Connectivity.FlatToLogicalToIndex(permutedIndex);
this->IndicesFrom = permutation.Connectivity.GetIndices(this->LogicalIndex); this->IndicesIncident = permutation.Connectivity.GetIndices(this->LogicalIndex);
this->CellShape = permutation.Connectivity.GetCellShape(permutedIndex); this->CellShape = permutation.Connectivity.GetCellShape(permutedIndex);
this->GlobalThreadIndexOffset = globalThreadIndexOffset; this->GlobalThreadIndexOffset = globalThreadIndexOffset;
} }
@ -384,19 +385,19 @@ public:
VTKM_EXEC VTKM_EXEC
vtkm::Id GetGlobalIndex() const { return (this->GlobalThreadIndexOffset + this->OutputIndex); } vtkm::Id GetGlobalIndex() const { return (this->GlobalThreadIndexOffset + this->OutputIndex); }
/// \brief The input indices of the "from" elements. /// \brief The indices of the incident elements.
/// ///
/// A topology map has "from" and "to" elements (for example from points to /// A topology map has "visited" and "incident" elements (e.g. points, cells,
/// cells). For each worklet invocation, there is exactly one "to" element, /// etc). For each worklet invocation, there is exactly one visited element,
/// but can be several "from" element. This method returns a Vec-like object /// but there can be several incident elements. This method returns a
/// containing the indices to the "from" elements. /// Vec-like object containing the indices to the incident elements.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType& GetIndicesFrom() const { return this->IndicesFrom; } const IndicesIncidentType& GetIndicesIncident() const { return this->IndicesIncident; }
/// \brief The input indices of the "from" elements in pointer form. /// \brief The input indices of the incident elements in pointer form.
/// ///
/// Returns the same object as GetIndicesFrom except that it returns a /// Returns the same object as GetIndicesIncident except that it returns a
/// pointer to the internally held object rather than a reference or copy. /// pointer to the internally held object rather than a reference or copy.
/// Since the from indices can be a sizeable Vec (8 entries is common), it is /// Since the from indices can be a sizeable Vec (8 entries is common), it is
/// best not to have a bunch a copies. Thus, you can pass around a pointer /// best not to have a bunch a copies. Thus, you can pass around a pointer
@ -404,7 +405,7 @@ public:
/// not go out of scope, at which time the returned pointer becomes invalid. /// not go out of scope, at which time the returned pointer becomes invalid.
/// ///
VTKM_EXEC VTKM_EXEC
const IndicesFromType* GetIndicesFromPointer() const { return &this->IndicesFrom; } const IndicesIncidentType* GetIndicesIncidentPointer() const { return &this->IndicesIncident; }
/// \brief The shape of the input cell. /// \brief The shape of the input cell.
/// ///
@ -422,7 +423,7 @@ private:
vtkm::IdComponent VisitIndex; vtkm::IdComponent VisitIndex;
vtkm::Id OutputIndex; vtkm::Id OutputIndex;
LogicalIndexType LogicalIndex; LogicalIndexType LogicalIndex;
IndicesFromType IndicesFrom; IndicesIncidentType IndicesIncident;
CellShapeTag CellShape; CellShapeTag CellShape;
vtkm::Id GlobalThreadIndexOffset; vtkm::Id GlobalThreadIndexOffset;
}; };

@ -105,8 +105,8 @@ struct FetchArrayNeighborhoodInTests
vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals; vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals;
connectivityInternals.SetPointDimensions(POINT_DIMS); connectivityInternals.SetPointDimensions(POINT_DIMS);
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint,
vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell,
3> 3>
connectivity(connectivityInternals); connectivity(connectivityInternals);

@ -107,8 +107,8 @@ struct FetchArrayTopologyMapInTests
vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals; vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals;
connectivityInternals.SetPointDimensions(vtkm::Id3(2, 2, 2)); connectivityInternals.SetPointDimensions(vtkm::Id3(2, 2, 2));
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
3> 3>
connectivity(connectivityInternals); connectivity(connectivityInternals);
@ -182,8 +182,8 @@ void TryStructuredPointCoordinatesInvocation(const Invocation& invocation)
template <vtkm::IdComponent NumDimensions> template <vtkm::IdComponent NumDimensions>
void TryStructuredPointCoordinates( void TryStructuredPointCoordinates(
const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, const vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell,
vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint,
NumDimensions>& connectivity, NumDimensions>& connectivity,
const vtkm::internal::ArrayPortalUniformPointCoordinates& coordinates) const vtkm::internal::ArrayPortalUniformPointCoordinates& coordinates)
{ {
@ -221,21 +221,21 @@ void TryStructuredPointCoordinates()
std::cout << "3D" << std::endl; std::cout << "3D" << std::endl;
vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals3d; vtkm::internal::ConnectivityStructuredInternals<3> connectivityInternals3d;
connectivityInternals3d.SetPointDimensions(vtkm::Id3(3, 2, 2)); connectivityInternals3d.SetPointDimensions(vtkm::Id3(3, 2, 2));
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 3> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 3>
connectivity3d(connectivityInternals3d); connectivity3d(connectivityInternals3d);
TryStructuredPointCoordinates(connectivity3d, coordinates); TryStructuredPointCoordinates(connectivity3d, coordinates);
std::cout << "2D" << std::endl; std::cout << "2D" << std::endl;
vtkm::internal::ConnectivityStructuredInternals<2> connectivityInternals2d; vtkm::internal::ConnectivityStructuredInternals<2> connectivityInternals2d;
connectivityInternals2d.SetPointDimensions(vtkm::Id2(3, 2)); connectivityInternals2d.SetPointDimensions(vtkm::Id2(3, 2));
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 2> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 2>
connectivity2d(connectivityInternals2d); connectivity2d(connectivityInternals2d);
TryStructuredPointCoordinates(connectivity2d, coordinates); TryStructuredPointCoordinates(connectivity2d, coordinates);
std::cout << "1D" << std::endl; std::cout << "1D" << std::endl;
vtkm::internal::ConnectivityStructuredInternals<1> connectivityInternals1d; vtkm::internal::ConnectivityStructuredInternals<1> connectivityInternals1d;
connectivityInternals1d.SetPointDimensions(3); connectivityInternals1d.SetPointDimensions(3);
vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagPoint, vtkm::TopologyElementTagCell, 1> vtkm::exec::ConnectivityStructured<vtkm::TopologyElementTagCell, vtkm::TopologyElementTagPoint, 1>
connectivity1d(connectivityInternals1d); connectivity1d(connectivityInternals1d);
TryStructuredPointCoordinates(connectivity1d, coordinates); TryStructuredPointCoordinates(connectivity1d, coordinates);
} }

Some files were not shown because too many files have changed in this diff Show More