27 const double height(5 * Units::nanometer);
28 const double radius(5 * Units::nanometer);
29 const double wavelength(0.154);
30 const int n_slices(3);
34 complex_t getSLDFromN(
double wavelength,
double delta,
double beta)
36 complex_t result{2 * delta - delta * delta + beta * beta, 2 * beta - 2 * delta * beta};
37 return result * M_PI / (wavelength * wavelength) * (Units::angstrom * Units::angstrom);
40 complex_t averageSLD(complex_t sld_p, complex_t sld_l,
double eff_vol)
42 return sld_l + eff_vol * (sld_p - sld_l);
46 MultiLayer* SlicedCylindersBuilder::buildSample()
const
52 Layer vacuum_layer(vacuum_material);
53 Layer substrate_layer(substrate_material);
57 Particle particle(particle_material, ff_cylinder);
60 vacuum_layer.addLayout(particle_layout);
61 vacuum_layer.setNumberOfSlices(n_slices);
65 multi_layer->
addLayer(substrate_layer);
69 MultiLayer* SLDSlicedCylindersBuilder::buildSample()
const
71 Material vacuum_material = MaterialBySLD(
"Vacuum", 0.0, 0.0);
72 complex_t sub_sld = getSLDFromN(wavelength, 6e-6, 2e-8);
73 Material substrate_material = MaterialBySLD(
"Substrate", sub_sld.real(), sub_sld.imag());
74 complex_t par_sld = getSLDFromN(wavelength, 6e-4, 2e-8);
75 Material particle_material = MaterialBySLD(
"Particle", par_sld.real(), par_sld.imag());
77 Layer vacuum_layer(vacuum_material);
78 Layer substrate_layer(substrate_material);
82 Particle particle(particle_material, ff_cylinder);
85 vacuum_layer.addLayout(particle_layout);
86 vacuum_layer.setNumberOfSlices(n_slices);
90 multi_layer->
addLayer(substrate_layer);
94 MultiLayer* AveragedSlicedCylindersBuilder::buildSample()
const
98 complex_t vacuum_sld{0.0, 0.0};
99 Material vacuum_material = MaterialBySLD(
"Vacuum", vacuum_sld.real(), vacuum_sld.imag());
100 complex_t sub_sld = getSLDFromN(wavelength, 6e-6, 2e-8);
101 Material substrate_material = MaterialBySLD(
"Substrate", sub_sld.real(), sub_sld.imag());
103 double eff_vol = par_surf_density * M_PI * radius * radius;
104 complex_t par_sld = getSLDFromN(wavelength, 6e-4, 2e-8);
105 complex_t avr_sld = averageSLD(par_sld, vacuum_sld, eff_vol);
106 Material avr_material = MaterialBySLD(
"Avr", avr_sld.real(), avr_sld.imag());
108 Layer vacuum_layer(vacuum_material);
109 Layer avr_layer(avr_material, height / n_slices);
110 Layer substrate_layer(substrate_material);
113 multi_layer->
addLayer(vacuum_layer);
114 for (
size_t i = 0; i < n_slices; ++i)
116 multi_layer->
addLayer(substrate_layer);
Factory functions used to create material instances.
Defines M_PI and some more mathematical constants.
Defines class MultiLayer.
Defines class ParticleLayout.
Defines classes for testing slicing machinery.
Defines some unit conversion factors and other constants in namespace Units.
A layer, with thickness (in nanometer) and material.
A wrapper for underlying material implementation.
Our sample model: a stack of layers one below the other.
void addLayer(const Layer &layer)
Adds object to multilayer.
Decorator class that adds particles to ISample objects.
double totalParticleSurfaceDensity() const final override
Returns surface density of all particles.
A particle with a form factor and refractive index.
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).