1 //============================================================================
2 //  Copyright (c) Kitware, Inc.
3 //  All rights reserved.
4 //  See LICENSE.txt for details.
5 //  This software is distributed WITHOUT ANY WARRANTY; without even
6 //  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7 //  PURPOSE.  See the above copyright notice for more information.
8 //
9 //  Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
10 //  Copyright 2014 UT-Battelle, LLC.
11 //  Copyright 2014 Los Alamos National Security.
12 //
13 //  Under the terms of Contract DE-NA0003525 with NTESS,
14 //  the U.S. Government retains certain rights in this software.
15 //
16 //  Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
17 //  Laboratory (LANL), the U.S. Government retains certain rights in
18 //  this software.
19 //============================================================================
20 
21 #include <vtkm/cont/testing/MakeTestDataSet.h>
22 #include <vtkm/cont/testing/Testing.h>
23 
24 #include <vtkm/filter/ExtractPoints.h>
25 
26 using vtkm::cont::testing::MakeTestDataSet;
27 
28 namespace
29 {
30 
31 class TestingExtractPoints
32 {
33 public:
TestUniformByBox0() const34   void TestUniformByBox0() const
35   {
36     std::cout << "Testing extract points with implicit function (box):" << std::endl;
37     vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
38 
39     // Implicit function
40     vtkm::Vec<vtkm::FloatDefault, 3> minPoint(1.f, 1.f, 1.f);
41     vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(3.f, 3.f, 3.f);
42     auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
43 
44     // Setup and run filter to extract by volume of interest
45     vtkm::filter::ExtractPoints extractPoints;
46     extractPoints.SetImplicitFunction(box);
47     extractPoints.SetExtractInside(true);
48     extractPoints.SetCompactPoints(true);
49 
50     vtkm::cont::DataSet output = extractPoints.Execute(dataset);
51     VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 27),
52                      "Wrong result for ExtractPoints");
53 
54     vtkm::cont::ArrayHandle<vtkm::Float32> outPointData;
55     output.GetField("pointvar").GetData().CopyTo(outPointData);
56 
57     VTKM_TEST_ASSERT(
58       test_equal(output.GetCellSet(0).GetNumberOfPoints(), outPointData.GetNumberOfValues()),
59       "Data/Geometry mismatch for ExtractPoints filter");
60 
61     VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(0) == 99.0f,
62                      "Wrong point field data");
63     VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(26) == 97.0f,
64                      "Wrong point field data");
65   }
66 
TestUniformByBox1() const67   void TestUniformByBox1() const
68   {
69     std::cout << "Testing extract points with implicit function (box):" << std::endl;
70     vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
71 
72     // Implicit function
73     vtkm::Vec<vtkm::FloatDefault, 3> minPoint(1.f, 1.f, 1.f);
74     vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(3.f, 3.f, 3.f);
75     auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
76 
77     // Setup and run filter to extract by volume of interest
78     vtkm::filter::ExtractPoints extractPoints;
79     extractPoints.SetImplicitFunction(box);
80     extractPoints.SetExtractInside(false);
81     extractPoints.SetCompactPoints(true);
82 
83     vtkm::cont::DataSet output = extractPoints.Execute(dataset);
84     VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 98),
85                      "Wrong result for ExtractPoints");
86 
87     vtkm::cont::ArrayHandle<vtkm::Float32> outPointData;
88     output.GetField("pointvar").GetData().CopyTo(outPointData);
89 
90     VTKM_TEST_ASSERT(
91       test_equal(output.GetCellSet(0).GetNumberOfPoints(), outPointData.GetNumberOfValues()),
92       "Data/Geometry mismatch for ExtractPoints filter");
93 
94     for (vtkm::Id i = 0; i < output.GetCellSet(0).GetNumberOfPoints(); i++)
95     {
96       VTKM_TEST_ASSERT(outPointData.GetPortalConstControl().Get(i) == 0.0f,
97                        "Wrong point field data");
98     }
99   }
100 
TestUniformBySphere() const101   void TestUniformBySphere() const
102   {
103     std::cout << "Testing extract points with implicit function (sphere):" << std::endl;
104     vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DUniformDataSet1();
105 
106     // Implicit function
107     vtkm::Vec<vtkm::FloatDefault, 3> center(2.f, 2.f, 2.f);
108     vtkm::FloatDefault radius(1.8f);
109     auto sphere = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Sphere>(center, radius);
110 
111     // Setup and run filter to extract by volume of interest
112     vtkm::filter::ExtractPoints extractPoints;
113     extractPoints.SetImplicitFunction(sphere);
114     extractPoints.SetExtractInside(true);
115 
116     vtkm::cont::DataSet output = extractPoints.Execute(dataset);
117     VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 27),
118                      "Wrong result for ExtractPoints");
119   }
120 
TestExplicitByBox0() const121   void TestExplicitByBox0() const
122   {
123     std::cout << "Testing extract points with implicit function (box):" << std::endl;
124     vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DExplicitDataSet5();
125 
126     // Implicit function
127     vtkm::Vec<vtkm::FloatDefault, 3> minPoint(0.f, 0.f, 0.f);
128     vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(1.f, 1.f, 1.f);
129     auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
130 
131     // Setup and run filter to extract by volume of interest
132     vtkm::filter::ExtractPoints extractPoints;
133     extractPoints.SetImplicitFunction(box);
134     extractPoints.SetExtractInside(true);
135 
136     vtkm::cont::DataSet output = extractPoints.Execute(dataset);
137     VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 8),
138                      "Wrong result for ExtractPoints");
139   }
140 
TestExplicitByBox1() const141   void TestExplicitByBox1() const
142   {
143     std::cout << "Testing extract points with implicit function (box):" << std::endl;
144     vtkm::cont::DataSet dataset = MakeTestDataSet().Make3DExplicitDataSet5();
145 
146     // Implicit function
147     vtkm::Vec<vtkm::FloatDefault, 3> minPoint(0.f, 0.f, 0.f);
148     vtkm::Vec<vtkm::FloatDefault, 3> maxPoint(1.f, 1.f, 1.f);
149     auto box = vtkm::cont::make_ImplicitFunctionHandle<vtkm::Box>(minPoint, maxPoint);
150 
151     // Setup and run filter to extract by volume of interest
152     vtkm::filter::ExtractPoints extractPoints;
153     extractPoints.SetImplicitFunction(box);
154     extractPoints.SetExtractInside(false);
155 
156     vtkm::cont::DataSet output = extractPoints.Execute(dataset);
157     VTKM_TEST_ASSERT(test_equal(output.GetCellSet().GetNumberOfCells(), 3),
158                      "Wrong result for ExtractPoints");
159   }
160 
operator ()() const161   void operator()() const
162   {
163     this->TestUniformByBox0();
164     this->TestUniformByBox1();
165     this->TestUniformBySphere();
166     this->TestExplicitByBox0();
167     this->TestExplicitByBox1();
168   }
169 };
170 }
171 
UnitTestExtractPointsFilter(int,char * [])172 int UnitTestExtractPointsFilter(int, char* [])
173 {
174   return vtkm::cont::testing::Testing::Run(TestingExtractPoints());
175 }
176