BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Crystal.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Particle/Crystal.cpp
6 //! @brief Implements class Crystal.
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 
22 
23 Crystal::Crystal(const IParticle& basis, const Lattice3D& lattice, double position_variance)
24  : m_lattice(lattice), m_position_variance(position_variance)
25 {
26  setName("Crystal");
27  m_basis.reset(basis.clone());
28  m_basis->registerAbundance(false);
29  registerChild(m_basis.get());
31 }
32 
33 Crystal::Crystal(IParticle* p_basis, const Lattice3D& lattice, double position_variance)
34  : m_lattice(lattice), m_position_variance(position_variance)
35 {
36  setName("Crystal");
37  m_basis.reset(p_basis);
38  registerChild(m_basis.get());
40 }
41 
42 Crystal::~Crystal() = default;
43 
45 {
47 }
48 
49 IFormFactor* Crystal::createTotalFormFactor(const IFormFactor& meso_crystal_form_factor,
50  const IRotation* rot,
51  const kvector_t& translation) const
52 {
53  Lattice3D transformed_lattice = transformedLattice(rot);
54  std::unique_ptr<IParticle> basis_clone{m_basis->clone()};
55  if (rot)
56  basis_clone->rotate(*rot);
57  basis_clone->translate(translation);
58  const std::unique_ptr<IFormFactor> basis_ff(basis_clone->createFormFactor());
59  return new FormFactorCrystal(transformed_lattice, *basis_ff, meso_crystal_form_factor,
61 }
62 
63 std::vector<HomogeneousRegion> Crystal::homogeneousRegions() const
64 {
65  std::vector<HomogeneousRegion> result;
66  double unit_cell_volume = m_lattice.unitCellVolume();
67  if (unit_cell_volume <= 0)
68  return {};
69  auto particles = m_basis->decompose();
70  ZLimits limits;
71  for (const auto* particle : particles) {
72  auto sliced_particle = particle->createSlicedParticle(limits);
73  result.insert(result.end(), sliced_particle.m_regions.begin(),
74  sliced_particle.m_regions.end());
75  }
76  for (auto& region : result)
77  region.m_volume /= unit_cell_volume;
78  return result;
79 }
80 
82 {
83  if (!rot)
84  return m_lattice;
85  return m_lattice.transformed(rot->getTransform3D());
86 }
87 
88 std::vector<const INode*> Crystal::getChildren() const
89 {
90  return std::vector<const INode*>() << m_basis << &m_lattice;
91 }
Defines class Crystal.
Defines class FormFactorCrystal.
Defines class ParticleComposition.
Defines class Particle.
Defines IRotation classes.
Defines class SlicedParticle.
Declares class Transform3D.
A crystal structure, defined by a Bravais lattice, a basis, and a position variance.
Definition: Crystal.h:35
Lattice3D m_lattice
Definition: Crystal.h:57
Crystal(const IParticle &basis, const Lattice3D &lattice, double position_variance=0)
Definition: Crystal.cpp:23
std::vector< HomogeneousRegion > homogeneousRegions() const
Definition: Crystal.cpp:63
std::vector< const INode * > getChildren() const final
Returns a vector of children.
Definition: Crystal.cpp:88
IFormFactor * createTotalFormFactor(const IFormFactor &meso_crystal_form_factor, const IRotation *p_rotation, const kvector_t &translation) const
Definition: Crystal.cpp:49
Lattice3D transformedLattice(const IRotation *p_rotation=nullptr) const
Definition: Crystal.cpp:81
std::unique_ptr< IParticle > m_basis
Definition: Crystal.h:58
const double m_position_variance
Definition: Crystal.h:59
Crystal * clone() const final
Returns a clone of this ISampleNode object.
Definition: Crystal.cpp:44
The form factor of a MesoCrystal.
Abstract base class for all form factors.
Definition: IFormFactor.h:36
void registerChild(INode *node)
Definition: INode.cpp:57
void setName(const std::string &name)
Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
Definition: IParticle.h:33
IParticle * clone() const override=0
Returns a clone of this ISampleNode object.
Abstract base class for rotations.
Definition: Rotations.h:28
virtual Transform3D getTransform3D() const =0
Returns transformation.
A Bravais lattice, characterized by three basis vectors, and optionally an ISelectionRule.
Definition: Lattice3D.h:29
double unitCellVolume() const
Returns the volume of the unit cell.
Definition: Lattice3D.cpp:73
Lattice3D transformed(const Transform3D &transform) const
Creates transformed lattice.
Definition: Lattice3D.cpp:55
Class that contains upper and lower limits of the z-coordinate for the slicing of form factors.
Definition: ZLimits.h:45