BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Material.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Material/Material.cpp
6 //! @brief Implements and implements class Material.
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 
18 #include <typeinfo>
19 
20 Material::Material(std::unique_ptr<BaseMaterialImpl> material_impl)
21  : m_material_impl(std::move(material_impl))
22 {
23 }
24 
25 Material::Material(const Material& material)
26 {
27  if (material.isEmpty())
28  throw std::runtime_error("Material: Error! Attempt to initialize material with nullptr.");
29  m_material_impl.reset(material.m_material_impl->clone());
30 }
31 
33 {
34  if (other.isEmpty())
35  throw std::runtime_error("Material: Error! Attempt to assign nullptr to material.");
36  m_material_impl.reset(other.m_material_impl->clone());
37  return *this;
38 }
39 
41 {
42  std::unique_ptr<BaseMaterialImpl> material_impl(m_material_impl->inverted());
43  return Material(std::move(material_impl));
44 }
45 
46 complex_t Material::refractiveIndex(double wavelength) const
47 {
48  return m_material_impl->refractiveIndex(wavelength);
49 }
50 
51 complex_t Material::refractiveIndex2(double wavelength) const
52 {
53  return m_material_impl->refractiveIndex2(wavelength);
54 }
55 
57 {
58  return m_material_impl->isScalarMaterial();
59 }
60 
62 {
63  return m_material_impl->isMagneticMaterial();
64 }
65 
66 std::string Material::getName() const
67 {
68  return m_material_impl->getName();
69 }
70 
72 {
73  return m_material_impl->typeID();
74 }
75 
77 {
78  return m_material_impl->magnetization();
79 }
80 
82 {
83  return m_material_impl->materialData();
84 }
85 
87 {
88  return materialData() == complex_t() && isScalarMaterial();
89 }
90 
92 {
93  return m_material_impl->scalarSubtrSLD(wavevectors);
94 }
95 
96 Eigen::Matrix2cd Material::polarizedSubtrSLD(const WavevectorInfo& wavevectors) const
97 {
98  return m_material_impl->polarizedSubtrSLD(wavevectors);
99 }
100 
101 Material Material::rotatedMaterial(const Transform3D& transform) const // TODO param:=rotation
102 {
103  std::unique_ptr<BaseMaterialImpl> material_impl(m_material_impl->rotatedMaterial(transform));
104  return Material(std::move(material_impl));
105 }
106 
107 std::ostream& operator<<(std::ostream& ostr, const Material& m)
108 {
109  m.m_material_impl->print(ostr);
110  return ostr;
111 }
112 
113 bool operator==(const Material& left, const Material& right)
114 {
115  if (left.getName() != right.getName())
116  return false;
117  if (left.magnetization() != right.magnetization())
118  return false;
119  if (left.materialData() != right.materialData())
120  return false;
121  if (left.typeID() != right.typeID())
122  return false;
123  return true;
124 }
125 
126 bool operator!=(const Material& left, const Material& right)
127 {
128  return !(left == right);
129 }
MATERIAL_TYPES
std::complex< double > complex_t
Definition: Complex.h:20
Defines and implements class Material.
Declares class Transform3D.
Defines WavevectorInfo.
bool operator!=(const BasicVector3D< T > &a, const BasicVector3D< T > &b)
Comparison of two vectors for inequality.
bool operator==(const BasicVector3D< T > &a, const BasicVector3D< T > &b)
Comparison of two vectors for equality.
std::ostream & operator<<(std::ostream &os, const BasicVector3D< T > &a)
Output to stream.
A wrapper for underlying material implementation.
Definition: Material.h:29
kvector_t magnetization() const
Get the magnetization (in A/m)
Definition: Material.cpp:76
Material inverted() const
Constructs a material with inverted magnetization.
Definition: Material.cpp:40
Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo &wavevectors) const
Returns ( - sld) matrix with magnetization corrections.
Definition: Material.cpp:96
complex_t refractiveIndex(double wavelength) const
Returns refractive index.
Definition: Material.cpp:46
complex_t scalarSubtrSLD(const WavevectorInfo &wavevectors) const
Returns ( - sld), sld (in ) being the scattering length density.
Definition: Material.cpp:91
bool isScalarMaterial() const
Indicates whether the interaction with the material is scalar.
Definition: Material.cpp:56
Material rotatedMaterial(const Transform3D &transform) const
Definition: Material.cpp:101
bool isMagneticMaterial() const
Definition: Material.cpp:61
complex_t refractiveIndex2(double wavelength) const
Returns squared refractive index.
Definition: Material.cpp:51
std::string getName() const
Returns the name of material.
Definition: Material.cpp:66
std::unique_ptr< BaseMaterialImpl > m_material_impl
Definition: Material.h:97
MATERIAL_TYPES typeID() const
Returns the type of underlying material implementation.
Definition: Material.cpp:71
bool isDefaultMaterial() const
Returns true if material has refractive index of (1.0, 0.0) and zero magnetization.
Definition: Material.cpp:86
bool isEmpty() const
Returns true if material underlying data is nullptr.
Definition: Material.h:77
complex_t materialData() const
Returns underlying material data.
Definition: Material.cpp:81
Material(std::unique_ptr< BaseMaterialImpl > material_impl)
Creates material with particular material implementation.
Definition: Material.cpp:20
Material & operator=(const Material &other)
Definition: Material.cpp:32
Vector transformations in three dimensions.
Definition: Transform3D.h:26
Holds all wavevector information relevant for calculating form factors.
Definition: filesystem.h:81