Use CreateResult mechanism for copying PDS fields.

This commit is contained in:
Dave Pugmire 2022-08-26 08:55:54 -04:00
parent 7d60c390ce
commit 71c6f034d9
5 changed files with 32 additions and 13 deletions

@ -143,6 +143,12 @@ void PartitionedDataSet::ReplacePartition(vtkm::Id index, const vtkm::cont::Data
}
}
VTKM_CONT
void PartitionedDataSet::CopyStructure(const vtkm::cont::PartitionedDataSet& source)
{
this->Partitions = source.Partitions;
}
VTKM_CONT
void PartitionedDataSet::PrintSummary(std::ostream& stream) const
{

@ -218,6 +218,10 @@ public:
}
//@}
/// Copies the structure i.e. partitions from the source. The fields are left unchanged.
VTKM_CONT
void CopyStructure(const vtkm::cont::PartitionedDataSet& source);
VTKM_CONT
void PrintSummary(std::ostream& stream) const;

@ -88,7 +88,7 @@ vtkm::cont::PartitionedDataSet NewFilter::DoExecutePartitions(
}
}
return output;
return this->CreateResult(input, output);
}
vtkm::cont::DataSet NewFilter::Execute(const vtkm::cont::DataSet& input)
@ -103,14 +103,7 @@ vtkm::cont::PartitionedDataSet NewFilter::Execute(const vtkm::cont::PartitionedD
(int)input.GetNumberOfPartitions(),
vtkm::cont::TypeToString<decltype(*this)>().c_str());
vtkm::cont::PartitionedDataSet output = this->DoExecutePartitions(input);
//Copy any fields.
vtkm::Id numFields = static_cast<vtkm::Id>(input.GetNumberOfFields());
for (vtkm::Id i = 0; i < numFields; i++)
output.AddField(input.GetField(i));
return output;
return this->DoExecutePartitions(input);
}
vtkm::cont::DataSet NewFilter::CreateResult(const vtkm::cont::DataSet& inDataSet) const
@ -124,6 +117,20 @@ vtkm::cont::DataSet NewFilter::CreateResult(const vtkm::cont::DataSet& inDataSet
return clone;
}
vtkm::cont::PartitionedDataSet NewFilter::CreateResult(
const vtkm::cont::PartitionedDataSet& input,
const vtkm::cont::PartitionedDataSet& output) const
{
vtkm::cont::PartitionedDataSet clone;
clone.CopyStructure(output);
this->MapFieldsOntoOutput(
input, clone, [](vtkm::cont::PartitionedDataSet& out, const vtkm::cont::Field& fieldToPass) {
out.AddField(fieldToPass);
});
return clone;
}
vtkm::Id NewFilter::DetermineNumberOfThreads(const vtkm::cont::PartitionedDataSet& input)
{
vtkm::Id numDS = input.GetNumberOfPartitions();

@ -326,6 +326,9 @@ protected:
/// fields of `inDataSet` (as selected by the `FieldsToPass` state of the filter).
///
VTKM_CONT vtkm::cont::DataSet CreateResult(const vtkm::cont::DataSet& inDataSet) const;
VTKM_CONT vtkm::cont::PartitionedDataSet CreateResult(
const vtkm::cont::PartitionedDataSet& input,
const vtkm::cont::PartitionedDataSet& output) const;
/// \brief Create the output data set for `DoExecute`.
///
@ -431,9 +434,9 @@ protected:
const vtkm::cont::PartitionedDataSet& inData);
private:
template <typename FieldMapper>
VTKM_CONT void MapFieldsOntoOutput(const vtkm::cont::DataSet& input,
vtkm::cont::DataSet& output,
template <typename DataType, typename FieldMapper>
VTKM_CONT void MapFieldsOntoOutput(const DataType& input,
DataType& output,
FieldMapper&& fieldMapper) const
{
for (vtkm::IdComponent cc = 0; cc < input.GetNumberOfFields(); ++cc)

@ -115,7 +115,6 @@ void TestPartitionedDataSetFilters()
result = cellAverage.Execute(partitions);
Result_Verify<vtkm::FloatDefault>(result, cellAverage, partitions, std::string("pointvar"));
//Make sure that any Fields are propagated to the output.
partitionNum = 3;
partitions = PartitionedDataSetBuilder<vtkm::FloatDefault>(partitionNum, "pointvar");