Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Steven Walton
VTK-m
Commits
fa4ec082
Commit
fa4ec082
authored
Jun 01, 2019
by
Steven Walton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved from auto to FloatDefault to be more explicit
parent
1657a253
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
102 additions
and
0 deletions
+102
-0
vtkm/exec/cellmetrics/CellStretchMetric.h
vtkm/exec/cellmetrics/CellStretchMetric.h
+102
-0
No files found.
vtkm/exec/cellmetrics/CellStretchMetric.h
0 → 100644
View file @
fa4ec082
//============================================================================
// 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_cellmetrics_CellStretchMetric_h
#define vtk_m_exec_cellmetrics_CellStretchMetric_h
/*
* Mesh quality metric functions that compute the aspect frobenius of certain mesh cells.
* The aspect frobenius metric generally measures the degree of regularity of a cell, with
* a value of 1 representing a regular cell..
*
* These metric computations are adapted from the VTK implementation of the Verdict library,
* which provides a set of mesh/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"
static
constexpr
FloatType
FLOAT_MAX
=
vtkm
::
Infinity
<
FloatType
>
();
static
constexpr
FloatType
FLOAT_MIN
=
vtkm
::
NegativeInfinity
<
FloatType
>
();
template
<
typename
OutType
,
typename
PointCoordVecType
,
typename
CellShapeType
>
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 stretch"
)
return
OutType
(
-
1.0
);
}
template
<
typename
OutType
,
typename
PointCoordVecType
>
VTKM_EXEC
OutType
CellStretchMetric
(
const
vtkm
::
IdComponent
&
numPts
,
const
PointCoordVecType
&
pts
,
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
]);
// 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
);
if
(
D_max
<
FLOAT_MIN
)
return
FLOAT_MAX
;
return
vtkm
::
Sqrt
(
2
)
/
D_max
*
vtkm
::
Sqrt
(
L_min
);
}
template
<
typename
OutType
,
typename
PointCoordVecType
>
VTKM_EXEC
OutType
CellStretchMetric
(
const
vtkm
::
IdComponent
&
numPts
,
const
PointCoordVecType
&
pts
,
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
);
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
;
}
#endif // vtk_m_exec_cellmetrics_CellStretchMetric_h
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment