BornAgain  1.18.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 scattering at grazing incidence
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 {
31 {
32  if (base.mag2() == 0.0)
33  return cvector_t{};
34  cvector_t projection = (base.dot(vector) / base.mag2()) * base;
35  return vector.complex() - projection;
36 }
37 } // namespace
38 
39 MagneticMaterialImpl::MagneticMaterialImpl(const std::string& name, kvector_t magnetization)
40  : BaseMaterialImpl(name), m_magnetization(magnetization)
41 {
42 }
43 
45 {
46  std::string name = isScalarMaterial() ? getName() : getName() + "_inv";
47  MagneticMaterialImpl* result = this->clone();
48  result->setMagnetization(-magnetization());
49  return result;
50 }
51 
53 {
54  return m_magnetization == kvector_t{};
55 }
56 
58 {
59  return !isScalarMaterial();
60 }
61 
63 {
64  return m_magnetization;
65 }
66 
67 Eigen::Matrix2cd MagneticMaterialImpl::polarizedSubtrSLD(const WavevectorInfo& wavevectors) const
68 {
69  cvector_t mag_ortho = OrthogonalToBaseVector(wavevectors.getQ(), m_magnetization);
70  complex_t unit_factor = scalarSubtrSLD(wavevectors);
72 }
73 
75 {
76  kvector_t transformed_field = transform.transformed(m_magnetization);
77  MagneticMaterialImpl* result = this->clone();
78  result->setMagnetization(transformed_field);
79  return result;
80 }
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< std::complex< double > > 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.
MagneticMaterialImpl(const std::string &name, kvector_t magnetization)
Constructs basic material with name and magnetization.
MagneticMaterialImpl * inverted() const override final
Constructs a material with inverted magnetization.
kvector_t magnetization() const override final
Returns the magnetization (in A/m)
bool isScalarMaterial() const override final
Indicates whether the interaction with the material is scalar.
MagneticMaterialImpl * rotatedMaterial(const Transform3D &transform) const override final
Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo &wavevectors) const override final
Returns ( - sld) matrix with magnetization corrections.
bool isMagneticMaterial() const override final
kvector_t m_magnetization
magnetization
Vector transformations in three dimensions.
Definition: Transform3D.h:28
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,
cvector_t OrthogonalToBaseVector(cvector_t base, const kvector_t vector)