25 InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(
const Lattice2D& lattice,
31 setName(
"Interference2DSuperLattice");
43 InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(
44 double length_1,
double length_2,
double alpha,
double xi,
unsigned size_1,
unsigned size_2)
50 InterferenceFunction2DSuperLattice::~InterferenceFunction2DSuperLattice() =
default;
55 ret->setPositionVariance(m_position_var);
56 ret->setSubstructureIFF(*mP_substructure);
57 ret->setIntegrationOverXi(integrationOverXi());
63 mP_substructure.reset(sub_iff.
clone());
64 registerChild(mP_substructure.get());
69 return *mP_substructure;
88 unsigned size_1,
unsigned size_2)
96 m_outer_iff = outer_iff;
100 return interferenceForXi(mP_lattice->rotationAngle());
101 return RealIntegrator().integrate([&](
double xi) ->
double {
return interferenceForXi(xi); },
106 void InterferenceFunction2DSuperLattice::setIntegrationOverXi(
bool integrate_xi)
108 m_integrate_xi = integrate_xi;
109 mP_lattice->setRotationEnabled(!m_integrate_xi);
112 const Lattice2D& InterferenceFunction2DSuperLattice::lattice()
const
115 throw std::runtime_error(
"InterferenceFunctionFinite2DLattice::lattice() -> Error. "
116 "No lattice defined.");
122 return std::vector<const INode*>() << mP_lattice << mP_substructure;
125 double InterferenceFunction2DSuperLattice::iff_without_dw(
const kvector_t q)
const
129 const double a = mP_lattice->length1();
130 const double b = mP_lattice->length2();
131 const double xialpha = m_xi + mP_lattice->latticeAngle();
133 const double qadiv2 = (q.
x() * a * std::cos(m_xi) + q.
y() * a * std::sin(m_xi)) / 2.0;
134 const double qbdiv2 = (q.
x() * b * std::cos(xialpha) + q.
y() * b * std::sin(xialpha)) / 2.0;
135 const double ampl =
Laue(qadiv2, m_size_1) *
Laue(qbdiv2, m_size_2);
136 return ampl * ampl / (m_size_1 * m_size_2);
139 void InterferenceFunction2DSuperLattice::setLattice(
const Lattice2D& lattice)
141 mP_lattice.reset(lattice.clone());
142 registerChild(mP_lattice.get());
145 double InterferenceFunction2DSuperLattice::interferenceForXi(
double xi)
const
150 const double delta_xi = xi - mP_lattice->rotationAngle();
151 return mP_substructure->evaluate(q.
rotatedZ(-delta_xi), outer_iff);
Defines many exception classes in namespace Exceptionss.
Defines classes RealIntegrator, ComplexIntegrator.
Defines class InterferenceFunction2DSuperLattice.
Defines class InterferenceFunctionNone.
Defines M_PI and some more mathematical constants.
Defines namespace MathFunctions.
Defines class RealParameter.
BasicVector3D< T > rotatedZ(double a) const
Returns result of rotation around z-axis.
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.
double iff_no_inner(const kvector_t q, double outer_iff) const
Calculates the structure factor in the absence of extra inner structure.
virtual IInterferenceFunction * clone() const =0
Returns a clone of this ISample object.
Interference function of a 2D superlattice with a configurable interference function for each lattice...
double evaluate(const kvector_t q, double outer_iff=1.0) const override final
Evaluates the interference function for a given wavevector transfer.
static InterferenceFunction2DSuperLattice * createHexagonal(double lattice_length, double xi, unsigned size_1, unsigned size_2)
Creates hexagonal lattice.
static InterferenceFunction2DSuperLattice * createSquare(double lattice_length, double xi, unsigned size_1, unsigned size_2)
Creates square lattice.
InterferenceFunction2DSuperLattice * clone() const override final
Returns a clone of this ISample object.
std::vector< const INode * > getChildren() const override final
Returns a vector of children (const).
Default interference function (i.e.
To integrate a real function of a real variable.
double Laue(const double x, size_t N)
Real Laue function: .