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

Fix memory leak: IFormFactor pointer in FormFactorDWBA(pol) not deleted...

parent 42c7e692
No related branches found
No related tags found
No related merge requests found
......@@ -19,7 +19,7 @@
#include "WavevectorInfo.h"
FormFactorDWBA::FormFactorDWBA(const IFormFactor& form_factor)
: mp_form_factor(form_factor.clone())
: mP_form_factor(form_factor.clone())
, mp_in_coeffs(0)
, mp_out_coeffs(0)
{
......@@ -31,7 +31,7 @@ FormFactorDWBA::~FormFactorDWBA()
FormFactorDWBA* FormFactorDWBA::clone() const
{
FormFactorDWBA* result = new FormFactorDWBA(*mp_form_factor);
FormFactorDWBA* result = new FormFactorDWBA(*mP_form_factor);
result->setSpecularInfo(mp_in_coeffs, mp_out_coeffs);
return result;
}
......@@ -65,10 +65,10 @@ complex_t FormFactorDWBA::evaluate(const WavevectorInfo& wavevectors) const
// The four different scattering contributions; S stands for scattering
// off the particle, R for reflection off the layer interface
complex_t term_S = T_in * mp_form_factor->evaluate(k_TT) * T_out;
complex_t term_RS = R_in * mp_form_factor->evaluate(k_RT) * T_out;
complex_t term_SR = T_in * mp_form_factor->evaluate(k_TR) * R_out;
complex_t term_RSR = R_in * mp_form_factor->evaluate(k_RR) * R_out;
complex_t term_S = T_in * mP_form_factor->evaluate(k_TT) * T_out;
complex_t term_RS = R_in * mP_form_factor->evaluate(k_RT) * T_out;
complex_t term_SR = T_in * mP_form_factor->evaluate(k_TR) * R_out;
complex_t term_RSR = R_in * mP_form_factor->evaluate(k_RR) * R_out;
return term_S + term_RS + term_SR + term_RSR;
}
......
......@@ -17,6 +17,7 @@
#define FORMFACTORDWBA_H
#include "IFormFactor.h"
#include <memory>
class ILayerRTCoefficients;
......@@ -37,11 +38,11 @@ public:
complex_t evaluate(const WavevectorInfo& wavevectors) const override;
//! Returns the total volume of the particle of this form factor's shape
double getVolume() const override { return mp_form_factor->getVolume(); }
double getVolume() const override { return mP_form_factor->getVolume(); }
//! Returns the (approximate in some cases) radial size of the particle of this
//! form factor's shape. This is used for SSCA calculations
double getRadialExtension() const override { return mp_form_factor->getRadialExtension(); }
double getRadialExtension() const override { return mP_form_factor->getRadialExtension(); }
//! Sets reflection/transmission info for scalar DWBA simulation
void setSpecularInfo (const ILayerRTCoefficients* p_in_coeffs,
......@@ -51,7 +52,7 @@ public:
private:
//! The form factor for BA
IFormFactor* mp_form_factor;
std::unique_ptr<IFormFactor> mP_form_factor;
const ILayerRTCoefficients* mp_in_coeffs; //!< not owned by this
const ILayerRTCoefficients* mp_out_coeffs; //!< not owned by this
......
......@@ -27,7 +27,7 @@ namespace {
}
FormFactorDWBAPol::FormFactorDWBAPol(const IFormFactor& form_factor)
: mp_form_factor(form_factor.clone())
: mP_form_factor(form_factor.clone())
, mp_in_coeffs(0)
, mp_out_coeffs(0)
{
......@@ -39,7 +39,7 @@ FormFactorDWBAPol::~FormFactorDWBAPol()
FormFactorDWBAPol* FormFactorDWBAPol::clone() const
{
FormFactorDWBAPol* p_result = new FormFactorDWBAPol(*mp_form_factor);
FormFactorDWBAPol* p_result = new FormFactorDWBAPol(*mP_form_factor);
p_result->setSpecularInfo(mp_in_coeffs, mp_out_coeffs);
return p_result;
}
......@@ -95,100 +95,100 @@ Eigen::Matrix2cd FormFactorDWBAPol::evaluatePol(const WavevectorInfo& wavevector
M22_S, M22_RS, M22_SR, M22_RSR;
// eigenmode 1 -> eigenmode 1: direct scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1T, wavelength));
M11_S(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T1plus());
M11_S(0,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1plus());
M11_S(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T1min());
M11_S(1,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T1min());
// eigenmode 1 -> eigenmode 1: reflection and then scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1T, wavelength));
M11_RS(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1plus());
M11_RS(0,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1plus());
M11_RS(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R1min());
M11_RS(1,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R1min());
// eigenmode 1 -> eigenmode 1: scattering and then reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_1R, wavelength));
M11_SR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1plus());
M11_SR(0,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1plus());
M11_SR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T1min());
M11_SR(1,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T1min());
// eigenmode 1 -> eigenmode 1: reflection, scattering and again reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_1R, wavelength));
M11_RSR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1plus());
M11_RSR(0,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1plus());
M11_RSR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R1min());
M11_RSR(1,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R1min());
// eigenmode 1 -> eigenmode 2: direct scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2T, wavelength));
M12_S(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1plus());
M12_S(0,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1plus());
M12_S(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T1min());
M12_S(1,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T1min());
// eigenmode 1 -> eigenmode 2: reflection and then scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2T, wavelength));
M12_RS(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1plus());
M12_RS(0,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1plus());
M12_RS(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R1min());
M12_RS(1,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R1min());
// eigenmode 1 -> eigenmode 2: scattering and then reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1T, kf_2R, wavelength));
M12_SR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1plus());
M12_SR(0,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1plus());
M12_SR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T1min());
M12_SR(1,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T1min());
// eigenmode 1 -> eigenmode 2: reflection, scattering and again reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_1R, kf_2R, wavelength));
M12_RSR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1plus());
M12_RSR(0,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1plus());
M12_RSR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R1min());
M12_RSR(1,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R1min());
// eigenmode 2 -> eigenmode 1: direct scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1T, wavelength));
M21_S(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2plus());
M21_S(0,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2plus());
M21_S(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->T2min());
M21_S(1,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->T2min());
// eigenmode 2 -> eigenmode 1: reflection and then scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1T, wavelength));
M21_RS(0,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2plus());
M21_RS(0,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2plus());
M21_RS(1,0) = - myprod(mp_out_coeffs->T1min(), ff_BA, mp_in_coeffs->R2min());
M21_RS(1,1) = myprod(mp_out_coeffs->T1plus(), ff_BA, mp_in_coeffs->R2min());
// eigenmode 2 -> eigenmode 1: scattering and then reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_1R, wavelength));
M21_SR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2plus());
M21_SR(0,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2plus());
M21_SR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->T2min());
M21_SR(1,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->T2min());
// eigenmode 2 -> eigenmode 1: reflection, scattering and again reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_1R, wavelength));
M21_RSR(0,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2plus());
M21_RSR(0,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2plus());
M21_RSR(1,0) = - myprod(mp_out_coeffs->R1min(), ff_BA, mp_in_coeffs->R2min());
M21_RSR(1,1) = myprod(mp_out_coeffs->R1plus(), ff_BA, mp_in_coeffs->R2min());
// eigenmode 2 -> eigenmode 2: direct scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2T, wavelength));
M22_S(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2plus());
M22_S(0,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2plus());
M22_S(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->T2min());
M22_S(1,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->T2min());
// eigenmode 2 -> eigenmode 2: reflection and then scattering
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2T, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2T, wavelength));
M22_RS(0,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2plus());
M22_RS(0,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2plus());
M22_RS(1,0) = - myprod(mp_out_coeffs->T2min(), ff_BA, mp_in_coeffs->R2min());
M22_RS(1,1) = myprod(mp_out_coeffs->T2plus(), ff_BA, mp_in_coeffs->R2min());
// eigenmode 2 -> eigenmode 2: scattering and then reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2T, kf_2R, wavelength));
M22_SR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2plus());
M22_SR(0,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2plus());
M22_SR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->T2min());
M22_SR(1,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->T2min());
// eigenmode 2 -> eigenmode 2: reflection, scattering and again reflection
ff_BA = mp_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2R, wavelength));
ff_BA = mP_form_factor->evaluatePol(WavevectorInfo(ki_2R, kf_2R, wavelength));
M22_RSR(0,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2plus());
M22_RSR(0,1) = myprod(mp_out_coeffs->R2plus(), ff_BA, mp_in_coeffs->R2plus());
M22_RSR(1,0) = - myprod(mp_out_coeffs->R2min(), ff_BA, mp_in_coeffs->R2min());
......
......@@ -17,6 +17,7 @@
#define FORMFACTORDWBAPOL_H
#include "IFormFactor.h"
#include <memory>
class ILayerRTCoefficients;
......@@ -41,11 +42,11 @@ public:
Eigen::Matrix2cd evaluatePol(const WavevectorInfo& wavevectors) const override;
//! Returns the total volume of the particle of this form factor's shape
double getVolume() const override { return mp_form_factor->getVolume(); }
double getVolume() const override { return mP_form_factor->getVolume(); }
//! Returns the (approximate in some cases) radial size of the particle of this
//! form factor's shape. This is used for SSCA calculations
double getRadialExtension() const override { return mp_form_factor->getRadialExtension(); }
double getRadialExtension() const override { return mP_form_factor->getRadialExtension(); }
//! Sets reflection/transmission info for scalar DWBA simulation
void setSpecularInfo(const ILayerRTCoefficients* p_in_coeffs,
......@@ -55,7 +56,7 @@ public:
private:
//! The form factor for BA
IFormFactor* mp_form_factor;
std::unique_ptr<IFormFactor> mP_form_factor;
const ILayerRTCoefficients* mp_in_coeffs; //!< not owned by this
const ILayerRTCoefficients* mp_out_coeffs; //!< not owned by this
......
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