BornAgain  1.18.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 scattering at grazing incidence
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 
20 
21 Crystal::Crystal(const IParticle& lattice_basis, const Lattice& lattice)
22  : m_lattice(lattice), m_position_variance(0.0)
23 {
24  setName("Crystal");
25  mp_lattice_basis.reset(lattice_basis.clone());
26  mp_lattice_basis->registerAbundance(false);
29 }
30 
31 Crystal::~Crystal() = default;
32 
34 {
35  Crystal* p_new = new Crystal(*mp_lattice_basis, m_lattice);
37  return p_new;
38 }
39 
40 IFormFactor* Crystal::createTotalFormFactor(const IFormFactor& meso_crystal_form_factor,
41  const IRotation* p_rotation,
42  const kvector_t& translation) const
43 {
44  Lattice transformed_lattice = transformedLattice(p_rotation);
45  std::unique_ptr<IParticle> P_basis_clone{mp_lattice_basis->clone()};
46  if (p_rotation)
47  P_basis_clone->rotate(*p_rotation);
48  P_basis_clone->translate(translation);
49  const std::unique_ptr<IFormFactor> P_basis_ff(P_basis_clone->createFormFactor());
50  return new FormFactorCrystal(transformed_lattice, *P_basis_ff, meso_crystal_form_factor,
52 }
53 
54 std::vector<HomogeneousRegion> Crystal::homogeneousRegions() const
55 {
56  std::vector<HomogeneousRegion> result;
57  double unit_cell_volume = m_lattice.volume();
58  if (unit_cell_volume <= 0)
59  return {};
60  auto particles = mp_lattice_basis->decompose();
61  ZLimits limits;
62  for (auto p_particle : particles) {
63  auto sliced_particle = p_particle->createSlicedParticle(limits);
64  result.insert(result.end(), sliced_particle.m_regions.begin(),
65  sliced_particle.m_regions.end());
66  }
67  for (auto& region : result)
68  region.m_volume /= unit_cell_volume;
69  return result;
70 }
71 
73 {
74  if (p_rotation)
76  else
77  return m_lattice;
78 }
79 
80 std::vector<const INode*> Crystal::getChildren() const
81 {
82  return std::vector<const INode*>() << mp_lattice_basis << &m_lattice;
83 }
84 
85 Crystal::Crystal(IParticle* p_lattice_basis, const Lattice& lattice)
86  : m_lattice(lattice), m_position_variance(0.0)
87 {
88  setName("Crystal");
89  mp_lattice_basis.reset(p_lattice_basis);
92 }
Defines class Crystal.
Defines class FormFactorCrystal.
Defines class ParticleComposition.
Defines class Particle.
Defines class SlicedParticle.
A crystal structure with a ParticleComposition as a basis.
Definition: Crystal.h:26
Crystal * clone() const override final
Returns a clone of this ISample object.
Definition: Crystal.cpp:33
IFormFactor * createTotalFormFactor(const IFormFactor &meso_crystal_form_factor, const IRotation *p_rotation, const kvector_t &translation) const override final
Creates a total form factor for the mesocrystal with a specific shape and content The bulk content of...
Definition: Crystal.cpp:40
std::unique_ptr< IParticle > mp_lattice_basis
Definition: Crystal.h:51
Crystal(const IParticle &lattice_basis, const Lattice &lattice)
Definition: Crystal.cpp:21
Lattice m_lattice
Definition: Crystal.h:50
std::vector< const INode * > getChildren() const override final
Returns a vector of children (const).
Definition: Crystal.cpp:80
void setPositionVariance(double position_variance)
Definition: Crystal.h:43
double m_position_variance
Definition: Crystal.h:52
std::vector< HomogeneousRegion > homogeneousRegions() const override final
Creates region information with volumetric densities instead of absolute volume These densities need ...
Definition: Crystal.cpp:54
Lattice transformedLattice(const IRotation *p_rotation=nullptr) const
Definition: Crystal.cpp:72
The form factor of a MesoCrystal.
Pure virtual base class for all form factors.
Definition: IFormFactor.h:40
void registerChild(INode *node)
Definition: INode.cpp:58
void setName(const std::string &name)
Pure virtual base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
Definition: IParticle.h:33
IParticle * clone() const override=0
Returns a clone of this ISample object.
Pure virtual interface for rotations.
Definition: Rotations.h:27
virtual Transform3D getTransform3D() const =0
Returns transformation.
A lattice with three basis vectors.
Definition: Lattice.h:28
Lattice createTransformedLattice(const Transform3D &transform) const
Creates transformed lattice.
Definition: Lattice.cpp:55
double volume() const
Returns the volume of the unit cell.
Definition: Lattice.cpp:88
Class that contains upper and lower limits of the z-coordinate for the slicing of form factors.
Definition: ZLimits.h:41