Skip to content
Snippets Groups Projects
Commit 50658988 authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Refactor: removed code duplication

parent 30d90b04
No related branches found
No related tags found
No related merge requests found
......@@ -28,26 +28,30 @@ ScalarSpecularInfoMap *ScalarSpecularInfoMap::clone() const
return new ScalarSpecularInfoMap(mp_multilayer, m_layer);
}
//! \todo Can we avoid the code duplication in the two following functions ?
const ScalarRTCoefficients *ScalarSpecularInfoMap::getOutCoefficients(
double alpha_f, double phi_f, double wavelength) const
{
(void)phi_f;
SpecularMatrix::MultiLayerCoeff_t coeffs;
// phi has no effect on R,T, so just pass zero:
(void)phi_f; // phi has no effect on R,T, so just pass zero:
kvector_t kvec = Geometry::vecOfLambdaAlphaPhi(wavelength, -alpha_f, 0.0);
SpecularMatrix::execute(*mp_multilayer, kvec, coeffs);
return new ScalarRTCoefficients(coeffs[m_layer]);
return getCoefficients(kvec);
}
const ScalarRTCoefficients *ScalarSpecularInfoMap::getInCoefficients(
double alpha_i, double phi_i, double wavelength) const
{
(void)phi_i;
SpecularMatrix::MultiLayerCoeff_t coeffs;
// phi has no effect on R,T, so just pass zero:
(void)phi_i; // phi has no effect on R,T, so just pass zero:
kvector_t kvec = Geometry::vecOfLambdaAlphaPhi(wavelength, alpha_i, 0.0);
return getCoefficients(kvec);
}
const ScalarRTCoefficients *ScalarSpecularInfoMap::getCoefficients(kvector_t kvec) const
{
SpecularMatrix::MultiLayerCoeff_t coeffs;
SpecularMatrix::execute(*mp_multilayer, kvec, coeffs);
return new ScalarRTCoefficients(coeffs[m_layer]);
auto layer_coeffs = coeffs[m_layer];
if (std::isnan(layer_coeffs.getScalarT().real())) {
throw RuntimeErrorException("ScalarSpecularInfoMap::getCoefficients() -> "
"Error! Amplitude is NaN");
}
return new ScalarRTCoefficients(layer_coeffs);
}
......@@ -45,6 +45,7 @@ public:
private:
const MultiLayer *mp_multilayer;
const int m_layer;
const ScalarRTCoefficients *getCoefficients(kvector_t kvec) const;
};
#endif /* SCALARSPECULARINFOMAP_H_ */
......@@ -47,7 +47,8 @@ void FormFactorDWBA::setSpecularInfo(const ILayerRTCoefficients *p_in_coeffs,
complex_t FormFactorDWBA::evaluate(const WavevectorInfo& wavevectors) const
{
calculateTerms(wavevectors);
return m_term_S + m_term_RS + m_term_SR + m_term_RSR;
complex_t sum_terms = m_term_S + m_term_RS + m_term_SR + m_term_RSR;
return sum_terms;
}
void FormFactorDWBA::calculateTerms(const WavevectorInfo& wavevectors) const
......@@ -71,14 +72,16 @@ void FormFactorDWBA::calculateTerms(const WavevectorInfo& wavevectors) const
WavevectorInfo k_TR(k_i_T, k_f_R, wavelength);
WavevectorInfo k_RR(k_i_R, k_f_R, wavelength);
// Get the four R,T coefficients
complex_t T_in = mp_in_coeffs->getScalarT();
complex_t R_in = mp_in_coeffs->getScalarR();
complex_t T_out = mp_out_coeffs->getScalarT();
complex_t R_out = mp_out_coeffs->getScalarR();
// The four different scattering contributions; S stands for scattering
// off the particle, R for reflection off the layer interface
m_term_S = mp_in_coeffs->getScalarT()*mp_form_factor->evaluate(k_TT)
* mp_out_coeffs->getScalarT();
m_term_RS = mp_in_coeffs->getScalarR()*mp_form_factor->evaluate(k_RT)
* mp_out_coeffs->getScalarT();
m_term_SR = mp_in_coeffs->getScalarT()*mp_form_factor->evaluate(k_TR)
* mp_out_coeffs->getScalarR();
m_term_RSR = mp_in_coeffs->getScalarR()*mp_form_factor->evaluate(k_RR)
* mp_out_coeffs->getScalarR();
m_term_S = T_in * mp_form_factor->evaluate(k_TT) * T_out;
m_term_RS = R_in * mp_form_factor->evaluate(k_RT) * T_out;
m_term_SR = T_in * mp_form_factor->evaluate(k_TR) * R_out;
m_term_RSR = R_in * mp_form_factor->evaluate(k_RR) * R_out;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment