Merge topic 'flying-edges-cell-fields'

8a9887023 Add regression test for flying edges interpolating cell fields
4f19ac608 Fix interpolation of cell fields with flying edges

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3129
This commit is contained in:
Kenneth Moreland 2023-08-31 14:28:27 +00:00 committed by Kitware Robot
commit e5723a4219
4 changed files with 48 additions and 5 deletions

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0d4ecc87a7d69d32eb5a7ade1ce0daac57a3a09902accb2c3bba62f00c25b62f
size 58412

@ -0,0 +1,5 @@
# Fix interpolation of cell fields with flying edges
The flying edges algorithm (used when contouring uniform structured cell
sets) was not interpolating cell fields correctly. There was an indexing
issue where a shortcut in the stepping was not incrementing the cell index.

@ -16,6 +16,7 @@
#include <vtkm/filter/clean_grid/CleanGrid.h> #include <vtkm/filter/clean_grid/CleanGrid.h>
#include <vtkm/filter/contour/Contour.h> #include <vtkm/filter/contour/Contour.h>
#include <vtkm/filter/field_conversion/CellAverage.h>
#include <vtkm/filter/field_transform/PointElevation.h> #include <vtkm/filter/field_transform/PointElevation.h>
#include <vtkm/source/Tangle.h> #include <vtkm/source/Tangle.h>
@ -61,7 +62,6 @@ void TestContourFilterUniform()
contour.SetMergeDuplicatePoints(true); contour.SetMergeDuplicatePoints(true);
contour.SetIsoValues({ 50, 100, 150 }); contour.SetIsoValues({ 50, 100, 150 });
contour.SetActiveField(fieldName); contour.SetActiveField(fieldName);
contour.SetFieldsToPass(fieldName);
vtkm::cont::DataSet result = contour.Execute(inputData); vtkm::cont::DataSet result = contour.Execute(inputData);
result.PrintSummary(std::cout); result.PrintSummary(std::cout);
@ -70,6 +70,36 @@ void TestContourFilterUniform()
vtkm::rendering::testing::RenderTestOptions testOptions; vtkm::rendering::testing::RenderTestOptions testOptions;
vtkm::rendering::testing::RenderTest( vtkm::rendering::testing::RenderTest(
result, "pointvar", "filter/contour-uniform.png", testOptions); result, "pointvar", "filter/contour-uniform.png", testOptions);
std::cout << "Generate image for contour filter on a uniform grid with a cell field" << std::endl;
inputData = maker.Make3DUniformDataSet2();
VTKM_TEST_ASSERT(inputData.HasField(fieldName));
std::string cellFieldName = "elevation";
vtkm::filter::field_transform::PointElevation elevation;
vtkm::Bounds bounds = inputData.GetCoordinateSystem().GetBounds();
elevation.SetLowPoint(bounds.MinCorner());
elevation.SetHighPoint(bounds.MaxCorner());
elevation.SetRange(0, 1);
elevation.SetOutputFieldName(cellFieldName);
elevation.SetUseCoordinateSystemAsField(true);
inputData = elevation.Execute(inputData);
vtkm::filter::field_conversion::CellAverage point2cell;
point2cell.SetActiveField(cellFieldName);
point2cell.SetFieldsToPass(fieldName);
inputData = point2cell.Execute(inputData);
VTKM_TEST_ASSERT(inputData.HasPointField(fieldName));
VTKM_TEST_ASSERT(inputData.HasCellField(cellFieldName));
contour.SetIsoValues({ 80 });
result = contour.Execute(inputData);
result.PrintSummary(std::cout);
vtkm::rendering::testing::RenderTest(
result, cellFieldName, "filter/contour-uniform-cellfield.png", testOptions);
} }
void TestContourFilterUniformBoundaries() void TestContourFilterUniformBoundaries()

@ -28,15 +28,19 @@ VTKM_EXEC inline vtkm::Id3 compute_incs3d(const vtkm::Id3& dims)
return vtkm::Id3{ 1, dims[0], (dims[0] * dims[1]) }; return vtkm::Id3{ 1, dims[0], (dims[0] * dims[1]) };
} }
VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumXAxis, vtkm::Id cellId, vtkm::Id) VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumXAxis,
vtkm::Id cellId,
vtkm::Id,
vtkm::Id numToIncrement = 1)
{ {
return cellId + 1; return cellId + numToIncrement;
} }
VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumYAxis, VTKM_EXEC inline constexpr vtkm::Id increment_cellId(SumYAxis,
vtkm::Id cellId, vtkm::Id cellId,
vtkm::Id y_point_axis_inc) vtkm::Id y_point_axis_inc,
vtkm::Id numToIncrement = 1)
{ {
return cellId + (y_point_axis_inc - 1); return cellId + ((y_point_axis_inc - 1) * numToIncrement);
} }
VTKM_EXEC inline bool case_includes_axes(vtkm::UInt8 const* const edgeUses) VTKM_EXEC inline bool case_includes_axes(vtkm::UInt8 const* const edgeUses)
@ -159,6 +163,7 @@ struct Pass4TrimState
cellId = compute_start(AxisToSum{}, ijk, pdims - vtkm::Id3{ 1, 1, 1 }); cellId = compute_start(AxisToSum{}, ijk, pdims - vtkm::Id3{ 1, 1, 1 });
//update our ijk //update our ijk
cellId = increment_cellId(AxisToSum{}, cellId, axis_inc, left - ijk[AxisToSum::xindex]);
ijk[AxisToSum::xindex] = left; ijk[AxisToSum::xindex] = left;
boundaryStatus[0] = FlyingEdges3D::Interior; boundaryStatus[0] = FlyingEdges3D::Interior;