19#ifndef PECLET_CORE_AMR_INDICATORS_HPP
20#define PECLET_CORE_AMR_INDICATORS_HPP
22#ifdef PECLET_CORE_HAVE_MORTON
39template <
int Dim,
unsigned Bits>
42 const Index n =
t.numLeaves();
43 std::vector<double>
e(
static_cast<std::size_t
>(n), 0.0);
45 const double ui =
u[
static_cast<std::size_t
>(
i)];
47 for (
int axis = 0; axis < Dim; ++axis) {
48 const Index jp =
t.faceNeighbor(
i, axis, +1);
49 const Index jm =
t.faceNeighbor(
i, axis, -1);
52 const double up =
u[
static_cast<std::size_t
>(
jp)];
53 const double um =
u[
static_cast<std::size_t
>(
jm)];
54 const double d2 =
up - 2.0 *
ui +
um;
55 const double nrm = std::fabs(
up -
ui) + std::fabs(
ui -
um) +
56 eps * (std::fabs(
up) + 2.0 * std::fabs(
ui) + std::fabs(
um));
60 e[
static_cast<std::size_t
>(
i)] = (
den2 > 0.0) ? std::sqrt(
num2 /
den2) : 0.0;
69template <
int Dim,
unsigned Bits>
71 const std::vector<double>&
u) {
72 const Index n =
t.numLeaves();
73 std::vector<double>
e(
static_cast<std::size_t
>(n), 0.0);
75 const double ui =
u[
static_cast<std::size_t
>(
i)];
77 for (
int axis = 0; axis < Dim; ++axis) {
78 const Index jp =
t.faceNeighbor(
i, axis, +1);
79 const Index jm =
t.faceNeighbor(
i, axis, -1);
83 u[
static_cast<std::size_t
>(
jp)] - 2.0 *
ui +
u[
static_cast<std::size_t
>(
jm)];
86 e[
static_cast<std::size_t
>(
i)] = std::sqrt(
s);
std::vector< double > secondDiffIndicator(const BlockOctree< Dim, Bits > &t, const std::vector< double > &u)
Raw second-derivative magnitude indicator, per leaf: the L2 norm over axes of the undivided second di...
std::vector< double > lohnerIndicator(const BlockOctree< Dim, Bits > &t, const std::vector< double > &u, double eps=0.01)
Löhner normalized second-difference indicator E_i ∈ [0,1], per leaf, for scalar u (indexed by leaf sl...
Kokkos::View< T *, MemSpace > View
1D device array.
std::int64_t Index
Signed index type for grids and particles (supersedes block_decomposer's long int IndxT).