BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
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 
16 #include "Base/Spin/SpinMatrix.h"
17 #include "Base/Util/Assert.h"
18 #include "Base/Vector/RotMatrix.h"
20 #include <typeinfo>
21 
22 Material::Material(std::unique_ptr<BaseMaterialImpl>&& material_impl)
23  : m_material_impl(std::move(material_impl))
24 {
25 }
26 
27 Material::Material(const Material& material)
28 {
29  ASSERT(!material.isEmpty());
30  m_material_impl.reset(material.m_material_impl->clone());
31 }
32 
34 {
35  if (this == &other)
36  return *this;
37  ASSERT(!other.isEmpty());
38  m_material_impl.reset(other.m_material_impl->clone());
39  return *this;
40 }
41 
43 {
44  std::unique_ptr<BaseMaterialImpl> material_impl(m_material_impl->inverted());
45  return Material(std::move(material_impl));
46 }
47 
48 complex_t Material::refractiveIndex(double wavelength) const
49 {
50  return m_material_impl->refractiveIndex(wavelength);
51 }
52 
53 complex_t Material::refractiveIndex2(double wavelength) const
54 {
55  return m_material_impl->refractiveIndex2(wavelength);
56 }
57 
59 {
60  return m_material_impl->isScalarMaterial();
61 }
62 
64 {
65  return m_material_impl->isMagneticMaterial();
66 }
67 
68 std::string Material::materialName() const
69 {
70  return m_material_impl->matName();
71 }
72 
74 {
75  return m_material_impl->typeID();
76 }
77 
79 {
80  return m_material_impl->magnetization();
81 }
82 
83 complex_t Material::materialData() const
84 {
85  return m_material_impl->materialData();
86 }
87 
89 {
90  return materialData() == complex_t() && isScalarMaterial();
91 }
92 
93 bool Material::isEmpty() const
94 {
95  return !m_material_impl;
96 }
97 
98 complex_t Material::scalarSubtrSLD(const WavevectorInfo& wavevectors) const
99 {
100  return m_material_impl->scalarSubtrSLD(wavevectors.vacuumLambda());
101 }
102 
104 {
105  return m_material_impl->polarizedSubtrSLD(wavevectors);
106 }
107 
108 Material Material::rotatedMaterial(const RotMatrix& transform) const // TODO param:=rotation
109 {
110  std::unique_ptr<BaseMaterialImpl> material_impl(m_material_impl->rotatedMaterial(transform));
111  return Material(std::move(material_impl));
112 }
113 
114 std::ostream& operator<<(std::ostream& ostr, const Material& m)
115 {
116  ostr << m.m_material_impl->print();
117  return ostr;
118 }
119 
120 bool operator==(const Material& left, const Material& right)
121 {
122  if (left.materialName() != right.materialName())
123  return false;
124  if (left.magnetization() != right.magnetization())
125  return false;
126  if (left.materialData() != right.materialData())
127  return false;
128  if (left.typeID() != right.typeID())
129  return false;
130  return true;
131 }
132 
133 bool operator!=(const Material& left, const Material& right)
134 {
135  return !(left == right);
136 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:45
MATERIAL_TYPES
bool operator!=(const Material &left, const Material &right)
Comparison operator for material wrapper (inequality check)
Definition: Material.cpp:133
std::ostream & operator<<(std::ostream &ostr, const Material &m)
Definition: Material.cpp:114
bool operator==(const Material &left, const Material &right)
Comparison operator for material wrapper (equality check)
Definition: Material.cpp:120
Defines and implements class Material.
Declares class RotMatrix.
Defines class SpinMatrix.
Defines WavevectorInfo.
A wrapper for underlying material implementation.
Definition: Material.h:35
Material inverted() const
Constructs a material with inverted magnetization.
Definition: Material.cpp:42
R3 magnetization() const
Get the magnetization (in A/m)
Definition: Material.cpp:78
complex_t refractiveIndex(double wavelength) const
Returns refractive index.
Definition: Material.cpp:48
complex_t scalarSubtrSLD(const WavevectorInfo &wavevectors) const
Returns ( - sld), sld (in ) being the scattering length density.
Definition: Material.cpp:98
bool isScalarMaterial() const
Indicates whether the interaction with the material is scalar. This means that different polarization...
Definition: Material.cpp:58
bool isMagneticMaterial() const
Definition: Material.cpp:63
std::string materialName() const
Returns the name of material.
Definition: Material.cpp:68
complex_t refractiveIndex2(double wavelength) const
Returns squared refractive index.
Definition: Material.cpp:53
Material(std::unique_ptr< BaseMaterialImpl > &&material_impl)
Creates material with particular material implementation.
Definition: Material.cpp:22
std::unique_ptr< BaseMaterialImpl > m_material_impl
Definition: Material.h:100
MATERIAL_TYPES typeID() const
Returns the type of underlying material implementation.
Definition: Material.cpp:73
bool isDefaultMaterial() const
Returns true if material has refractive index of (1.0, 0.0) and zero magnetization.
Definition: Material.cpp:88
bool isEmpty() const
Returns true if material underlying data is nullptr.
Definition: Material.cpp:93
Material rotatedMaterial(const RotMatrix &transform) const
Definition: Material.cpp:108
SpinMatrix polarizedSubtrSLD(const WavevectorInfo &wavevectors) const
Returns ( - sld) matrix with magnetization corrections.
Definition: Material.cpp:103
complex_t materialData() const
Returns delta + i beta.
Definition: Material.cpp:83
Material & operator=(const Material &other)
Definition: Material.cpp:33
Rotation matrix in three dimensions. Represents group SO(3). Internal parameterization based on quate...
Definition: RotMatrix.h:25
Holds all wavevector information relevant for calculating form factors.
double vacuumLambda() const