33 complex_t h_plus(complex_t z)
 
   35     return 0.5 * cerfcx(-
mul_I(z) / std::sqrt(2.0));
 
   37 complex_t h_min(complex_t z)
 
   39     return 0.5 * cerfcx(
mul_I(z) / std::sqrt(2.0));
 
   43 RoughMultiLayerComputation::RoughMultiLayerComputation(
const ProcessedSample* p_sample)
 
   50     if (elem.getAlphaMean() < 0.0)
 
   52     auto n_slices = mp_sample->numberOfSlices();
 
   54     double wavelength = elem.getWavelength();
 
   56     complex_t crosscorr(0.0, 0.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++) {
 
   62         rterm[i] = get_refractive_term(i, wavelength);
 
   63         sterm[i] = get_sum8terms(i, elem);
 
   65     for (
size_t i = 0; i + 1 < n_slices; i++) {
 
   68             autocorr += std::norm(rterm[i]) * std::norm(sterm[i]) * rough->
getSpectralFun(q);
 
   71     if (mp_sample->crossCorrelationLength() != 0.0) {
 
   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]);
 
   82     elem.addIntensity((autocorr + crosscorr.real()) * M_PI / 4. / wavelength / wavelength);
 
   85 complex_t RoughMultiLayerComputation::get_refractive_term(
size_t ilayer, 
double wavelength)
 const 
   87     auto& slices = mp_sample->slices();
 
   88     return slices[ilayer].material().refractiveIndex2(wavelength)
 
   89            - slices[ilayer + 1].material().refractiveIndex2(wavelength);
 
   92 complex_t RoughMultiLayerComputation::get_sum8terms(
size_t ilayer,
 
   95     auto& slices = mp_sample->slices();
 
   96     auto p_fresnel_map = mp_sample->fresnelMap();
 
   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;
 
  107     complex_t qz3_plus = -qz2_plus;
 
  108     complex_t qz4_plus = -qz1_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;
 
  119     complex_t qz3_minus = -qz2_minus;
 
  120     complex_t qz4_minus = -qz1_minus;
 
  123     if (
const LayerRoughness* roughness = mp_sample->bottomRoughness(ilayer))
 
  124         sigma = roughness->getSigma();
 
  125     complex_t term1 = T_in_plus * T_out_plus * h_plus(qz1_plus * sigma);
 
  126     complex_t term2 = T_in_plus * R_out_plus * h_plus(qz2_plus * sigma);
 
  127     complex_t term3 = R_in_plus * T_out_plus * h_plus(qz3_plus * sigma);
 
  128     complex_t term4 = R_in_plus * R_out_plus * h_plus(qz4_plus * sigma);
 
  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.
 
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.
 
double crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const
Fourier transform of the correlation function of roughnesses between the interfaces.
 
Data stucture containing both input and output of a single detector cell.