BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RandomPositionBuilder Class Reference
Inheritance diagram for RandomPositionBuilder:
[legend]
Collaboration diagram for RandomPositionBuilder:
[legend]

Public Member Functions

 RandomPositionBuilder ()
 
 ~RandomPositionBuilder () override
 
std::vector< std::vector< double > > generatePositions (double layer_size, double density=0.0) const
 

Private Member Functions

std::vector< std::vector< double > > generatePositionsImpl (double layer_size, double density=0.0) const override
 
double positionVariance () const override
 

Detailed Description

Definition at line 55 of file IPositionBuilder.h.

Constructor & Destructor Documentation

◆ RandomPositionBuilder()

RandomPositionBuilder::RandomPositionBuilder ( )
default

◆ ~RandomPositionBuilder()

RandomPositionBuilder::~RandomPositionBuilder ( )
overridedefault

Member Function Documentation

◆ generatePositions()

std::vector< std::vector< double > > IPositionBuilder::generatePositions ( double  layer_size,
double  density = 0.0 
) const
inherited

Definition at line 28 of file IPositionBuilder.cpp.

30 {
31  std::vector<std::vector<double>> positions = generatePositionsImpl(layer_size, density);
32  double pos_var = positionVariance();
33  if (pos_var > 0.0) {
34  // random generator and distribution
35  std::random_device rd; // Will be used to obtain a seed for the random number engine
36  std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
37  std::normal_distribution<double> dis(0.0, std::sqrt(pos_var));
38  for (auto& position : positions) {
39  for (auto& coordinate : position)
40  coordinate += dis(gen);
41  }
42  }
43  return positions;
44 }
virtual std::vector< std::vector< double > > generatePositionsImpl(double layer_size, double density=0.0) const =0
virtual double positionVariance() const =0

References IPositionBuilder::generatePositionsImpl(), and IPositionBuilder::positionVariance().

Here is the call graph for this function:

◆ generatePositionsImpl()

std::vector< std::vector< double > > RandomPositionBuilder::generatePositionsImpl ( double  layer_size,
double  density = 0.0 
) const
overrideprivatevirtual

Implements IPositionBuilder.

Definition at line 65 of file IPositionBuilder.cpp.

67 {
68  std::vector<std::vector<double>> lattice_positions;
69  std::vector<double> position;
70 
71  // to compute total number of particles we use the total particle density
72  // and multiply by the area of the layer
73  int num_particles = static_cast<int>(density * (2 * layer_size) * (2 * layer_size));
74 
75  // random generator and distribution
76  std::random_device rd; // Will be used to obtain a seed for the random number engine
77  std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
78  std::uniform_real_distribution<double> dis(0.0, 1.0);
79 
80  for (int i = 1; i <= num_particles; ++i) {
81  // generate random x and y coordinates
82  position.push_back(dis(gen) * 2 * layer_size - layer_size); // x
83  position.push_back(dis(gen) * 2 * layer_size - layer_size); // y
84 
85  lattice_positions.push_back(position);
86  position.clear();
87  }
88  return lattice_positions;
89 }

◆ positionVariance()

double RandomPositionBuilder::positionVariance ( ) const
overrideprivatevirtual

Implements IPositionBuilder.

Definition at line 91 of file IPositionBuilder.cpp.

92 {
93  return 0.0; // no need for extra randomness here
94 }

The documentation for this class was generated from the following files: