34 return 0.5 * cerfcx(-
mul_I(z) / std::sqrt(2.0));
38 return 0.5 * cerfcx(
mul_I(z) / std::sqrt(2.0));
57 std::vector<complex_t> rterm(n_slices - 1);
58 std::vector<complex_t> sterm(n_slices - 1);
60 for (
size_t i = 0; i + 1 < n_slices; i++) {
64 for (
size_t i = 0; i + 1 < n_slices; i++) {
67 autocorr += std::norm(rterm[i]) * std::norm(sterm[i]) * rough->
getSpectralFun(q);
71 for (
size_t j = 0; j < n_slices - 1; j++) {
72 for (
size_t k = 0; k < n_slices - 1; k++) {
76 * std::conj(rterm[k]) * std::conj(sterm[k]);
81 elem.
addIntensity((autocorr + crosscorr.real()) *
M_PI / 4. / wavelength / wavelength);
87 return slices[ilayer].material().refractiveIndex2(wavelength)
88 - slices[ilayer + 1].material().refractiveIndex2(wavelength);
97 const auto P_out_plus = p_fresnel_map->getOutCoefficients(sim_element, ilayer);
99 const auto P_in_minus = p_fresnel_map->getInCoefficients(sim_element, ilayer + 1);
100 const auto P_out_minus = p_fresnel_map->getOutCoefficients(sim_element, ilayer + 1);
102 complex_t kiz_plus = P_in_plus->getScalarKz();
103 complex_t kfz_plus = P_out_plus->getScalarKz();
104 complex_t qz1_plus = -kiz_plus - kfz_plus;
105 complex_t qz2_plus = -kiz_plus + kfz_plus;
108 double thickness = slices[ilayer].thickness();
109 complex_t T_in_plus = P_in_plus->getScalarT() *
exp_I(kiz_plus * thickness);
110 complex_t R_in_plus = P_in_plus->getScalarR() *
exp_I(-kiz_plus * thickness);
111 complex_t T_out_plus = P_out_plus->getScalarT() *
exp_I(kfz_plus * thickness);
112 complex_t R_out_plus = P_out_plus->getScalarR() *
exp_I(-kfz_plus * thickness);
114 complex_t kiz_minus = P_in_minus->getScalarKz();
115 complex_t kfz_minus = P_out_minus->getScalarKz();
116 complex_t qz1_minus = -kiz_minus - kfz_minus;
117 complex_t qz2_minus = -kiz_minus + kfz_minus;
123 sigma = roughness->getSigma();
124 complex_t term1 = T_in_plus * T_out_plus * h_plus(qz1_plus * sigma);
125 complex_t term2 = T_in_plus * R_out_plus * h_plus(qz2_plus * sigma);
126 complex_t term3 = R_in_plus * T_out_plus * h_plus(qz3_plus * sigma);
127 complex_t term4 = R_in_plus * R_out_plus * h_plus(qz4_plus * sigma);
129 P_in_minus->getScalarT() * P_out_minus->getScalarT() * h_min(qz1_minus * sigma);
131 P_in_minus->getScalarT() * P_out_minus->getScalarR() * h_min(qz2_minus * sigma);
133 P_in_minus->getScalarR() * P_out_minus->getScalarT() * h_min(qz3_minus * sigma);
135 P_in_minus->getScalarR() * P_out_minus->getScalarR() * h_min(qz4_minus * sigma);
137 return term1 + term2 + term3 + term4 + term5 + term6 + term7 + term8;
complex_t mul_I(complex_t z)
Returns product I*z, where I is the imaginary unit.
std::complex< double > complex_t
complex_t exp_I(complex_t z)
Returns exp(I*z), where I is the imaginary unit.
Defines M_PI and some more mathematical constants.
Defines interface IFresnelMap.
Defines and implements class ILayerRTCoefficients.
Defines class LayerInterface.
Defines class LayerRoughness.
Defines class MultiLayer.
Defines class ProcessedSample.
Defines class RoughMultiLayerComputation.
Defines class SimulationElement.
std::unique_ptr< const ILayerRTCoefficients > getInCoefficients(const T &sim_element, size_t layer_index) const
Retrieves the amplitude coefficients for an incoming wavevector.
A roughness of interface between two layers.
double getSpectralFun(const kvector_t kvec) const
Returns power spectral density of the surface roughness.
Data structure that contains all the necessary data for scattering calculations.
const std::vector< Slice > & slices() const
const IFresnelMap * fresnelMap() const
size_t numberOfSlices() const
double crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
Fourier transform of the correlation function of roughnesses between the interfaces.
double crossCorrelationLength() const
const LayerRoughness * bottomRoughness(size_t i) const
void compute(SimulationElement &elem) const
complex_t get_sum8terms(size_t ilayer, const SimulationElement &sim_element) const
complex_t get_refractive_term(size_t ilayer, double wavelength) const
const ProcessedSample * m_sample
RoughMultiLayerComputation(const ProcessedSample *p_sample)
Data stucture containing both input and output of a single detector cell.
double wavelength() const
void addIntensity(double intensity)
double getAlphaMean() const