BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
Layer.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Multilayer/Layer.cpp
6 //! @brief Implements class Layer.
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 
17 
18 //! Constructor of a layer with thickness and material
19 //! @param material: material the layer is made of
20 //! @param thickness: thickness of a layer in nanometers
21 Layer::Layer(Material material, double thickness)
22  : m_material(std::move(material))
23  , m_thickness(thickness)
24 {
25  if (thickness < 0.)
26  throw std::runtime_error("Layer thickness cannot be negative");
27 }
28 
29 Layer::~Layer() = default;
30 
32 {
33  auto* result = new Layer(m_material, m_thickness);
34  result->m_B_field = m_B_field;
35  result->m_n_slices = m_n_slices;
36  for (const auto* layout : layouts())
37  result->addLayout(*layout);
38  return result;
39 }
40 
41 std::vector<const INode*> Layer::nodeChildren() const
42 {
43  std::vector<const INode*> result;
44  for (const auto& layout : m_layouts)
45  result.push_back(layout.get());
46  return result;
47 }
48 
49 void Layer::addLayout(const ParticleLayout& layout)
50 {
51  m_layouts.emplace_back(layout.clone());
52 }
53 
54 std::vector<const ParticleLayout*> Layer::layouts() const
55 {
56  std::vector<const ParticleLayout*> result;
57  for (const auto& layout : m_layouts)
58  result.push_back(layout.get());
59  return result;
60 }
Defines class Layer.
Defines class ParticleLayout.
A layer in a MultiLayer sample.
Definition: Layer.h:26
double thickness() const
Definition: Layer.h:41
std::vector< const ParticleLayout * > layouts() const
Definition: Layer.cpp:54
double m_thickness
layer thickness in nanometers
Definition: Layer.h:53
~Layer() override
void addLayout(const ParticleLayout &layout)
Definition: Layer.cpp:49
std::vector< std::unique_ptr< ParticleLayout > > m_layouts
independent layouts in this layer
Definition: Layer.h:54
unsigned int m_n_slices
number of slices to create for graded layer approach
Definition: Layer.h:55
Material m_material
material
Definition: Layer.h:51
Layer(Material material, double thickness=0)
Constructor of a layer with thickness and material.
Definition: Layer.cpp:21
R3 m_B_field
cached value of magnetic induction
Definition: Layer.h:52
Layer * clone() const override
Returns a clone of this ISampleNode object.
Definition: Layer.cpp:31
std::vector< const INode * > nodeChildren() const override
Returns all children.
Definition: Layer.cpp:41
A wrapper for underlying material implementation.
Definition: Material.h:35
Decorator class that adds particles to ISampleNode objects.
ParticleLayout * clone() const override
Returns a clone of this ISampleNode object.