BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FormFactorTetrahedron.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Sample/HardParticle/FormFactorTetrahedron.cpp
6 //! @brief Implements class FormFactorTetrahedron.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************** //
14 
17 #include "Base/Types/Exceptions.h"
19 
20 const PolyhedralTopology FormFactorTetrahedron::topology = {{{{2, 1, 0}, false},
21  {{0, 1, 4, 3}, false},
22  {{1, 2, 5, 4}, false},
23  {{2, 0, 3, 5}, false},
24  {{3, 4, 5}, false}},
25  false};
26 
29  {"Tetrahedron",
30  "actually, not a tetrahedron, but a trigonal frustum",
31  {{"BaseEdge", "nm", "edge of base triangle", 0, +INF, 0},
32  {"Height", "nm", "height of frustum", 0, +INF, 0},
33  {"Alpha", "rad", "angle between base and a side face", 0., M_PI_2, 0}}},
34  P),
35  m_base_edge(m_P[0]), m_height(m_P[1]), m_alpha(m_P[2])
36 {
37  onChange();
38 }
39 
40 FormFactorTetrahedron::FormFactorTetrahedron(double base_edge, double height, double alpha)
41  : FormFactorTetrahedron(std::vector<double>{base_edge, height, alpha})
42 {
43 }
44 
46  kvector_t translation) const
47 {
48  auto effects = computeSlicingEffects(limits, translation, m_height);
49  double dbase_edge = 2 * sqrt(3) * effects.dz_bottom * MathFunctions::cot(m_alpha);
50  FormFactorTetrahedron slicedff(m_base_edge - dbase_edge,
51  m_height - effects.dz_bottom - effects.dz_top, m_alpha);
52  return createTransformedFormFactor(slicedff, rot, effects.position);
53 }
54 
56 {
57  double cot_alpha = MathFunctions::cot(m_alpha);
58  if (!std::isfinite(cot_alpha) || cot_alpha < 0)
59  throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
60  double r = cot_alpha * 2 * std::sqrt(3.) * m_height / m_base_edge; // L(top)/L(base)
61  if (r > 1) {
62  std::ostringstream ostr;
63  ostr << "Incompatible parameters in Tetrahedron: ";
64  ostr << "(base_edge=" << m_base_edge;
65  ostr << ", height:" << m_height;
66  ostr << ", alpha[rad]:" << m_alpha << ")";
68  }
69 
70  double a = m_base_edge;
71  double as = a / 2;
72  double ac = a / sqrt(3) / 2;
73  double ah = a / sqrt(3);
74  double b = a * (1 - r);
75  double bs = b / 2;
76  double bc = b / sqrt(3) / 2;
77  double bh = b / sqrt(3);
78 
79  double zcom = m_height * (.5 - 2 * r / 3 + r * r / 4) / (1 - r + r * r / 3); // center of mass
80 
81  setPolyhedron(topology, -zcom,
82  {// base:
83  {-ac, as, -zcom},
84  {-ac, -as, -zcom},
85  {ah, 0., -zcom},
86  // top:
87  {-bc, bs, m_height - zcom},
88  {-bc, -bs, m_height - zcom},
89  {bh, 0., m_height - zcom}});
90 }
Defines many exception classes in namespace Exceptionss.
Defines class FormFactorTetrahedron.
IFormFactor * createTransformedFormFactor(const IFormFactor &formfactor, const IRotation &rot, kvector_t translation)
Definition: IFormFactor.cpp:77
const double INF
Definition: INode.h:24
Defines M_PI and some more mathematical constants.
#define M_PI_2
Definition: MathConstants.h:40
Defines namespace MathFunctions.
A frustum with equilateral trigonal base.
static const PolyhedralTopology topology
IFormFactor * sliceFormFactor(ZLimits limits, const IRotation &rot, kvector_t translation) const override final
Actually slices the form factor or throws an exception.
FormFactorTetrahedron(const std::vector< double > P)
void onChange() override final
Action to be taken in inherited class when a parameter has changed.
SlicingEffects computeSlicingEffects(ZLimits limits, const kvector_t &position, double height) const
Helper method for slicing.
A polyhedron, for form factor computation.
void setPolyhedron(const PolyhedralTopology &topology, double z_bottom, const std::vector< kvector_t > &vertices)
Called by child classes to set faces and other internal variables.
Pure virtual base class for all form factors.
Definition: IFormFactor.h:40
Pure virtual interface for rotations.
Definition: Rotations.h:27
For internal use in IFormFactorPolyhedron.
Class that contains upper and lower limits of the z-coordinate for the slicing of form factors.
Definition: ZLimits.h:41
double cot(double x)
cotangent function: