Copy PDS fields in filter. Add more tests.

This commit is contained in:
Dave Pugmire 2022-08-25 09:28:35 -04:00
parent 75b9c398f0
commit fa401ba016
2 changed files with 96 additions and 3 deletions

@ -41,7 +41,7 @@ static void PartitionedDataSetTest()
std::vector<vtkm::Id> ids = { 0, 1 };
std::vector<vtkm::FloatDefault> var = { 1, 2 };
auto idsField = vtkm::cont::make_Field(
"ids", vtkm::cont::Field::Association::WholeMesh, ids, vtkm::CopyFlag::On);
"ids", vtkm::cont::Field::Association::Partitions, ids, vtkm::CopyFlag::On);
auto pdsVar = vtkm::cont::make_Field(
"pds_var", vtkm::cont::Field::Association::AllPartitions, ids, vtkm::CopyFlag::On);
pds.AddField(idsField);
@ -110,7 +110,7 @@ static void PartitionedDataSetTest()
pdsVar.GetRange(&SourceRange);
pds.GetField("pds_var").GetRange(&TestRange);
VTKM_TEST_ASSERT(TestRange == SourceRange, "WholePartitions field values incorrect");
VTKM_TEST_ASSERT(TestRange == SourceRange, "AllPartitions field values incorrect");
vtkm::cont::PartitionedDataSet testblocks1;
std::vector<vtkm::cont::DataSet> partitions = pds.GetPartitions();
@ -138,6 +138,88 @@ static void PartitionedDataSetTest()
DataSet_Compare(TDset1, TestDSet);
}
static void PartitionedDataSetFieldTest()
{
vtkm::cont::testing::MakeTestDataSet testDataSet;
vtkm::cont::DataSet TDset1 = testDataSet.Make2DUniformDataSet0();
vtkm::cont::DataSet TDset2 = testDataSet.Make3DUniformDataSet0();
constexpr vtkm::Id id0 = 0, id1 = 1;
constexpr vtkm::FloatDefault globalScalar = 1.0f;
for (int i = 0; i < 4; i++)
{
vtkm::cont::PartitionedDataSet pds({ TDset1, TDset2 });
std::vector<vtkm::Id> ids = { id0, id1 };
std::vector<vtkm::FloatDefault> gs = { globalScalar };
auto idsArr = vtkm::cont::make_ArrayHandle(ids, vtkm::CopyFlag::Off);
auto gsArr = vtkm::cont::make_ArrayHandle(gs, vtkm::CopyFlag::Off);
if (i == 0) //field
{
auto idField = vtkm::cont::make_Field(
"id", vtkm::cont::Field::Association::Partitions, ids, vtkm::CopyFlag::Off);
auto gScalar = vtkm::cont::make_Field(
"global_scalar", vtkm::cont::Field::Association::AllPartitions, gs, vtkm::CopyFlag::Off);
pds.AddField(idField);
pds.AddField(gScalar);
}
else if (i == 1) //array handle
{
pds.AddPartitionsField("id", idsArr);
pds.AddAllPartitionsField("global_scalar", gsArr);
}
else if (i == 2) //std::vector
{
pds.AddPartitionsField("id", ids);
pds.AddAllPartitionsField("global_scalar", gs);
}
else if (i == 3) //pointer
{
pds.AddPartitionsField("id", ids.data(), 2);
pds.AddAllPartitionsField("global_scalar", gs.data(), 1);
}
//Validate each method.
VTKM_TEST_ASSERT(pds.GetNumberOfFields() == 2, "Wrong number of fields");
//Make sure fields are there and of the right type.
VTKM_TEST_ASSERT(pds.HasField("id") && pds.HasPartitionsField("id"), "id field misssing.");
VTKM_TEST_ASSERT(pds.HasField("global_scalar") && pds.HasAllPartitionsField("global_scalar"),
"global_scalar field misssing.");
for (int j = 0; j < 2; j++)
{
vtkm::cont::Field f0, f1;
if (j == 0)
{
f0 = pds.GetField("id");
f1 = pds.GetField("global_scalar");
}
else
{
f0 = pds.GetPartitionsField("id");
f1 = pds.GetAllPartitionsField("global_scalar");
}
//Check the values.
auto portal0 = f0.GetData().AsArrayHandle<vtkm::cont::ArrayHandle<vtkm::Id>>().ReadPortal();
auto portal1 =
f1.GetData().AsArrayHandle<vtkm::cont::ArrayHandle<vtkm::FloatDefault>>().ReadPortal();
VTKM_TEST_ASSERT(portal0.GetNumberOfValues() == 2, "Wrong number of values in field");
VTKM_TEST_ASSERT(portal1.GetNumberOfValues() == 1, "Wrong number of values in field");
VTKM_TEST_ASSERT(portal0.Get(0) == id0 && portal0.Get(1) == id1, "Wrong field value");
VTKM_TEST_ASSERT(portal1.Get(0) == globalScalar, "Wrong field value");
}
}
}
void DataSet_Compare(vtkm::cont::DataSet& leftDataSet, vtkm::cont::DataSet& rightDataSet)
{
for (vtkm::Id j = 0; j < leftDataSet.GetNumberOfFields(); j++)
@ -151,7 +233,13 @@ void DataSet_Compare(vtkm::cont::DataSet& leftDataSet, vtkm::cont::DataSet& righ
return;
}
static void PartitionedDataSetTests()
{
PartitionedDataSetTest();
PartitionedDataSetFieldTest();
}
int UnitTestPartitionedDataSet(int argc, char* argv[])
{
return vtkm::cont::testing::Testing::Run(PartitionedDataSetTest, argc, argv);
return vtkm::cont::testing::Testing::Run(PartitionedDataSetTests, argc, argv);
}

@ -88,6 +88,11 @@ vtkm::cont::PartitionedDataSet NewFilter::DoExecutePartitions(
}
}
//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;
}