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