1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //============================================================================
10
11 #include <vtkm/CellShape.h>
12 #include <vtkm/VectorAnalysis.h>
13 #include <vtkm/cont/ArrayHandle.h>
14 #include <vtkm/cont/CellSetStructured.h>
15 #include <vtkm/cont/DataSet.h>
16
17 #include <vtkm/cont/PartitionedDataSet.h>
18 #include <vtkm/cont/serial/DeviceAdapterSerial.h>
19 #include <vtkm/exec/ConnectivityStructured.h>
20
21 #include <vtkm/cont/testing/MakeTestDataSet.h>
22 #include <vtkm/cont/testing/Testing.h>
23 #include <vtkm/filter/CellAverage.h>
24
25
26 template <typename T>
PartitionedDataSetBuilder(std::size_t partitionNum,std::string fieldName)27 vtkm::cont::PartitionedDataSet PartitionedDataSetBuilder(std::size_t partitionNum,
28 std::string fieldName)
29 {
30 vtkm::cont::DataSetBuilderUniform dataSetBuilder;
31 vtkm::cont::DataSet dataSet;
32
33 vtkm::Vec<T, 2> origin(0);
34 vtkm::Vec<T, 2> spacing(1);
35 vtkm::cont::PartitionedDataSet partitions;
36 for (vtkm::Id partId = 0; partId < static_cast<vtkm::Id>(partitionNum); partId++)
37 {
38 vtkm::Id2 dimensions((partId + 2) * (partId + 2), (partId + 2) * (partId + 2));
39
40 if (fieldName == "cellvar")
41 {
42 vtkm::Id numCells = (dimensions[0] - 1) * (dimensions[1] - 1);
43
44 std::vector<T> varC2D(static_cast<std::size_t>(numCells));
45 for (vtkm::Id i = 0; i < numCells; i++)
46 {
47 varC2D[static_cast<std::size_t>(i)] = static_cast<T>(partId * i);
48 }
49 dataSet = dataSetBuilder.Create(vtkm::Id2(dimensions[0], dimensions[1]),
50 vtkm::Vec<T, 2>(origin[0], origin[1]),
51 vtkm::Vec<T, 2>(spacing[0], spacing[1]));
52 dataSet.AddCellField("cellvar", varC2D);
53 }
54
55 if (fieldName == "pointvar")
56 {
57 vtkm::Id numPoints = dimensions[0] * dimensions[1];
58 std::vector<T> varP2D(static_cast<std::size_t>(numPoints));
59 for (vtkm::Id i = 0; i < numPoints; i++)
60 {
61 varP2D[static_cast<std::size_t>(i)] = static_cast<T>(partId);
62 }
63 dataSet = dataSetBuilder.Create(vtkm::Id2(dimensions[0], dimensions[1]),
64 vtkm::Vec<T, 2>(origin[0], origin[1]),
65 vtkm::Vec<T, 2>(spacing[0], spacing[1]));
66 dataSet.AddPointField("pointvar", varP2D);
67 }
68
69 partitions.AppendPartition(dataSet);
70 }
71 return partitions;
72 }
73 template <typename T, typename D>
Result_Verify(const vtkm::cont::PartitionedDataSet & result,D & filter,const vtkm::cont::PartitionedDataSet & partitions,std::string fieldName)74 void Result_Verify(const vtkm::cont::PartitionedDataSet& result,
75 D& filter,
76 const vtkm::cont::PartitionedDataSet& partitions,
77 std::string fieldName)
78 {
79 VTKM_TEST_ASSERT(result.GetNumberOfPartitions() == partitions.GetNumberOfPartitions(),
80 "result partition number incorrect");
81 const std::string outputFieldName = filter.GetOutputFieldName();
82 for (vtkm::Id j = 0; j < result.GetNumberOfPartitions(); j++)
83 {
84 filter.SetActiveField(fieldName);
85 vtkm::cont::DataSet partitionResult = filter.Execute(partitions.GetPartition(j));
86
87 VTKM_TEST_ASSERT(result.GetPartition(j).GetField(outputFieldName).GetNumberOfValues() ==
88 partitionResult.GetField(outputFieldName).GetNumberOfValues(),
89 "result vectors' size incorrect");
90
91 vtkm::cont::ArrayHandle<T> partitionArray;
92 result.GetPartition(j).GetField(outputFieldName).GetData().AsArrayHandle(partitionArray);
93 vtkm::cont::ArrayHandle<T> sDataSetArray;
94 partitionResult.GetField(outputFieldName).GetData().AsArrayHandle(sDataSetArray);
95
96 const vtkm::Id numValues = result.GetPartition(j).GetField(outputFieldName).GetNumberOfValues();
97 for (vtkm::Id i = 0; i < numValues; i++)
98 {
99 VTKM_TEST_ASSERT(partitionArray.ReadPortal().Get(i) == sDataSetArray.ReadPortal().Get(i),
100 "result values incorrect");
101 }
102 }
103 return;
104 }
105
TestPartitionedDataSetFilters()106 void TestPartitionedDataSetFilters()
107 {
108 std::size_t partitionNum = 7;
109 vtkm::cont::PartitionedDataSet result;
110 vtkm::cont::PartitionedDataSet partitions;
111
112 partitions = PartitionedDataSetBuilder<vtkm::FloatDefault>(partitionNum, "pointvar");
113 vtkm::filter::CellAverage cellAverage;
114 cellAverage.SetOutputFieldName("average");
115 cellAverage.SetActiveField("pointvar");
116 result = cellAverage.Execute(partitions);
117 Result_Verify<vtkm::FloatDefault>(result, cellAverage, partitions, std::string("pointvar"));
118 }
119
UnitTestPartitionedDataSetFilters(int argc,char * argv[])120 int UnitTestPartitionedDataSetFilters(int argc, char* argv[])
121 {
122 return vtkm::cont::testing::Testing::Run(TestPartitionedDataSetFilters, argc, argv);
123 }
124