BornAgain  1.18.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 scattering at grazing incidence
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 
29 const double sphere_radius = 5 * Units::nanometer;
30 
31 MultiLayer* parametricBuild(double sigmaRoughness, RoughnessModel roughnessModel)
32 {
33  MultiLayer* multi_layer = new MultiLayer();
34 
35  kvector_t substr_field = kvector_t(0.0, 1e6, 0.0);
36  kvector_t layer_field = kvector_t(1e6, 1e6, 0.0);
37  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
38  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
39  Material layer_material = HomogeneousMaterial("MagLayer", 6e-4, 2e-8, layer_field);
40 
41  auto roughness = LayerRoughness();
42  roughness.setSigma(sigmaRoughness * Units::angstrom);
43 
44  Layer vacuum_layer(vacuum_material);
45  Layer substrate_layer(substrate_material);
46  Layer layer(layer_material, 200 * Units::angstrom);
47  multi_layer->addLayer(vacuum_layer);
48  multi_layer->addLayerWithTopRoughness(layer, roughness);
49  multi_layer->addLayerWithTopRoughness(substrate_layer, roughness);
50  multi_layer->setRoughnessModel(roughnessModel);
51  return multi_layer;
52 }
53 
54 } // namespace
55 
57 {
58  kvector_t substr_field(0.0, 0.0, 0.0);
59  kvector_t particle_field(0.1, 0.0, 0.0);
60  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
61  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
62  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
63 
64  ParticleLayout particle_layout;
65  kvector_t position(0.0, 0.0, -10.0 * Units::nanometer);
67  Particle particle(particle_material, ff_sphere);
68  particle_layout.addParticle(particle, 1.0, position);
69 
70  Layer vacuum_layer(vacuum_material);
71  Layer substrate_layer(substrate_material);
72  substrate_layer.addLayout(particle_layout);
73 
74  MultiLayer* multi_layer = new MultiLayer();
75  multi_layer->addLayer(vacuum_layer);
76  multi_layer->addLayer(substrate_layer);
77  return multi_layer;
78 }
79 
81 {
82  MultiLayer* multi_layer = new MultiLayer();
83 
84  kvector_t layer_field = kvector_t(0.0, 1e8, 0.0);
85  Material vacuum_material = MaterialBySLD("Vacuum", 0.0, 0.0);
86  Material layer_material = MaterialBySLD("MagLayer", 1e-4, 1e-8, layer_field);
87  Material substrate_material = MaterialBySLD("Substrate", 7e-5, 2e-6);
88 
89  Layer vacuum_layer(vacuum_material);
90  Layer intermediate_layer(layer_material, 10.0); // 10 nm layer thickness
91  Layer substrate_layer(substrate_material);
92 
93  multi_layer->addLayer(vacuum_layer);
94  multi_layer->addLayer(intermediate_layer);
95  multi_layer->addLayer(substrate_layer);
96  return multi_layer;
97 }
98 
100 {
101  MultiLayer* multi_layer = new MultiLayer();
102 
103  kvector_t layer_field = kvector_t(0.0, 0.0, 1e6);
104  kvector_t particle_field(1e6, 0.0, 0.0);
105  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
106  Material layer_material = HomogeneousMaterial("Vacuum", 0.0, 0.0, layer_field);
107  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8);
108  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
109 
110  ParticleLayout particle_layout;
112  Particle particle(particle_material, ff_sphere);
113  particle_layout.addParticle(particle, 1.0);
114 
115  Layer vacuum_layer(vacuum_material);
116  Layer intermediate_layer(layer_material);
117  intermediate_layer.addLayout(particle_layout);
118  Layer substrate_layer(substrate_material);
119 
120  multi_layer->addLayer(vacuum_layer);
121  multi_layer->addLayer(intermediate_layer);
122  multi_layer->addLayer(substrate_layer);
123  return multi_layer;
124 }
125 
127 {
128  return parametricBuild(0., RoughnessModel::TANH);
129 }
130 
132 {
133  return 3;
134 }
135 
137 {
138  switch (index) {
139 
140  case 0:
141  return parametricBuild(0., RoughnessModel::TANH);
142 
143  case 1:
144  setName("Tanh");
145  return parametricBuild(2., RoughnessModel::TANH);
146 
147  case 2:
148  setName("NC");
149  return parametricBuild(2., RoughnessModel::NEVOT_CROCE);
150 
151  default:
152  ASSERT(0);
153  }
154 }
155 
157 {
158  MultiLayer* multi_layer = new MultiLayer();
159 
160  kvector_t substr_field = kvector_t(0.0, 1e6, 0.0);
161  kvector_t particle_field(1e6, 0.0, 0.0);
162  Material vacuum_material = HomogeneousMaterial("Vacuum", 0.0, 0.0);
163  Material substrate_material = HomogeneousMaterial("Substrate", 7e-6, 2e-8, substr_field);
164  Material particle_material = HomogeneousMaterial("MagParticle", 6e-4, 2e-8, particle_field);
165 
166  ParticleLayout particle_layout;
167  kvector_t position(0.0, 0.0, -10.0 * Units::nanometer);
169  Particle particle(particle_material, ff_sphere);
170  RotationZ rot_z(90 * Units::deg);
171  particle_layout.addParticle(particle, 1.0, position, rot_z);
172 
173  Layer vacuum_layer(vacuum_material);
174  Layer substrate_layer(substrate_material);
175  substrate_layer.addLayout(particle_layout);
176 
177  multi_layer->addLayer(vacuum_layer);
178  multi_layer->addLayer(substrate_layer);
179  return multi_layer;
180 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:26
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, with thickness (in nanometer) and material.
Definition: Layer.h:28
void addLayout(const ILayout &decoration)
Definition: Layer.cpp:57
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:42
void setRoughnessModel(RoughnessModel roughnessModel)
Definition: MultiLayer.cpp:110
void addLayer(const Layer &layer)
Adds object to multilayer.
Definition: MultiLayer.cpp:54
void addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)
Adds layer with top roughness.
Definition: MultiLayer.cpp:61
Decorator class that adds particles to ISample 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:26
A rotation about the z axis.
Definition: Rotations.h:114
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:56
static constexpr double angstrom
Definition: Units.h:25
static constexpr double nanometer
Definition: Units.h:24
MultiLayer * parametricBuild(double sigmaRoughness, RoughnessModel roughnessModel)