BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
InterferenceHardDisk Class Reference

Description

Percus-Yevick hard disk interference function.

M.S. Ripoll & C.F. Tejero (1995) Approximate analytical expression for the direct correlation function of hard discs within the Percus-Yevick equation, Molecular Physics, 85:2, 423-428, DOI: 10.1080/00268979500101211

Definition at line 27 of file InterferenceHardDisk.h.

Inheritance diagram for InterferenceHardDisk:
[legend]
Collaboration diagram for InterferenceHardDisk:
[legend]

Public Member Functions

 InterferenceHardDisk (double radius, double density, double position_var=0)
 
 ~InterferenceHardDisk () override=default
 
void checkNodeArgs () const
 Raises exception if a parameter value is invalid. More...
 
std::string className () const final
 Returns the class name, to be hard-coded in each leaf class that inherits from INode. More...
 
InterferenceHardDiskclone () const override
 
double density () const
 
double DWfactor (R3 q) const
 structureFactors the Debye-Waller factor for a given wavevector transfer More...
 
virtual std::vector< const INode * > nodeChildren () const
 Returns all children. More...
 
std::vector< const INode * > nodeOffspring () const
 Returns all descendants. More...
 
std::vector< ParaMetaparDefs () const final
 Returns the parameter definitions, to be hard-coded in each leaf class. More...
 
double particleDensity () const override
 If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value. More...
 
double positionVariance () const
 Returns the position variance. More...
 
double radius () const
 
void setPositionVariance (double var)
 Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension. More...
 
virtual double structureFactor (R3 q, double outer_iff=1.0) const
 The interference function for a given wavevector transfer. More...
 
virtual bool supportsMultilayer () const
 Indicates if this interference function can be used with a sample (DWBA mode) More...
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 

Protected Member Functions

double iff_no_inner (R3 q, double outer_iff) const
 Calculates the structure factor in the absence of extra inner structure. More...
 

Protected Attributes

std::vector< double > m_P
 
double m_position_var
 

Private Member Functions

double iff_without_dw (R3 q) const override
 Calculates the structure factor without Debye-Waller factor. More...
 
double packingRatio () const
 

Private Attributes

double m_density
 
double m_radius
 

Constructor & Destructor Documentation

◆ InterferenceHardDisk()

InterferenceHardDisk::InterferenceHardDisk ( double  radius,
double  density,
double  position_var = 0 
)

Definition at line 49 of file InterferenceHardDisk.cpp.

50  : IInterference(position_var)
51  , m_radius(radius)
53 {
54  if (m_radius < 0.0 || m_density < 0.0 || packingRatio() > 0.65)
55  throw std::runtime_error("InterferenceHardDisk::validateParameters: "
56  "radius and density must be positive and packing ratio between "
57  "0 and 0.65");
59  RealLimits::nonnegative().check("TotalParticleDensity", m_density);
60 }
IInterference(const std::vector< double > &PValues)
void check(const std::string &name, double value) const
Throws if value is outside limits. Parameter 'name' is for exception message.
Definition: RealLimits.cpp:170
static RealLimits nonnegative()
Creates an object which can have only positive values with 0. included.
Definition: RealLimits.cpp:124

References RealLimits::check(), m_density, m_radius, RealLimits::nonnegative(), and packingRatio().

Referenced by clone().

Here is the call graph for this function:

◆ ~InterferenceHardDisk()

InterferenceHardDisk::~InterferenceHardDisk ( )
overridedefault

Member Function Documentation

◆ checkNodeArgs()

void INode::checkNodeArgs ( ) const
inherited

Raises exception if a parameter value is invalid.

Definition at line 27 of file INode.cpp.

28 {
29  size_t nP = m_P.size();
30  if (parDefs().size() != nP) {
31  std::cerr << "BUG in class " << className() << std::endl;
32  std::cerr << "#m_P = " << nP << std::endl;
33  std::cerr << "#PDf = " << parDefs().size() << std::endl;
34  for (const ParaMeta& pm : parDefs())
35  std::cerr << " PDf: " << pm.name << std::endl;
36  ASSERT(0);
37  }
38  ASSERT(parDefs().size() == nP);
39  for (size_t i = 0; i < nP; ++i) {
40  const ParaMeta pm = parDefs()[i];
41 
43  if (pm.vMin == -INF) {
44  ASSERT(pm.vMax == +INF);
45  // nothing to do
46  } else if (pm.vMax == +INF) {
47  ASSERT(pm.vMin == 0);
48  limits = RealLimits::nonnegative();
49  } else {
50  limits = RealLimits::limited(pm.vMin, pm.vMax);
51  }
52  limits.check(pm.name, m_P[i]);
53  }
54 }
#define ASSERT(condition)
Definition: Assert.h:45
const double INF
Definition: INode.h:26
virtual std::vector< ParaMeta > parDefs() const
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: INode.h:51
std::vector< double > m_P
Definition: INode.h:63
virtual std::string className() const =0
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Limits for a real fit parameter.
Definition: RealLimits.h:24
static RealLimits limitless()
Creates an object without bounds (default)
Definition: RealLimits.cpp:139
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:134
Metadata of one model parameter.
Definition: INode.h:29
double vMin
Definition: INode.h:33
double vMax
Definition: INode.h:34
std::string name
Definition: INode.h:30

References ASSERT, RealLimits::check(), INode::className(), INF, RealLimits::limited(), RealLimits::limitless(), INode::m_P, ParaMeta::name, RealLimits::nonnegative(), INode::parDefs(), ParaMeta::vMax, and ParaMeta::vMin.

Referenced by BarGauss::BarGauss(), BarLorentz::BarLorentz(), Bipyramid4::Bipyramid4(), Box::Box(), CantellatedCube::CantellatedCube(), Cone::Cone(), ConstantBackground::ConstantBackground(), CosineRippleBox::CosineRippleBox(), CosineRippleGauss::CosineRippleGauss(), CosineRippleLorentz::CosineRippleLorentz(), Cylinder::Cylinder(), DistributionCosine::DistributionCosine(), DistributionGate::DistributionGate(), DistributionGaussian::DistributionGaussian(), DistributionLogNormal::DistributionLogNormal(), DistributionLorentz::DistributionLorentz(), DistributionTrapezoid::DistributionTrapezoid(), Dodecahedron::Dodecahedron(), EllipsoidalCylinder::EllipsoidalCylinder(), FootprintGauss::FootprintGauss(), FootprintSquare::FootprintSquare(), FuzzySphere::FuzzySphere(), GaussSphere::GaussSphere(), HemiEllipsoid::HemiEllipsoid(), HollowSphere::HollowSphere(), HorizontalCylinder::HorizontalCylinder(), Icosahedron::Icosahedron(), LongBoxGauss::LongBoxGauss(), LongBoxLorentz::LongBoxLorentz(), PlatonicOctahedron::PlatonicOctahedron(), PlatonicTetrahedron::PlatonicTetrahedron(), Prism3::Prism3(), Prism6::Prism6(), Profile1DCauchy::Profile1DCauchy(), Profile1DCosine::Profile1DCosine(), Profile1DGate::Profile1DGate(), Profile1DGauss::Profile1DGauss(), Profile1DTriangle::Profile1DTriangle(), Profile1DVoigt::Profile1DVoigt(), Profile2DCauchy::Profile2DCauchy(), Profile2DCone::Profile2DCone(), Profile2DGate::Profile2DGate(), Profile2DGauss::Profile2DGauss(), Profile2DVoigt::Profile2DVoigt(), Pyramid2::Pyramid2(), Pyramid3::Pyramid3(), Pyramid4::Pyramid4(), Pyramid6::Pyramid6(), RotationEuler::RotationEuler(), RotationX::RotationX(), RotationY::RotationY(), RotationZ::RotationZ(), SawtoothRippleBox::SawtoothRippleBox(), SawtoothRippleGauss::SawtoothRippleGauss(), SawtoothRippleLorentz::SawtoothRippleLorentz(), Sphere::Sphere(), Spheroid::Spheroid(), TruncatedCube::TruncatedCube(), TruncatedSphere::TruncatedSphere(), and TruncatedSpheroid::TruncatedSpheroid().

Here is the call graph for this function:

◆ className()

std::string InterferenceHardDisk::className ( ) const
inlinefinalvirtual

Returns the class name, to be hard-coded in each leaf class that inherits from INode.

Implements INode.

Definition at line 39 of file InterferenceHardDisk.h.

39 { return "InterferenceHardDisk"; }

◆ clone()

InterferenceHardDisk * InterferenceHardDisk::clone ( ) const
overridevirtual

Implements IInterference.

Definition at line 62 of file InterferenceHardDisk.cpp.

63 {
65  return result;
66 }
double m_position_var
Definition: IInterference.h:53
InterferenceHardDisk(double radius, double density, double position_var=0)

References InterferenceHardDisk(), m_density, IInterference::m_position_var, and m_radius.

Here is the call graph for this function:

◆ density()

double InterferenceHardDisk::density ( ) const

Definition at line 78 of file InterferenceHardDisk.cpp.

79 {
80  return m_density;
81 }

References m_density.

◆ DWfactor()

double IInterference::DWfactor ( R3  q) const
inherited

structureFactors the Debye-Waller factor for a given wavevector transfer

Definition at line 48 of file IInterference.cpp.

49 {
50  // remove z component for two-dimensional interference functions:
51  if (supportsMultilayer())
52  q.setZ(0.0);
53  return std::exp(-q.mag2() * m_position_var);
54 }
virtual bool supportsMultilayer() const
Indicates if this interference function can be used with a sample (DWBA mode)
Definition: IInterference.h:47

References IInterference::m_position_var, and IInterference::supportsMultilayer().

Referenced by IInterference::iff_no_inner(), and Interference2DSuperLattice::interferenceForXi().

Here is the call graph for this function:

◆ iff_no_inner()

double IInterference::iff_no_inner ( R3  q,
double  outer_iff 
) const
protectedinherited

Calculates the structure factor in the absence of extra inner structure.

Definition at line 56 of file IInterference.cpp.

57 {
58  return DWfactor(q) * (iff_without_dw(q) * outer_iff - 1.0) + 1.0;
59 }
double DWfactor(R3 q) const
structureFactors the Debye-Waller factor for a given wavevector transfer
virtual double iff_without_dw(R3 q) const =0
Calculates the structure factor without Debye-Waller factor.

References IInterference::DWfactor(), and IInterference::iff_without_dw().

Referenced by IInterference::structureFactor().

Here is the call graph for this function:

◆ iff_without_dw()

double InterferenceHardDisk::iff_without_dw ( R3  q) const
overrideprivatevirtual

Calculates the structure factor without Debye-Waller factor.

Implements IInterference.

Definition at line 83 of file InterferenceHardDisk.cpp.

84 {
85  const double qx = q.x();
86  const double qy = q.y();
87  const double q2r = 2.0 * std::sqrt(qx * qx + qy * qy) * m_radius;
88  const double packing = packingRatio();
89  const double c_zero = Czero(packing);
90  const double s2 = S2(packing);
91  const double c_q = 2.0 * M_PI
93  [=](double x) -> double {
94  double cx =
95  c_zero * (1.0 + 4.0 * packing * (W2(x / 2.0) - 1.0) + s2 * x);
96  return x * cx * Math::Bessel::J0(q2r * x);
97  },
98  0.0, 1.0);
99  const double rho = 4.0 * packing / M_PI;
100  return 1.0 / (1.0 - rho * c_q);
101 }
#define M_PI
Definition: Constants.h:44
To integrate a real function of a real variable.
Definition: IntegratorGK.h:28
double integrate(const std::function< double(double)> &f, double lmin, double lmax)
double J0(double x)
Bessel function of the first kind and order 0.
Definition: Bessel.cpp:162

References RealIntegrator::integrate(), Math::Bessel::J0(), M_PI, m_radius, and packingRatio().

Here is the call graph for this function:

◆ nodeChildren()

◆ nodeOffspring()

std::vector< const INode * > INode::nodeOffspring ( ) const
inherited

Returns all descendants.

Definition at line 61 of file INode.cpp.

62 {
63  std::vector<const INode*> result;
64  result.push_back(this);
65  for (const auto* child : nodeChildren()) {
66  for (const auto* p : child->nodeOffspring())
67  result.push_back(p);
68  }
69  return result;
70 }
virtual std::vector< const INode * > nodeChildren() const
Returns all children.
Definition: INode.cpp:56

References INode::nodeChildren().

Here is the call graph for this function:

◆ packingRatio()

double InterferenceHardDisk::packingRatio ( ) const
private

Definition at line 103 of file InterferenceHardDisk.cpp.

104 {
105  return M_PI * m_radius * m_radius * m_density;
106 }

References m_density, M_PI, and m_radius.

Referenced by InterferenceHardDisk(), and iff_without_dw().

◆ parDefs()

std::vector<ParaMeta> InterferenceHardDisk::parDefs ( ) const
inlinefinalvirtual

Returns the parameter definitions, to be hard-coded in each leaf class.

Reimplemented from INode.

Definition at line 31 of file InterferenceHardDisk.h.

32  {
33  return {{"Radius", "nm", "particle radius", 0, +INF, 0},
34  {"Density", "nm^-2", "particle density", 0, +INF, 0},
35  {"Variance", "nm?", "position variance", 0, +INF, 0}};
36  }

References INF.

◆ particleDensity()

double InterferenceHardDisk::particleDensity ( ) const
overridevirtual

If defined by this interference function's parameters, returns the particle density (per area). Otherwise, returns zero or a user-defined value.

Reimplemented from IInterference.

Definition at line 68 of file InterferenceHardDisk.cpp.

69 {
70  return m_density;
71 }

References m_density.

◆ positionVariance()

double IInterference::positionVariance ( ) const
inlineinherited

Returns the position variance.

Definition at line 40 of file IInterference.h.

40 { return m_position_var; }

References IInterference::m_position_var.

◆ radius()

double InterferenceHardDisk::radius ( ) const

Definition at line 73 of file InterferenceHardDisk.cpp.

74 {
75  return m_radius;
76 }

References m_radius.

◆ setPositionVariance()

void IInterference::setPositionVariance ( double  var)
inherited

Sets the variance of the position for the calculation of the DW factor It is defined as the variance in each relevant dimension.

Definition at line 40 of file IInterference.cpp.

41 {
42  if (var < 0.0)
43  throw std::runtime_error("IInterference::setPositionVariance: "
44  "variance should be positive.");
45  m_position_var = var;
46 }

References IInterference::m_position_var.

Referenced by ExemplarySamples::createFiniteSquareLattice2D(), and ExemplarySamples::createSuperLattice().

◆ structureFactor()

double IInterference::structureFactor ( R3  q,
double  outer_iff = 1.0 
) const
virtualinherited

The interference function for a given wavevector transfer.

Reimplemented in Interference2DSuperLattice.

Definition at line 35 of file IInterference.cpp.

36 {
37  return iff_no_inner(q, outer_iff);
38 }
double iff_no_inner(R3 q, double outer_iff) const
Calculates the structure factor in the absence of extra inner structure.

References IInterference::iff_no_inner().

Here is the call graph for this function:

◆ supportsMultilayer()

virtual bool IInterference::supportsMultilayer ( ) const
inlinevirtualinherited

Indicates if this interference function can be used with a sample (DWBA mode)

Reimplemented in InterferenceFinite3DLattice, and Interference3DLattice.

Definition at line 47 of file IInterference.h.

47 { return true; }

Referenced by IInterference::DWfactor().

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 32 of file ICloneable.h.

Member Data Documentation

◆ m_density

double InterferenceHardDisk::m_density
private

◆ m_P

◆ m_position_var

◆ m_radius

double InterferenceHardDisk::m_radius
private

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