31 unsigned N_1,
unsigned N_2)
34 setName(
"InterferenceFinite2DLattice");
47 double alpha,
double xi,
48 unsigned N_1,
unsigned N_2)
53 InterferenceFunctionFinite2DLattice::~InterferenceFunctionFinite2DLattice() =
default;
58 ret->setPositionVariance(m_position_var);
59 ret->setIntegrationOverXi(integrationOverXi());
87 void InterferenceFunctionFinite2DLattice::setIntegrationOverXi(
bool integrate_xi)
89 m_integrate_xi = integrate_xi;
90 mP_lattice->setRotationEnabled(!m_integrate_xi);
93 const Lattice2D& InterferenceFunctionFinite2DLattice::lattice()
const
96 throw std::runtime_error(
"InterferenceFunctionFinite2DLattice::lattice() -> Error. "
97 "No lattice defined.");
103 double area = mP_lattice->unitCellArea();
104 return area == 0.0 ? 0.0 : 1.0 / area;
109 return std::vector<const INode*>() << mP_lattice;
112 double InterferenceFunctionFinite2DLattice::iff_without_dw(
const kvector_t q)
const
117 return interferenceForXi(mP_lattice->rotationAngle());
118 return RealIntegrator().integrate([&](
double xi) ->
double {
return interferenceForXi(xi); },
123 void InterferenceFunctionFinite2DLattice::setLattice(
const Lattice2D& lattice)
125 mP_lattice.reset(lattice.clone());
126 registerChild(mP_lattice.get());
129 double InterferenceFunctionFinite2DLattice::interferenceForXi(
double xi)
const
131 double a = mP_lattice->length1();
132 double b = mP_lattice->length2();
133 double xialpha = xi + mP_lattice->latticeAngle();
135 double qadiv2 = (m_qx * a * std::cos(xi) + m_qy * a * std::sin(xi)) / 2.0;
136 double qbdiv2 = (m_qx * b * std::cos(xialpha) + m_qy * b * std::sin(xialpha)) / 2.0;
137 double ampl =
Laue(qadiv2, m_N_1) *
Laue(qbdiv2, m_N_2);
138 double lattice_factor = ampl * ampl / (m_N_1 * m_N_2);
140 return lattice_factor;
Defines many exception classes in namespace Exceptionss.
Defines classes RealIntegrator, ComplexIntegrator.
Defines class InterferenceFunctionFinite2DLattice.
Defines M_PI and some more mathematical constants.
Defines namespace MathFunctions.
Defines class RealParameter.
T y() const
Returns y-component in cartesian coordinate system.
T x() const
Returns x-component in cartesian coordinate system.
Pure virtual base class of interference functions.
Interference function of a finite 2D lattice.
InterferenceFunctionFinite2DLattice(const Lattice2D &lattice, unsigned N_1, unsigned N_2)
Constructor of two-dimensional finite lattice interference function.
InterferenceFunctionFinite2DLattice * clone() const override final
Returns a clone of this ISample object.
double getParticleDensity() const override final
Returns the particle density associated with this 2d lattice.
static InterferenceFunctionFinite2DLattice * createSquare(double lattice_length, double xi, unsigned N_1, unsigned N_2)
Creates square lattice.
static InterferenceFunctionFinite2DLattice * createHexagonal(double lattice_length, double xi, unsigned N_1, unsigned N_2)
Creates hexagonal lattice.
std::vector< const INode * > getChildren() const override final
Returns a vector of children (const).
To integrate a real function of a real variable.
double Laue(const double x, size_t N)
Real Laue function: .