BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
SpinMatrix.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Base/Spin/SpinMatrix.cpp
6 //! @brief Implements class SpinMatrix.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "Base/Spin/SpinMatrix.h"
16 #include "Base/Spin/Spinor.h"
17 
18 SpinMatrix::SpinMatrix(complex_t a_, complex_t b_, complex_t c_, complex_t d_)
19  : a(a_)
20  , b(b_)
21  , c(c_)
22  , d(d_)
23 {
24 }
25 
27  : SpinMatrix(0, 0, 0, 0)
28 {
29 }
30 
31 SpinMatrix SpinMatrix::Diag(complex_t a_, complex_t d_)
32 {
33  return {a_, 0, 0, d_};
34 }
35 
37 {
38  return Diag(1, 1);
39 }
40 
42 {
43  return {(1.0 + v.z()) / 2.0, complex_t(v.x(), -v.y()) / 2.0, complex_t(v.x(), v.y()) / 2.0,
44  (1.0 - v.z()) / 2.0};
45 }
46 
48 {
49  return {-a, -b, -c, -d};
50 }
51 
53 {
54  return {a + o.a, b + o.b, c + o.c, d + o.d};
55 }
56 
58 {
59  return {a - o.a, b - o.b, c - o.c, d - o.d};
60 }
61 
63 {
64  a += o.a;
65  b += o.b;
66  c += o.c;
67  d += o.d;
68 
69  return *this;
70 }
71 
73 {
74  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};
75 }
76 
78 {
79  const SpinMatrix tmp(*this * o);
80  *this = tmp;
81  return *this;
82 }
83 
85 {
86  return {a * s.u + b * s.v, c * s.u + d * s.v};
87 }
88 
90 {
91  return {a * f, b * f, c * f, d * f};
92 }
93 
95 {
96  return {a * f, b * f, c * f, d * f};
97 }
98 
100 {
101  return {a / f, b / f, c / f, d / f};
102 }
103 
105 {
106  return {a / f, b / f, c / f, d / f};
107 }
108 
110 {
111  a *= f;
112  b *= f;
113  c *= f;
114  d *= f;
115  return *this;
116 }
117 
119 {
120  a *= f;
121  b *= f;
122  c *= f;
123  d *= f;
124  return *this;
125 }
126 
128 {
129  a /= f;
130  b /= f;
131  c /= f;
132  d /= f;
133  return *this;
134 }
135 
137 {
138  a /= f;
139  b /= f;
140  c /= f;
141  d /= f;
142  return *this;
143 }
144 
145 SpinMatrix operator*(complex_t f, const SpinMatrix& m)
146 {
147  return m * f;
148 }
149 
150 SpinMatrix operator*(double f, const SpinMatrix& m)
151 {
152  return m * f;
153 }
154 
156 {
157  return {a, c};
158 }
159 
161 {
162  return {b, d};
163 }
164 
165 complex_t SpinMatrix::trace() const
166 {
167  return a + d;
168 }
169 
170 complex_t SpinMatrix::determinant() const
171 {
172  return a * d - b * c;
173 }
174 
176 {
177  return isfinite(a) && isfinite(b) && isfinite(c) && isfinite(d);
178 }
179 
181 {
182  return {conj(a), conj(c), conj(b), conj(d)};
183 }
SpinMatrix operator*(complex_t f, const SpinMatrix &m)
Definition: SpinMatrix.cpp:145
Defines class SpinMatrix.
Defines class Spinor.
complex_t a
Definition: SpinMatrix.h:68
complex_t b
Definition: SpinMatrix.h:68
complex_t c
Definition: SpinMatrix.h:68
SpinMatrix()
Contructs the null matrix.
Definition: SpinMatrix.cpp:26
SpinMatrix operator*(const SpinMatrix &) const
Definition: SpinMatrix.cpp:72
SpinMatrix operator/(complex_t) const
Definition: SpinMatrix.cpp:99
SpinMatrix adjoint() const
Definition: SpinMatrix.cpp:180
static SpinMatrix One()
Definition: SpinMatrix.cpp:36
SpinMatrix operator*=(const SpinMatrix &)
Definition: SpinMatrix.cpp:77
SpinMatrix operator+=(const SpinMatrix &)
Definition: SpinMatrix.cpp:62
bool allFinite() const
Definition: SpinMatrix.cpp:175
SpinMatrix operator+(const SpinMatrix &) const
Definition: SpinMatrix.cpp:52
Spinor col1() const
Definition: SpinMatrix.cpp:160
static SpinMatrix FromBlochVector(const R3 &v)
Constructs matrix (I+v*s)/2, where s is the Pauli vector.
Definition: SpinMatrix.cpp:41
static SpinMatrix Diag(complex_t a_, complex_t d_)
Definition: SpinMatrix.cpp:31
complex_t d
Definition: SpinMatrix.h:68
Spinor col0() const
Definition: SpinMatrix.cpp:155
complex_t trace() const
Definition: SpinMatrix.cpp:165
complex_t determinant() const
Definition: SpinMatrix.cpp:170
SpinMatrix operator-() const
Definition: SpinMatrix.cpp:47
SpinMatrix operator/=(complex_t)
Definition: SpinMatrix.cpp:127
Definition: Spinor.h:20
complex_t v
Definition: Spinor.h:31
complex_t u
Definition: Spinor.h:31