6#include "AMReX_SPACE.H"
7#include "AMReX_Vector.H"
8#include "AMReX_BLassert.H"
9#include "AMReX_Geometry.H"
10#include "AMReX_GpuComplex.H"
11#include "AMReX_IndexType.H"
12#include <eigen3/Eigen/Core>
13#include <eigen3/Eigen/Geometry>
14#include <eigen3/Eigen/SVD>
15#include <AMReX_REAL.H>
21using Vector = Eigen::Matrix<amrex::Real,AMREX_SPACEDIM,1>;
23using Covector = Eigen::Matrix<amrex::Real,1,AMREX_SPACEDIM>;
24using Matrix = Eigen::Matrix<amrex::Real,AMREX_SPACEDIM,AMREX_SPACEDIM>;
26using iMatrix = Eigen::Matrix<int,AMREX_SPACEDIM,AMREX_SPACEDIM>;
48 : Eigen::Quaterniond() {}
50 : Eigen::Quaterniond(
w,
x,
y,
z) {}
52 : Eigen::Quaterniond(R) {}
54 : Eigen::Quaterniond(q.
w(),q.
x(),q.
y(),q.
z()) {}
82 ret.w() =
b.w()*alpha;
ret.x() =
b.x()*alpha;
ret.y() =
b.y()*alpha;
ret.z() =
b.z()*alpha;
89 ret.w() =
b.w()*alpha;
ret.x() =
b.x()*alpha;
ret.y() =
b.y()*alpha;
ret.z() =
b.z()*alpha;
96 ret.w() = a.w()+
b.w();
ret.x() = a.x()+
b.x();
ret.y() = a.y()+
b.y();
ret.z() = a.z()+
b.z();
104 ret.w() = a.w()-
b.w();
ret.x() = a.x()-
b.x();
ret.y() = a.y()-
b.y();
ret.z() = a.z()-
b.z();
111 if (
fabs((a.w() -
b.w())/(a.w()+a.w())) > 1E-8)
return false;
112 if (
fabs((a.x() -
b.x())/(a.x()+a.x())) > 1E-8)
return false;
113 if (
fabs((a.y() -
b.y())/(a.y()+a.y())) > 1E-8)
return false;
114 if (
fabs((a.z() -
b.z())/(a.z()+a.z())) > 1E-8)
return false;
125 if (
ixType == amrex::IndexType::TheNodeType())
127 return Vector(AMREX_D_DECL(
128 geom.ProbLo()[0] + ((amrex::Real)(
i)) * geom.CellSize()[0],
129 geom.ProbLo()[1] + ((amrex::Real)(
j)) * geom.CellSize()[1],
130 geom.ProbLo()[2] + ((amrex::Real)(
k)) * geom.CellSize()[2]));
132 else if (
ixType == amrex::IndexType::TheCellType())
134 return Vector(AMREX_D_DECL(
135 geom.ProbLo()[0] + ((amrex::Real)(
i) + 0.5) * geom.CellSize()[0],
136 geom.ProbLo()[1] + ((amrex::Real)(
j) + 0.5) * geom.CellSize()[1],
137 geom.ProbLo()[2] + ((amrex::Real)(
k) + 0.5) * geom.CellSize()[2]));
139 return Set::Vector::Zero();
145 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> &
prob_lo,
146 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> &
cell_size,
147 const amrex::IndexType &
ixType)
150 const amrex::Real offset =
151 ixType == amrex::IndexType::TheNodeType() ? 0.0 : 0.5;
152 return Vector(AMREX_D_DECL(
163 if (
xmin)
N(0) = -1.0;
164 else if (
xmax)
N(0) = 1.0;
166 if (
ymin)
N(1) = -1.0;
167 else if (
ymax)
N(1) = 1.0;
170 if (
zmin)
N(2) = -1.0;
171 else if (
zmax)
N(2) = 1.0;
180 size(0) = geom.ProbHi()[0] - geom.ProbLo()[0];
182 size(1) = geom.ProbHi()[1] - geom.ProbLo()[1];
185 size(2) = geom.ProbHi()[2] - geom.ProbLo()[2];
195 if (
ixType == amrex::IndexType::TheNodeType())
197 return Vector(AMREX_D_DECL(
198 geom.ProbLo()[0] + ((amrex::Real)(
i)) * geom.CellSize()[0],
199 geom.ProbLo()[1] + ((amrex::Real)(
j)) * geom.CellSize()[1],
200 geom.ProbLo()[2] + ((amrex::Real)(
k)) * geom.CellSize()[2]));
202 else if (
ixType == amrex::IndexType::TheCellType())
204 return Vector(AMREX_D_DECL(
205 geom.ProbLo()[0] + ((amrex::Real)(
i) + 0.5) * geom.CellSize()[0],
206 geom.ProbLo()[1] + ((amrex::Real)(
j) + 0.5) * geom.CellSize()[1],
207 geom.ProbLo()[2] + ((amrex::Real)(
k) + 0.5) * geom.CellSize()[2]));
209 return Set::Vector::Zero();
AMREX_FORCE_INLINE void operator+=(const Quaternion &rhs)
friend Quaternion operator-(const Quaternion a, const Quaternion b)
friend Quaternion operator*(const Set::Scalar alpha, const Quaternion b)
Quaternion(const Eigen::Matrix3d &R)
friend Quaternion operator+(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE void operator=(const Eigen::Quaterniond &rhs)
friend bool operator==(const Quaternion a, const Quaternion b)
Quaternion(Set::Scalar w, Set::Scalar x, Set::Scalar y, Set::Scalar z)
Quaternion(Eigen::Quaterniond &q)
A collection of data types and symmetry-reduced data structures.
Eigen::Matrix< int, AMREX_SPACEDIM, AMREX_SPACEDIM > iMatrix
AMREX_FORCE_INLINE Quaternion operator-(const Quaternion a, const Quaternion b)
amrex::GpuComplex< Scalar > Complex
AMREX_FORCE_INLINE Vector Volume(const int &i, const int &j, const int &k, const amrex::Geometry &geom, const amrex::IndexType &ixType)
Eigen::Matrix< amrex::Real, 1, AMREX_SPACEDIM > Covector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
AMREX_FORCE_INLINE Vector Position(const int &i, const int &j, const int &k, const amrex::Geometry &geom, const amrex::IndexType &ixType)
AMREX_FORCE_INLINE bool operator==(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE Quaternion operator+(const Quaternion a, const Quaternion b)
AMREX_FORCE_INLINE Set::Matrix3d expand(const Set::Matrix &in)
AMREX_FORCE_INLINE Vector Size(const amrex::Geometry &geom)
AMREX_FORCE_INLINE Vector Normal(AMREX_D_DECL(bool xmin, bool ymin, bool zmin), AMREX_D_DECL(bool xmax, bool ymax, bool zmax))
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
AMREX_FORCE_INLINE Set::Matrix reduce(const Set::Matrix3d &in)
AMREX_FORCE_INLINE Quaternion operator*(const Set::Scalar alpha, const Quaternion b)