diff --git a/Core/FormFactors/inc/FormFactorRipple2.h b/Core/FormFactors/inc/FormFactorRipple2.h index 3190986755f32b534020694f72e9779b944b49bf..39b48758ddf9b8ea205cbecd8b7e1414bf9e5907 100644 --- a/Core/FormFactors/inc/FormFactorRipple2.h +++ b/Core/FormFactors/inc/FormFactorRipple2.h @@ -29,7 +29,7 @@ class BA_CORE_API_ FormFactorRipple2 : public IFormFactorBorn public: FormFactorRipple2(double width, double height, double length, double asymetry); - ~FormFactorRipple2() { delete m_integrator; } + ~FormFactorRipple2() { } virtual FormFactorRipple2 *clone() const; @@ -45,7 +45,6 @@ public: virtual complex_t evaluate_for_q(const cvector_t& q) const; private: - complex_t Integrand(double Z, void* params) const; virtual void init_parameters(); @@ -54,8 +53,6 @@ private: double m_length; double m_d; mutable cvector_t m_q; - - MemberComplexFunctionIntegrator<FormFactorRipple2> *m_integrator; }; #endif // FORMFACTORSPHERE_H diff --git a/Core/FormFactors/src/FormFactorRipple2.cpp b/Core/FormFactors/src/FormFactorRipple2.cpp index 2cf658cb08585b9940b878da4298712a66ee190d..292fb6c7fb7d909483740884be25fb79abe00507 100644 --- a/Core/FormFactors/src/FormFactorRipple2.cpp +++ b/Core/FormFactors/src/FormFactorRipple2.cpp @@ -32,11 +32,6 @@ FormFactorRipple2::FormFactorRipple2(double width, double height, double length, assert(m_width >= 2.*m_d); assert(m_height > 0); init_parameters(); - - MemberComplexFunctionIntegrator<FormFactorRipple2>::mem_function p_mf = - & FormFactorRipple2::Integrand; - m_integrator = - new MemberComplexFunctionIntegrator<FormFactorRipple2>(p_mf, this); } void FormFactorRipple2::init_parameters() @@ -56,23 +51,33 @@ FormFactorRipple2 *FormFactorRipple2::clone() const } -//! Integrand for complex formfactor. - -complex_t FormFactorRipple2::Integrand(double Z, void* params) const -{ - (void)params; // to avoid unused-variable warning - complex_t p1 = (1.0-Z/m_height)*MathFunctions::Sinc(m_q.y()*m_width*0.5*(1.0-Z/m_height)); - return p1*std::exp(complex_t(0.0, 1.0)*(-1.0*m_q.y()*m_d*(1-Z/m_height) + m_q.z()*Z)); -} - //! Complex formfactor. complex_t FormFactorRipple2::evaluate_for_q(const cvector_t& q) const { m_q = q; complex_t factor = m_length*MathFunctions::Sinc(m_q.x()*m_length*0.5)*m_width; - complex_t integral = m_integrator->integrate(0, m_height); - return factor*integral; + complex_t result = 0; + complex_t iqzH = complex_t(0.0, 1.0)*m_q.z()*m_height; + complex_t iqyW = complex_t(0.0, 1.0)*m_q.y()*m_width; + complex_t aaa = 2.0*(m_d*m_q.y() + m_height*m_q.z()); + + if (0.0==m_q.y() and 0.0==m_q.z()) + result = m_height*0.5; + else if (0.0==m_q.y()) + result = (1.0 - std::exp(iqzH) + iqzH)/(m_height*m_q.z()*m_q.z()); + else if (1.0 == aaa/(m_q.y()*m_width)) + result = m_height*std::exp(iqzH)*(1.0 - std::exp(-1.0*iqyW) - iqyW)/(m_q.y()*m_q.y()*m_width*m_width); + else if (-1.0 == aaa/(m_q.y()*m_width)) + result = m_height*std::exp(iqzH)*(1.0 - std::exp(-1.0*iqyW) + iqyW)/(m_q.y()*m_q.y()*m_width*m_width); + else { + complex_t iHqzdqy = complex_t(0.0, 1.0)*(m_q.z()*m_height + m_q.y()*m_d); + complex_t Hqzdqy = m_q.z()*m_height + m_q.y()*m_d; + result = std::cos(m_q.y()*m_width*0.5) + 2.0*iHqzdqy*std::sin(m_q.y()*m_width*0.5)/(m_width*m_q.y()); + result = result*std::exp(-1.0*iHqzdqy) - 1.0; + result = result*4.0*m_height*std::exp(iqzH)/(4.0*Hqzdqy*Hqzdqy - m_q.y()*m_q.y()*m_width*m_width); + } + return factor*result; }