diff --git a/vtkm/exec/cellmetrics/CellStretchMetric.h b/vtkm/exec/cellmetrics/CellStretchMetric.h index 699163179708307bdbdaedc32be2c0ac28b80678..c2cfb791bf9ae0118a46905cdd337e15c0bb3499 100644 --- a/vtkm/exec/cellmetrics/CellStretchMetric.h +++ b/vtkm/exec/cellmetrics/CellStretchMetric.h @@ -58,14 +58,14 @@ VTKM_EXEC OutType CellStretchMetric(const vtkm::IdComponent& numPts, vtlm::CellShapeTagQuad, const vtkm::exec::FunctorBase& worklet) { - FloatDefault L0 = vtkm::MagnitudeSquared(pts[1] - pts[0]); - FloatDefault L1 = vtkm::MagnitudeSquared(pts[2] - pts[1]); - FloatDefault L2 = vtkm::MagnitudeSquared(pts[3] - pts[2]); - FloatDefault L3 = vtkm::MagnitudeSquared(pts[0] - pts[3]); + FloatType L0 = vtkm::MagnitudeSquared(pts[1] - pts[0]); + FloatType L1 = vtkm::MagnitudeSquared(pts[2] - pts[1]); + FloatType L2 = vtkm::MagnitudeSquared(pts[3] - pts[2]); + FloatType L3 = vtkm::MagnitudeSquared(pts[0] - pts[3]); // Find the minimum length (use square of values to speed up) - FloatDefault D0 = pts[2] - pts[0]; - FloatDefault D1 = pts[3] - pts[1]; - FloatDefault D_max = vtkm::Max(D0,D1); + FloatType D0 = pts[2] - pts[0]; + FloatType D1 = pts[3] - pts[1]; + FloatType D_max = vtkm::Max(D0,D1); if(D_max < FLOAT_MIN) return FLOAT_MAX; return vtkm::Sqrt(2)/D_max * vtkm::Sqrt(L_min); @@ -77,23 +77,23 @@ VTKM_EXEC OutType CellStretchMetric(const vtkm::IdComponent& numPts, vtlm::CellShapeTagHex, const vtkm::exec::FunctorBase& worklet) { - FloatDefault L0 = vtkm::MagnitudeSquared(pts[1] - pts[0]); - FloatDefault L1 = vtkm::MagnitudeSquared(pts[2] - pts[1]); - FloatDefault L2 = vtkm::MagnitudeSquared(pts[3] - pts[2]); - FloatDefault L3 = vtkm::MagnitudeSquared(pts[3] - pts[0]); - FloatDefault L4 = vtkm::MagnitudeSquared(pts[4] - pts[0]); - FloatDefault L5 = vtkm::MagnitudeSquared(pts[5] - pts[1]); - FloatDefault L6 = vtkm::MagnitudeSquared(pts[6] - pts[2]); - FloatDefault L7 = vtkm::MagnitudeSquared(pts[3] - pts[3]); - FloatDefault L8 = vtkm::MagnitudeSquared(pts[5] - pts[4]); - FloatDefault L9 = vtkm::MagnitudeSquared(pts[6] - pts[5]); - FloatDefault L10 = vtkm::MagnitudeSquared(pts[7] - pts[6]); - FloatDefault L11 = vtkm::MagnitudeSquared(pts[7] - pts[4]); - FloatDefault D0 = pts[6] - pts[0]; - FloatDefault D1 = pts[7] - pts[1]; - FloatDefault D2 = pts[4] - pts[2]; - FloatDefault D3 = pts[5] - pts[3]; - FloatDefault D_max = vtkm::Max(D0,D1,D2,D3); + FloatType L0 = vtkm::MagnitudeSquared(pts[1] - pts[0]); + FloatType L1 = vtkm::MagnitudeSquared(pts[2] - pts[1]); + FloatType L2 = vtkm::MagnitudeSquared(pts[3] - pts[2]); + FloatType L3 = vtkm::MagnitudeSquared(pts[3] - pts[0]); + FloatType L4 = vtkm::MagnitudeSquared(pts[4] - pts[0]); + FloatType L5 = vtkm::MagnitudeSquared(pts[5] - pts[1]); + FloatType L6 = vtkm::MagnitudeSquared(pts[6] - pts[2]); + FloatType L7 = vtkm::MagnitudeSquared(pts[3] - pts[3]); + FloatType L8 = vtkm::MagnitudeSquared(pts[5] - pts[4]); + FloatType L9 = vtkm::MagnitudeSquared(pts[6] - pts[5]); + FloatType L10 = vtkm::MagnitudeSquared(pts[7] - pts[6]); + FloatType L11 = vtkm::MagnitudeSquared(pts[7] - pts[4]); + FloatType D0 = pts[6] - pts[0]; + FloatType D1 = pts[7] - pts[1]; + FloatType D2 = pts[4] - pts[2]; + FloatType D3 = pts[5] - pts[3]; + FloatType D_max = vtkm::Max(D0,D1,D2,D3); if(D_max < FLOAT_MIN) return FLOAT_MAX; return vtkm::Sqrt(3) * vtkm::Sqrt(vtkm::Min(L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11)) / D_max; } diff --git a/vtkm/exec/cellmetrics/CellWarpageMetric.h b/vtkm/exec/cellmetrics/CellWarpageMetric.h new file mode 100644 index 0000000000000000000000000000000000000000..839a0d01f04a439a6655d7c0bd5040c6c4529ec5 --- /dev/null +++ b/vtkm/exec/cellmetrics/CellWarpageMetric.h @@ -0,0 +1,74 @@ +//============================================================================ +// Copyright (c) Kitware, Inc. +// All rights reserved. +// See LICENSE.txt for details. +// This software is distributed WITHOUT ANY WARRANTY; without even +// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +// PURPOSE. See the above copyright notice for more information. +// +// Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS). +// Copyright 2014 UT-Battelle, LLC. +// Copyright 2014 Los Alamos National Security. +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National +// Laboratory (LANL), the U.S. Government retains certain rights in +// this software. +//============================================================================ +#ifndef vtk_m_exec_CellWarpageMetric_h +#define vtk_m_exec_CellWarpageMetric_h +/* + * Mesh quality metric functions that compute the shape, or weighted Jacobian, of mesh cells. + * The Jacobian of a cell is weighted by the condition metric value of the cell. + * + * These metric computations are adapted from the VTK implementation of the Verdict library, + * which provides a set of cell metrics for evaluating the geometric qualities of regions of mesh spaces. + * + * See: The Verdict Library Reference Manual (for per-cell-type metric formulae) + * See: vtk/ThirdParty/verdict/vtkverdict (for VTK code implementation of this metric) + */ + +#include "vtkm/CellShape.h" +#include "vtkm/CellTraits.h" +#include "vtkm/VecTraits.h" +#include "vtkm/VectorAnalysis.h" +#include "vtkm/exec/FunctorBase.h" +#include "vtkm/exec/cellmetrics/CellConditionMetric.h" + +namespace vtkm +{ +namespace exec +{ +static constexpr FloatType FLOAT_MAX = vtkm::Infinity(); +static constexpr FloatType FLOAT_MIN = vtkm::NegativeInfinity(); + +template +VTKM_EXEC OutType CellStretchMetric(const vtkm::IdComponent& numPts, + const PointCoordVecType& pts, + CellShapeType shape, + const vtkm::exec::FunctorBase& worklet) +{ + worklet.RaiseError("Shape type template must be specified to compute taper") + return OutType(-1.0); +} + +template +VTKM_EXEC OutType CellTaperMetric(const vtkm::IdComponents &numPts, + const PointCoordVecType& pts, + vtkm::CellShapeQuad, + const vtkm::exec::FunctorBase& worklet) +{ + FloatType N0 = vtkm::Cross((pts[0]-pts[3]),(pts[1]-pts[0])); + FloatType N1 = vtkm::Cross((pts[1]-pts[0]),(pts[2]-pts[1])); + FloatType N2 = vtkm::Cross((pts[2]-pts[1]),(pts[3]-pts[2])); + FloatType N3 = vtkm::Cross((pts[3]-pts[2]),(pts[0]-pts[3])); + if ( + +} + +} // exec +} // vtkm + +#endif vtk_m_exec_CellWarpage_Metric_h