BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
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 
19 
20 //! Constructor of a layer with thickness and material
21 //! @param material: material the layer is made of
22 //! @param thickness: thickness of a layer in nanometers
23 Layer::Layer(Material material, double thickness)
24  : m_material(std::move(material)), m_thickness(thickness)
25 {
26  if (thickness < 0.)
27  throw std::runtime_error("Layer thickness cannot be negative");
28  setName("Layer");
30 }
31 
32 Layer::~Layer() = default;
33 
35 {
36  Layer* result = new Layer(m_material, m_thickness);
37  result->setName(getName());
38  result->m_B_field = m_B_field;
39  result->m_n_slices = m_n_slices;
40  for (const auto* layout : layouts())
41  result->addLayout(*layout);
42  return result;
43 }
44 
45 //! Sets layer thickness in nanometers.
46 void Layer::setThickness(double thickness)
47 {
48  if (thickness < 0.)
49  throw std::runtime_error("Layer thickness cannot be negative");
51 }
52 
54 {
55  m_material = std::move(material);
56 }
57 
58 void Layer::addLayout(const ParticleLayout& layout)
59 {
60  ParticleLayout* clone = layout.clone();
63 }
64 
65 std::vector<const ParticleLayout*> Layer::layouts() const
66 {
67  std::vector<const ParticleLayout*> result;
68  for (const auto* layout : m_layouts)
69  result.push_back(layout);
70  return result;
71 }
72 
73 std::vector<const INode*> Layer::getChildren() const
74 {
75  std::vector<const INode*> result;
76  for (auto layout : m_layouts)
77  result.push_back(layout);
78  return result;
79 }
80 
81 void Layer::registerThickness(bool make_registered)
82 {
83  if (make_registered) {
84  if (!parameter("Thickness"))
85  registerParameter("Thickness", &m_thickness).setUnit("nm").setNonnegative();
86  } else {
87  removeParameter("Thickness");
88  }
89 }
Defines class Layer.
Defines class ParameterPool.
Defines class ParticleLayout.
Defines class RealParameter.
void registerChild(INode *node)
Definition: INode.cpp:57
const std::string & getName() const
void removeParameter(const std::string &name)
RealParameter * parameter(const std::string &name) const
Returns parameter with given 'name'.
void setName(const std::string &name)
RealParameter & registerParameter(const std::string &name, double *parpointer)
A layer in a MultiLayer sample.
Definition: Layer.h:27
double thickness() const
Definition: Layer.h:38
std::vector< const ParticleLayout * > layouts() const
Definition: Layer.cpp:65
const Material * material() const final
Returns nullptr, unless overwritten to return a specific material.
Definition: Layer.h:40
kvector_t m_B_field
cached value of magnetic induction
Definition: Layer.h:56
double m_thickness
layer thickness in nanometers
Definition: Layer.h:57
~Layer() override
void setMaterial(Material material)
Definition: Layer.cpp:53
void setThickness(double thickness)
Sets layer thickness in nanometers.
Definition: Layer.cpp:46
unsigned int m_n_slices
number of slices to create for graded layer approach
Definition: Layer.h:59
std::vector< const INode * > getChildren() const final
Returns a vector of children.
Definition: Layer.cpp:73
Material m_material
material
Definition: Layer.h:55
Layer(Material material, double thickness=0)
Constructor of a layer with thickness and material.
Definition: Layer.cpp:23
void registerThickness(bool make_registered=true)
Definition: Layer.cpp:81
void addLayout(const ParticleLayout &decoration)
Definition: Layer.cpp:58
SafePointerVector< ParticleLayout > m_layouts
independent layouts in this layer
Definition: Layer.h:58
Layer * clone() const final
Returns a clone of this ISampleNode object.
Definition: Layer.cpp:34
A wrapper for underlying material implementation.
Definition: Material.h:29
Decorator class that adds particles to ISampleNode objects.
ParticleLayout * clone() const override
Returns a clone of this ISampleNode object.
RealParameter & setNonnegative()
RealParameter & setUnit(const std::string &name)
void push_back(T *pointer)
Definition: filesystem.h:81