21 std::complex<double> VecMatVecProduct(
const Eigen::Vector2cd& vec1,
const Eigen::Matrix2cd& ff,
22 const Eigen::Vector2cd& vec2)
24 return vec1.transpose() * ff * vec2;
28 FormFactorDWBAPol::FormFactorDWBAPol(
const IFormFactor& form_factor)
29 : mP_form_factor(form_factor.clone())
31 setName(
"FormFactorDWBAPol");
34 FormFactorDWBAPol::~FormFactorDWBAPol() =
default;
39 std::unique_ptr<const ILayerRTCoefficients> p_in_coefs =
40 mp_in_coeffs ? std::unique_ptr<const ILayerRTCoefficients>(mp_in_coeffs->clone()) :
nullptr;
41 std::unique_ptr<const ILayerRTCoefficients> p_out_coefs =
42 mp_out_coeffs ? std::unique_ptr<const ILayerRTCoefficients>(mp_out_coeffs->clone())
44 p_result->
setSpecularInfo(std::move(p_in_coefs), std::move(p_out_coefs));
51 "FormFactorDWBAPol::evaluate: should never be called for matrix interactions");
58 complex_t kix = wavevectors.getKi().
x();
59 complex_t kiy = wavevectors.getKi().
y();
60 cvector_t ki_1R(kix, kiy, mp_in_coeffs->getKz()(0));
61 cvector_t ki_1T(kix, kiy, -mp_in_coeffs->getKz()(0));
62 cvector_t ki_2R(kix, kiy, mp_in_coeffs->getKz()(1));
63 cvector_t ki_2T(kix, kiy, -mp_in_coeffs->getKz()(1));
66 kf_1R.
setZ(-(complex_t)mp_out_coeffs->getKz()(0));
68 kf_1T.
setZ((complex_t)mp_out_coeffs->getKz()(0));
70 kf_2R.
setZ(-(complex_t)mp_out_coeffs->getKz()(1));
72 kf_2T.
setZ((complex_t)mp_out_coeffs->getKz()(1));
82 Eigen::Matrix2cd ff_BA;
84 double wavelength = wavevectors.getWavelength();
92 Eigen::Matrix2cd M11_S, M11_RS, M11_SR, M11_RSR, M12_S, M12_RS, M12_SR, M12_RSR, M21_S, M21_RS,
93 M21_SR, M21_RSR, M22_S, M22_RS, M22_SR, M22_RSR;
96 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1T, kf_1T, wavelength));
97 M11_S(0, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T1plus());
98 M11_S(0, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1plus());
99 M11_S(1, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T1min());
100 M11_S(1, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1min());
102 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1R, kf_1T, wavelength));
103 M11_RS(0, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1plus());
104 M11_RS(0, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1plus());
105 M11_RS(1, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1min());
106 M11_RS(1, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1min());
108 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1T, kf_1R, wavelength));
109 M11_SR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1plus());
110 M11_SR(0, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1plus());
111 M11_SR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1min());
112 M11_SR(1, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1min());
114 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1R, kf_1R, wavelength));
115 M11_RSR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1plus());
116 M11_RSR(0, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1plus());
117 M11_RSR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1min());
118 M11_RSR(1, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1min());
121 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1T, kf_2T, wavelength));
122 M12_S(0, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1plus());
123 M12_S(0, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1plus());
124 M12_S(1, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1min());
125 M12_S(1, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1min());
127 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1R, kf_2T, wavelength));
128 M12_RS(0, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1plus());
129 M12_RS(0, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1plus());
130 M12_RS(1, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1min());
131 M12_RS(1, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1min());
133 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1T, kf_2R, wavelength));
134 M12_SR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1plus());
135 M12_SR(0, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1plus());
136 M12_SR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1min());
137 M12_SR(1, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1min());
139 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_1R, kf_2R, wavelength));
140 M12_RSR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1plus());
141 M12_RSR(0, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1plus());
142 M12_RSR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1min());
143 M12_RSR(1, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1min());
146 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2T, kf_1T, wavelength));
147 M21_S(0, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2plus());
148 M21_S(0, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2plus());
149 M21_S(1, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2min());
150 M21_S(1, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2min());
152 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2R, kf_1T, wavelength));
153 M21_RS(0, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2plus());
154 M21_RS(0, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2plus());
155 M21_RS(1, 0) = -VecMatVecProduct(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2min());
156 M21_RS(1, 1) = VecMatVecProduct(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2min());
158 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2T, kf_1R, wavelength));
159 M21_SR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2plus());
160 M21_SR(0, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2plus());
161 M21_SR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2min());
162 M21_SR(1, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2min());
164 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2R, kf_1R, wavelength));
165 M21_RSR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2plus());
166 M21_RSR(0, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2plus());
167 M21_RSR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2min());
168 M21_RSR(1, 1) = VecMatVecProduct(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2min());
171 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2T, kf_2T, wavelength));
172 M22_S(0, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2plus());
173 M22_S(0, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2plus());
174 M22_S(1, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2min());
175 M22_S(1, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2min());
177 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2R, kf_2T, wavelength));
178 M22_RS(0, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2plus());
179 M22_RS(0, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2plus());
180 M22_RS(1, 0) = -VecMatVecProduct(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2min());
181 M22_RS(1, 1) = VecMatVecProduct(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2min());
183 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2T, kf_2R, wavelength));
184 M22_SR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2plus());
185 M22_SR(0, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2plus());
186 M22_SR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2min());
187 M22_SR(1, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2min());
189 ff_BA = mP_form_factor->evaluatePol(
WavevectorInfo(ki_2R, kf_2R, wavelength));
190 M22_RSR(0, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2plus());
191 M22_RSR(0, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R2plus());
192 M22_RSR(1, 0) = -VecMatVecProduct(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2min());
193 M22_RSR(1, 1) = VecMatVecProduct(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R2min());
195 return M11_S + M11_RS + M11_SR + M11_RSR + M12_S + M12_RS + M12_SR + M12_RSR + M21_S + M21_RS
196 + M21_SR + M21_RSR + M22_S + M22_RS + M22_SR + M22_RSR;
201 return mP_form_factor->bottomZ(rotation);
206 return mP_form_factor->topZ(rotation);
210 std::unique_ptr<const ILayerRTCoefficients> p_out_coeffs)
212 mp_in_coeffs = std::move(p_in_coeffs);
213 mp_out_coeffs = std::move(p_out_coeffs);
Defines and implements class ILayerRTCoefficients.
T y() const
Returns y-component in cartesian coordinate system.
T x() const
Returns x-component in cartesian coordinate system.
void setZ(const T &a)
Sets z-component in cartesian coordinate system.
Pure virtual interface for rotations.
Holds all wavevector information relevant for calculating form factors.