forked from arborx/ArborX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArborX_Ellipsoid.hpp
102 lines (87 loc) · 2.84 KB
/
ArborX_Ellipsoid.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/****************************************************************************
* Copyright (c) 2025, ArborX authors *
* All rights reserved. *
* *
* This file is part of the ArborX library. ArborX is *
* distributed under a BSD 3-clause license. For the licensing terms see *
* the LICENSE file in the top-level directory. *
* *
* SPDX-License-Identifier: BSD-3-Clause *
****************************************************************************/
#ifndef ARBORX_ELLIPSOID_HPP
#define ARBORX_ELLIPSOID_HPP
#include <ArborX_GeometryTraits.hpp>
#include <ArborX_Point.hpp>
#include <Kokkos_Assert.hpp>
#include <Kokkos_Macros.hpp>
#include <initializer_list>
#include <type_traits>
namespace ArborX::Experimental
{
template <int DIM, class Coordinate = float>
struct Ellipsoid
{
KOKKOS_DEFAULTED_FUNCTION
Ellipsoid() = default;
KOKKOS_FUNCTION
constexpr Ellipsoid(Point<DIM, Coordinate> const ¢roid,
Coordinate const rmt[DIM][DIM])
: _centroid(centroid)
{
for (int i = 0; i < DIM; ++i)
for (int j = 0; j < DIM; ++j)
_rmt[i][j] = rmt[i][j];
}
KOKKOS_FUNCTION
constexpr Ellipsoid(
Point<DIM, Coordinate> const ¢roid,
std::initializer_list<std::initializer_list<Coordinate>> const rmt)
: _centroid(centroid)
{
KOKKOS_ASSERT(rmt.size() == DIM);
int i = 0;
for (auto const &row : rmt)
{
KOKKOS_ASSERT(row.size() == DIM);
int j = 0;
for (auto const &value : row)
_rmt[i][j++] = value;
++i;
}
}
KOKKOS_FUNCTION
constexpr auto ¢roid() { return _centroid; }
KOKKOS_FUNCTION
constexpr auto const ¢roid() const { return _centroid; }
KOKKOS_FUNCTION
constexpr auto const &rmt() const { return _rmt; }
Point<DIM, Coordinate> _centroid = {};
Coordinate _rmt[DIM][DIM] = {};
};
template <typename T, std::size_t N>
#if KOKKOS_VERSION >= 40400
KOKKOS_DEDUCTION_GUIDE
#else
KOKKOS_FUNCTION
#endif
Ellipsoid(T const (&)[N], T const (&)[N][N]) -> Ellipsoid<N, T>;
} // namespace ArborX::Experimental
template <int DIM, class Coordinate>
struct ArborX::GeometryTraits::dimension<
ArborX::Experimental::Ellipsoid<DIM, Coordinate>>
{
static constexpr int value = DIM;
};
template <int DIM, class Coordinate>
struct ArborX::GeometryTraits::tag<
ArborX::Experimental::Ellipsoid<DIM, Coordinate>>
{
using type = EllipsoidTag;
};
template <int DIM, class Coordinate>
struct ArborX::GeometryTraits::coordinate_type<
ArborX::Experimental::Ellipsoid<DIM, Coordinate>>
{
using type = Coordinate;
};
#endif