31 const complex_t sldFe = complex_t{8.02e-06, 0};
32 const complex_t sldAu = complex_t{4.6665e-6, 0};
33 const complex_t sldNi = complex_t{9.4245e-06, 0};
39 double m_magnetizationMagnitude = 1.e7;
42 double m_sigmaRoughness = 0.;
43 int m_effectiveSLD = 0;
47 Options NBilayers(
int n)
52 Options angle(
double angle)
57 Options magnetizationMagnitude(
double M)
59 m_magnetizationMagnitude = M;
62 Options thicknessFe(
double t)
67 Options thicknessNi(
double t)
72 Options sigmaRoughness(
double r)
77 Options effectiveSLD(
int i)
84 m_roughnessModel = rm;
92 explicit FeNiBilayer(Options opt = {})
93 : NBilayers(opt.m_NBilayers)
95 , magnetizationMagnitude(opt.m_magnetizationMagnitude)
96 , thicknessFe(opt.m_thicknessFe)
97 , thicknessNi(opt.m_thicknessNi)
98 , sigmaRoughness(opt.m_sigmaRoughness)
99 , effectiveSLD(opt.m_effectiveSLD)
100 , roughnessModel(opt.m_roughnessModel)
102 if (angle != 0. && effectiveSLD != 0.)
103 throw std::runtime_error(
"Cannot perform scalar computation "
104 "for non-colinear magnetization");
106 magnetizationVector = R3(magnetizationMagnitude * std::sin(angle),
107 magnetizationMagnitude * std::cos(angle), 0);
108 sample = constructSample();
111 MultiLayer* release() {
return sample.release(); }
116 double magnetizationMagnitude;
119 double sigmaRoughness;
123 R3 magnetizationVector;
125 std::unique_ptr<MultiLayer> sample;
127 std::unique_ptr<MultiLayer> constructSample();
132 std::unique_ptr<MultiLayer> FeNiBilayer::constructSample()
134 auto sample = std::make_unique<MultiLayer>();
139 ?
MaterialBySLD(
"Fe", sldFe.real(), sldFe.imag(), magnetizationVector)
140 :
MaterialBySLD(
"Fe", sldFe.real() + effectiveSLD * rhoMconst * magnetizationMagnitude,
141 sldFe.imag(), R3{0, 0, 0});
144 auto m_Substrate =
MaterialBySLD(
"Au", sldAu.real(), sldAu.imag());
146 Layer l_Fe{m_Fe, thicknessFe};
147 Layer l_Ni{m_Ni, thicknessNi};
150 sample->addLayer(
Layer{m_ambient});
152 for (
auto i = 0; i < NBilayers; ++i) {
153 sample->addLayerWithTopRoughness(l_Fe, roughness);
154 sample->addLayerWithTopRoughness(l_Ni, roughness);
157 sample->addLayerWithTopRoughness(
Layer{m_Substrate}, roughness);
158 sample->setRoughnessModel(roughnessModel);
164 auto sample = FeNiBilayer{Options()};
165 return sample.release();
170 auto sample = FeNiBilayer{
172 return sample.release();
177 auto sample = FeNiBilayer{
179 return sample.release();
184 auto sample = FeNiBilayer{Options().angle(38. *
deg)};
185 return sample.release();
190 auto sample = FeNiBilayer{Options()
194 return sample.release();
199 auto sample = FeNiBilayer{Options()
203 return sample.release();
Defines various sample builder classes to test polarized specular computations.
Defines class LayerRoughness.
Factory functions used to create material instances.
Defines class MultiLayer.
Defines the values of physical constants (SI)
Defines some unit conversion factors and other constants in namespace Units.
A roughness of interface between two layers.
A layer in a MultiLayer sample.
Our sample model: a stack of layers one below the other.
RoughnessModel roughnessModel() const
MultiLayer * createFeNiBilayerNC()
MultiLayer * createFeNiBilayerSpinFlip()
MultiLayer * createFeNiBilayerTanh()
MultiLayer * createFeNiBilayerSpinFlipNC()
MultiLayer * createFeNiBilayer()
MultiLayer * createFeNiBilayerSpinFlipTanh()
constexpr double g_factor_n
neutron g-factor
constexpr double h_bar
Reduced Plank constant, J s.
constexpr double m_n
Neutron mass, kg.
constexpr double mu_N
Nuclear magneton ( ), J/T.
static constexpr double deg
static constexpr double angstrom