30 return iff.getName() ==
"Interference2DLattice" || iff.getName() ==
"Interference2DParaCrystal"
31 || iff.getName() ==
"Interference2DSuperLattice"
32 || iff.getName() ==
"InterferenceFinite2DLattice"
33 || iff.getName() ==
"InterferenceHardDisk";
37 ParticleLayout::ParticleLayout() : mP_interference_function{nullptr}, m_total_particle_density{0.01}
39 setName(
"ParticleLayout");
40 registerParticleDensity();
44 ParticleLayout::ParticleLayout(
const IAbstractParticle& particle,
double abundance)
45 : mP_interference_function{nullptr}, m_total_particle_density{0.01}
47 setName(
"ParticleLayout");
48 addParticle(particle, abundance);
49 registerParticleDensity();
53 ParticleLayout::~ParticleLayout() =
default;
59 for (
auto p_particle : m_particles)
60 p_result->addAndRegisterAbstractParticle(p_particle->clone());
62 if (mP_interference_function)
63 p_result->setAndRegisterInterferenceFunction(mP_interference_function->clone());
83 particle_clone->
rotate(rotation);
86 addAndRegisterAbstractParticle(particle_clone);
94 for (
auto particle : m_particles) {
97 for (
const IParticle* particle : generated_particles)
98 particle_vector.push_back(particle->clone());
99 }
else if (
const auto* p_iparticle =
dynamic_cast<const IParticle*
>(particle)) {
100 particle_vector.push_back(p_iparticle->clone());
103 return particle_vector;
108 return mP_interference_function.get();
114 for (
auto p_particle : m_particles) {
115 result += p_particle->abundance();
123 setAndRegisterInterferenceFunction(interference_function.
clone());
129 mP_interference_function ? mP_interference_function->getParticleDensity() : 0.0;
130 return iff_density > 0.0 ? iff_density : m_total_particle_density;
137 m_total_particle_density = particle_density;
142 std::vector<const INode*> result;
143 for (
auto particle : m_particles)
144 result.push_back(particle);
145 result << mP_interference_function;
152 m_particles.push_back(child);
153 registerChild(child);
159 mP_interference_function.reset(child);
160 registerChild(child);
162 if (particleDensityIsProvidedByInterference(*mP_interference_function))
163 registerParticleDensity(
false);
165 registerParticleDensity(
true);
168 void ParticleLayout::registerParticleDensity(
bool make_registered)
170 if (make_registered) {
172 registerParameter(
"TotalParticleDensity", &m_total_particle_density);
174 removeParameter(
"TotalParticleDensity");
178 void ParticleLayout::registerWeight()
180 registerParameter(
"Weight", &m_weight);
Defines many exception classes in namespace Exceptionss.
Defines class InterferenceFunctionNone.
Defines class ParameterPool.
Defines class ParticleDistribution.
Defines class ParticleLayout.
Defines class RealParameter.
Interface for a generic particle.
void setAbundance(double abundance)
Sets particle abundance.
virtual IAbstractParticle * clone() const =0
Returns a clone of this ISample object.
virtual void translate(kvector_t translation)=0
Translates the particle with the given vector.
virtual void rotate(const IRotation &rotation)=0
Applies the given rotation to the particle.
Pure virtual base class of interference functions.
virtual IInterferenceFunction * clone() const =0
Returns a clone of this ISample object.
void setWeight(double weight)
Sets the relative weight of this layout.
double weight() const
Returns the relative weight of this layout.
RealParameter * parameter(const std::string &name) const
Returns parameter with given 'name'.
Pure virtual base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
Pure virtual interface for rotations.
virtual bool isIdentity() const
Returns true if rotation matrix is identity matrix (no rotations)
A particle type that is a parametric distribution of IParticle's.
Decorator class that adds particles to ISample objects.
double getTotalAbundance() const final override
Get total abundance of all particles.
SafePointerVector< IParticle > particles() const final override
Returns information on all particles (type and abundance) and generates new particles if an IAbstract...
std::vector< const INode * > getChildren() const final override
Returns a vector of children (const).
void setInterferenceFunction(const IInterferenceFunction &interference_function)
Adds interference functions.
double totalParticleSurfaceDensity() const final override
Returns surface density of all particles.
void setTotalParticleSurfaceDensity(double particle_density) final override
Sets total particle surface density.
const IInterferenceFunction * interferenceFunction() const final override
Returns the interference function.
void addParticle(const IAbstractParticle &particle, double abundance=-1.0, const kvector_t position={}, const IRotation &rotation=IdentityRotation())
Adds particle to the layout with abundance, position and the rotation defined.
ParticleLayout * clone() const final override
Returns a clone of this ISample object.
A vector of pointers, owned by *this, with methods to handle them safely.