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,
61 (
sizeof...(Args) + 2 == dim) &&
66 :
vect{i, j,
static_cast<Real>(ks)...} {}
70 for (
int i = 0; i < dim; ++i) {
82 for (
int i = 0; i < dim; ++i) {
94 for (
int i = 0; i < dim; ++i) {
105 for (
int i = 0; i < dim; ++i) {
139 template<std::
size_t i>
141 Real&
get () noexcept {
static_assert(0<=i && i<dim);
return vect[i];}
144 template<std::
size_t i>
146 const Real&
get () const noexcept {
static_assert(0<=i && i<dim);
return vect[i];}
151 for (
int i = 0; i < dim; ++i) {
208 bool retval =
vect[0] == p[0];
209 for (
int i=1; i<dim; ++i) {
210 retval = retval &&
vect[i] == p[i];
222 bool retval =
vect[0] != p[0];
223 for (
int i=1; i<dim; ++i) {
224 retval = retval ||
vect[i] != p[i];
333 template <
int N=dim, std::enable_if_t<( N==3 ),
int> = 0>
538 static constexpr std::size_t
size () noexcept {
539 return static_cast<std::size_t
>(dim);
543 static constexpr int isize () noexcept {
553 template<
int new_dim>
556 static_assert(new_dim <= dim);
564 template<
int new_dim>
567 static_assert(new_dim >= dim);
569 for (
int i=0; i<dim; ++i) {
579 template<
int new_dim>
582 if constexpr (new_dim > dim) {
583 return expand<new_dim>(fill_extra);
585 return shrink<new_dim>();
597template <
class...Args,
620using RealVect = RealVectND<AMREX_SPACEDIM>;
626 for (
int i=0; i<dim; ++i) {
636 for (
int i=0; i<dim; ++i) {
646 for (
int i=0; i<dim; ++i) {
664 for (
int i=0; i<dim; ++i) {
665 retval[i] = -vect[i];
674 for (
int i=0; i<dim; ++i) {
685 for (
int i=0; i<dim; ++i) {
686 retval[i] =
static_cast<int>(std::floor(vect[i]));
696 for (
int i=0; i<dim; ++i) {
697 retval[i] =
static_cast<int>(std::ceil(vect[i]));
707 for (
int i=0; i<dim; ++i) {
708 retval[i] =
static_cast<int>(std::round(vect[i]));
717 Real retval = vect[0];
718 for (
int i=1; i<dim; ++i) {
728 Real len = this->radSquared();
729 len = std::sqrt(len);
737 Real retval = vect[0] * vect[0];
738 for (
int i=1; i<dim; ++i) {
739 retval += vect[i] * vect[i];
748 Real retval = vect[0];
749 for (
int i=1; i<dim; ++i) {
759 bool retval = vect[0] < p[0];
760 for (
int i=1; i<dim; ++i) {
761 retval = retval && vect[i] < p[i];
770 bool retval = vect[0] <= p[0];
771 for (
int i=1; i<dim; ++i) {
772 retval = retval && vect[i] <= p[i];
781 bool retval = vect[0] > p[0];
782 for (
int i=1; i<dim; ++i) {
783 retval = retval && vect[i] > p[i];
792 bool retval = vect[0] >= p[0];
793 for (
int i=1; i<dim; ++i) {
794 retval = retval && vect[i] >= p[i];
803 for (
int i=0; i<dim; ++i) {
813 for (
int i=0; i<dim; ++i) {
845 Real retval = vect[0] * a_rhs.
vect[0];
846 for (
int i=1; i<dim; ++i) {
847 retval += vect[i] * a_rhs.vect[i];
853template <
int N, std::enable_if_t<( N==3 ),
int>>
858 vect[2] * a_rhs[0] - vect[0] * a_rhs[2],
859 vect[0] * a_rhs[1] - vect[1] * a_rhs[0]);
867 for (
int i=0; i<dim; ++i) {
877 for (
int i=0; i<dim; ++i) {
887 for (
int i=0; i<dim; ++i) {
898 for (
int i=0; i<dim; ++i) {
899 retval[i] = vect[i] * s;
909 for (
int i=0; i<dim; ++i) {
910 retval[i] = vect[i] - s;
920 for (
int i=0; i<dim; ++i) {
921 retval[i] = vect[i] + s;
930 for (
int i=0; i<dim; ++i) {
940 for (
int i=0; i<dim; ++i) {
951 for (
int i=0; i<dim; ++i) {
952 retval[i] = vect[i] / s;
964 if (std::abs(vect[
idir]) < std::abs(vect[mDir])) {
968 if (vect[
idir] < vect[mDir]) {
983 if (std::abs(vect[
idir]) > std::abs(vect[mDir])) {
987 if (vect[
idir] > vect[mDir]) {
1006template <
int dim=AMREX_SPACEDIM>
1028 for (
int i=0; i<dim; ++i) {
1029 retval[i] = s / p[i];
1042 for (
int i=0; i<dim; ++i) {
1043 retval[i] = p[i] + s;
1055 for (
int i=0; i<dim; ++i) {
1056 retval[i] = s - p[i];
1069 for (
int i=0; i<dim; ++i) {
1070 retval[i] = s * p[i];
1082 for (
int i=0; i<dim; ++i) {
1083 retval[i] = s[i] / p[i];
1095 for (
int i=0; i<dim; ++i) {
1096 retval[i] = p[i] + s[i];
1108 for (
int i=0; i<dim; ++i) {
1109 retval[i] = s[i] - p[i];
1121 for (
int i=0; i<dim; ++i) {
1122 retval[i] = p[i] * s[i];
1135 for (
int i=0; i<dim; ++i) {
1136 retval[i] = s * p[i];
1143 std::ostream& real_vector_write (std::ostream& os,
const Real* p,
int dim);
1144 std::istream& real_vector_read (std::istream& is,
Real* p,
int dim);
1148 void RealVectCat_imp (
Real*& dst,
const RealVectND<dim>& src)
noexcept {
1149 for (
int i=0; i<dim; ++i) {
1157 void RealVectSplit_imp2 (RealVectND<dim>& dst,
const Real*& src)
noexcept {
1158 for (
int i=0; i<dim; ++i) {
1164 template<
class T, std::size_t...Ns>
1166 T RealVectSplit_imp (T& retval, std::index_sequence<Ns...>,
const Real * src)
noexcept {
1167 (RealVectSplit_imp2(amrex::get<Ns>(retval), src), ...);
1177 return detail::real_vector_write(os, p.
begin(), dim);
1184 return detail::real_vector_read(is, p.
begin(), dim);
1191template<
int d,
int...dims>
1194constexpr RealVectND<detail::get_sum<d, dims...>()>
1196 RealVectND<detail::get_sum<d, dims...>()> retval {0.};
1198 detail::RealVectCat_imp(dst, v);
1199 (detail::RealVectCat_imp(dst, vects), ...);
1207template<
int d,
int...dims>
1210constexpr GpuTuple<RealVectND<d>, RealVectND<dims>...>
1213 return detail::RealVectSplit_imp(retval,
1214 std::make_index_sequence<1 +
sizeof...(dims)>(),
1222template<
int new_dim,
int old_dim>
1225constexpr RealVectND<new_dim>
1227 return iv.template shrink<new_dim>();
1234template<
int new_dim,
int old_dim>
1237constexpr RealVectND<new_dim>
1239 return iv.template expand<new_dim>(fill_extra);
1246template<
int new_dim,
int old_dim>
1249constexpr RealVectND<new_dim>
1251 return iv.template resize<new_dim>(fill_extra);
1260struct std::tuple_size<
amrex::RealVectND<dim>> {
1261 static constexpr std::size_t value = dim;
1265template<std::
size_t s,
int dim>
1266struct 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:1093
GPU-compatible tuple.
Definition AMReX_Tuple.H:98
An Integer Vector in dim-Dimensional Space.
Definition AMReX_IntVect.H:57
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:769
__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:146
__host__ __device__ RealVectND & operator*=(Real s) noexcept
Definition AMReX_RealVect.H:635
__host__ __device__ constexpr Real * begin() noexcept
Definition AMReX_RealVect.H:169
__host__ __device__ int maxDir(const bool &a_doAbs) const noexcept
Definition AMReX_RealVect.H:979
__host__ __device__ constexpr Real * end() noexcept
Definition AMReX_RealVect.H:183
constexpr RealVectND() noexcept
Definition AMReX_RealVect.H:45
__host__ __device__ RealVectND & max(const RealVectND &p) noexcept
Definition AMReX_RealVect.H:812
__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:555
__host__ __device__ RealVectND operator-() const noexcept
Definition AMReX_RealVect.H:662
__host__ __device__ constexpr bool operator==(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:207
__host__ __device__ constexpr RealVectND(Real i, Real j, Args... ks) noexcept
Definition AMReX_RealVect.H:65
__host__ static __device__ constexpr int isize() noexcept
Definition AMReX_RealVect.H:543
__host__ __device__ RealVectND & operator+=(Real s) noexcept
Definition AMReX_RealVect.H:866
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:844
__host__ __device__ RealVectND crossProduct(const RealVectND &a_rhs) const noexcept
__host__ __device__ IntVectND< dim > round() const noexcept
Definition AMReX_RealVect.H:705
__host__ static __device__ constexpr RealVectND TheZeroVector() noexcept
Definition AMReX_RealVect.H:524
__host__ __device__ constexpr const Real * begin() const noexcept
Definition AMReX_RealVect.H:176
__host__ __device__ RealVectND operator/(Real s) const noexcept
Definition AMReX_RealVect.H:949
__host__ __device__ RealVectND operator+() const noexcept
Definition AMReX_RealVect.H:655
__host__ __device__ bool operator>=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:791
__host__ __device__ const Real * dataPtr() const noexcept
Definition AMReX_RealVect.H:485
__host__ __device__ constexpr RealVectND(Real s) noexcept
Definition AMReX_RealVect.H:69
__host__ __device__ RealVectND & scale(Real s) noexcept
Definition AMReX_RealVect.H:673
__host__ __device__ Real radSquared() const noexcept
Definition AMReX_RealVect.H:736
__host__ __device__ bool operator<(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:758
__host__ __device__ Real sum() const noexcept
Definition AMReX_RealVect.H:716
__host__ static __device__ constexpr std::size_t size() noexcept
Definition AMReX_RealVect.H:538
__host__ __device__ constexpr RealVectND(const IntVectND< dim > &iv) noexcept
Definition AMReX_RealVect.H:93
Real & operator[](int i) &&=delete
__host__ __device__ constexpr const Real * end() const noexcept
Definition AMReX_RealVect.H:190
Real vect[dim]
Definition AMReX_RealVect.H:593
__host__ __device__ Real product() const noexcept
Definition AMReX_RealVect.H:747
__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:141
__host__ __device__ Real vectorLength() const noexcept
Definition AMReX_RealVect.H:727
__host__ __device__ bool operator>(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:780
__host__ __device__ RealVectND operator*(Real s) const noexcept
Definition AMReX_RealVect.H:896
__host__ __device__ int minDir(const bool &a_doAbs) const noexcept
Definition AMReX_RealVect.H:960
__host__ __device__ constexpr RealVectND(const GpuArray< Real, dim > ga) noexcept
Definition AMReX_RealVect.H:104
__host__ __device__ IntVectND< dim > floor() const noexcept
Definition AMReX_RealVect.H:683
__host__ __device__ IntVectND< dim > ceil() const noexcept
Definition AMReX_RealVect.H:694
__host__ __device__ RealVectND & operator/=(Real s) noexcept
Definition AMReX_RealVect.H:929
__host__ static __device__ constexpr RealVectND TheUnitVector() noexcept
Definition AMReX_RealVect.H:531
static const RealVectND Unit
Definition AMReX_RealVect.H:511
static const RealVectND Zero
Definition AMReX_RealVect.H:505
__host__ __device__ constexpr GpuArray< Real, dim > to_array() const noexcept
Definition AMReX_RealVect.H:149
__host__ __device__ RealVectND & operator-=(Real s) noexcept
Definition AMReX_RealVect.H:625
__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:581
Real value_type
Definition AMReX_RealVect.H:547
__host__ __device__ Real * dataPtr() noexcept
Definition AMReX_RealVect.H:492
__host__ __device__ RealVectND(const Real *a) noexcept
Definition AMReX_RealVect.H:81
__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:566
__host__ __device__ RealVectND & min(const RealVectND &p) noexcept
Definition AMReX_RealVect.H:802
__host__ __device__ constexpr bool operator!=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:221
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Definition AMReX_Amr.cpp:49
__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:1238
__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:1008
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:24
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:276
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:35
__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:1013
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:44
__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:1211
__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:1195
__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:1250
std::istream & operator>>(std::istream &is, BoxND< dim > &bx)
Read from istream.
Definition AMReX_Box.H:1825
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
__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:1226
__host__ __device__ XDim3 operator-(XDim3 const &a, XDim3 const &b)
Definition AMReX_Dim3.H:34
__host__ __device__ XDim3 operator+(XDim3 const &a, XDim3 const &b)
Definition AMReX_Dim3.H:28
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:41
amrex::Real type
Definition AMReX_RealVect.H:1267