support multiple input fields

This commit is contained in:
Li-Ta Lo 2021-12-14 13:43:42 -07:00
parent 6ae6a68923
commit a1b98287f5
2 changed files with 74 additions and 23 deletions

@ -35,14 +35,31 @@ public:
const std::string& name,
vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY)
{
this->ActiveFieldName = name;
this->ActiveFieldAssociation = association;
this->SetActiveField(0, name, association);
}
VTKM_CONT const std::string& GetActiveFieldName() const { return this->ActiveFieldName; }
VTKM_CONT vtkm::cont::Field::Association GetActiveFieldAssociation() const
void SetActiveField(
vtkm::IdComponent index,
const std::string& name,
vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY)
{
return this->ActiveFieldAssociation;
auto index_st = static_cast<std::size_t>(index);
ResizeIfNeeded(index_st);
this->ActiveFieldNames[index_st] = name;
this->ActiveFieldAssociation[index_st] = association;
}
VTKM_CONT const std::string& GetActiveFieldName(vtkm::IdComponent index = 0) const
{
VTKM_ASSERT((index >= 0) &&
(index < static_cast<vtkm::IdComponent>(this->ActiveFieldNames.size())));
return this->ActiveFieldNames[index];
}
VTKM_CONT vtkm::cont::Field::Association GetActiveFieldAssociation(
vtkm::IdComponent index = 0) const
{
return this->ActiveFieldAssociation[index];
}
//@}
@ -50,29 +67,67 @@ public:
/// To simply use the active coordinate system as the field to operate on, set
/// UseCoordinateSystemAsField to true.
VTKM_CONT
void SetUseCoordinateSystemAsField(bool val) { this->UseCoordinateSystemAsField = val; }
VTKM_CONT
bool GetUseCoordinateSystemAsField() const { return this->UseCoordinateSystemAsField; }
//@}
void SetUseCoordinateSystemAsField(bool val) { SetUseCoordinateSystemAsField(0, val); }
VTKM_CONT
void SetUseCoordinateSystemAsField(vtkm::IdComponent index, bool val)
{
auto index_st = static_cast<std::size_t>(index);
ResizeIfNeeded(index_st);
this->UseCoordinateSystemAsField[index] = val;
}
VTKM_CONT
bool GetUseCoordinateSystemAsField(vtkm::IdComponent index = 0) const
{
VTKM_ASSERT((index >= 0) &&
(index < static_cast<vtkm::IdComponent>(this->ActiveFieldNames.size())));
return this->UseCoordinateSystemAsField[index];
}
//@}
VTKM_CONT
const vtkm::cont::Field& GetFieldFromDataSet(const vtkm::cont::DataSet& input) const
{
if (this->UseCoordinateSystemAsField)
return GetFieldFromDataSet(0, input);
}
VTKM_CONT
const vtkm::cont::Field& GetFieldFromDataSet(vtkm::IdComponent index,
const vtkm::cont::DataSet& input) const
{
if (this->UseCoordinateSystemAsField[index])
{
return input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex());
}
else
{
return input.GetField(this->GetActiveFieldName(), this->GetActiveFieldAssociation());
return input.GetField(this->GetActiveFieldName(index),
this->GetActiveFieldAssociation(index));
}
}
private:
void ResizeIfNeeded(size_t index_st)
{
if (ActiveFieldNames.size() <= index_st)
{
auto oldSize = ActiveFieldNames.size();
ActiveFieldNames.resize(index_st + 1);
ActiveFieldAssociation.resize(index_st + 1);
UseCoordinateSystemAsField.resize(index_st + 1);
for (std::size_t i = oldSize; i <= index_st; ++i)
{
ActiveFieldAssociation[i] = cont::Field::Association::ANY;
UseCoordinateSystemAsField[i] = false;
}
}
}
std::string OutputFieldName;
std::string ActiveFieldName;
vtkm::cont::Field::Association ActiveFieldAssociation = vtkm::cont::Field::Association::ANY;
bool UseCoordinateSystemAsField = false;
std::vector<std::string> ActiveFieldNames;
std::vector<vtkm::cont::Field::Association> ActiveFieldAssociation;
std::vector<bool> UseCoordinateSystemAsField;
};
} // namespace filter
} // namespace vtkm

@ -78,14 +78,13 @@ public:
const std::string& name,
vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY)
{
this->SecondaryFieldName = name;
this->SecondaryFieldAssociation = association;
this->SetActiveField(1, name, association);
}
VTKM_CONT const std::string& GetSecondaryFieldName() const { return this->SecondaryFieldName; }
VTKM_CONT const std::string& GetSecondaryFieldName() const { return this->GetActiveFieldName(1); }
VTKM_CONT vtkm::cont::Field::Association GetSecondaryFieldAssociation() const
{
return this->SecondaryFieldAssociation;
return this->GetActiveFieldAssociation(1);
}
//@}
@ -95,12 +94,12 @@ public:
VTKM_CONT
void SetUseCoordinateSystemAsSecondaryField(bool flag)
{
this->UseCoordinateSystemAsSecondaryField = flag;
this->SetUseCoordinateSystemAsField(1, flag);
}
VTKM_CONT
bool GetUseCoordinateSystemAsSecondaryField() const
{
return this->UseCoordinateSystemAsSecondaryField;
return this->GetUseCoordinateSystemAsField(1);
}
//@}
@ -122,9 +121,6 @@ public:
private:
vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input) override;
std::string SecondaryFieldName;
vtkm::cont::Field::Association SecondaryFieldAssociation = vtkm::cont::Field::Association::ANY;
bool UseCoordinateSystemAsSecondaryField = false;
vtkm::Id SecondaryCoordinateSystemIndex = 0;
};
} // namespace vector_calculus