BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
Crystal.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Particle/Crystal.h
6 //! @brief Defines 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 
15 #ifndef BORNAGAIN_SAMPLE_PARTICLE_CRYSTAL_H
16 #define BORNAGAIN_SAMPLE_PARTICLE_CRYSTAL_H
17 
19 #include <heinz/Vectors3D.h>
20 
21 class Admixtures;
22 class IParticle;
23 class IRotation;
24 class Lattice3D;
25 
26 //! A crystal structure, defined by a Bravais lattice, a basis, and a position variance.
27 //!
28 //! Computations are delegated to class ReMesocrystal.
29 //!
30 //! Used in MesoCrystal, where it is given an outer shape.
31 //!
32 //! @ingroup samples
33 
34 class Crystal : public ISampleNode {
35 public:
36  Crystal(const IParticle& basis, const Lattice3D& lattice, double position_variance = 0);
37  ~Crystal() override;
38 
39  Crystal* clone() const override;
40  std::string className() const final { return "Crystal"; }
41  std::vector<const INode*> nodeChildren() const override;
42  std::vector<ParaMeta> parDefs() const final
43  {
44  return {{"Variance", "nm?", "position variance", 0, +INF, 0}};
45  }
46 
47  const IParticle* basis() const { return m_basis.get(); }
48  const Lattice3D* lattice() const { return m_lattice.get(); }
49  double position_variance() const { return m_position_variance; }
50 
51  Crystal* transformed(const IRotation* rotation, const R3& translation) const;
52 
53 private:
55 
56  std::unique_ptr<IParticle> m_basis;
57  std::unique_ptr<Lattice3D> m_lattice;
58  const double m_position_variance;
59 };
60 
61 #endif // BORNAGAIN_SAMPLE_PARTICLE_CRYSTAL_H
const double INF
Definition: INode.h:26
Defines interface class ISampleNode.
The list of material admixtures to a slice.
Definition: Admixtures.h:39
A crystal structure, defined by a Bravais lattice, a basis, and a position variance.
Definition: Crystal.h:34
std::vector< ParaMeta > parDefs() const final
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: Crystal.h:42
Crystal * transformed(const IRotation *rotation, const R3 &translation) const
Definition: Crystal.cpp:46
Crystal(const IParticle &basis, const Lattice3D &lattice, double position_variance=0)
Definition: Crystal.cpp:22
const IParticle * basis() const
Definition: Crystal.h:47
std::vector< const INode * > nodeChildren() const override
Returns all children.
Definition: Crystal.cpp:41
double position_variance() const
Definition: Crystal.h:49
const Lattice3D * lattice() const
Definition: Crystal.h:48
std::unique_ptr< Lattice3D > m_lattice
Definition: Crystal.h:57
Crystal * clone() const override
Returns a clone of this ISampleNode object.
Definition: Crystal.cpp:36
std::unique_ptr< IParticle > m_basis
Definition: Crystal.h:56
~Crystal() override
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Definition: Crystal.h:40
const double m_position_variance
Definition: Crystal.h:58
Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal....
Definition: IParticle.h:31
Abstract base class for rotations.
Definition: Rotations.h:29
Abstract base class for sample components and properties related to scattering.
Definition: ISampleNode.h:27
A Bravais lattice, characterized by three basis vectors, and optionally an ISelectionRule.
Definition: Lattice3D.h:30