Add fields to vtkm::cont::PartitionedDataSet

This commit is contained in:
Dave Pugmire 2022-08-22 08:43:15 -04:00
parent 4cc930c400
commit cbdb797f1e
6 changed files with 160 additions and 4 deletions

@ -190,6 +190,12 @@ void DataSet::PrintSummary(std::ostream& out) const
VTKM_CONT void DataSet::AddField(const Field& field)
{
// map::insert will not replace the duplicated element
if (field.GetAssociation() == vtkm::cont::Field::Association::Partitions ||
field.GetAssociation() == vtkm::cont::Field::Association::WholePartition)
{
throw vtkm::cont::ErrorBadValue("Association not valid for DataSet.");
}
this->Fields[{ field.GetName(), field.GetAssociation() }] = field;
}

@ -97,6 +97,12 @@ void Field::PrintSummary(std::ostream& out) const
case Association::Cells:
out << "Cells ";
break;
case Association::WholePartition:
out << "WholePartition ";
break;
case Association::Partitions:
out << "Partitions ";
break;
}
this->Data.PrintSummary(out);
}

@ -37,6 +37,8 @@ public:
WholeMesh,
Points,
Cells,
WholePartition,
Partitions,
ANY VTKM_DEPRECATED(1.8, "Use vtkm::cont::Field::Association::Any.") = Any,
WHOLE_MESH VTKM_DEPRECATED(1.8, "Use vtkm::cont::Field::Association::WholeMesh.") = WholeMesh,
POINTS VTKM_DEPRECATED(1.8, "Use vtkm::cont::Field::Association::Points.") = Points,

@ -66,14 +66,79 @@ PartitionedDataSet& PartitionedDataSet::operator=(const vtkm::cont::PartitionedD
}
VTKM_CONT
vtkm::cont::Field PartitionedDataSet::GetField(const std::string& field_name,
int partition_index) const
vtkm::cont::Field PartitionedDataSet::GetPartitionField(const std::string& field_name,
int partition_index) const
{
assert(partition_index >= 0);
assert(static_cast<std::size_t>(partition_index) < this->Partitions.size());
return this->Partitions[static_cast<std::size_t>(partition_index)].GetField(field_name);
}
VTKM_CONT void PartitionedDataSet::AddField(const Field& field)
{
// map::insert will not replace the duplicated element
if (field.GetAssociation() == vtkm::cont::Field::Association::Cells ||
field.GetAssociation() == vtkm::cont::Field::Association::Points ||
field.GetAssociation() == vtkm::cont::Field::Association::WholeMesh)
{
throw vtkm::cont::ErrorBadValue("Association not valid for PartitionedDataSet.");
}
this->Fields[{ field.GetName(), field.GetAssociation() }] = field;
}
const vtkm::cont::Field& PartitionedDataSet::GetField(const std::string& name,
vtkm::cont::Field::Association assoc) const
{
auto idx = this->GetFieldIndex(name, assoc);
if (idx == -1)
{
throw vtkm::cont::ErrorBadValue("No field with requested name: " + name);
}
return this->GetField(idx);
}
vtkm::cont::Field& PartitionedDataSet::GetField(const std::string& name,
vtkm::cont::Field::Association assoc)
{
auto idx = this->GetFieldIndex(name, assoc);
if (idx == -1)
{
throw vtkm::cont::ErrorBadValue("No field with requested name: " + name);
}
return this->GetField(idx);
}
const vtkm::cont::Field& PartitionedDataSet::GetField(vtkm::Id index) const
{
VTKM_ASSERT((index >= 0) && (index < this->GetNumberOfFields()));
auto it = this->Fields.cbegin();
std::advance(it, index);
return it->second;
}
vtkm::cont::Field& PartitionedDataSet::GetField(vtkm::Id index)
{
VTKM_ASSERT((index >= 0) && (index < this->GetNumberOfFields()));
auto it = this->Fields.begin();
std::advance(it, index);
return it->second;
}
vtkm::Id PartitionedDataSet::GetFieldIndex(const std::string& name,
vtkm::cont::Field::Association assoc) const
{
const auto it = this->Fields.find({ name, assoc });
if (it != this->Fields.end())
{
return static_cast<vtkm::Id>(std::distance(this->Fields.begin(), it));
}
return -1;
}
VTKM_CONT
vtkm::Id PartitionedDataSet::GetNumberOfPartitions() const
{

@ -21,6 +21,8 @@ namespace vtkm
namespace cont
{
//Should field data and methods be put into a base class for DataSet and PartitionedDataSet ???
class VTKM_CONT_EXPORT PartitionedDataSet
{
using StorageVec = std::vector<vtkm::cont::DataSet>;
@ -55,7 +57,7 @@ public:
~PartitionedDataSet();
/// Get the field @a field_name from partition @a partition_index.
VTKM_CONT
vtkm::cont::Field GetField(const std::string& field_name, int partition_index) const;
vtkm::cont::Field GetPartitionField(const std::string& field_name, int partition_index) const;
/// Get number of DataSet objects stored in this PartitionedDataSet.
VTKM_CONT
@ -91,6 +93,45 @@ public:
VTKM_CONT
void AppendPartitions(const std::vector<vtkm::cont::DataSet>& partitions);
//Fields on partitions.
VTKM_CONT
vtkm::IdComponent GetNumberOfFields() const
{
return static_cast<vtkm::IdComponent>(this->Fields.size());
}
VTKM_CONT void AddField(const Field& field);
VTKM_CONT const vtkm::cont::Field& GetField(
const std::string& name,
vtkm::cont::Field::Association assoc = vtkm::cont::Field::Association::Any) const;
VTKM_CONT vtkm::cont::Field& GetField(
const std::string& name,
vtkm::cont::Field::Association assoc = vtkm::cont::Field::Association::Any);
VTKM_CONT const vtkm::cont::Field& GetField(vtkm::Id index) const;
VTKM_CONT vtkm::cont::Field& GetField(vtkm::Id index);
VTKM_CONT
bool HasField(const std::string& name,
vtkm::cont::Field::Association assoc = vtkm::cont::Field::Association::Any) const
{
return (this->GetFieldIndex(name, assoc) != -1);
}
VTKM_CONT
bool HasWholePartitionField(const std::string& name) const
{
return (this->GetFieldIndex(name, vtkm::cont::Field::Association::WholePartition) != -1);
}
VTKM_CONT
bool HasPartitionsField(const std::string& name) const
{
return (this->GetFieldIndex(name, vtkm::cont::Field::Association::Partitions) != -1);
}
VTKM_CONT
vtkm::Id GetFieldIndex(
const std::string& name,
vtkm::cont::Field::Association assoc = vtkm::cont::Field::Association::Any) const;
VTKM_CONT
void PrintSummary(std::ostream& stream) const;
@ -110,7 +151,24 @@ public:
const_iterator cend() const noexcept { return this->Partitions.cend(); }
//@}
private:
//Move this to another place...
struct FieldCompare
{
using Key = std::pair<std::string, vtkm::cont::Field::Association>;
template <typename T>
bool operator()(const T& a, const T& b) const
{
if (a.first == b.first)
return a.second < b.second && a.second != vtkm::cont::Field::Association::Any &&
b.second != vtkm::cont::Field::Association::Any;
return a.first < b.first;
}
};
std::vector<vtkm::cont::DataSet> Partitions;
std::map<FieldCompare::Key, vtkm::cont::Field, FieldCompare> Fields;
};
}
} // namespace vtkm::cont

@ -38,7 +38,17 @@ static void PartitionedDataSetTest()
pds.AppendPartition(TDset1);
pds.AppendPartition(TDset2);
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::Partitions, ids, vtkm::CopyFlag::On);
auto pdsVar = vtkm::cont::make_Field(
"pds_var", vtkm::cont::Field::Association::WholePartition, ids, vtkm::CopyFlag::On);
pds.AddField(idsField);
pds.AddField(pdsVar);
VTKM_TEST_ASSERT(pds.GetNumberOfPartitions() == 2, "Incorrect number of partitions");
VTKM_TEST_ASSERT(pds.GetNumberOfFields() == 2, "Incorrect number of fields");
vtkm::cont::DataSet TestDSet = pds.GetPartition(0);
VTKM_TEST_ASSERT(TDset1.GetNumberOfFields() == TestDSet.GetNumberOfFields(),
@ -88,11 +98,20 @@ static void PartitionedDataSetTest()
"Local field value range info incorrect");
vtkm::Range SourceRange; //test the validity of member function GetField(FieldName, BlockId)
pds.GetField("cellvar", 0).GetRange(&SourceRange);
pds.GetPartitionField("cellvar", 0).GetRange(&SourceRange);
vtkm::Range TestRange;
pds.GetPartition(0).GetField("cellvar").GetRange(&TestRange);
VTKM_TEST_ASSERT(TestRange == SourceRange, "Local field value info incorrect");
//test partition fields.
idsField.GetRange(&SourceRange);
pds.GetField("ids").GetRange(&TestRange);
VTKM_TEST_ASSERT(TestRange == SourceRange, "Partitions field values incorrect");
pdsVar.GetRange(&SourceRange);
pds.GetField("pds_var").GetRange(&TestRange);
VTKM_TEST_ASSERT(TestRange == SourceRange, "WholePartitions field values incorrect");
vtkm::cont::PartitionedDataSet testblocks1;
std::vector<vtkm::cont::DataSet> partitions = pds.GetPartitions();
testblocks1.AppendPartitions(partitions);