1#ifndef AMREX_REALVECT_H_
2#define AMREX_REALVECT_H_
3#include <AMReX_Config.H>
45 explicit RealVectND (
const std::vector<Real>& vr)
noexcept {
47 for (
int i = 0; i < dim; ++i) {
57 template <
class... Args,
59 (
sizeof...(Args) + 2 == dim) &&
63 constexpr RealVectND (Real i, Real j, Args... ks) noexcept
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) {
93 vect[i] =
static_cast<Real
>(iv[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) {
188 const Real*
end () const noexcept {
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];
331 template <
int N=dim, std::enable_if_t<( N==3 ),
int> = 0>
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,
618using RealVect = RealVectND<AMREX_SPACEDIM>;
624 for (
int i=0; i<dim; ++i) {
634 for (
int i=0; i<dim; ++i) {
644 for (
int i=0; i<dim; ++i) {
662 for (
int i=0; i<dim; ++i) {
663 retval[i] = -vect[i];
672 for (
int i=0; i<dim; ++i) {
683 for (
int i=0; i<dim; ++i) {
684 retval[i] =
static_cast<int>(std::floor(vect[i]));
694 for (
int i=0; i<dim; ++i) {
695 retval[i] =
static_cast<int>(std::ceil(vect[i]));
705 for (
int i=0; i<dim; ++i) {
706 retval[i] =
static_cast<int>(std::round(vect[i]));
715 Real retval = vect[0];
716 for (
int i=1; i<dim; ++i) {
726 Real len = this->radSquared();
727 len = std::sqrt(len);
735 Real retval = vect[0] * vect[0];
736 for (
int i=1; i<dim; ++i) {
737 retval += vect[i] * vect[i];
746 Real retval = vect[0];
747 for (
int i=1; i<dim; ++i) {
757 bool retval = vect[0] < p[0];
758 for (
int i=1; i<dim; ++i) {
759 retval = retval && vect[i] < p[i];
768 bool retval = vect[0] <= p[0];
769 for (
int i=1; i<dim; ++i) {
770 retval = retval && vect[i] <= p[i];
779 bool retval = vect[0] > p[0];
780 for (
int i=1; i<dim; ++i) {
781 retval = retval && vect[i] > p[i];
790 bool retval = vect[0] >= p[0];
791 for (
int i=1; i<dim; ++i) {
792 retval = retval && vect[i] >= p[i];
801 for (
int i=0; i<dim; ++i) {
811 for (
int i=0; i<dim; ++i) {
843 Real retval = vect[0] * a_rhs.
vect[0];
844 for (
int i=1; i<dim; ++i) {
845 retval += vect[i] * a_rhs.vect[i];
851template <
int N, std::enable_if_t<( N==3 ),
int>>
856 vect[2] * a_rhs[0] - vect[0] * a_rhs[2],
857 vect[0] * a_rhs[1] - vect[1] * a_rhs[0]);
865 for (
int i=0; i<dim; ++i) {
875 for (
int i=0; i<dim; ++i) {
885 for (
int i=0; i<dim; ++i) {
896 for (
int i=0; i<dim; ++i) {
897 retval[i] = vect[i] * s;
907 for (
int i=0; i<dim; ++i) {
908 retval[i] = vect[i] - s;
918 for (
int i=0; i<dim; ++i) {
919 retval[i] = vect[i] + s;
928 for (
int i=0; i<dim; ++i) {
938 for (
int i=0; i<dim; ++i) {
949 for (
int i=0; i<dim; ++i) {
950 retval[i] = vect[i] / s;
962 if (std::abs(vect[
idir]) < std::abs(vect[mDir])) {
966 if (vect[
idir] < vect[mDir]) {
981 if (std::abs(vect[
idir]) > std::abs(vect[mDir])) {
985 if (vect[
idir] > vect[mDir]) {
1004template <
int dim=AMREX_SPACEDIM>
1026 for (
int i=0; i<dim; ++i) {
1027 retval[i] = s / p[i];
1040 for (
int i=0; i<dim; ++i) {
1041 retval[i] = p[i] + s;
1053 for (
int i=0; i<dim; ++i) {
1054 retval[i] = s - p[i];
1067 for (
int i=0; i<dim; ++i) {
1068 retval[i] = s * p[i];
1080 for (
int i=0; i<dim; ++i) {
1081 retval[i] = s[i] / p[i];
1093 for (
int i=0; i<dim; ++i) {
1094 retval[i] = p[i] + s[i];
1106 for (
int i=0; i<dim; ++i) {
1107 retval[i] = s[i] - p[i];
1119 for (
int i=0; i<dim; ++i) {
1120 retval[i] = p[i] * s[i];
1133 for (
int i=0; i<dim; ++i) {
1134 retval[i] = s * p[i];
1146 for (
int i=0; i<dim; ++i) {
1155 for (
int i=0; i<dim; ++i) {
1161 template<
class T, std::size_t...Ns>
1187template<
int d,
int...dims>
1193 Real* dst = retval.
begin();
1203template<
int d,
int...dims>
1206constexpr GpuTuple<RealVectND<d>, RealVectND<dims>...>
1210 std::make_index_sequence<1 +
sizeof...(dims)>(),
1218template<
int new_dim,
int old_dim>
1221constexpr RealVectND<new_dim>
1223 return iv.template shrink<new_dim>();
1230template<
int new_dim,
int old_dim>
1233constexpr RealVectND<new_dim>
1235 return iv.template expand<new_dim>(fill_extra);
1242template<
int new_dim,
int old_dim>
1245constexpr RealVectND<new_dim>
1247 return iv.template resize<new_dim>(fill_extra);
1256struct std::tuple_size<
amrex::RealVectND<dim>> {
1257 static constexpr std::size_t value = dim;
1261template<std::
size_t s,
int dim>
1262struct 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
Definition AMReX_Tuple.H:93
Definition AMReX_IntVect.H:55
A Real vector in dim-dimensional space.
Definition AMReX_RealVect.H:32
__host__ __device__ bool operator<=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:767
__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:633
__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:977
__host__ __device__ constexpr Real * end() noexcept
Definition AMReX_RealVect.H:181
constexpr RealVectND() noexcept
Definition AMReX_RealVect.H:43
__host__ __device__ RealVectND & max(const RealVectND &p) noexcept
Definition AMReX_RealVect.H:810
__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:660
__host__ __device__ constexpr bool operator==(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:205
__host__ __device__ constexpr RealVectND(Real i, Real j, Args... ks) noexcept
Definition AMReX_RealVect.H:63
__host__ static __device__ constexpr int isize() noexcept
Definition AMReX_RealVect.H:541
__host__ __device__ RealVectND & operator+=(Real s) noexcept
Definition AMReX_RealVect.H:864
RealVectND(const std::vector< Real > &vr) noexcept
Definition AMReX_RealVect.H:45
__host__ __device__ Real dotProduct(const RealVectND &a_rhs) const noexcept
Definition AMReX_RealVect.H:842
__host__ __device__ RealVectND crossProduct(const RealVectND &a_rhs) const noexcept
__host__ __device__ IntVectND< dim > round() const noexcept
Definition AMReX_RealVect.H:703
__host__ static __device__ constexpr RealVectND TheZeroVector() noexcept
Definition AMReX_RealVect.H:522
__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:947
__host__ __device__ RealVectND operator+() const noexcept
Definition AMReX_RealVect.H:653
__host__ __device__ bool operator>=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:789
__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:671
__host__ __device__ Real radSquared() const noexcept
Definition AMReX_RealVect.H:734
__host__ __device__ bool operator<(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:756
__host__ __device__ Real sum() const noexcept
Definition AMReX_RealVect.H:714
__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:745
__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:725
__host__ __device__ bool operator>(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:778
__host__ __device__ RealVectND operator*(Real s) const noexcept
Definition AMReX_RealVect.H:894
__host__ __device__ int minDir(const bool &a_doAbs) const noexcept
Definition AMReX_RealVect.H:958
__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:681
__host__ __device__ IntVectND< dim > ceil() const noexcept
Definition AMReX_RealVect.H:692
__host__ __device__ RealVectND & operator/=(Real s) noexcept
Definition AMReX_RealVect.H:927
__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:623
__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:800
__host__ __device__ constexpr bool operator!=(const RealVectND &p) const noexcept
Definition AMReX_RealVect.H:219
std::ostream & real_vector_write(std::ostream &os, const Real *p, int dim)
Definition AMReX_RealVect.cpp:7
__host__ __device__ constexpr void RealVectCat_imp(Real *&dst, const RealVectND< dim > &src) noexcept
Definition AMReX_RealVect.H:1145
__host__ __device__ constexpr void RealVectSplit_imp2(RealVectND< dim > &dst, const Real *&src) noexcept
Definition AMReX_RealVect.H:1154
__host__ __device__ constexpr T RealVectSplit_imp(T &retval, std::index_sequence< Ns... >, const Real *src) noexcept
Definition AMReX_RealVect.H:1163
__host__ __device__ constexpr int get_sum()
Definition AMReX_IntVect.H:1137
std::istream & real_vector_read(std::istream &is, Real *p, int dim)
Definition AMReX_RealVect.cpp:23
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:1234
__host__ __device__ GpuComplex< T > operator*(const GpuComplex< T > &a_x, const GpuComplex< U > &a_y) noexcept
Multiply two complex numbers.
Definition AMReX_GpuComplex.H:256
__host__ __device__ RealVectND< dim > BASISREALV(int dir) noexcept
Definition AMReX_RealVect.H:1006
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:270
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:35
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:35
__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:292
__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:1207
__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:1191
__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:1246
std::istream & operator>>(std::istream &is, BoxND< dim > &bx)
Read from istream.
Definition AMReX_Box.H:1718
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1236
__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:1222
__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
__host__ __device__ 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:1011
Definition AMReX_FabArrayCommI.H:1000
Definition AMReX_Array.H:34
amrex::Real type
Definition AMReX_RealVect.H:1263