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