-
Wuttke, Joachim authoredWuttke, Joachim authored
SpinMatrix.cpp 3.20 KiB
// ************************************************************************************************
//
// BornAgain: simulate and fit reflection and scattering
//
//! @file Base/Spin/SpinMatrix.cpp
//! @brief Implements class SpinMatrix.
//!
//! @homepage http://www.bornagainproject.org
//! @license GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
// ************************************************************************************************
#include "Base/Spin/SpinMatrix.h"
#include "Base/Spin/Spinor.h"
SpinMatrix::SpinMatrix(complex_t a_, complex_t b_, complex_t c_, complex_t d_)
: a(a_)
, b(b_)
, c(c_)
, d(d_)
{
}
SpinMatrix::SpinMatrix()
: SpinMatrix(0, 0, 0, 0)
{
}
SpinMatrix SpinMatrix::Diag(complex_t a_, complex_t d_)
{
return {a_, 0, 0, d_};
}
SpinMatrix SpinMatrix::One()
{
return Diag(1, 1);
}
SpinMatrix SpinMatrix::operator-() const
{
return {-a, -b, -c, -d};
}
SpinMatrix SpinMatrix::operator+(const SpinMatrix& o) const
{
return {a + o.a, b + o.b, c + o.c, d + o.d};
}
SpinMatrix SpinMatrix::operator-(const SpinMatrix& o) const
{
return {a - o.a, b - o.b, c - o.c, d - o.d};
}
SpinMatrix SpinMatrix::operator+=(const SpinMatrix& o)
{
a += o.a;
b += o.b;
c += o.c;
d += o.d;
return *this;
}
SpinMatrix SpinMatrix::operator*(const SpinMatrix& o) const
{
return {a * o.a + b * o.c, a * o.b + b * o.d, c * o.a + d * o.c, c * o.b + d * o.d};
}
SpinMatrix SpinMatrix::operator*=(const SpinMatrix& o)
{
const SpinMatrix tmp(*this * o);
*this = tmp;
return *this;
}
Spinor SpinMatrix::operator*(const Spinor& s) const
{
return {a * s.u + b * s.v, c * s.u + d * s.v};
}
SpinMatrix SpinMatrix::operator*(complex_t f) const
{
return {a * f, b * f, c * f, d * f};
}
SpinMatrix SpinMatrix::operator*(double f) const
{
return {a * f, b * f, c * f, d * f};
}
SpinMatrix SpinMatrix::operator/(complex_t f) const
{
return {a / f, b / f, c / f, d / f};
}
SpinMatrix SpinMatrix::operator/(double f) const
{
return {a / f, b / f, c / f, d / f};
}
SpinMatrix SpinMatrix::operator*=(complex_t f)
{
a *= f;
b *= f;
c *= f;
d *= f;
return *this;
}
SpinMatrix SpinMatrix::operator*=(double f)
{
a *= f;
b *= f;
c *= f;
d *= f;
return *this;
}
SpinMatrix SpinMatrix::operator/=(complex_t f)
{
a /= f;
b /= f;
c /= f;
d /= f;
return *this;
}
SpinMatrix SpinMatrix::operator/=(double f)
{
a /= f;
b /= f;
c /= f;
d /= f;
return *this;
}
SpinMatrix operator*(complex_t f, const SpinMatrix& m)
{
return m * f;
}
SpinMatrix operator*(double f, const SpinMatrix& m)
{
return m * f;
}
Spinor SpinMatrix::col0() const
{
return {a, c};
}
Spinor SpinMatrix::col1() const
{
return {b, d};
}
complex_t SpinMatrix::trace() const
{
return a + d;
}
complex_t SpinMatrix::determinant() const
{
return a * d - b * c;
}
bool SpinMatrix::allFinite() const
{
return isfinite(a) && isfinite(b) && isfinite(c) && isfinite(d);
}
SpinMatrix SpinMatrix::adjoint() const
{
return {conj(a), conj(c), conj(b), conj(d)};
}