File: ParacrystalBuilder.cpp

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (152 lines) | stat: -rw-r--r-- 5,323 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      Sample/StandardSample/ParacrystalBuilder.cpp
//! @brief     Implements class ParacrystalBuilder.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#include "Sample/StandardSample/ParacrystalBuilder.h"
#include "Base/Const/Units.h"
#include "Base/Util/Assert.h"
#include "Sample/Aggregate/Interference2DParacrystal.h"
#include "Sample/Aggregate/InterferenceRadialParacrystal.h"
#include "Sample/Aggregate/ParticleLayout.h"
#include "Sample/HardParticle/Cylinder.h"
#include "Sample/Multilayer/Layer.h"
#include "Sample/Multilayer/Sample.h"
#include "Sample/Particle/Particle.h"
#include "Sample/StandardSample/ReferenceMaterials.h"

using Units::deg;

Sample* ExemplarySamples::createRadialParacrystal()
{
    const double m_corr_peak_distance(20.0);
    const double m_corr_width(7);
    const double m_corr_length(1e3);
    const double m_cylinder_height(5);
    const double m_cylinder_radius(5);

    Layer vacuum_layer(refMat::Vacuum);
    Layer substrate_layer(refMat::Substrate);

    InterferenceRadialParacrystal iff(m_corr_peak_distance, m_corr_length);
    Profile1DGauss pdf(m_corr_width);
    iff.setProbabilityDistribution(pdf);
    Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);

    Particle particle(refMat::Particle, ff_cylinder);
    ParticleLayout particle_layout(particle);
    particle_layout.setInterference(iff);

    vacuum_layer.addLayout(particle_layout);

    auto* result = new Sample;
    result->addLayer(vacuum_layer);
    result->addLayer(substrate_layer);
    return result;
}

// -----------------------------------------------------------------------------
// Basic2DParacrystalBuilder
// -----------------------------------------------------------------------------

Sample* ExemplarySamples::createBasic2DParacrystalWithFTDis(const IProfile2D* pdf2)
{
    const Profile2DCauchy pdf1(0.1, 0.2, 0);

    Layer vacuum_layer(refMat::Vacuum);
    Layer substrate_layer(refMat::Substrate);

    Interference2DParacrystal iff(BasicLattice2D(10.0, 20.0, 30.0 * deg, 45.0 * deg), 1000.0,
                                  20.0 * Units::micrometer, 40.0 * Units::micrometer);

    iff.setProbabilityDistributions(pdf1, *pdf2);

    const Cylinder ff_cylinder(5.0, 5.0);

    Particle particle(refMat::Particle, ff_cylinder);
    ParticleLayout particle_layout(particle);
    particle_layout.setInterference(iff);

    vacuum_layer.addLayout(particle_layout);

    auto* result = new Sample;
    result->setName("Basic2DParacrystal_" + pdf2->className());
    result->addLayer(vacuum_layer);
    result->addLayer(substrate_layer);
    return result;
}

// -----------------------------------------------------------------------------
// HexParacrystalBuilder
// -----------------------------------------------------------------------------

Sample* ExemplarySamples::createHexParacrystal()
{
    const double m_peak_distance(20.0);
    const double m_corr_length(0.0);
    const double m_domain_size_1(20.0 * Units::micrometer);
    const double m_domain_size_2(20.0 * Units::micrometer);
    const double m_cylinder_height(5);
    const double m_cylinder_radius(5);

    Layer vacuum_layer(refMat::Vacuum);
    Layer substrate_layer(refMat::Substrate);

    Interference2DParacrystal iff(HexagonalLattice2D(m_peak_distance, 0.0), m_corr_length,
                                  m_domain_size_1, m_domain_size_2);
    iff.setIntegrationOverXi(true);
    Profile2DCauchy pdf(1.0, 1.0, 0);
    iff.setProbabilityDistributions(pdf, pdf);

    Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
    Particle cylinder(refMat::Particle, ff_cylinder);

    ParticleLayout particle_layout(cylinder);
    particle_layout.setInterference(iff);

    vacuum_layer.addLayout(particle_layout);

    auto* result = new Sample;
    result->addLayer(vacuum_layer);
    result->addLayer(substrate_layer);
    return result;
}

// -----------------------------------------------------------------------------
// RectParacrystalBuilder
// -----------------------------------------------------------------------------

Sample* ExemplarySamples::createRectParacrystal()
{
    Layer vacuum_layer(refMat::Vacuum);
    Layer substrate_layer(refMat::Substrate);

    Interference2DParacrystal iff(SquareLattice2D(10), 0, 0, 0);
    iff.setIntegrationOverXi(true);
    iff.setDomainSizes(20.0 * Units::micrometer, 20.0 * Units::micrometer);
    Profile2DCauchy pdf1(0.5, 2.0, 0);
    Profile2DCauchy pdf2(0.5, 2.0, 0);
    iff.setProbabilityDistributions(pdf1, pdf2);

    Cylinder ff_cylinder(5.0, 5.0);

    Particle particle(refMat::Particle, ff_cylinder);
    ParticleLayout particle_layout(particle);
    particle_layout.setInterference(iff);

    vacuum_layer.addLayout(particle_layout);

    auto* result = new Sample;
    result->addLayer(vacuum_layer);
    result->addLayer(substrate_layer);
    return result;
}