Support deprecated MeshQuality features

Reenable the `vtkm::filter::CellMetric` class and
`vtkm::filter::MetricNames` static variable for backward compatibility.
(Both are of course marked deprecated.)

Also, adjust names in the new `vtkm::filter::mesh_info::CellMetric` to
conform with the rest of VTK-m style for scoped enums.
This commit is contained in:
Kenneth Moreland 2022-02-16 08:56:02 -07:00
parent d22a509b52
commit 5b7893a3f7
6 changed files with 238 additions and 106 deletions

@ -258,7 +258,7 @@ int main(int argc, char* argv[])
// A cell metric is now computed for every shape type that exists in the // A cell metric is now computed for every shape type that exists in the
// input dataset. // input dataset.
vtkm::filter::mesh_info::CellMetric shapeMetric = vtkm::filter::mesh_info::CellMetric::VOLUME; vtkm::filter::mesh_info::CellMetric shapeMetric = vtkm::filter::mesh_info::CellMetric::Volume;
try try
{ {

@ -100,8 +100,8 @@ inline VTKM_CONT vtkm::cont::DataSet MIRFilter::DoExecute(
input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex()); input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex());
vtkm::cont::ArrayHandle<vtkm::Float64> avgSizeTot; vtkm::cont::ArrayHandle<vtkm::Float64> avgSizeTot;
vtkm::worklet::MeshQuality getVol; vtkm::worklet::MeshQuality getVol;
getVol.SetMetric(c3 > 0 ? vtkm::filter::mesh_info::CellMetric::VOLUME getVol.SetMetric(c3 > 0 ? vtkm::filter::mesh_info::CellMetric::Volume
: vtkm::filter::mesh_info::CellMetric::AREA); : vtkm::filter::mesh_info::CellMetric::Area);
this->Invoke(getVol, this->Invoke(getVol,
vtkm::filter::ApplyPolicyCellSet(input.GetCellSet(), policy, *this), vtkm::filter::ApplyPolicyCellSet(input.GetCellSet(), policy, *this),
inputCoords.GetData(), inputCoords.GetData(),

@ -33,28 +33,28 @@ namespace
//Names of the available cell metrics, for use in //Names of the available cell metrics, for use in
//the output dataset fields //the output dataset fields
const std::map<CellMetric, std::string> MetricNames = { const std::map<CellMetric, std::string> MetricNames = {
{ CellMetric::AREA, "area" }, { CellMetric::Area, "area" },
{ CellMetric::ASPECT_GAMMA, "aspectGamma" }, { CellMetric::AspectGama, "aspectGamma" },
{ CellMetric::ASPECT_RATIO, "aspectRatio" }, { CellMetric::AspectRatio, "aspectRatio" },
{ CellMetric::CONDITION, "condition" }, { CellMetric::Condition, "condition" },
{ CellMetric::DIAGONAL_RATIO, "diagonalRatio" }, { CellMetric::DiagonalRatio, "diagonalRatio" },
{ CellMetric::DIMENSION, "dimension" }, { CellMetric::Dimension, "dimension" },
{ CellMetric::JACOBIAN, "jacobian" }, { CellMetric::Jacobian, "jacobian" },
{ CellMetric::MAX_ANGLE, "maxAngle" }, { CellMetric::MaxAngle, "maxAngle" },
{ CellMetric::MAX_DIAGONAL, "maxDiagonal" }, { CellMetric::MaxDiagonal, "maxDiagonal" },
{ CellMetric::MIN_ANGLE, "minAngle" }, { CellMetric::MinAngle, "minAngle" },
{ CellMetric::MIN_DIAGONAL, "minDiagonal" }, { CellMetric::MinDiagonal, "minDiagonal" },
{ CellMetric::ODDY, "oddy" }, { CellMetric::Oddy, "oddy" },
{ CellMetric::RELATIVE_SIZE_SQUARED, "relativeSizeSquared" }, { CellMetric::RelativeSizeSquared, "relativeSizeSquared" },
{ CellMetric::SCALED_JACOBIAN, "scaledJacobian" }, { CellMetric::ScaledJacobian, "scaledJacobian" },
{ CellMetric::SHAPE, "shape" }, { CellMetric::Shape, "shape" },
{ CellMetric::SHAPE_AND_SIZE, "shapeAndSize" }, { CellMetric::ShapeAndSize, "shapeAndSize" },
{ CellMetric::SHEAR, "shear" }, { CellMetric::Shear, "shear" },
{ CellMetric::SKEW, "skew" }, { CellMetric::Skew, "skew" },
{ CellMetric::STRETCH, "stretch" }, { CellMetric::Stretch, "stretch" },
{ CellMetric::TAPER, "taper" }, { CellMetric::Taper, "taper" },
{ CellMetric::VOLUME, "volume" }, { CellMetric::Volume, "volume" },
{ CellMetric::WARPAGE, "warpage" } { CellMetric::Warpage, "warpage" }
}; };
} // anonymous namespace } // anonymous namespace
@ -77,8 +77,8 @@ VTKM_CONT vtkm::cont::DataSet MeshQuality::DoExecute(const vtkm::cont::DataSet&
vtkm::cont::UnknownCellSet inputCellSet = input.GetCellSet(); vtkm::cont::UnknownCellSet inputCellSet = input.GetCellSet();
vtkm::worklet::MeshQuality qualityWorklet; vtkm::worklet::MeshQuality qualityWorklet;
if (this->MyMetric == CellMetric::RELATIVE_SIZE_SQUARED || if (this->MyMetric == CellMetric::RelativeSizeSquared ||
this->MyMetric == CellMetric::SHAPE_AND_SIZE) this->MyMetric == CellMetric::ShapeAndSize)
{ {
vtkm::worklet::MeshQuality subWorklet; vtkm::worklet::MeshQuality subWorklet;
vtkm::FloatDefault totalArea; vtkm::FloatDefault totalArea;
@ -89,11 +89,11 @@ VTKM_CONT vtkm::cont::DataSet MeshQuality::DoExecute(const vtkm::cont::DataSet&
using T = typename std::decay_t<decltype(concrete)>::ValueType::ComponentType; using T = typename std::decay_t<decltype(concrete)>::ValueType::ComponentType;
vtkm::cont::ArrayHandle<T> array; vtkm::cont::ArrayHandle<T> array;
subWorklet.SetMetric(CellMetric::AREA); subWorklet.SetMetric(CellMetric::Area);
this->Invoke(subWorklet, inputCellSet, concrete, array); this->Invoke(subWorklet, inputCellSet, concrete, array);
totalArea = (vtkm::FloatDefault)vtkm::cont::Algorithm::Reduce(array, T{}); totalArea = (vtkm::FloatDefault)vtkm::cont::Algorithm::Reduce(array, T{});
subWorklet.SetMetric(CellMetric::VOLUME); subWorklet.SetMetric(CellMetric::Volume);
this->Invoke(subWorklet, inputCellSet, concrete, array); this->Invoke(subWorklet, inputCellSet, concrete, array);
totalVolume = (vtkm::FloatDefault)vtkm::cont::Algorithm::Reduce(array, T{}); totalVolume = (vtkm::FloatDefault)vtkm::cont::Algorithm::Reduce(array, T{});
}; };
@ -128,3 +128,69 @@ VTKM_CONT vtkm::cont::DataSet MeshQuality::DoExecute(const vtkm::cont::DataSet&
} // namespace mesh_info } // namespace mesh_info
} // namespace filter } // namespace filter
} // namespace vtkm } // namespace vtkm
namespace vtkm
{
namespace filter
{
VTKM_DEPRECATED_SUPPRESS_BEGIN
vtkm::filter::mesh_info::CellMetric MeshQuality::ConvertCellMetric(
vtkm::filter::CellMetric oldMetricEnum)
{
switch (oldMetricEnum)
{
case vtkm::filter::CellMetric::AREA:
return vtkm::filter::mesh_info::CellMetric::Area;
case vtkm::filter::CellMetric::ASPECT_GAMMA:
return vtkm::filter::mesh_info::CellMetric::AspectGama;
case vtkm::filter::CellMetric::ASPECT_RATIO:
return vtkm::filter::mesh_info::CellMetric::AspectRatio;
case vtkm::filter::CellMetric::CONDITION:
return vtkm::filter::mesh_info::CellMetric::Condition;
case vtkm::filter::CellMetric::DIAGONAL_RATIO:
return vtkm::filter::mesh_info::CellMetric::DiagonalRatio;
case vtkm::filter::CellMetric::DIMENSION:
return vtkm::filter::mesh_info::CellMetric::Dimension;
case vtkm::filter::CellMetric::JACOBIAN:
return vtkm::filter::mesh_info::CellMetric::Jacobian;
case vtkm::filter::CellMetric::MAX_ANGLE:
return vtkm::filter::mesh_info::CellMetric::MaxAngle;
case vtkm::filter::CellMetric::MAX_DIAGONAL:
return vtkm::filter::mesh_info::CellMetric::MaxDiagonal;
case vtkm::filter::CellMetric::MIN_ANGLE:
return vtkm::filter::mesh_info::CellMetric::MinAngle;
case vtkm::filter::CellMetric::MIN_DIAGONAL:
return vtkm::filter::mesh_info::CellMetric::MinDiagonal;
case vtkm::filter::CellMetric::ODDY:
return vtkm::filter::mesh_info::CellMetric::Oddy;
case vtkm::filter::CellMetric::RELATIVE_SIZE_SQUARED:
return vtkm::filter::mesh_info::CellMetric::RelativeSizeSquared;
case vtkm::filter::CellMetric::SCALED_JACOBIAN:
return vtkm::filter::mesh_info::CellMetric::ScaledJacobian;
case vtkm::filter::CellMetric::SHAPE:
return vtkm::filter::mesh_info::CellMetric::Shape;
case vtkm::filter::CellMetric::SHAPE_AND_SIZE:
return vtkm::filter::mesh_info::CellMetric::ShapeAndSize;
case vtkm::filter::CellMetric::SHEAR:
return vtkm::filter::mesh_info::CellMetric::Shear;
case vtkm::filter::CellMetric::SKEW:
return vtkm::filter::mesh_info::CellMetric::Skew;
case vtkm::filter::CellMetric::STRETCH:
return vtkm::filter::mesh_info::CellMetric::Stretch;
case vtkm::filter::CellMetric::TAPER:
return vtkm::filter::mesh_info::CellMetric::Taper;
case vtkm::filter::CellMetric::VOLUME:
return vtkm::filter::mesh_info::CellMetric::Volume;
case vtkm::filter::CellMetric::WARPAGE:
return vtkm::filter::mesh_info::CellMetric::Warpage;
default:
throw vtkm::cont::ErrorBadValue("Invalid mesh quality metric.");
}
}
VTKM_DEPRECATED_SUPPRESS_END
} // namespace filter
} // namespace vtkm

@ -30,9 +30,81 @@ namespace filter
{ {
namespace mesh_info namespace mesh_info
{ {
//Different cell metrics available to use
//This must follow the same order as the MetricNames above enum struct CellMetric
enum class CellMetric {
Area,
AspectGama,
AspectRatio,
Condition,
DiagonalRatio,
Dimension,
Jacobian,
MaxAngle,
MaxDiagonal,
MinAngle,
MinDiagonal,
Oddy,
RelativeSizeSquared,
ScaledJacobian,
Shape,
ShapeAndSize,
Shear,
Skew,
Stretch,
Taper,
Volume,
Warpage,
None
};
/** \brief Computes the quality of an unstructured cell-based mesh. The quality is defined in terms of the
* summary statistics (frequency, mean, variance, min, max) of metrics computed over the mesh
* cells. One of several different metrics can be specified for a given cell type, and the mesh
* can consist of one or more different cell types. The resulting mesh quality is stored as one
* or more new fields in the output dataset of this filter, with a separate field for each cell type.
* Each field contains the metric summary statistics for the cell type.
* Summary statists with all 0 values imply that the specified metric does not support the cell type.
*/
class VTKM_FILTER_MESH_INFO_EXPORT MeshQuality : public vtkm::filter::NewFilterField
{
public:
VTKM_CONT explicit MeshQuality(CellMetric);
private:
VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input) override;
CellMetric MyMetric;
};
} // namespace mesh_info
VTKM_DEPRECATED_SUPPRESS_BEGIN
VTKM_DEPRECATED(1.8)
static const std::string MetricNames[] = { "area",
"aspectGamma",
"aspectRatio",
"condition",
"diagonalRatio",
"dimension",
"jacobian",
"maxAngle",
"maxDiagonal",
"minAngle",
"minDiagonal",
"oddy",
"relativeSizeSquared",
"scaledJacobian",
"shape",
"shapeAndSize",
"shear",
"skew",
"stretch",
"taper",
"volume",
"warpage" };
VTKM_DEPRECATED_SUPPRESS_END
enum struct VTKM_DEPRECATED(1.8 "Use vtkm::filter::mesh_info::CellMetric.") CellMetric
{ {
AREA, AREA,
ASPECT_GAMMA, ASPECT_GAMMA,
@ -60,29 +132,23 @@ enum class CellMetric
EMPTY EMPTY
}; };
/** \brief Computes the quality of an unstructured cell-based mesh. The quality is defined in terms of the
* summary statistics (frequency, mean, variance, min, max) of metrics computed over the mesh
* cells. One of several different metrics can be specified for a given cell type, and the mesh
* can consist of one or more different cell types. The resulting mesh quality is stored as one
* or more new fields in the output dataset of this filter, with a separate field for each cell type.
* Each field contains the metric summary statistics for the cell type.
* Summary statists with all 0 values imply that the specified metric does not support the cell type.
*/
class VTKM_FILTER_MESH_INFO_EXPORT MeshQuality : public vtkm::filter::NewFilterField
{
public:
VTKM_CONT explicit MeshQuality(CellMetric);
private:
VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input) override;
CellMetric MyMetric;
};
} // namespace mesh_info
class VTKM_DEPRECATED(1.8, "Use vtkm::filter::mesh_info::MeshQuality.") MeshQuality class VTKM_DEPRECATED(1.8, "Use vtkm::filter::mesh_info::MeshQuality.") MeshQuality
: public vtkm::filter::mesh_info::MeshQuality : public vtkm::filter::mesh_info::MeshQuality
{ {
VTKM_DEPRECATED_SUPPRESS_BEGIN
static vtkm::filter::mesh_info::CellMetric ConvertCellMetric(
vtkm::filter::CellMetric oldMetricEnum);
VTKM_DEPRECATED_SUPPRESS_END
public:
using mesh_info::MeshQuality::MeshQuality; using mesh_info::MeshQuality::MeshQuality;
VTKM_DEPRECATED_SUPPRESS_BEGIN
MeshQuality(vtkm::filter::CellMetric oldMetric)
: mesh_info::MeshQuality(ConvertCellMetric(oldMetric))
{
}
VTKM_DEPRECATED_SUPPRESS_END
}; };
} // namespace filter } // namespace filter
} // namespace vtkm } // namespace vtkm

@ -196,157 +196,157 @@ int TestMeshQuality()
std::vector<vtkm::cont::DataSet> inputs; std::vector<vtkm::cont::DataSet> inputs;
expectedValues.push_back(FloatVec{ 0, 0, 1, 1.333333333f, 4, 4 }); expectedValues.push_back(FloatVec{ 0, 0, 1, 1.333333333f, 4, 4 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::VOLUME); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Volume);
metricName.emplace_back("volume"); metricName.emplace_back("volume");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 3, 4, 0, 0, 0, 0 }); expectedValues.push_back(FloatVec{ 3, 4, 0, 0, 0, 0 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::AREA); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Area);
metricName.emplace_back("area"); metricName.emplace_back("area");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 3, 1 }); expectedValues.push_back(FloatVec{ 3, 1 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::AREA); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Area);
metricName.emplace_back("area"); metricName.emplace_back("area");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ 1.164010f, 1.118034f, 1.648938f, 0, 0, 1.1547f }); expectedValues.push_back(FloatVec{ 1.164010f, 1.118034f, 1.648938f, 0, 0, 1.1547f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::ASPECT_RATIO); metrics.push_back(vtkm::filter::mesh_info::CellMetric::AspectRatio);
metricName.emplace_back("aspectRatio"); metricName.emplace_back("aspectRatio");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 1.164010f, 2.47582f }); expectedValues.push_back(FloatVec{ 1.164010f, 2.47582f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::ASPECT_RATIO); metrics.push_back(vtkm::filter::mesh_info::CellMetric::AspectRatio);
metricName.emplace_back("aspectRatio"); metricName.emplace_back("aspectRatio");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ 0, 0, 1.52012f, 0, 0, 0 }); expectedValues.push_back(FloatVec{ 0, 0, 1.52012f, 0, 0, 0 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::ASPECT_GAMMA); metrics.push_back(vtkm::filter::mesh_info::CellMetric::AspectGama);
metricName.emplace_back("aspectGamma"); metricName.emplace_back("aspectGamma");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 1.058475f, 2.25f, 1.354007f, 0, 0, 1.563472f }); expectedValues.push_back(FloatVec{ 1.058475f, 2.25f, 1.354007f, 0, 0, 1.563472f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::CONDITION); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Condition);
metricName.emplace_back("condition"); metricName.emplace_back("condition");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 1.058475f, 2.02073f }); expectedValues.push_back(FloatVec{ 1.058475f, 2.02073f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::CONDITION); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Condition);
metricName.emplace_back("condition"); metricName.emplace_back("condition");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ 45, 45, -1, -1, -1, -1 }); expectedValues.push_back(FloatVec{ 45, 45, -1, -1, -1, -1 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MIN_ANGLE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MinAngle);
metricName.emplace_back("minAngle"); metricName.emplace_back("minAngle");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 45, 18.4348f }); expectedValues.push_back(FloatVec{ 45, 18.4348f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MIN_ANGLE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MinAngle);
metricName.emplace_back("minAngle"); metricName.emplace_back("minAngle");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ 71.56505f, 135, -1, -1, -1, -1 }); expectedValues.push_back(FloatVec{ 71.56505f, 135, -1, -1, -1, -1 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MAX_ANGLE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MaxAngle);
metricName.emplace_back("maxAngle"); metricName.emplace_back("maxAngle");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 71.56505f, 116.565f }); expectedValues.push_back(FloatVec{ 71.56505f, 116.565f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MAX_ANGLE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MaxAngle);
metricName.emplace_back("maxAngle"); metricName.emplace_back("maxAngle");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 1.73205f }); expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 1.73205f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MIN_DIAGONAL); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MinDiagonal);
metricName.emplace_back("minDiagonal"); metricName.emplace_back("minDiagonal");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 4.3589f }); expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 4.3589f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::MAX_DIAGONAL); metrics.push_back(vtkm::filter::mesh_info::CellMetric::MaxDiagonal);
metricName.emplace_back("maxDiagonal"); metricName.emplace_back("maxDiagonal");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0, 2, 6, 0, 0, 4 }); expectedValues.push_back(FloatVec{ 0, 2, 6, 0, 0, 4 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::JACOBIAN); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Jacobian);
metricName.emplace_back("jacobian"); metricName.emplace_back("jacobian");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.816497f, 0.707107f, 0.408248f, -2, -2, 0.57735f }); expectedValues.push_back(FloatVec{ 0.816497f, 0.707107f, 0.408248f, -2, -2, 0.57735f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SCALED_JACOBIAN); metrics.push_back(vtkm::filter::mesh_info::CellMetric::ScaledJacobian);
metricName.emplace_back("scaledJacobian"); metricName.emplace_back("scaledJacobian");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.816497f, 0.365148f }); expectedValues.push_back(FloatVec{ 0.816497f, 0.365148f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SCALED_JACOBIAN); metrics.push_back(vtkm::filter::mesh_info::CellMetric::ScaledJacobian);
metricName.emplace_back("scaledJacobian"); metricName.emplace_back("scaledJacobian");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ -1, 8.125f, -1, -1, -1, 2.62484f }); expectedValues.push_back(FloatVec{ -1, 8.125f, -1, -1, -1, 2.62484f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::ODDY); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Oddy);
metricName.emplace_back("oddy"); metricName.emplace_back("oddy");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, 0.620174f, -1, -1, -1, 0.397360f }); expectedValues.push_back(FloatVec{ -1, 0.620174f, -1, -1, -1, 0.397360f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::DIAGONAL_RATIO); metrics.push_back(vtkm::filter::mesh_info::CellMetric::DiagonalRatio);
metricName.emplace_back("diagonalRatio"); metricName.emplace_back("diagonalRatio");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.944755f, 0.444444f, 0.756394f, -1, -1, 0.68723f }); expectedValues.push_back(FloatVec{ 0.944755f, 0.444444f, 0.756394f, -1, -1, 0.68723f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SHAPE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Shape);
metricName.emplace_back("shape"); metricName.emplace_back("shape");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.944755f, 0.494872f }); expectedValues.push_back(FloatVec{ 0.944755f, 0.494872f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SHAPE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Shape);
metricName.emplace_back("shape"); metricName.emplace_back("shape");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ -1, 0.707107f, -1, -1, -1, 0.57735f }); expectedValues.push_back(FloatVec{ -1, 0.707107f, -1, -1, -1, 0.57735f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SHEAR); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Shear);
metricName.emplace_back("shear"); metricName.emplace_back("shear");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, 0.447214f, -1, -1, -1, 0.57735f }); expectedValues.push_back(FloatVec{ -1, 0.447214f, -1, -1, -1, 0.57735f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SKEW); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Skew);
metricName.emplace_back("skew"); metricName.emplace_back("skew");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, (float)0.392232, -1, -1, -1, (float)0.688247 }); expectedValues.push_back(FloatVec{ -1, (float)0.392232, -1, -1, -1, (float)0.688247 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::STRETCH); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Stretch);
metricName.emplace_back("stretch"); metricName.emplace_back("stretch");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, 0.5, -1, -1, -1, 0 }); expectedValues.push_back(FloatVec{ -1, 0.5, -1, -1, -1, 0 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::TAPER); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Taper);
metricName.emplace_back("taper"); metricName.emplace_back("taper");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, 1, -1, -1, -1, -1 }); expectedValues.push_back(FloatVec{ -1, 1, -1, -1, -1, -1 });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::WARPAGE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Warpage);
metricName.emplace_back("warpage"); metricName.emplace_back("warpage");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 0.707107f }); expectedValues.push_back(FloatVec{ -1, -1, -1, -1, -1, 0.707107f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::DIMENSION); metrics.push_back(vtkm::filter::mesh_info::CellMetric::Dimension);
metricName.emplace_back("dimension"); metricName.emplace_back("dimension");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.151235f, 0.085069f, 0.337149f, -1, -1, 0.185378f }); expectedValues.push_back(FloatVec{ 0.151235f, 0.085069f, 0.337149f, -1, -1, 0.185378f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::RELATIVE_SIZE_SQUARED); metrics.push_back(vtkm::filter::mesh_info::CellMetric::RelativeSizeSquared);
metricName.emplace_back("relativeSizeSquared"); metricName.emplace_back("relativeSizeSquared");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.444444f, 0.25f }); expectedValues.push_back(FloatVec{ 0.444444f, 0.25f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::RELATIVE_SIZE_SQUARED); metrics.push_back(vtkm::filter::mesh_info::CellMetric::RelativeSizeSquared);
metricName.emplace_back("relativeSizeSquared"); metricName.emplace_back("relativeSizeSquared");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);
expectedValues.push_back(FloatVec{ 0.142880f, 0.037809f, 0.255017f, -1, -1, 0.127397f }); expectedValues.push_back(FloatVec{ 0.142880f, 0.037809f, 0.255017f, -1, -1, 0.127397f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SHAPE_AND_SIZE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::ShapeAndSize);
metricName.emplace_back("shapeAndSize"); metricName.emplace_back("shapeAndSize");
inputs.push_back(explicitInput); inputs.push_back(explicitInput);
expectedValues.push_back(FloatVec{ 0.419891f, 0.123718f }); expectedValues.push_back(FloatVec{ 0.419891f, 0.123718f });
metrics.push_back(vtkm::filter::mesh_info::CellMetric::SHAPE_AND_SIZE); metrics.push_back(vtkm::filter::mesh_info::CellMetric::ShapeAndSize);
metricName.emplace_back("shapeAndSize"); metricName.emplace_back("shapeAndSize");
inputs.push_back(singleTypeInput); inputs.push_back(singleTypeInput);

@ -96,7 +96,7 @@ public:
private: private:
// data member // data member
vtkm::filter::mesh_info::CellMetric Metric{ vtkm::filter::mesh_info::CellMetric::EMPTY }; vtkm::filter::mesh_info::CellMetric Metric{ vtkm::filter::mesh_info::CellMetric::None };
vtkm::FloatDefault AverageArea{}; vtkm::FloatDefault AverageArea{};
vtkm::FloatDefault AverageVolume{}; vtkm::FloatDefault AverageVolume{};
@ -116,92 +116,92 @@ private:
vtkm::ErrorCode ec{ vtkm::ErrorCode::Success }; vtkm::ErrorCode ec{ vtkm::ErrorCode::Success };
switch (this->Metric) switch (this->Metric)
{ {
case vtkm::filter::mesh_info::CellMetric::AREA: case vtkm::filter::mesh_info::CellMetric::Area:
metricValue = vtkm::exec::CellMeasure<OutType>(numPts, pts, tag, ec); metricValue = vtkm::exec::CellMeasure<OutType>(numPts, pts, tag, ec);
if (dims != 2) if (dims != 2)
metricValue = 0.; metricValue = 0.;
break; break;
case vtkm::filter::mesh_info::CellMetric::ASPECT_GAMMA: case vtkm::filter::mesh_info::CellMetric::AspectGama:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellAspectGammaMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellAspectGammaMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::ASPECT_RATIO: case vtkm::filter::mesh_info::CellMetric::AspectRatio:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellAspectRatioMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellAspectRatioMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::CONDITION: case vtkm::filter::mesh_info::CellMetric::Condition:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellConditionMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellConditionMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::DIAGONAL_RATIO: case vtkm::filter::mesh_info::CellMetric::DiagonalRatio:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellDiagonalRatioMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellDiagonalRatioMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::DIMENSION: case vtkm::filter::mesh_info::CellMetric::Dimension:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellDimensionMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellDimensionMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::JACOBIAN: case vtkm::filter::mesh_info::CellMetric::Jacobian:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellJacobianMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellJacobianMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::MAX_ANGLE: case vtkm::filter::mesh_info::CellMetric::MaxAngle:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellMaxAngleMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellMaxAngleMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::MAX_DIAGONAL: case vtkm::filter::mesh_info::CellMetric::MaxDiagonal:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellMaxDiagonalMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellMaxDiagonalMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::MIN_ANGLE: case vtkm::filter::mesh_info::CellMetric::MinAngle:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellMinAngleMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellMinAngleMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::MIN_DIAGONAL: case vtkm::filter::mesh_info::CellMetric::MinDiagonal:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellMinDiagonalMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellMinDiagonalMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::ODDY: case vtkm::filter::mesh_info::CellMetric::Oddy:
metricValue = vtkm::worklet::cellmetrics::CellOddyMetric<OutType>(numPts, pts, tag, ec); metricValue = vtkm::worklet::cellmetrics::CellOddyMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::RELATIVE_SIZE_SQUARED: case vtkm::filter::mesh_info::CellMetric::RelativeSizeSquared:
metricValue = vtkm::worklet::cellmetrics::CellRelativeSizeSquaredMetric<OutType>( metricValue = vtkm::worklet::cellmetrics::CellRelativeSizeSquaredMetric<OutType>(
numPts, pts, static_cast<OutType>(average), tag, ec); numPts, pts, static_cast<OutType>(average), tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::SHAPE_AND_SIZE: case vtkm::filter::mesh_info::CellMetric::ShapeAndSize:
metricValue = vtkm::worklet::cellmetrics::CellShapeAndSizeMetric<OutType>( metricValue = vtkm::worklet::cellmetrics::CellShapeAndSizeMetric<OutType>(
numPts, pts, static_cast<OutType>(average), tag, ec); numPts, pts, static_cast<OutType>(average), tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::SCALED_JACOBIAN: case vtkm::filter::mesh_info::CellMetric::ScaledJacobian:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellScaledJacobianMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellScaledJacobianMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::SHAPE: case vtkm::filter::mesh_info::CellMetric::Shape:
metricValue = vtkm::worklet::cellmetrics::CellShapeMetric<OutType>(numPts, pts, tag, ec); metricValue = vtkm::worklet::cellmetrics::CellShapeMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::SHEAR: case vtkm::filter::mesh_info::CellMetric::Shear:
metricValue = vtkm::worklet::cellmetrics::CellShearMetric<OutType>(numPts, pts, tag, ec); metricValue = vtkm::worklet::cellmetrics::CellShearMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::SKEW: case vtkm::filter::mesh_info::CellMetric::Skew:
metricValue = vtkm::worklet::cellmetrics::CellSkewMetric<OutType>(numPts, pts, tag, ec); metricValue = vtkm::worklet::cellmetrics::CellSkewMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::STRETCH: case vtkm::filter::mesh_info::CellMetric::Stretch:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellStretchMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellStretchMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::TAPER: case vtkm::filter::mesh_info::CellMetric::Taper:
metricValue = vtkm::worklet::cellmetrics::CellTaperMetric<OutType>(numPts, pts, tag, ec); metricValue = vtkm::worklet::cellmetrics::CellTaperMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::VOLUME: case vtkm::filter::mesh_info::CellMetric::Volume:
metricValue = vtkm::exec::CellMeasure<OutType>(numPts, pts, tag, ec); metricValue = vtkm::exec::CellMeasure<OutType>(numPts, pts, tag, ec);
if (dims != 3) if (dims != 3)
metricValue = 0.; metricValue = 0.;
break; break;
case vtkm::filter::mesh_info::CellMetric::WARPAGE: case vtkm::filter::mesh_info::CellMetric::Warpage:
metricValue = metricValue =
vtkm::worklet::cellmetrics::CellWarpageMetric<OutType>(numPts, pts, tag, ec); vtkm::worklet::cellmetrics::CellWarpageMetric<OutType>(numPts, pts, tag, ec);
break; break;
case vtkm::filter::mesh_info::CellMetric::EMPTY: case vtkm::filter::mesh_info::CellMetric::None:
break; break;
default: default:
//Only call metric function if a metric is specified for this shape type //Only call metric function if a metric is specified for this shape type