Advanced Multi-Physics (AMP)
On-Line Documentation
MeshPoint.h
Go to the documentation of this file.
1#ifndef included_AMP_MeshPoint
2#define included_AMP_MeshPoint
3
4
5#include <array>
6#include <cstddef>
7#include <cstdint>
8#include <initializer_list>
9#include <math.h>
10#include <ostream>
11#include <sstream>
12#include <stdexcept>
13#include <vector>
14
15
16namespace AMP::Mesh {
17
18
23template<class TYPE>
24class MeshPoint final
25{
26public:
28 constexpr MeshPoint() noexcept : d_ndim( 0 ), d_data{ 0, 0, 0 } {}
29
30 // Constructors
31 constexpr MeshPoint( std::initializer_list<TYPE> x ) : d_ndim( x.size() ), d_data{ 0, 0, 0 }
32 {
33 if ( d_ndim > 3 || d_ndim == 0 )
34 throw std::logic_error( "Invalid Dimension" );
35 auto it = x.begin();
36 d_data[0] = *it;
37 for ( size_t d = 1; d < d_ndim; d++ )
38 d_data[d] = *( ++it );
39 }
40 constexpr explicit MeshPoint( size_t ndim ) noexcept : d_ndim( ndim ), d_data{ 0, 0, 0 } {}
41 constexpr explicit MeshPoint( const TYPE &x ) noexcept : d_ndim( 1 ), d_data{ x, 0, 0 } {}
42 constexpr explicit MeshPoint( const TYPE &x, const TYPE &y ) noexcept
43 : d_ndim( 2 ), d_data{ x, y, 0 }
44 {
45 }
46 constexpr explicit MeshPoint( const TYPE &x, const TYPE &y, const TYPE &z ) noexcept
47 : d_ndim( 3 ), d_data{ x, y, z }
48 {
49 }
50 constexpr explicit MeshPoint( const size_t ndim, const TYPE *x ) noexcept
51 : d_ndim( ndim ), d_data{ 0, 0, 0 }
52 {
53 for ( size_t d = 0; d < d_ndim; d++ )
54 d_data[d] = x[d];
55 }
56 constexpr MeshPoint( const size_t ndim, std::initializer_list<TYPE> x )
57 : d_ndim( ndim ), d_data{ 0, 0, 0 }
58 {
59 if ( d_ndim > 3 )
60 throw std::logic_error( "Invalid Dimension" );
61 auto it = x.begin();
62 d_data[0] = *it;
63 for ( size_t d = 1; d < std::min<size_t>( d_ndim, x.size() ); d++ )
64 d_data[d] = *( ++it );
65 }
66 template<std::size_t NDIM>
67 constexpr MeshPoint( const std::array<TYPE, NDIM> &x ) : d_ndim( NDIM ), d_data{ 0, 0, 0 }
68 {
69 for ( size_t d = 0; d < NDIM; d++ )
70 d_data[d] = x[d];
71 }
72 MeshPoint( const std::vector<TYPE> &x ) : d_ndim( x.size() ), d_data{ 0, 0, 0 }
73 {
74 for ( size_t d = 0; d < x.size(); d++ )
75 d_data[d] = x[d];
76 }
77
78 // Typecast operators
79 constexpr operator std::array<TYPE, 1>() const { return { d_data[0] }; }
80 constexpr operator std::array<TYPE, 2>() const { return { d_data[0], d_data[1] }; }
81 constexpr operator std::array<TYPE, 3>() const { return { d_data[0], d_data[1], d_data[2] }; }
82
83
84 // Copy/assigment operators
85 constexpr MeshPoint( MeshPoint && ) noexcept = default;
86 constexpr MeshPoint( const MeshPoint & ) noexcept = default;
87 constexpr MeshPoint &operator=( MeshPoint && ) noexcept = default;
88 constexpr MeshPoint &operator=( const MeshPoint & ) noexcept = default;
89
90 // Copy point of a different type
91 template<class TYPE2>
92 constexpr MeshPoint( const MeshPoint<TYPE2> &rhs ) noexcept : d_ndim( rhs.d_ndim )
93 {
94 d_data[0] = rhs.d_data[0];
95 d_data[1] = rhs.d_data[1];
96 d_data[2] = rhs.d_data[2];
97 }
98
99 // Number of dimensions
100 constexpr size_t size() const { return d_ndim; }
101 constexpr uint8_t ndim() const { return d_ndim; }
102 constexpr void setNdim( uint8_t N ) { d_ndim = N; }
103
104 // Accessors
105 constexpr TYPE *data() noexcept { return d_data; }
106 constexpr const TYPE *data() const noexcept { return d_data; }
107 constexpr TYPE &x() noexcept { return d_data[0]; }
108 constexpr TYPE &y() noexcept { return d_data[1]; }
109 constexpr TYPE &z() noexcept { return d_data[2]; }
110 constexpr const TYPE &x() const { return d_data[0]; }
111 constexpr const TYPE &y() const { return d_data[1]; }
112 constexpr const TYPE &z() const { return d_data[2]; }
113 constexpr TYPE &operator[]( std::size_t i )
114 {
115 if ( i >= d_ndim )
116 throw std::logic_error( "Invalid index" );
117 return d_data[i];
118 }
119 constexpr const TYPE &operator[]( std::size_t i ) const
120 {
121 if ( i >= d_ndim )
122 throw std::logic_error( "Invalid index" );
123 return d_data[i];
124 }
125
126 // Iterators
127 constexpr TYPE *begin() noexcept { return d_data; }
128 constexpr TYPE *end() noexcept { return d_data + d_ndim; }
129 constexpr const TYPE *begin() const noexcept { return d_data; }
130 constexpr const TYPE *end() const noexcept { return d_data + d_ndim; }
131
132 // Arithmetic operators
133 constexpr MeshPoint &operator+=( const TYPE rhs ) noexcept
134 {
135 d_data[0] += rhs;
136 d_data[1] += rhs;
137 d_data[2] += rhs;
138 return *this;
139 }
140 template<class TYPE2>
141 constexpr MeshPoint &operator+=( const MeshPoint<TYPE2> &rhs ) noexcept
142 {
143 d_data[0] += rhs.d_data[0];
144 d_data[1] += rhs.d_data[1];
145 d_data[2] += rhs.d_data[2];
146 return *this;
147 }
148 constexpr MeshPoint &operator-=( const TYPE rhs ) noexcept
149 {
150 d_data[0] -= rhs;
151 d_data[1] -= rhs;
152 d_data[2] -= rhs;
153 return *this;
154 }
155 template<class TYPE2>
156 constexpr MeshPoint &operator-=( const MeshPoint<TYPE2> &rhs ) noexcept
157 {
158 d_data[0] -= rhs.d_data[0];
159 d_data[1] -= rhs.d_data[1];
160 d_data[2] -= rhs.d_data[2];
161 return *this;
162 }
163 constexpr MeshPoint &operator*=( const TYPE &rhs ) noexcept
164 {
165 d_data[0] *= rhs;
166 d_data[1] *= rhs;
167 d_data[2] *= rhs;
168 return *this;
169 }
170
171 // Comparison operators
172 constexpr bool operator==( const MeshPoint &rhs ) const
173 {
174 return d_ndim == rhs.d_ndim && d_data[0] == rhs.d_data[0] && d_data[1] == rhs.d_data[1] &&
175 d_data[2] == rhs.d_data[2];
176 }
177 constexpr bool operator!=( const MeshPoint &rhs ) const
178 {
179 return d_ndim != rhs.d_ndim || d_data[0] != rhs.d_data[0] || d_data[1] != rhs.d_data[1] ||
180 d_data[2] != rhs.d_data[2];
181 }
182 constexpr bool operator>( const MeshPoint &rhs ) const
183 {
184 if ( d_ndim != rhs.d_ndim )
185 return d_ndim > rhs.d_ndim;
186 for ( int d = 0; d < 3; d++ ) {
187 if ( d_data[d] != rhs.d_data[d] )
188 return d_data[d] > rhs.d_data[d];
189 }
190 return false;
191 }
192 constexpr bool operator>=( const MeshPoint &rhs ) const
193 {
194 if ( d_ndim != rhs.d_ndim )
195 return d_ndim > rhs.d_ndim;
196 for ( int d = 0; d < 3; d++ ) {
197 if ( d_data[d] != rhs.d_data[d] )
198 return d_data[d] > rhs.d_data[d];
199 }
200 return true;
201 }
202 constexpr bool operator<( const MeshPoint &rhs ) const
203 {
204 if ( d_ndim != rhs.d_ndim )
205 return d_ndim > rhs.d_ndim;
206 for ( int d = 0; d < 3; d++ ) {
207 if ( d_data[d] != rhs.d_data[d] )
208 return d_data[d] < rhs.d_data[d];
209 }
210 return false;
211 }
212 constexpr bool operator<=( const MeshPoint &rhs ) const
213 {
214 if ( d_ndim != rhs.d_ndim )
215 return d_ndim < rhs.d_ndim;
216 for ( int d = 0; d < 3; d++ ) {
217 if ( d_data[d] != rhs.d_data[d] )
218 return d_data[d] < rhs.d_data[d];
219 }
220 return true;
221 }
222
224 constexpr TYPE norm() const
225 {
226 return d_data[0] * d_data[0] + d_data[1] * d_data[1] + d_data[2] * d_data[2];
227 }
228
230 inline TYPE abs() const { return std::sqrt( norm() ); }
231
233 inline void print( std::ostream &os ) const
234 {
235 if ( d_ndim == 0 ) {
236 os << "()";
237 } else {
238 os << "(" << d_data[0];
239 for ( int d = 1; d < d_ndim; d++ )
240 os << "," << d_data[d];
241 os << ")";
242 }
243 }
244
246 inline std::string print() const
247 {
248 std::ostringstream stream;
249 print( stream );
250 return stream.str();
251 }
252
253private:
254 uint8_t d_ndim;
255 TYPE d_data[3];
256};
257
258
260
261
262/****************************************************************
263 * Operator overloading *
264 ****************************************************************/
265template<class TYPE>
268{
269 TYPE c[3] = { a.x() + b.x(), a.y() + b.y(), a.z() + b.z() };
270 return AMP::Mesh::MeshPoint<TYPE>( a.size(), c );
271}
272template<class TYPE>
274{
275 TYPE c[3] = { a.x() + b, a.y() + b, a.z() + b };
276 return AMP::Mesh::MeshPoint<TYPE>( a.size(), c );
277}
278template<class TYPE>
280{
281 TYPE c[3] = { a + b.x(), a + b.y(), a + b.z() };
282 return AMP::Mesh::MeshPoint<TYPE>( b.size(), c );
283}
284template<class TYPE>
287{
288 TYPE c[3] = { a.x() - b.x(), a.y() - b.y(), a.z() - b.z() };
289 return AMP::Mesh::MeshPoint<TYPE>( a.size(), c );
290}
291template<class TYPE>
293{
294 TYPE c[3] = { a.x() - b, a.y() - b, a.z() - b };
295 return AMP::Mesh::MeshPoint<TYPE>( a.size(), c );
296}
297template<class TYPE>
299{
300 TYPE c[3] = { a - b.x(), a - b.y(), a - b.z() };
301 return AMP::Mesh::MeshPoint<TYPE>( b.size(), c );
302}
303template<class TYPE>
305{
306 TYPE c[3] = { -a.x(), -a.y(), -a.z() };
307 return AMP::Mesh::MeshPoint<TYPE>( a.size(), c );
308}
309template<class TYPE>
311{
312 auto c = a;
313 c.x() *= b;
314 c.y() *= b;
315 c.z() *= b;
316 return c;
317}
318template<class TYPE>
320{
321 auto c = b;
322 c.x() *= a;
323 c.y() *= a;
324 c.z() *= a;
325 return c;
326}
327
328
329/****************************************************************
330 * Helper functions *
331 ****************************************************************/
332template<class TYPE>
333constexpr TYPE abs( const AMP::Mesh::MeshPoint<TYPE> &x )
334{
335 return x.abs();
336}
337template<class TYPE>
339{
340 return a.x() * b.x() + a.y() * b.y() + a.z() * b.z();
341}
342template<class TYPE>
345{
346 return AMP::Mesh::MeshPoint<TYPE>( a.y() * b.z() - a.z() * b.y(),
347 a.z() * b.x() - a.x() * b.z(),
348 a.x() * b.y() - a.y() * b.x() );
349}
350template<class TYPE>
352{
353 auto y = x;
354 double t = 1.0 / x.abs();
355 y.x() *= t;
356 y.y() *= t;
357 y.z() *= t;
358 return y;
359}
360template<class TYPE>
361std::ostream &operator<<( std::ostream &out, const AMP::Mesh::MeshPoint<TYPE> &x )
362{
363 x.print( out );
364 return out;
365}
366
367} // namespace AMP::Mesh
368
369
370#endif
constexpr TYPE & z() noexcept
Definition MeshPoint.h:109
constexpr const TYPE & y() const
Definition MeshPoint.h:111
constexpr const TYPE * begin() const noexcept
Definition MeshPoint.h:129
constexpr bool operator<(const MeshPoint &rhs) const
Definition MeshPoint.h:202
constexpr TYPE & operator[](std::size_t i)
Definition MeshPoint.h:113
constexpr MeshPoint(const size_t ndim, const TYPE *x) noexcept
Definition MeshPoint.h:50
constexpr TYPE * data() noexcept
Definition MeshPoint.h:105
constexpr MeshPoint(const TYPE &x, const TYPE &y) noexcept
Definition MeshPoint.h:42
constexpr MeshPoint(const TYPE &x) noexcept
Definition MeshPoint.h:41
constexpr MeshPoint & operator-=(const TYPE rhs) noexcept
Definition MeshPoint.h:148
constexpr MeshPoint & operator*=(const TYPE &rhs) noexcept
Definition MeshPoint.h:163
constexpr bool operator!=(const MeshPoint &rhs) const
Definition MeshPoint.h:177
constexpr TYPE * begin() noexcept
Definition MeshPoint.h:127
constexpr TYPE norm() const
Return the squared magnitude.
Definition MeshPoint.h:224
constexpr MeshPoint(const std::array< TYPE, NDIM > &x)
Definition MeshPoint.h:67
constexpr MeshPoint(size_t ndim) noexcept
Definition MeshPoint.h:40
MeshPoint(const std::vector< TYPE > &x)
Definition MeshPoint.h:72
constexpr MeshPoint(std::initializer_list< TYPE > x)
Definition MeshPoint.h:31
constexpr uint8_t ndim() const
Definition MeshPoint.h:101
constexpr TYPE * end() noexcept
Definition MeshPoint.h:128
constexpr TYPE & y() noexcept
Definition MeshPoint.h:108
constexpr MeshPoint(MeshPoint &&) noexcept=default
constexpr bool operator>=(const MeshPoint &rhs) const
Definition MeshPoint.h:192
constexpr size_t size() const
Definition MeshPoint.h:100
constexpr MeshPoint(const TYPE &x, const TYPE &y, const TYPE &z) noexcept
Definition MeshPoint.h:46
constexpr const TYPE & z() const
Definition MeshPoint.h:112
TYPE abs() const
Return the magnitude.
Definition MeshPoint.h:230
constexpr MeshPoint & operator-=(const MeshPoint< TYPE2 > &rhs) noexcept
Definition MeshPoint.h:156
constexpr const TYPE & x() const
Definition MeshPoint.h:110
constexpr TYPE & x() noexcept
Definition MeshPoint.h:107
constexpr MeshPoint & operator+=(const MeshPoint< TYPE2 > &rhs) noexcept
Definition MeshPoint.h:141
constexpr bool operator==(const MeshPoint &rhs) const
Definition MeshPoint.h:172
constexpr MeshPoint() noexcept
Empty constructor.
Definition MeshPoint.h:28
constexpr void setNdim(uint8_t N)
Definition MeshPoint.h:102
constexpr const TYPE * end() const noexcept
Definition MeshPoint.h:130
std::string print() const
Print the point.
Definition MeshPoint.h:246
constexpr const TYPE & operator[](std::size_t i) const
Definition MeshPoint.h:119
void print(std::ostream &os) const
Print the point.
Definition MeshPoint.h:233
constexpr bool operator>(const MeshPoint &rhs) const
Definition MeshPoint.h:182
constexpr bool operator<=(const MeshPoint &rhs) const
Definition MeshPoint.h:212
constexpr MeshPoint & operator+=(const TYPE rhs) noexcept
Definition MeshPoint.h:133
constexpr const TYPE * data() const noexcept
Definition MeshPoint.h:106
constexpr MeshPoint(const size_t ndim, std::initializer_list< TYPE > x)
Definition MeshPoint.h:56
constexpr AMP::Mesh::MeshPoint< TYPE > operator*(const AMP::Mesh::MeshPoint< TYPE > &a, const TYPE &b)
Definition MeshPoint.h:310
constexpr AMP::Mesh::MeshPoint< TYPE > normalize(const AMP::Mesh::MeshPoint< TYPE > &x)
Definition MeshPoint.h:351
constexpr TYPE dot(const AMP::Mesh::MeshPoint< TYPE > &a, const AMP::Mesh::MeshPoint< TYPE > &b)
Definition MeshPoint.h:338
constexpr TYPE abs(const AMP::Mesh::MeshPoint< TYPE > &x)
Definition MeshPoint.h:333
std::ostream & operator<<(std::ostream &out, GeomType x)
GeomType operator-(GeomType, int) noexcept
GeomType operator+(GeomType, int) noexcept
constexpr AMP::Mesh::MeshPoint< TYPE > cross(const AMP::Mesh::MeshPoint< TYPE > &a, const AMP::Mesh::MeshPoint< TYPE > &b)
Definition MeshPoint.h:343



Advanced Multi-Physics (AMP)
Oak Ridge National Laboratory
Idaho National Laboratory
Los Alamos National Laboratory
This page automatically produced from the
source code by doxygen
Last updated: Tue Mar 10 2026 13:06:41.
Comments on this page