BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MagneticMaterialImpl.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Material/MagneticMaterialImpl.cpp
6 //! @brief Implements magnetic material base implementation.
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 
20 #include <memory>
21 
23 using PhysConsts::mu_B;
24 using PhysConsts::r_e;
25 // The factor 1e-18 is here to have unit: m/A*nm^-2
26 constexpr double magnetization_prefactor = (gamma_n * r_e / 2.0 / mu_B) * 1e-18;
27 
28 namespace {
29 cvector_t OrthogonalToBaseVector(cvector_t base, const kvector_t vector)
30 {
31  if (base.mag2() == 0.0)
32  return cvector_t{};
33  cvector_t projection = (base.dot(vector) / base.mag2()) * base;
34  return vector.complex() - projection;
35 }
36 } // namespace
37 
38 MagneticMaterialImpl::MagneticMaterialImpl(const std::string& name, kvector_t magnetization)
39  : BaseMaterialImpl(name), m_magnetization(magnetization)
40 {
41 }
42 
44 {
45  std::string name = isScalarMaterial() ? getName() : getName() + "_inv";
46  MagneticMaterialImpl* result = this->clone();
47  result->setMagnetization(-magnetization());
48  return result;
49 }
50 
52 {
53  return m_magnetization == kvector_t{};
54 }
55 
57 {
58  return !isScalarMaterial();
59 }
60 
62 {
63  return m_magnetization;
64 }
65 
66 Eigen::Matrix2cd MagneticMaterialImpl::polarizedSubtrSLD(const WavevectorInfo& wavevectors) const
67 {
68  cvector_t mag_ortho = OrthogonalToBaseVector(wavevectors.getQ(), m_magnetization);
69  complex_t unit_factor = scalarSubtrSLD(wavevectors);
71 }
72 
74 {
75  kvector_t transformed_field = transform.transformed(m_magnetization);
76  MagneticMaterialImpl* result = this->clone();
77  result->setMagnetization(transformed_field);
78  return result;
79 }
std::complex< double > complex_t
Definition: Complex.h:20
constexpr double magnetization_prefactor
Defines magnetic material base implementation.
Declares functions in namespace MaterialUtils.
Defines the values of physical constants (SI)
Declares class Transform3D.
Defines WavevectorInfo.
Interface for material implementation classes.
const std::string & getName() const
Returns name of the material.
virtual complex_t scalarSubtrSLD(const WavevectorInfo &wavevectors) const =0
Returns ( - sld), sld being the scattering length density.
double mag2() const
Returns magnitude squared of the vector.
auto dot(const BasicVector3D< U > &v) const
Returns dot product of vectors (antilinear in the first [=self] argument).
BasicVector3D< complex_t > complex() const
Returns this, trivially converted to complex type.
Basic implementation for magnetized material.
void setMagnetization(kvector_t magnetization)
MagneticMaterialImpl * clone() const override=0
Returns pointer to a copy of material.
kvector_t magnetization() const final
Returns the magnetization (in A/m)
MagneticMaterialImpl(const std::string &name, kvector_t magnetization)
Constructs basic material with name and magnetization.
bool isScalarMaterial() const final
Indicates whether the interaction with the material is scalar.
bool isMagneticMaterial() const final
Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo &wavevectors) const final
Returns ( - sld) matrix with magnetization corrections.
MagneticMaterialImpl * inverted() const final
Constructs a material with inverted magnetization.
MagneticMaterialImpl * rotatedMaterial(const Transform3D &transform) const final
kvector_t m_magnetization
magnetization
Vector transformations in three dimensions.
Definition: Transform3D.h:26
ivector_t transformed(const ivector_t &v) const
Return transformed vector v.
Holds all wavevector information relevant for calculating form factors.
cvector_t getQ() const
Eigen::Matrix2cd MagnetizationCorrection(complex_t unit_factor, double magnetic_factor, BasicVector3D< T > polarization)
constexpr double mu_B
Bohr magneton ( ), J/T.
constexpr double r_e
Thomson scattering length ( ), m.
constexpr double gamma_n
factor for neutron magnetic moment,
QString const & name(EShape k)
Definition: particles.cpp:21