BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ParaCrystalBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/ParaCrystalBuilder.cpp
6 //! @brief Implements class ParaCrystalBuilder.
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/Util/Assert.h"
26 
27 using Units::deg;
28 
30 {
31  const double m_corr_peak_distance(20.0);
32  const double m_corr_width(7);
33  const double m_corr_length(1e3);
34  const double m_cylinder_height(5);
35  const double m_cylinder_radius(5);
36 
37  Layer vacuum_layer(refMat::Vacuum);
38  Layer substrate_layer(refMat::Substrate);
39 
40  InterferenceRadialParaCrystal iff(m_corr_peak_distance, m_corr_length);
41  Profile1DGauss pdf(m_corr_width);
43  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
44 
45  Particle particle(refMat::Particle, ff_cylinder);
46  ParticleLayout particle_layout(particle);
47  particle_layout.setInterference(iff);
48 
49  vacuum_layer.addLayout(particle_layout);
50 
51  auto* sample = new MultiLayer();
52  sample->addLayer(vacuum_layer);
53  sample->addLayer(substrate_layer);
54  return sample;
55 }
56 
57 // -----------------------------------------------------------------------------
58 // Basic2DParaCrystalBuilder
59 // -----------------------------------------------------------------------------
60 
62 {
63  const Profile2DCauchy pdf1(0.1, 0.2, 0);
64 
65  Layer vacuum_layer(refMat::Vacuum);
66  Layer substrate_layer(refMat::Substrate);
67 
68  Interference2DParaCrystal iff(BasicLattice2D(10.0, 20.0, 30.0 * deg, 45.0 * deg), 1000.0,
69  20.0 * Units::micrometer, 40.0 * Units::micrometer);
70 
71  iff.setProbabilityDistributions(pdf1, *pdf2);
72 
73  const Cylinder ff_cylinder(5.0, 5.0);
74 
75  Particle particle(refMat::Particle, ff_cylinder);
76  ParticleLayout particle_layout(particle);
77  particle_layout.setInterference(iff);
78 
79  vacuum_layer.addLayout(particle_layout);
80 
81  auto* sample = new MultiLayer("Basic2DParaCrystal_" + pdf2->className());
82  sample->addLayer(vacuum_layer);
83  sample->addLayer(substrate_layer);
84  return sample;
85 }
86 
87 // -----------------------------------------------------------------------------
88 // HexParaCrystalBuilder
89 // -----------------------------------------------------------------------------
90 
92 {
93  const double m_peak_distance(20.0);
94  const double m_corr_length(0.0);
95  const double m_domain_size_1(20.0 * Units::micrometer);
96  const double m_domain_size_2(20.0 * Units::micrometer);
97  const double m_cylinder_height(5);
98  const double m_cylinder_radius(5);
99 
100  Layer vacuum_layer(refMat::Vacuum);
101  Layer substrate_layer(refMat::Substrate);
102 
103  Interference2DParaCrystal iff(HexagonalLattice2D(m_peak_distance, 0.0), m_corr_length,
104  m_domain_size_1, m_domain_size_2);
105  iff.setIntegrationOverXi(true);
106  Profile2DCauchy pdf(1.0, 1.0, 0);
107  iff.setProbabilityDistributions(pdf, pdf);
108 
109  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
110  Particle cylinder(refMat::Particle, ff_cylinder);
111 
112  ParticleLayout particle_layout(cylinder);
113  particle_layout.setInterference(iff);
114 
115  vacuum_layer.addLayout(particle_layout);
116 
117  auto* sample = new MultiLayer();
118  sample->addLayer(vacuum_layer);
119  sample->addLayer(substrate_layer);
120  return sample;
121 }
122 
123 // -----------------------------------------------------------------------------
124 // RectParaCrystalBuilder
125 // -----------------------------------------------------------------------------
126 
128 {
129  Layer vacuum_layer(refMat::Vacuum);
130  Layer substrate_layer(refMat::Substrate);
131 
132  Interference2DParaCrystal iff(SquareLattice2D(10), 0, 0, 0);
133  iff.setIntegrationOverXi(true);
135  Profile2DCauchy pdf1(0.5, 2.0, 0);
136  Profile2DCauchy pdf2(0.5, 2.0, 0);
137  iff.setProbabilityDistributions(pdf1, pdf2);
138 
139  Cylinder ff_cylinder(5.0, 5.0);
140 
141  Particle particle(refMat::Particle, ff_cylinder);
142  ParticleLayout particle_layout(particle);
143  particle_layout.setInterference(iff);
144 
145  vacuum_layer.addLayout(particle_layout);
146 
147  auto* sample = new MultiLayer();
148  sample->addLayer(vacuum_layer);
149  sample->addLayer(substrate_layer);
150  return sample;
151 }
Defines the macro ASSERT.
Defines class Cylinder.
Defines class Interference2DParaCrystal.
Defines class InterferenceRadialParaCrystal.
Defines class Layer.
Defines class MultiLayer.
Defines classes of ParaCrystalBuilder family.
Defines class ParticleLayout.
Defines class Particle.
Defines materials in namespace refMat.
Defines some unit conversion factors and other constants in namespace Units.
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:51
A circular cylinder.
Definition: Cylinder.h:23
A two-dimensional Bravais lattice with hexagonal symmetry.
Definition: Lattice2D.h:98
virtual std::string className() const =0
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Interface for two-dimensional distributions in Fourier space.
Definition: Profiles2D.h:29
Interference function of a 2D paracrystal.
void setProbabilityDistributions(const IProfile2D &pdf_1, const IProfile2D &pdf_2)
Sets the probability distributions (Fourier transformed) for the two lattice directions.
void setDomainSizes(double size_1, double size_2)
Sets the sizes of coherence domains.
void setIntegrationOverXi(bool integrate_xi)
Enables/disables averaging over the lattice rotation angle.
Interference function of radial paracrystal.
void setProbabilityDistribution(const IProfile1D &pdf)
Sets one-dimensional probability distribution.
A layer in a MultiLayer sample.
Definition: Layer.h:26
void addLayout(const ParticleLayout &layout)
Definition: Layer.cpp:49
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:43
Decorator class that adds particles to ISampleNode objects.
void setInterference(const IInterference &interparticle)
Adds interference functions.
A particle with a form factor and refractive index.
Definition: Particle.h:25
Gaussian IProfile1D; its Fourier transform standardizedFT(q) is a Gaussian starting at standardizedFT...
Definition: Profiles1D.h:87
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Definition: Profiles2D.h:71
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:76
MultiLayer * createBasic2DParaCrystalWithFTDis(const IProfile2D *pdf2)
MultiLayer * createHexParaCrystal()
MultiLayer * createRectParaCrystal()
MultiLayer * createRadialParaCrystal()
static constexpr double deg
Definition: Units.h:46
static constexpr double micrometer
Definition: Units.h:35
static const Material Vacuum
static const Material Particle
static const Material Substrate