IAP GITLAB

Skip to content
Snippets Groups Projects
Commit a77d5fce authored by Maximilian Reininghaus's avatar Maximilian Reininghaus :vulcan:
Browse files

defined/fixed some operators for (Quantity-)Vectors

parent 0aa6a48d
No related branches found
No related tags found
No related merge requests found
...@@ -5,16 +5,19 @@ ...@@ -5,16 +5,19 @@
#include <Eigen/Dense> #include <Eigen/Dense>
#include <iostream> #include <iostream>
#include <utility>
template <typename dim> template <typename dim>
class QuantityVector class QuantityVector
{ {
protected: protected:
using Quantity = phys::units::quantity<dim, double>; using Quantity = phys::units::quantity<dim, double>;
using QuantitySquared = decltype(Quantity(phys::units::detail::magnitude_tag, 0) * Quantity(phys::units::detail::magnitude_tag, 0)); //using QuantitySquared = decltype(std::declval<Quantity>() * std::declval<Quantity>());
public: public:
Eigen::Vector3d eVector; Eigen::Vector3d eVector;
typedef dim dimension;
QuantityVector(Quantity a, Quantity b, Quantity c) : QuantityVector(Quantity a, Quantity b, Quantity c) :
eVector{a.magnitude(), b.magnitude(), c.magnitude()} eVector{a.magnitude(), b.magnitude(), c.magnitude()}
...@@ -38,6 +41,7 @@ public: ...@@ -38,6 +41,7 @@ public:
auto squaredNorm() const auto squaredNorm() const
{ {
using QuantitySquared = decltype(std::declval<Quantity>() * std::declval<Quantity>());
return QuantitySquared(phys::units::detail::magnitude_tag, eVector.squaredNorm()); return QuantitySquared(phys::units::detail::magnitude_tag, eVector.squaredNorm());
} }
...@@ -51,14 +55,56 @@ public: ...@@ -51,14 +55,56 @@ public:
return QuantityVector<dim>(eVector - pQVec.eVector); return QuantityVector<dim>(eVector - pQVec.eVector);
} }
//auto operator*( template <typename ScalarDim>
auto operator*(phys::units::quantity<ScalarDim, double> const p) const
{
return QuantityVector<typename phys::units::detail::Product<ScalarDim, dim, double, double>::dimension_type>(eVector * p.magnitude());
// TODO: this function does not work if the result is dimensionless, as
// dimensionless quantities are "cast" back to plain old double in PhysUnits.
// Either change PhysUnits, or cover this case with a template specialization?
}
auto operator*(double const p) const
{
return QuantityVector<dim>(eVector * p);
}
auto& operator*=(double const p)
{
eVector *= p;
return *this;
}
auto& operator+=(QuantityVector<dim> const& pQVec)
{
eVector += pQVec.eVector;
return *this;
}
auto& operator-=(QuantityVector<dim> const& pQVec)
{
eVector -= pQVec.eVector;
return *this;
}
auto& operator-() const
{
return QuantityVector<dim>(-eVector);
}
auto normalized() const
{
return (*this) * (1 / norm());
}
}; };
template <typename dim> template <typename dim>
auto& operator<<(std::ostream& os, QuantityVector<dim> qv) auto& operator<<(std::ostream& os, QuantityVector<dim> qv)
{ {
using Quantity = phys::units::quantity<dim, double>;
os << '(' << qv.eVector(0) << ' ' << qv.eVector(1) << ' ' << qv.eVector(2) os << '(' << qv.eVector(0) << ' ' << qv.eVector(1) << ' ' << qv.eVector(2)
<< ") " << phys::units::to_unit_symbol(phys::units::quantity<dim, double>()); << ") " << phys::units::to_unit_symbol<dim, double>(Quantity(phys::units::detail::magnitude_tag, 1));
return os; return os;
} }
......
...@@ -71,6 +71,58 @@ public: ...@@ -71,6 +71,58 @@ public:
return parallelProjectionOnto<dim2>(pVec, *BaseVector<dim>::cs); return parallelProjectionOnto<dim2>(pVec, *BaseVector<dim>::cs);
} }
auto operator+(Vector<dim> const& pVec) const
{
auto const components = getComponents(*BaseVector<dim>::cs) + pVec.getComponents(*BaseVector<dim>::cs);
return Vector<dim>(*BaseVector<dim>::cs, components);
}
auto operator-(Vector<dim> const& pVec) const
{
auto const components = getComponents() - pVec.getComponents(*BaseVector<dim>::cs);
return Vector<dim>(*BaseVector<dim>::cs, components);
}
auto& operator*=(double const p)
{
BaseVector<dim>::qVector *= p;
return *this;
}
template <typename ScalarDim>
auto operator*(phys::units::quantity<ScalarDim, double> const p) const
{
using res_dim = typename decltype(BaseVector<dim>::qVector * p)::dimension;
return Vector<res_dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
}
auto operator*(double const p) const
{
return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p);
}
auto& operator+=(Vector<dim> const& pVec)
{
BaseVector<dim>::qVector += pVec.getComponents(*BaseVector<dim>::cs);
return *this;
}
auto& operator-=(Vector<dim> const& pVec)
{
BaseVector<dim>::qVector -= pVec.getComponents(*BaseVector<dim>::cs);
return *this;
}
auto& operator-() const
{
return Vector<dim>(*BaseVector<dim>::cs, - BaseVector<dim>::qVector);
}
auto normalized() const
{
return (*this) * (1 / norm());
}
//~ template <typename dim2> //~ template <typename dim2>
//~ auto operator*(Vector<dim2> const& pVec) //~ auto operator*(Vector<dim2> const& pVec)
//~ { //~ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment