23 IFTDecayFunction2D::IFTDecayFunction2D(
const NodeMeta& meta,
const std::vector<double>& PValues)
24 :
INode(nodeMetaUnion({{
"DecayLengthX",
"nm",
"Half-width along x axis", 0, INF, 1.},
25 {
"DecayLengthY",
"nm",
"Half-width along y axis", 0, INF, 1.},
26 {
"Gamma",
"rad",
"orientation with respect to the first lattice vector",
27 -M_PI_2, +M_PI_2, 0}},
30 m_decay_length_x(m_P[0]), m_decay_length_y(m_P[1]), m_gamma(m_P[2])
36 std::pair<double, double>
40 auto q_bounds_1 = transformToRecLatticeCoordinates(qX, qY, a, b, alpha);
41 auto q_bounds_2 = transformToRecLatticeCoordinates(qX, -qY, a, b, alpha);
42 double qa_max = std::max(std::abs(q_bounds_1.first), std::abs(q_bounds_2.first));
43 double qb_max = std::max(std::abs(q_bounds_1.second), std::abs(q_bounds_2.second));
44 return {qa_max, qb_max};
47 std::pair<double, double> IFTDecayFunction2D::transformToRecLatticeCoordinates(
double qX,
double qY,
51 double qa = (a * qX * std::cos(m_gamma) - a * qY * std::sin(m_gamma)) / M_TWOPI;
52 double qb = (b * qX * std::cos(alpha - m_gamma) + b * qY * std::sin(alpha - m_gamma)) / M_TWOPI;
60 FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(
const std::vector<double> P)
65 FTDecayFunction2DCauchy::FTDecayFunction2DCauchy(
double decay_length_x,
double decay_length_y,
78 double sum_sq = qx * qx * m_decay_length_x * m_decay_length_x
79 + qy * qy * m_decay_length_y * m_decay_length_y;
80 return M_TWOPI * m_decay_length_x * m_decay_length_y * std::pow(1.0 + sum_sq, -1.5);
87 FTDecayFunction2DGauss::FTDecayFunction2DGauss(
const std::vector<double> P)
92 FTDecayFunction2DGauss::FTDecayFunction2DGauss(
double decay_length_x,
double decay_length_y,
105 double sum_sq = qx * qx * m_decay_length_x * m_decay_length_x
106 + qy * qy * m_decay_length_y * m_decay_length_y;
107 return M_TWOPI * m_decay_length_x * m_decay_length_y * std::exp(-sum_sq / 2.0);
114 FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(
const std::vector<double> P)
116 {
"FTDecayFunction2DVoigt",
118 {{
"Eta",
"",
"balances between Gauss (eta=0) and Cauchy (eta=1) limiting cases", -INF,
125 FTDecayFunction2DVoigt::FTDecayFunction2DVoigt(
double decay_length_x,
double decay_length_y,
126 double gamma,
double eta)
138 double sum_sq = qx * qx * m_decay_length_x * m_decay_length_x
139 + qy * qy * m_decay_length_y * m_decay_length_y;
140 return M_TWOPI * m_decay_length_x * m_decay_length_y
141 * (m_eta * std::exp(-sum_sq / 2.0) + (1.0 - m_eta) * std::pow(1.0 + sum_sq, -1.5));
Defines classes IFTDecayFunction1D, IFTDecayFunction2D,.
Defines namespace MathFunctions.
Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space,...
double evaluate(double qx, double qy) const final
evaluate Fourier transformed decay function for q in X,Y coordinates
Two-dimensional Gauss decay function in reciprocal space; corresponds to exp(-r^2/2) in real space,...
double evaluate(double qx, double qy) const final
evaluate Fourier transformed decay function for q in X,Y coordinates
Two-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*C...
double evaluate(double qx, double qy) const final
evaluate Fourier transformed decay function for q in X,Y coordinates
Interface for two-dimensional decay function in reciprocal space.
double gamma() const
get angle between first lattice vector and X-axis of distribution (both in direct space)
std::pair< double, double > boundingReciprocalLatticeCoordinates(double qX, double qY, double a, double b, double alpha) const
transform back to a*, b* basis:
Base class for tree-like structures containing parameterized objects.