BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
Lattice2D.h
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Lattice/Lattice2D.h
6 //! @brief Defines classes of Lattice2D family.
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_LATTICE_LATTICE2D_H
16 #define BORNAGAIN_SAMPLE_LATTICE_LATTICE2D_H
17 
18 #include "Base/Types/ICloneable.h"
19 #include "Param/Node/INode.h"
20 
21 //! A two-dimensional Bravais lattice.
22 
23 class Lattice2D : public ICloneable, public INode {
24 public:
25  Lattice2D(const std::vector<double>& PValues);
26  explicit Lattice2D(double xi);
27  Lattice2D* clone() const override = 0;
28 
29  struct ReciprocalBases {
30  double m_asx, m_asy; //!< x,y coordinates of a*
31  double m_bsx, m_bsy; //!< x,y coordinates of b*
32  };
33 
34  virtual double length1() const = 0;
35  virtual double length2() const = 0;
36  virtual double latticeAngle() const = 0;
37  virtual double unitCellArea() const = 0;
38 
39  double rotationAngle() const { return m_xi; }
40 
41  ReciprocalBases reciprocalBases() const;
42 
43  void setRotationEnabled(bool enabled);
44 
45 protected:
46  double m_xi;
47 };
48 
49 //! A two-dimensional Bravais lattice with no special symmetry.
50 
51 class BasicLattice2D : public Lattice2D {
52 public:
53  BasicLattice2D(double length1, double length2, double angle, double xi);
54 
55  BasicLattice2D* clone() const override;
56  std::string className() const final { return "BasicLattice2D"; }
57  std::vector<ParaMeta> parDefs() const final
58  {
59  return {{"Length1", "nm", "lattice constant 1", 0, +INF, 0},
60  {"Length2", "nm", "lattice constant 2", 0, +INF, 0},
61  {"Alpha", "rad", "angle between lattice vectors 1 and 2", -INF, +INF, 0}};
62  }
63 
64  double length1() const override { return m_length1; }
65  double length2() const override { return m_length2; }
66  double latticeAngle() const override { return m_angle; }
67  double unitCellArea() const override;
68 
69 private:
71  double m_angle;
72 };
73 
74 //! A two-dimensional Bravais lattice with square unit cell.
75 
76 class SquareLattice2D : public Lattice2D {
77 public:
78  SquareLattice2D(double length, double xi = 0.0);
79 
80  SquareLattice2D* clone() const override;
81  std::string className() const final { return "SquareLattice2D"; }
82  std::vector<ParaMeta> parDefs() const final
83  {
84  return {{"Length", "nm", "lattice constant", 0, +INF, 0}};
85  }
86 
87  double length1() const override { return m_length; }
88  double length2() const override { return m_length; }
89  double latticeAngle() const override;
90  double unitCellArea() const override;
91 
92 private:
93  double m_length;
94 };
95 
96 //! A two-dimensional Bravais lattice with hexagonal symmetry.
97 
98 class HexagonalLattice2D : public Lattice2D {
99 public:
100  HexagonalLattice2D(double length, double xi);
101 
102  HexagonalLattice2D* clone() const override;
103  std::string className() const final { return "HexagonalLattice2D"; }
104  std::vector<ParaMeta> parDefs() const final
105  {
106  return {{"Length", "nm", "lattice constant", 0, +INF, 0},
107  {"Xi", "rad", "angle between x axis and lattice vector", -INF, +INF, 0}};
108  }
109 
110  double length1() const override { return m_length; }
111  double length2() const override { return m_length; }
112  double latticeAngle() const override;
113  double unitCellArea() const override;
114 
115 private:
116  double m_length;
117 };
118 
119 #endif // BORNAGAIN_SAMPLE_LATTICE_LATTICE2D_H
Defines and implements the standard mix-in ICloneable.
Defines interface INode.
const double INF
Definition: INode.h:26
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:51
double m_length1
Definition: Lattice2D.h:70
double latticeAngle() const override
Definition: Lattice2D.h:66
double unitCellArea() const override
Definition: Lattice2D.cpp:75
double length1() const override
Definition: Lattice2D.h:64
std::vector< ParaMeta > parDefs() const final
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: Lattice2D.h:57
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Definition: Lattice2D.h:56
double m_length2
Definition: Lattice2D.h:70
double m_angle
Definition: Lattice2D.h:71
BasicLattice2D * clone() const override
Definition: Lattice2D.cpp:70
double length2() const override
Definition: Lattice2D.h:65
BasicLattice2D(double length1, double length2, double angle, double xi)
Definition: Lattice2D.cpp:56
A two-dimensional Bravais lattice with hexagonal symmetry.
Definition: Lattice2D.h:98
double length2() const override
Definition: Lattice2D.h:111
double length1() const override
Definition: Lattice2D.h:110
double unitCellArea() const override
Definition: Lattice2D.cpp:134
std::vector< ParaMeta > parDefs() const final
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: Lattice2D.h:104
HexagonalLattice2D * clone() const override
Definition: Lattice2D.cpp:124
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Definition: Lattice2D.h:103
double latticeAngle() const override
Definition: Lattice2D.cpp:129
HexagonalLattice2D(double length, double xi)
Definition: Lattice2D.cpp:114
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:23
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:40
A two-dimensional Bravais lattice.
Definition: Lattice2D.h:23
double rotationAngle() const
Definition: Lattice2D.h:39
ReciprocalBases reciprocalBases() const
Definition: Lattice2D.cpp:34
virtual double latticeAngle() const =0
Lattice2D(const std::vector< double > &PValues)
Definition: Lattice2D.cpp:24
double m_xi
Definition: Lattice2D.h:46
virtual double length2() const =0
Lattice2D * clone() const override=0
virtual double length1() const =0
void setRotationEnabled(bool enabled)
Definition: Lattice2D.cpp:46
virtual double unitCellArea() const =0
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:76
double unitCellArea() const override
Definition: Lattice2D.cpp:105
double length2() const override
Definition: Lattice2D.h:88
SquareLattice2D * clone() const override
Definition: Lattice2D.cpp:95
std::string className() const final
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Definition: Lattice2D.h:81
double latticeAngle() const override
Definition: Lattice2D.cpp:100
double length1() const override
Definition: Lattice2D.h:87
SquareLattice2D(double length, double xi=0.0)
Definition: Lattice2D.cpp:84
double m_length
Definition: Lattice2D.h:93
std::vector< ParaMeta > parDefs() const final
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: Lattice2D.h:82
double m_asy
x,y coordinates of a*
Definition: Lattice2D.h:30
double m_bsy
x,y coordinates of b*
Definition: Lattice2D.h:31