Add fields to vtkm::cont::PartitionedDataSet
This commit is contained in:
parent
4cc930c400
commit
cbdb797f1e
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user