BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MultiLayerUtils.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Sample/Multilayer/MultiLayerUtils.cpp
6 //! @brief Implements helper functions for MultiLayer objects.
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 
23 
24 namespace
25 {
26 std::vector<double> BottomLayerCoordinates(const MultiLayer& multilayer);
27 } // namespace
28 
29 double MultiLayerUtils::LayerThickness(const MultiLayer& multilayer, size_t i)
30 {
31  return multilayer.layer(i)->thickness();
32 }
33 
35 {
36  if (i == 0)
37  return nullptr;
38  return multilayer.layerInterface(i - 1);
39 }
40 
42 {
43  if (i + 1 < multilayer.numberOfLayers())
44  return multilayer.layerInterface(i);
45  return nullptr;
46 }
47 
49 {
50  if (i == 0)
51  return nullptr;
52  return multilayer.layerInterface(i - 1)->getRoughness();
53 }
54 
55 size_t MultiLayerUtils::IndexOfLayer(const MultiLayer& multilayer, const Layer* p_layer)
56 {
57  for (size_t i = 0; i < multilayer.numberOfLayers(); ++i)
58  if (p_layer == multilayer.layer(i))
59  return i;
60  throw std::out_of_range("MultiLayerUtils::IndexOfLayer: layer not found");
61 }
62 
64 {
67 }
68 
69 std::vector<ZLimits> MultiLayerUtils::ParticleRegions(const MultiLayer& multilayer,
70  bool use_slicing)
71 {
72  auto bottom_coords = BottomLayerCoordinates(multilayer);
73  LayerFillLimits layer_fill_limits(bottom_coords);
74  if (use_slicing) {
75  for (size_t i = 0; i < multilayer.numberOfLayers(); ++i) {
76  auto p_layer = multilayer.layer(i);
77  double offset = (i == 0) ? 0 : bottom_coords[i - 1];
78  for (auto p_layout : p_layer->layouts()) {
79  for (auto p_particle : p_layout->particles())
80  layer_fill_limits.update(p_particle->bottomTopZ(), offset);
81  }
82  }
83  }
84  return layer_fill_limits.layerZLimits();
85 }
86 
88 {
89  for (size_t i = 0; i < sample.numberOfLayers() - 1; i++) {
90  if (sample.layerInterface(i)->getRoughness())
91  return true;
92  }
93  return false;
94 }
95 
96 namespace
97 {
98 std::vector<double> BottomLayerCoordinates(const MultiLayer& multilayer)
99 {
100  auto n_layers = multilayer.numberOfLayers();
101  if (n_layers < 2)
102  return {};
103  std::vector<double> result(n_layers - 1);
104  result[0] = 0.0;
105  for (size_t i = 1; i < n_layers - 1; ++i) {
106  result[i] = result[i - 1] - MultiLayerUtils::LayerThickness(multilayer, i);
107  }
108  return result;
109 }
110 } // unnamed namespace
Defines and implements interface class ILayout.
Defines interface IParticle.
Defines class LayerFillLimits.
Defines class LayerInterface.
Defines class Layer.
Declares functions in namespace MaterialUtils.
Defines helper functions for MultiLayer objects.
Defines class MultiLayer.
std::vector< const Material * > containedMaterials() const
Returns set of unique materials contained in this ISample.
Definition: ISample.cpp:23
Helper class for the graded layer approximation.
std::vector< ZLimits > layerZLimits() const
Returns the filled region limits for each layer (in local layer coordinates)
void update(ParticleLimits particle_limits, double offset=0.0)
Particle limits are given in global coordinates.
Interface between two layers, possibly with roughness.
const LayerRoughness * getRoughness() const
Returns roughness of the interface.
A roughness of interface between two layers.
A layer, with thickness (in nanometer) and material.
Definition: Layer.h:28
double thickness() const
Definition: Layer.h:39
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:42
const LayerInterface * layerInterface(size_t i_interface) const
Returns interface with given index.
Definition: MultiLayer.cpp:93
const Layer * layer(size_t i_layer) const
Returns layer with given index.
Definition: MultiLayer.cpp:88
size_t numberOfLayers() const
Definition: MultiLayer.h:53
MATERIAL_TYPES checkMaterialTypes(const std::vector< const Material * > &materials)
Checks if all non-default materials in materials are of the same type and returns this type.
const LayerRoughness * LayerTopRoughness(const MultiLayer &multilayer, size_t i)
Returns top roughness of layer.
std::vector< ZLimits > ParticleRegions(const MultiLayer &multilayer, bool use_slicing)
Calculate z-regions occupied by particles.
size_t IndexOfLayer(const MultiLayer &multilayer, const Layer *p_layer)
Returns the index of the given layer.
bool ContainsCompatibleMaterials(const MultiLayer &multilayer)
Returns true if the multilayer contains non-default materials of one type only.
double LayerThickness(const MultiLayer &multilayer, size_t i)
Returns thickness of layer.
const LayerInterface * LayerTopInterface(const MultiLayer &multilayer, size_t i)
Returns top interface of layer.
bool hasRoughness(const MultiLayer &sample)
const LayerInterface * LayerBottomInterface(const MultiLayer &multilayer, size_t i)
Returns bottom interface of layer.
std::vector< double > BottomLayerCoordinates(const MultiLayer &multilayer)