20 FormFactorCrystal::FormFactorCrystal(
const Lattice& lattice,
const IFormFactor& basis_form_factor,
21 const IFormFactor& meso_form_factor,
double position_variance)
22 : m_lattice(lattice), mp_basis_form_factor(basis_form_factor.clone()),
23 mp_meso_form_factor(meso_form_factor.clone()), m_position_variance(position_variance)
25 setName(
"FormFactorCrystal");
26 calculateLargestReciprocalDistance();
29 FormFactorCrystal::~FormFactorCrystal()
31 delete mp_basis_form_factor;
32 delete mp_meso_form_factor;
37 return mp_meso_form_factor->
bottomZ(rotation);
42 return mp_meso_form_factor->
topZ(rotation);
49 double radius = 2.1 * m_max_rec_length;
50 std::vector<kvector_t> rec_vectors =
54 complex_t result(0.0, 0.0);
55 for (
const auto& rec : rec_vectors) {
56 auto dw_factor = debyeWallerFactor(rec);
58 complex_t basis_factor = mp_basis_form_factor->
evaluate(basis_wavevectors);
60 wavevectors.getWavelength());
61 complex_t meso_factor = mp_meso_form_factor->
evaluate(meso_wavevectors);
62 result += dw_factor * basis_factor * meso_factor;
74 double radius = 2.1 * m_max_rec_length;
75 std::vector<kvector_t> rec_vectors =
79 Eigen::Matrix2cd result = Eigen::Matrix2cd::Zero();
80 for (
const auto& rec : rec_vectors) {
81 auto dw_factor = debyeWallerFactor(rec);
83 Eigen::Matrix2cd basis_factor = mp_basis_form_factor->
evaluatePol(basis_wavevectors);
85 wavevectors.getWavelength());
86 complex_t meso_factor = mp_meso_form_factor->
evaluate(meso_wavevectors);
87 result += dw_factor * basis_factor * meso_factor;
95 void FormFactorCrystal::calculateLargestReciprocalDistance()
101 m_max_rec_length = std::max(M_PI / a1.
mag(), M_PI / a2.
mag());
102 m_max_rec_length = std::max(m_max_rec_length, M_PI / a3.
mag());
105 complex_t FormFactorCrystal::debyeWallerFactor(
const kvector_t& q_i)
const
107 auto q2 = q_i.
mag2();
108 return std::exp(-q2 * m_position_variance / 2.0);
Defines many exception classes in namespace Exceptionss.
Defines M_PI and some more mathematical constants.
double mag2() const
Returns magnitude squared of the vector.
double mag() const
Returns magnitude of the vector.
BasicVector3D< double > real() const
Returns real parts.
BasicVector3D< std::complex< double > > complex() const
Returns this, trivially converted to complex type.
Pure virtual interface for rotations.
A lattice with three basis vectors.
kvector_t getBasisVectorB() const
Returns basis vector b.
std::vector< kvector_t > reciprocalLatticeVectorsWithinRadius(const kvector_t input_vector, double radius) const
Computes a list of reciprocal lattice vectors within a specified distance of a given vector.
kvector_t getBasisVectorC() const
Returns basis vector c.
double volume() const
Returns the volume of the unit cell.
kvector_t getBasisVectorA() const
Returns basis vector a.
Holds all wavevector information relevant for calculating form factors.