35 return 0.5 * cerfcx(-
mul_I(z) / std::sqrt(2.0));
39 return 0.5 * cerfcx(
mul_I(z) / std::sqrt(2.0));
58 std::vector<complex_t> rterm(
n_slices - 1);
59 std::vector<complex_t> sterm(
n_slices - 1);
61 for (
size_t i = 0; i + 1 <
n_slices; i++) {
65 for (
size_t i = 0; i + 1 <
n_slices; i++) {
68 autocorr += std::norm(rterm[i]) * std::norm(sterm[i]) * rough->
getSpectralFun(q);
72 for (
size_t j = 0; j <
n_slices - 1; j++) {
73 for (
size_t k = 0; k <
n_slices - 1; k++) {
77 * std::conj(rterm[k]) * std::conj(sterm[k]);
88 return slices[ilayer].material().refractiveIndex2(
wavelength)
89 - slices[ilayer + 1].material().refractiveIndex2(
wavelength);
98 const auto P_out_plus = p_fresnel_map->getOutCoefficients(sim_element, ilayer);
100 const auto P_in_minus = p_fresnel_map->getInCoefficients(sim_element, ilayer + 1);
101 const auto P_out_minus = p_fresnel_map->getOutCoefficients(sim_element, ilayer + 1);
103 complex_t kiz_plus = P_in_plus->getScalarKz();
104 complex_t kfz_plus = P_out_plus->getScalarKz();
105 complex_t qz1_plus = -kiz_plus - kfz_plus;
106 complex_t qz2_plus = -kiz_plus + kfz_plus;
109 double thickness = slices[ilayer].thickness();
110 complex_t T_in_plus = P_in_plus->getScalarT() *
exp_I(kiz_plus * thickness);
111 complex_t R_in_plus = P_in_plus->getScalarR() *
exp_I(-kiz_plus * thickness);
112 complex_t T_out_plus = P_out_plus->getScalarT() *
exp_I(kfz_plus * thickness);
113 complex_t R_out_plus = P_out_plus->getScalarR() *
exp_I(-kfz_plus * thickness);
115 complex_t kiz_minus = P_in_minus->getScalarKz();
116 complex_t kfz_minus = P_out_minus->getScalarKz();
117 complex_t qz1_minus = -kiz_minus - kfz_minus;
118 complex_t qz2_minus = -kiz_minus + kfz_minus;
124 sigma = roughness->getSigma();
130 P_in_minus->getScalarT() * P_out_minus->getScalarT() *
h_min(qz1_minus * sigma);
132 P_in_minus->getScalarT() * P_out_minus->getScalarR() *
h_min(qz2_minus * sigma);
134 P_in_minus->getScalarR() * P_out_minus->getScalarT() *
h_min(qz3_minus * sigma);
136 P_in_minus->getScalarR() * P_out_minus->getScalarR() *
h_min(qz4_minus * sigma);
138 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 class IFresnelMap.
Defines and implements class ILayerRTCoefficients.
Defines class LayerInterface.
Defines class LayerRoughness.
Defines M_PI and some more mathematical constants.
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 * mp_sample
RoughMultiLayerComputation(const ProcessedSample *p_sample)
Data stucture containing both input and output of a single detector cell.
void addIntensity(double intensity)
double getWavelength() const
kvector_t getMeanQ() const
double getAlphaMean() const
complex_t h_plus(complex_t z)
complex_t h_min(complex_t z)
const double wavelength(0.154)