BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MagneticLayersBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/MagneticLayersBuilder.cpp
6 //! @brief Implements class to build samples with magnetic layers
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/Const/Units.h"
17 #include "Base/Utils/Assert.h"
25 
26 namespace {
27 
28 const double sphere_radius = 5 * Units::nm;
29 
30 MultiLayer* parametricBuild(double sigmaRoughness, RoughnessModel roughnessModel)
31 {
32  MultiLayer* multi_layer = new MultiLayer();
33 
34  kvector_t substr_field = kvector_t(0.0, 1e6, 0.0);
35  kvector_t layer_field = kvector_t(1e6, 1e6, 0.0);
36  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
37  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
38  Material layer_material = HomogeneousMaterial("MagLayer", 6e-4, 2e-8, layer_field);
39 
40  auto roughness = LayerRoughness();
41  roughness.setSigma(sigmaRoughness * Units::angstrom);
42 
43  Layer vacuum_layer(vacuum_material);
44  Layer substrate_layer(substrate_material);
45  Layer layer(layer_material, 200 * Units::angstrom);
46  multi_layer->addLayer(vacuum_layer);
47  multi_layer->addLayerWithTopRoughness(layer, roughness);
48  multi_layer->addLayerWithTopRoughness(substrate_layer, roughness);
49  multi_layer->setRoughnessModel(roughnessModel);
50  return multi_layer;
51 }
52 
53 } // namespace
54 
56 {
57  kvector_t substr_field(0.0, 0.0, 0.0);
58  kvector_t particle_field(0.1, 0.0, 0.0);
59  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
60  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
61  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
62 
63  ParticleLayout particle_layout;
64  kvector_t position(0.0, 0.0, -10.0 * Units::nm);
65  FormFactorFullSphere ff_sphere(sphere_radius);
66  Particle particle(particle_material, ff_sphere);
67  particle_layout.addParticle(particle, 1.0, position);
68 
69  Layer vacuum_layer(vacuum_material);
70  Layer substrate_layer(substrate_material);
71  substrate_layer.addLayout(particle_layout);
72 
73  MultiLayer* multi_layer = new MultiLayer();
74  multi_layer->addLayer(vacuum_layer);
75  multi_layer->addLayer(substrate_layer);
76  return multi_layer;
77 }
78 
80 {
81  MultiLayer* multi_layer = new MultiLayer();
82 
83  kvector_t layer_field = kvector_t(0.0, 1e8, 0.0);
84  Material vacuum_material = MaterialBySLD("Vacuum", 0.0, 0.0);
85  Material layer_material = MaterialBySLD("MagLayer", 1e-4, 1e-8, layer_field);
86  Material substrate_material = MaterialBySLD("Substrate", 7e-5, 2e-6);
87 
88  Layer vacuum_layer(vacuum_material);
89  Layer intermediate_layer(layer_material, 10.0); // 10 nm layer thickness
90  Layer substrate_layer(substrate_material);
91 
92  multi_layer->addLayer(vacuum_layer);
93  multi_layer->addLayer(intermediate_layer);
94  multi_layer->addLayer(substrate_layer);
95  return multi_layer;
96 }
97 
99 {
100  MultiLayer* multi_layer = new MultiLayer();
101 
102  kvector_t layer_field = kvector_t(0.0, 0.0, 1e6);
103  kvector_t particle_field(1e6, 0.0, 0.0);
104  Material vacuum_material = HomogeneousMaterial("Vacuum0", 0.0, 0.0);
105  Material layer_material = HomogeneousMaterial("Vacuum1", 0.0, 0.0, layer_field);
106  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8);
107  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
108 
109  ParticleLayout particle_layout;
110  FormFactorFullSphere ff_sphere(sphere_radius);
111  Particle particle(particle_material, ff_sphere);
112  particle_layout.addParticle(particle, 1.0);
113 
114  Layer vacuum_layer(vacuum_material);
115  Layer intermediate_layer(layer_material);
116  intermediate_layer.addLayout(particle_layout);
117  Layer substrate_layer(substrate_material);
118 
119  multi_layer->addLayer(vacuum_layer);
120  multi_layer->addLayer(intermediate_layer);
121  multi_layer->addLayer(substrate_layer);
122  return multi_layer;
123 }
124 
126 {
127  return parametricBuild(0., RoughnessModel::TANH);
128 }
129 
131 {
132  return 3;
133 }
134 
136 {
137  switch (index) {
138 
139  case 0:
140  return parametricBuild(0., RoughnessModel::TANH);
141 
142  case 1:
143  setName("Tanh");
144  return parametricBuild(2., RoughnessModel::TANH);
145 
146  case 2:
147  setName("NC");
148  return parametricBuild(2., RoughnessModel::NEVOT_CROCE);
149 
150  default:
151  ASSERT(0);
152  }
153 }
154 
156 {
157  MultiLayer* multi_layer = new MultiLayer();
158 
159  kvector_t substr_field = kvector_t(0.0, 1e6, 0.0);
160  kvector_t particle_field(1e6, 0.0, 0.0);
161  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
162  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
163  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
164 
165  ParticleLayout particle_layout;
166  kvector_t position(0.0, 0.0, -10.0 * Units::nm);
167  FormFactorFullSphere ff_sphere(sphere_radius);
168  Particle particle(particle_material, ff_sphere);
169  RotationZ rot_z(90 * Units::deg);
170  particle_layout.addParticle(particle, 1.0, position, rot_z);
171 
172  Layer vacuum_layer(vacuum_material);
173  Layer substrate_layer(substrate_material);
174  substrate_layer.addLayout(particle_layout);
175 
176  multi_layer->addLayer(vacuum_layer);
177  multi_layer->addLayer(substrate_layer);
178  return multi_layer;
179 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:31
Defines class FormFactorFullSphere.
Defines class LayerRoughness.
Defines class Layer.
Defines class to build samples with magnetic layers.
Factory functions used to create material instances.
Defines class MultiLayer.
Defines class ParticleLayout.
Defines class Particle.
Defines some unit conversion factors and other constants in namespace Units.
BasicVector3D< double > kvector_t
Definition: Vectors3D.h:21
void setName(const std::string &name)
A roughness of interface between two layers.
A layer in a MultiLayer sample.
Definition: Layer.h:27
void addLayout(const ParticleLayout &decoration)
Definition: Layer.cpp:58
MultiLayer * buildSample() const
MultiLayer * buildSample() const
A wrapper for underlying material implementation.
Definition: Material.h:29
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:41
void setRoughnessModel(RoughnessModel roughnessModel)
Definition: MultiLayer.cpp:113
void addLayer(const Layer &layer)
Adds layer with default (zero) roughness.
Definition: MultiLayer.cpp:53
void addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)
Adds layer with top roughness.
Definition: MultiLayer.cpp:60
Decorator class that adds particles to ISampleNode objects.
void addParticle(const IAbstractParticle &particle, double abundance=-1.0, const kvector_t position={}, const IRotation &rotation=IdentityRotation())
Adds particle to the layout with abundance, position and the rotation defined.
A particle with a form factor and refractive index.
Definition: Particle.h:24
A rotation about the z axis.
Definition: Rotations.h:113
MultiLayer * buildSample() const override
MultiLayer * createSampleByIndex(size_t index) override
Material HomogeneousMaterial(const std::string &name, complex_t refractive_index, kvector_t magnetization)
Constructs a material with name, refractive_index and magnetization (in A/m).
static constexpr double deg
Definition: Units.h:46
static constexpr double nm
Definition: Units.h:39
static constexpr double angstrom
Definition: Units.h:34