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

Moved bin sizes to IFormFactorBorn

parent ea7eff95
No related branches found
No related tags found
No related merge requests found
...@@ -33,9 +33,7 @@ public: ...@@ -33,9 +33,7 @@ public:
virtual void setAmbientRefractiveIndex(complex_t refractive_index); virtual void setAmbientRefractiveIndex(complex_t refractive_index);
//! propagate the bin sizes to the form factor to possibly enable large bin size approximations
virtual void setBinSizes(double delta_qy, double delta_qz) { virtual void setBinSizes(double delta_qy, double delta_qz) {
IFormFactor::setBinSizes(delta_qy, delta_qz);
mp_basis_form_factor->setBinSizes(delta_qy, delta_qz); mp_basis_form_factor->setBinSizes(delta_qy, delta_qz);
mp_meso_form_factor->setBinSizes(delta_qy, delta_qz); mp_meso_form_factor->setBinSizes(delta_qy, delta_qz);
} }
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
class IFormFactor : public ISample class IFormFactor : public ISample
{ {
public: public:
IFormFactor() : m_use_large_bin_approximation(false), m_bin_qy(0.0), m_bin_qz(0.0) {} IFormFactor() {}
virtual ~IFormFactor() {} virtual ~IFormFactor() {}
//! create a clone of this formfactor //! create a clone of this formfactor
...@@ -47,7 +47,7 @@ public: ...@@ -47,7 +47,7 @@ public:
virtual int getNumberOfStochasticParameters() const { return 0; } virtual int getNumberOfStochasticParameters() const { return 0; }
//! propagate the bin sizes to the form factor to possibly enable large bin size approximations //! propagate the bin sizes to the form factor to possibly enable large bin size approximations
virtual void setBinSizes(double delta_qy, double delta_qz); virtual void setBinSizes(double delta_qy, double delta_qz)=0;
//! get the total volume of the particle to which this formfactor belongs //! get the total volume of the particle to which this formfactor belongs
virtual double getVolume() const; virtual double getVolume() const;
...@@ -71,24 +71,8 @@ public: ...@@ -71,24 +71,8 @@ public:
//! static method to calculate bin sizes in reciprocal space //! static method to calculate bin sizes in reciprocal space
static double CalculateBinSize(double lambda, double phi_range, size_t n_phi); static double CalculateBinSize(double lambda, double phi_range, size_t n_phi);
protected:
bool m_use_large_bin_approximation; //!< indicates if large bin size approximation should be used
double m_bin_qy, m_bin_qz; //!< the sizes of the bins in q space
}; };
inline void IFormFactor::setBinSizes(double delta_qy, double delta_qz)
{
m_bin_qy = delta_qy;
m_bin_qz = delta_qz;
if (m_bin_qy > M_PI/2.0/getRadius() || m_bin_qz > M_PI/2.0/getHeight()) {
m_use_large_bin_approximation = true;
}
else {
m_use_large_bin_approximation = false;
}
}
inline double IFormFactor::getVolume() const inline double IFormFactor::getVolume() const
{ {
cvector_t zero; cvector_t zero;
......
...@@ -27,12 +27,14 @@ ...@@ -27,12 +27,14 @@
class IFormFactorBorn : public IFormFactor class IFormFactorBorn : public IFormFactor
{ {
public: public:
IFormFactorBorn() {} IFormFactorBorn();
virtual ~IFormFactorBorn() {} virtual ~IFormFactorBorn() {}
virtual IFormFactorBorn *clone() const=0; virtual IFormFactorBorn *clone() const=0;
virtual complex_t evaluate(const cvector_t &k_i, const cvector_t &k_f, double alpha_i, double alpha_f) const; virtual complex_t evaluate(const cvector_t &k_i, const cvector_t &k_f, double alpha_i, double alpha_f) const;
virtual void setBinSizes(double delta_qy, double delta_qz);
//! evaluate scattering amplitude for large bin sizes //! evaluate scattering amplitude for large bin sizes
virtual complex_t evaluateForLargeBins(const cvector_t &q) const; virtual complex_t evaluateForLargeBins(const cvector_t &q) const;
protected: protected:
...@@ -42,6 +44,10 @@ protected: ...@@ -42,6 +44,10 @@ protected:
//! override volume getter to avoid infinite loop caused by big bin approximation //! override volume getter to avoid infinite loop caused by big bin approximation
virtual double getVolume() const; virtual double getVolume() const;
bool m_use_large_bin_approximation_radial; //!< indicates if large bin size approximation should be used in the qx-qy direction
bool m_use_large_bin_approximation_z; //!< indicates if large bin size approximation should be used in the qz direction
double m_bin_qy, m_bin_qz; //!< the sizes of the bins in q space
private: private:
double bigRadialPart(double qR, void *params) const; double bigRadialPart(double qR, void *params) const;
double bigZPart(double qH2) const; double bigZPart(double qH2) const;
...@@ -51,7 +57,7 @@ inline complex_t IFormFactorBorn::evaluate(const cvector_t &k_i, const cvector_t ...@@ -51,7 +57,7 @@ inline complex_t IFormFactorBorn::evaluate(const cvector_t &k_i, const cvector_t
{ {
(void)alpha_i; (void)alpha_i;
(void)alpha_f; (void)alpha_f;
if (m_use_large_bin_approximation) { if (m_use_large_bin_approximation_radial || m_use_large_bin_approximation_z) {
return evaluateForLargeBins(k_i - k_f); return evaluateForLargeBins(k_i - k_f);
} }
return evaluate_for_q(k_i - k_f); return evaluate_for_q(k_i - k_f);
......
...@@ -56,8 +56,7 @@ inline void IFormFactorDecorator::setAmbientRefractiveIndex(complex_t refractive ...@@ -56,8 +56,7 @@ inline void IFormFactorDecorator::setAmbientRefractiveIndex(complex_t refractive
inline void IFormFactorDecorator::setBinSizes(double delta_qy, double delta_qz) inline void IFormFactorDecorator::setBinSizes(double delta_qy, double delta_qz)
{ {
IFormFactor::setBinSizes(delta_qy, delta_qz); if (mp_form_factor) mp_form_factor->setBinSizes(delta_qy, delta_qz);
mp_form_factor->setBinSizes(delta_qy, delta_qz);
} }
inline double IFormFactorDecorator::getVolume() const inline double IFormFactorDecorator::getVolume() const
......
#include "IFormFactorBorn.h" #include "IFormFactorBorn.h"
void IFormFactorBorn::setBinSizes(double delta_qy, double delta_qz)
{
m_bin_qy = delta_qy;
m_bin_qz = delta_qz;
if (m_bin_qy > M_PI/2.0/getRadius()) {
m_use_large_bin_approximation_radial = true;
}
else {
m_use_large_bin_approximation_radial = false;
}
if (m_bin_qz > M_PI/2.0/getHeight()) {
m_use_large_bin_approximation_z = true;
}
else {
m_use_large_bin_approximation_z = false;
}
}
double IFormFactorBorn::bigRadialPart(double qR, void *params) const double IFormFactorBorn::bigRadialPart(double qR, void *params) const
{ {
(void)params; (void)params;
...@@ -9,6 +27,14 @@ double IFormFactorBorn::bigRadialPart(double qR, void *params) const ...@@ -9,6 +27,14 @@ double IFormFactorBorn::bigRadialPart(double qR, void *params) const
return a/(1.0 + std::pow(std::abs(b*qR),3.0)); return a/(1.0 + std::pow(std::abs(b*qR),3.0));
} }
IFormFactorBorn::IFormFactorBorn()
: m_use_large_bin_approximation_radial(false)
, m_use_large_bin_approximation_z(false)
, m_bin_qy(0.0)
, m_bin_qz(0.0)
{
}
double IFormFactorBorn::bigZPart(double qH2) const double IFormFactorBorn::bigZPart(double qH2) const
{ {
if (qH2<Numeric::double_epsilon) return qH2; if (qH2<Numeric::double_epsilon) return qH2;
......
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