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));
46 : m_re_sample{re_sample}
58 complex_t crosscorr(0.0, 0.0);
60 std::vector<complex_t> rterm(n_slices - 1);
61 std::vector<complex_t> sterm(n_slices - 1);
63 for (
size_t i = 0; i + 1 < n_slices; i++) {
67 for (
size_t i = 0; i + 1 < n_slices; i++) {
70 autocorr += std::norm(rterm[i]) * std::norm(sterm[i]) * rough->
spectralFunction(q);
74 for (
size_t j = 0; j < n_slices - 1; j++) {
75 for (
size_t k = 0; k < n_slices - 1; k++) {
79 * std::conj(rterm[k]) * std::conj(sterm[k]);
84 ele.
addIntensity((autocorr + crosscorr.real()) *
M_PI / 4. / wavelength / wavelength);
98 const auto* in_minus =
dynamic_cast<const ScalarFlux*
>(ele.
fluxIn(i_layer + 1));
99 const auto* out_minus =
dynamic_cast<const ScalarFlux*
>(ele.
fluxOut(i_layer + 1));
100 ASSERT(in_plus && out_plus && in_minus && out_minus);
102 const complex_t kiz_plus = in_plus->getScalarKz();
103 const complex_t kfz_plus = out_plus->getScalarKz();
104 const complex_t qz1_plus = -kiz_plus - kfz_plus;
105 const complex_t qz2_plus = -kiz_plus + kfz_plus;
106 const complex_t qz3_plus = -qz2_plus;
107 const complex_t qz4_plus = -qz1_plus;
110 const complex_t T_in_plus = in_plus->getScalarT() * exp_I(kiz_plus * thickness);
111 const complex_t R_in_plus = in_plus->getScalarR() * exp_I(-kiz_plus * thickness);
112 const complex_t T_out_plus = out_plus->getScalarT() * exp_I(kfz_plus * thickness);
113 const complex_t R_out_plus = out_plus->getScalarR() * exp_I(-kfz_plus * thickness);
115 const complex_t kiz_minus = in_minus->getScalarKz();
116 const complex_t kfz_minus = out_minus->getScalarKz();
117 const complex_t qz1_minus = -kiz_minus - kfz_minus;
118 const complex_t qz2_minus = -kiz_minus + kfz_minus;
119 const complex_t qz3_minus = -qz2_minus;
120 const complex_t qz4_minus = -qz1_minus;
123 const double sigma = roughness ? roughness->
sigma() : 0.;
124 const complex_t term1 = T_in_plus * T_out_plus * h_plus(qz1_plus * sigma);
125 const complex_t term2 = T_in_plus * R_out_plus * h_plus(qz2_plus * sigma);
126 const complex_t term3 = R_in_plus * T_out_plus * h_plus(qz3_plus * sigma);
127 const complex_t term4 = R_in_plus * R_out_plus * h_plus(qz4_plus * sigma);
128 const complex_t term5 =
129 in_minus->getScalarT() * out_minus->getScalarT() * h_min(qz1_minus * sigma);
130 const complex_t term6 =
131 in_minus->getScalarT() * out_minus->getScalarR() * h_min(qz2_minus * sigma);
132 const complex_t term7 =
133 in_minus->getScalarR() * out_minus->getScalarT() * h_min(qz3_minus * sigma);
134 const complex_t term8 =
135 in_minus->getScalarR() * out_minus->getScalarR() * h_min(qz4_minus * sigma);
137 return term1 + term2 + term3 + term4 + term5 + term6 + term7 + term8;
Defines the macro ASSERT.
#define ASSERT(condition)
Defines M_PI and some more mathematical constants.
Defines class DiffuseElement.
Defines class LayerInterface.
Defines class LayerRoughness.
Defines class MultiLayer.
Defines class RoughMultiLayerContribution.
Defines class ScalarFlux.
Data stucture containing both input and output of a single detector cell.
const IFlux * fluxIn(size_t i_layer) const
const IFlux * fluxOut(size_t i_layer) const
double wavelength() const
void addIntensity(double intensity)
A roughness of interface between two layers.
double spectralFunction(R3 kvec) const
Returns power spectral density of the surface roughness.
double sigma() const
Returns rms of roughness.
complex_t refractiveIndex2(double wavelength) const
Returns squared refractive index.
double crossCorrLength() const
Returns cross correlation length of roughnesses between interfaces.
const reSample & m_re_sample
void compute(DiffuseElement &ele) const
complex_t get_refractive_term(size_t i_layer, double wavelength) const
RoughMultiLayerContribution(const reSample &re_sample)
complex_t get_sum8terms(size_t i_layer, const DiffuseElement &ele) const
Specular reflection and transmission coefficients in a layer in case of scalar interactions between t...
const LayerRoughness * bottomRoughness(size_t i_slice) const
double thicknessOr0() const
const Material & material() const
const LayerRoughness * topRoughness() const
Data structure that contains all the necessary data for scattering calculations.
const Slice & avgeSlice(size_t i) const
size_t numberOfSlices() const
double crossCorrSpectralFun(R3 kvec, size_t j, size_t k) const
Fourier transform of the correlation function of roughnesses between the interfaces.
const MultiLayer & sample() const
const SliceStack & averageSlices() const