BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
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 NodeMeta& meta, const std::vector<double>& PValues);
26  explicit Lattice2D(double xi);
27 
28  virtual Lattice2D* clone() const = 0;
29 
30  struct ReciprocalBases {
31  double m_asx, m_asy; //!< x,y coordinates of a*
32  double m_bsx, m_bsy; //!< x,y coordinates of b*
33  };
34 
35  virtual double length1() const = 0;
36  virtual double length2() const = 0;
37  virtual double latticeAngle() const = 0;
38  virtual double unitCellArea() const = 0;
39 
40  double rotationAngle() const { return m_xi; }
41 
42  ReciprocalBases reciprocalBases() const;
43 
44  void setRotationEnabled(bool enabled);
45 
46 protected:
47  virtual void onChange();
48  double m_xi;
49 };
50 
51 //! A two-dimensional Bravais lattice with no special symmetry.
52 
53 class BasicLattice2D : public Lattice2D {
54 public:
55  BasicLattice2D(double length1, double length2, double angle, double xi);
56 
57  BasicLattice2D* clone() const;
58 
59  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
60 
61  virtual double length1() const { return m_length1; }
62  virtual double length2() const { return m_length2; }
63  virtual double latticeAngle() const { return m_angle; }
64  virtual double unitCellArea() const;
65 
66 private:
68  double m_angle;
69 };
70 
71 //! A two-dimensional Bravais lattice with square unit cell.
72 
73 class SquareLattice2D : public Lattice2D {
74 public:
75  SquareLattice2D(double length, double xi = 0.0);
76 
77  SquareLattice2D* clone() const;
78 
79  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
80 
81  virtual double length1() const { return m_length; }
82  virtual double length2() const { return m_length; }
83  virtual double latticeAngle() const;
84  virtual double unitCellArea() const;
85 
86 private:
87  double m_length;
88 };
89 
90 //! A two-dimensional Bravais lattice with hexagonal symmetry.
91 
92 class HexagonalLattice2D : public Lattice2D {
93 public:
94  HexagonalLattice2D(double length, double xi);
95 
96  HexagonalLattice2D* clone() const;
97 
98  void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
99 
100  virtual double length1() const { return m_length; }
101  virtual double length2() const { return m_length; }
102  virtual double latticeAngle() const;
103  virtual double unitCellArea() const;
104 
105 private:
106  double m_length;
107 };
108 
109 #endif // BORNAGAIN_SAMPLE_LATTICE_LATTICE2D_H
Defines and implements the standard mix-in ICloneable.
Defines interface INode.
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:53
double m_length1
Definition: Lattice2D.h:67
virtual double unitCellArea() const
Definition: Lattice2D.cpp:87
virtual double length2() const
Definition: Lattice2D.h:62
BasicLattice2D * clone() const
Definition: Lattice2D.cpp:82
double m_length2
Definition: Lattice2D.h:67
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
Definition: Lattice2D.h:59
double m_angle
Definition: Lattice2D.h:68
virtual double length1() const
Definition: Lattice2D.h:61
BasicLattice2D(double length1, double length2, double angle, double xi)
Definition: Lattice2D.cpp:68
virtual double latticeAngle() const
Definition: Lattice2D.h:63
A two-dimensional Bravais lattice with hexagonal symmetry.
Definition: Lattice2D.h:92
virtual double unitCellArea() const
Definition: Lattice2D.cpp:146
virtual double length1() const
Definition: Lattice2D.h:100
HexagonalLattice2D * clone() const
Definition: Lattice2D.cpp:136
virtual double length2() const
Definition: Lattice2D.h:101
virtual double latticeAngle() const
Definition: Lattice2D.cpp:141
HexagonalLattice2D(double length, double xi)
Definition: Lattice2D.cpp:126
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
Definition: Lattice2D.h:98
Interface for polymorphic classes that should not be copied, except by explicit cloning.
Definition: ICloneable.h:25
Visitor interface to visit ISampleNode objects.
Definition: INodeVisitor.h:146
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
A two-dimensional Bravais lattice.
Definition: Lattice2D.h:23
double rotationAngle() const
Definition: Lattice2D.h:40
ReciprocalBases reciprocalBases() const
Definition: Lattice2D.cpp:35
virtual double latticeAngle() const =0
virtual void onChange()
Action to be taken in inherited class when a parameter has changed.
Definition: Lattice2D.cpp:47
double m_xi
Definition: Lattice2D.h:48
virtual double length2() const =0
virtual double length1() const =0
void setRotationEnabled(bool enabled)
Definition: Lattice2D.cpp:53
virtual Lattice2D * clone() const =0
Lattice2D(const NodeMeta &meta, const std::vector< double > &PValues)
Definition: Lattice2D.cpp:25
virtual double unitCellArea() const =0
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:73
SquareLattice2D * clone() const
Definition: Lattice2D.cpp:107
void accept(INodeVisitor *visitor) const final
Calls the INodeVisitor's visit method.
Definition: Lattice2D.h:79
SquareLattice2D(double length, double xi=0.0)
Definition: Lattice2D.cpp:96
virtual double length2() const
Definition: Lattice2D.h:82
virtual double length1() const
Definition: Lattice2D.h:81
double m_length
Definition: Lattice2D.h:87
virtual double latticeAngle() const
Definition: Lattice2D.cpp:112
virtual double unitCellArea() const
Definition: Lattice2D.cpp:117
double m_asy
x,y coordinates of a*
Definition: Lattice2D.h:31
double m_bsy
x,y coordinates of b*
Definition: Lattice2D.h:32
Metadata of one model node.
Definition: INode.h:38