1#ifndef AMREX_REALVECT_H_
2#define AMREX_REALVECT_H_
3#include <AMReX_Config.H>
47 explicit RealVectND (
const std::vector<Real>& vr)
noexcept {
49 for (
int i = 0; i < dim; ++i) {
59 template <
class... Args>
60 requires ((
sizeof...(Args) + 2 == dim) &&
64 :
vect{i, j,
static_cast<Real>(ks)...} {}
68 for (
int i = 0; i < dim; ++i) {
80 for (
int i = 0; i < dim; ++i) {
92 for (
int i = 0; i < dim; ++i) {
103 for (
int i = 0; i < dim; ++i) {
137 template<std::
size_t i>
139 Real&
get () noexcept {
static_assert(0<=i && i<dim);
return vect[i];}
142 template<std::
size_t i>
144 const Real&
get () const noexcept {
static_assert(0<=i && i<dim);
return vect[i];}
149 for (
int i = 0; i < dim; ++i) {
206 bool retval =
vect[0] == p[0];
207 for (
int i=1; i<dim; ++i) {
208 retval = retval &&
vect[i] == p[i];
220 bool retval =
vect[0] != p[0];
221 for (
int i=1; i<dim; ++i) {
222 retval = retval ||
vect[i] != p[i];
332 const RealVectND& a_rhs)
const noexcept requires (dim == 3);
536 static constexpr std::size_t
size () noexcept {
537 return static_cast<std::size_t
>(dim);
541 static constexpr int isize () noexcept {
551 template<
int new_dim>
554 static_assert(new_dim <= dim);
562 template<
int new_dim>
565 static_assert(new_dim >= dim);
567 for (
int i=0; i<dim; ++i) {
577 template<
int new_dim>
580 if constexpr (new_dim > dim) {
581 return expand<new_dim>(fill_extra);
583 return shrink<new_dim>();
595template <
class... Args>
616using RealVect = RealVectND<AMREX_SPACEDIM>;
622 for (
int i=0; i<dim; ++i) {
632 for (
int i=0; i<dim; ++i) {
642 for (
int i=0; i<dim; ++i) {
660 for (
int i=0; i<dim; ++i) {
661 retval[i] = -vect[i];
670 for (
int i=0; i<dim; ++i) {
681 for (
int i=0; i<dim; ++i) {
682 retval[i] =
static_cast<int>(std::floor(vect[i]));
692 for (
int i=0; i<dim; ++i) {
693 retval[i] =
static_cast<int>(std::ceil(vect[i]));
703 for (
int i=0; i<dim; ++i) {
704 retval[i] =
static_cast<int>(std::round(vect[i]));
713 Real retval = vect[0];
714 for (
int i=1; i<dim; ++i) {
724 Real len = this->radSquared();
725 len = std::sqrt(len);
733 Real retval = vect[0] * vect[0];
734 for (
int i=1; i<dim; ++i) {
735 retval += vect[i] * vect[i];
744 Real retval = vect[0];
745 for (
int i=1; i<dim; ++i) {
755 bool retval = vect[0] < p[0];
756 for (
int i=1; i<dim; ++i) {
757 retval = retval && vect[i] < p[i];
766 bool retval = vect[0] <= p[0];
767 for (
int i=1; i<dim; ++i) {
768 retval = retval && vect[i] <= p[i];
777 bool retval = vect[0] > p[0];
778 for (
int i=1; i<dim; ++i) {
779 retval = retval && vect[i] > p[i];
788 bool retval = vect[0] >= p[0];
789 for (
int i=1; i<dim; ++i) {
790 retval = retval && vect[i] >= p[i];
799 for (
int i=0; i<dim; ++i) {
809 for (
int i=0; i<dim; ++i) {
841 Real retval = vect[0] * a_rhs.
vect[0];
842 for (
int i=1; i<dim; ++i) {
843 retval += vect[i] * a_rhs.vect[i];
855 vect[2] * a_rhs[0] - vect[0] * a_rhs[2],
856 vect[0] * a_rhs[1] - vect[1] * a_rhs[0]);
864 for (
int i=0; i<dim; ++i) {
874 for (
int i=0; i<dim; ++i) {
884 for (
int i=0; i<dim; ++i) {
895 for (
int i=0; i<dim; ++i) {
896 retval[i] = vect[i] * s;
906 for (
int i=0; i<dim; ++i) {
907 retval[i] = vect[i] - s;
917 for (
int i=0; i<dim; ++i) {
918 retval[i] = vect[i] + s;
927 for (
int i=0; i<dim; ++i) {
937 for (
int i=0; i<dim; ++i) {
948 for (
int i=0; i<dim; ++i) {
949 retval[i] = vect[i] / s;
961 if (std::abs(vect[
idir]) < std::abs(vect[mDir])) {
965 if (vect[
idir] < vect[mDir]) {
980 if (std::abs(vect[
idir]) > std::abs(vect[mDir])) {
984 if (vect[
idir] > vect[mDir]) {
1003template <
int dim=AMREX_SPACEDIM>
1025 for (
int i=0; i<dim; ++i) {
1026 retval[i] = s / p[i];
1039 for (
int i=0; i<dim; ++i) {
1040 retval[i] = p[i] + s;
1052 for (
int i=0; i<dim; ++i) {
1053 retval[i] = s - p[i];
1066 for (
int i=0; i<dim; ++i) {
1067 retval[i] = s * p[i];
1079 for (
int i=0; i<dim; ++i) {
1080 retval[i] = s[i] / p[i];
1092 for (
int i=0; i<dim; ++i) {
1093 retval[i] = p[i] + s[i];
1105 for (
int i=0; i<dim; ++i) {
1106 retval[i] = s[i] - p[i];
1118 for (
int i=0; i<dim; ++i) {
1119 retval[i] = p[i] * s[i];
1132 for (
int i=0; i<dim; ++i) {
1133 retval[i] = s * p[i];
1143 void RealVectCat_imp (
Real*& dst,
const RealVectND<dim>& src)
noexcept {
1144 for (
int i=0; i<dim; ++i) {
1152 void RealVectSplit_imp2 (RealVectND<dim>& dst,
const Real*& src)
noexcept {
1153 for (
int i=0; i<dim; ++i) {
1159 template<
class T, std::size_t...Ns>
1161 T RealVectSplit_imp (T& retval, std::index_sequence<Ns...>,
const Real * src)
noexcept {
1162 (RealVectSplit_imp2(amrex::get<Ns>(retval), src), ...);
1178 return detail::T_vector_write(os, p.
begin(), dim);
1193 return detail::T_vector_read(is, p.
begin(), dim);
1200template<
int d,
int...dims>
1203constexpr RealVectND<detail::get_sum<d, dims...>()>
1205 RealVectND<detail::get_sum<d, dims...>()> retval {0.};
1207 detail::RealVectCat_imp(dst, v);
1208 (detail::RealVectCat_imp(dst, vects), ...);
1216template<
int d,
int...dims>
1219constexpr GpuTuple<RealVectND<d>, RealVectND<dims>...>
1222 return detail::RealVectSplit_imp(retval,
1223 std::make_index_sequence<1 +
sizeof...(dims)>(),
1231template<
int new_dim,
int old_dim>
1234constexpr RealVectND<new_dim>
1236 return iv.template shrink<new_dim>();
1243template<
int new_dim,
int old_dim>
1246constexpr RealVectND<new_dim>
1248 return iv.template expand<new_dim>(fill_extra);
1255template<
int new_dim,
int old_dim>
1258constexpr RealVectND<new_dim>
1260 return iv.template resize<new_dim>(fill_extra);
1269struct std::tuple_size<
amrex::RealVectND<dim>> {
1270 static constexpr std::size_t value = dim;
1274template<std::
size_t s,
int dim>
1275struct std::tuple_element<s,
amrex::RealVectND<dim>> {
#define BL_ASSERT(EX)
Definition AMReX_BLassert.H:39
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
int idir
Definition AMReX_HypreMLABecLap.cpp:1143
GPU-compatible tuple.
Definition AMReX_Tuple.H:98
An Integer Vector in dim-Dimensional Space.
Definition AMReX_IntVect.H:149
A Real vector in dim-dimensional space.
Definition AMReX_RealVect.H:34
__host__ __device__ bool operator<=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:765
__host__ __device__ constexpr const Real & get() const noexcept
Returns a reference to the i'th coordinate of the RealVectND. Used by structured bindings.
Definition AMReX_RealVect.H:144
__host__ __device__ RealVectND & operator*=(Real s) noexcept
Definition AMReX_RealVect.H:631
__host__ __device__ constexpr Real * begin() noexcept
Definition AMReX_RealVect.H:167
__host__ __device__ int maxDir(const bool &a_doAbs) const noexcept
Definition AMReX_RealVect.H:976
__host__ __device__ constexpr Real * end() noexcept
Definition AMReX_RealVect.H:181
constexpr RealVectND() noexcept
Definition AMReX_RealVect.H:45
__host__ __device__ RealVectND & max(const RealVectND &p) noexcept
Definition AMReX_RealVect.H:808
__host__ __device__ RealVectND< new_dim > shrink() const noexcept
Returns a new RealVectND of size new_dim and assigns the first new_dim values of this RealVectND to i...
Definition AMReX_RealVect.H:553
__host__ __device__ RealVectND operator-() const noexcept
Definition AMReX_RealVect.H:658
__host__ __device__ constexpr bool operator==(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:205
__host__ static __device__ constexpr int isize() noexcept
Definition AMReX_RealVect.H:541
__host__ __device__ RealVectND & operator+=(Real s) noexcept
Definition AMReX_RealVect.H:863
RealVectND(const std::vector< Real > &vr) noexcept
Definition AMReX_RealVect.H:47
__host__ __device__ Real dotProduct(const RealVectND &a_rhs) const noexcept
Definition AMReX_RealVect.H:840
__host__ __device__ IntVectND< dim > round() const noexcept
Definition AMReX_RealVect.H:701
__host__ static __device__ constexpr RealVectND TheZeroVector() noexcept
Definition AMReX_RealVect.H:522
__host__ __device__ RealVectND crossProduct(const RealVectND &a_rhs) const noexcept
Definition AMReX_RealVect.H:851
__host__ __device__ constexpr const Real * begin() const noexcept
Definition AMReX_RealVect.H:174
__host__ __device__ RealVectND operator/(Real s) const noexcept
Definition AMReX_RealVect.H:946
__host__ __device__ RealVectND operator+() const noexcept
Definition AMReX_RealVect.H:651
__host__ __device__ bool operator>=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:787
__host__ __device__ const Real * dataPtr() const noexcept
Definition AMReX_RealVect.H:483
__host__ __device__ constexpr RealVectND(Real s) noexcept
Definition AMReX_RealVect.H:67
__host__ __device__ RealVectND & scale(Real s) noexcept
Definition AMReX_RealVect.H:669
__host__ __device__ Real radSquared() const noexcept
Definition AMReX_RealVect.H:732
__host__ __device__ bool operator<(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:754
__host__ __device__ Real sum() const noexcept
Definition AMReX_RealVect.H:712
__host__ static __device__ constexpr std::size_t size() noexcept
Definition AMReX_RealVect.H:536
__host__ __device__ constexpr RealVectND(const IntVectND< dim > &iv) noexcept
Definition AMReX_RealVect.H:91
Real & operator[](int i) &&=delete
__host__ __device__ constexpr const Real * end() const noexcept
Definition AMReX_RealVect.H:188
Real vect[dim]
Definition AMReX_RealVect.H:591
__host__ __device__ Real product() const noexcept
Definition AMReX_RealVect.H:743
__host__ __device__ constexpr Real & get() noexcept
Returns a reference to the i'th coordinate of the RealVectND. Used by structured bindings.
Definition AMReX_RealVect.H:139
__host__ __device__ Real vectorLength() const noexcept
Definition AMReX_RealVect.H:723
__host__ __device__ bool operator>(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:776
__host__ __device__ RealVectND operator*(Real s) const noexcept
Definition AMReX_RealVect.H:893
__host__ __device__ int minDir(const bool &a_doAbs) const noexcept
Definition AMReX_RealVect.H:957
__host__ __device__ constexpr RealVectND(const GpuArray< Real, dim > ga) noexcept
Definition AMReX_RealVect.H:102
__host__ __device__ IntVectND< dim > floor() const noexcept
Definition AMReX_RealVect.H:679
__host__ __device__ IntVectND< dim > ceil() const noexcept
Definition AMReX_RealVect.H:690
__host__ __device__ RealVectND & operator/=(Real s) noexcept
Definition AMReX_RealVect.H:926
__host__ static __device__ constexpr RealVectND TheUnitVector() noexcept
Definition AMReX_RealVect.H:529
static const RealVectND Unit
Definition AMReX_RealVect.H:509
static const RealVectND Zero
Definition AMReX_RealVect.H:503
__host__ __device__ constexpr GpuArray< Real, dim > to_array() const noexcept
Definition AMReX_RealVect.H:147
__host__ __device__ RealVectND & operator-=(Real s) noexcept
Definition AMReX_RealVect.H:621
__host__ __device__ RealVectND< new_dim > resize(Real fill_extra=0.) const noexcept
Returns a new RealVectND of size new_dim by either shrinking or expanding this RealVectND.
Definition AMReX_RealVect.H:579
Real value_type
Definition AMReX_RealVect.H:545
__host__ __device__ Real * dataPtr() noexcept
Definition AMReX_RealVect.H:490
__host__ __device__ RealVectND(const Real *a) noexcept
Definition AMReX_RealVect.H:79
__host__ __device__ RealVectND< new_dim > expand(Real fill_extra=0.) const noexcept
Returns a new RealVectND of size new_dim and assigns all values of this RealVectND to it andĀ fill_ext...
Definition AMReX_RealVect.H:564
__host__ __device__ RealVectND & min(const RealVectND &p) noexcept
Definition AMReX_RealVect.H:798
__host__ __device__ constexpr bool operator!=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:219
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Definition AMReX_Amr.cpp:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
__host__ __device__ constexpr RealVectND< new_dim > RealVectExpand(const RealVectND< old_dim > &iv, Real fill_extra=0) noexcept
Returns a new RealVectND of size new_dim and assigns all values of iv to it andĀ fill_extra to the rem...
Definition AMReX_RealVect.H:1247
__host__ __device__ GpuComplex< T > operator*(const GpuComplex< T > &a_x, const GpuComplex< U > &a_y) noexcept
Multiply two complex numbers.
Definition AMReX_GpuComplex.H:257
__host__ __device__ RealVectND< dim > BASISREALV(int dir) noexcept
Definition AMReX_RealVect.H:1005
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:25
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:256
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:37
__host__ __device__ constexpr IntVectND< dim > scale(const IntVectND< dim > &p, int s) noexcept
Returns a IntVectND obtained by multiplying each of the components of this IntVectND by s.
Definition AMReX_IntVect.H:1102
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:45
__host__ __device__ GpuComplex< T > operator/(const GpuComplex< T > &a_x, const GpuComplex< T > &a_y) noexcept
Divide a complex number by another one.
Definition AMReX_GpuComplex.H:293
__host__ __device__ constexpr GpuTuple< RealVectND< d >, RealVectND< dims >... > RealVectSplit(const RealVectND< detail::get_sum< d, dims... >()> &v) noexcept
Returns a tuple of RealVectND obtained by splitting the input RealVectND according to the dimensions ...
Definition AMReX_RealVect.H:1220
__host__ __device__ constexpr RealVectND< detail::get_sum< d, dims... >()> RealVectCat(const RealVectND< d > &v, const RealVectND< dims > &...vects) noexcept
Returns a RealVectND obtained by concatenating the input RealVectNDs. The dimension of the return val...
Definition AMReX_RealVect.H:1204
__host__ __device__ constexpr RealVectND< new_dim > RealVectResize(const RealVectND< old_dim > &iv, Real fill_extra=0) noexcept
Returns a new RealVectND of size new_dim by either shrinking or expanding iv.
Definition AMReX_RealVect.H:1259
std::istream & operator>>(std::istream &is, BoxND< dim > &bx)
Read from istream.
Definition AMReX_Box.H:1834
__host__ __device__ constexpr RealVectND< new_dim > RealVectShrink(const RealVectND< old_dim > &iv) noexcept
Returns a new RealVectND of size new_dim and assigns the first new_dim values of iv to it.
Definition AMReX_RealVect.H:1235
__host__ __device__ XDim3 operator-(XDim3 const &a, XDim3 const &b)
Definition AMReX_Dim3.H:35
__host__ __device__ XDim3 operator+(XDim3 const &a, XDim3 const &b)
Definition AMReX_Dim3.H:29
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:43
amrex::Real type
Definition AMReX_RealVect.H:1276