• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

step/stepcore

  • sources
  • kde-4.12
  • kdeedu
  • step
  • stepcore
particle.cc
Go to the documentation of this file.
1 /* This file is part of StepCore library.
2  Copyright (C) 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
3 
4  StepCore library is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  StepCore library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with StepCore; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
19 #include "particle.h"
20 #include "types.h"
21 #include <cstring>
22 #include <cmath>
23 #include <QtGlobal>
24 
25 namespace StepCore
26 {
27 
28 STEPCORE_META_OBJECT(Particle, QT_TRANSLATE_NOOP("ObjectClass", "Particle"), QT_TR_NOOP("Simple zero-size particle"), 0,
29  STEPCORE_SUPER_CLASS(Item) STEPCORE_SUPER_CLASS(Body),
30  STEPCORE_PROPERTY_RW_D(StepCore::Vector2d, position, QT_TRANSLATE_NOOP("PropertyName", "position"), QT_TRANSLATE_NOOP("Units", "m"), QT_TR_NOOP("position"), position, setPosition)
31  STEPCORE_PROPERTY_RW_D(StepCore::Vector2d, velocity, QT_TRANSLATE_NOOP("PropertyName", "velocity"), QT_TRANSLATE_NOOP("Units", "m/s"), QT_TR_NOOP("velocity"), velocity, setVelocity)
32  STEPCORE_PROPERTY_R_D(StepCore::Vector2d, acceleration, QT_TRANSLATE_NOOP("PropertyName", "acceleration"), STEPCORE_FROM_UTF8(QT_TRANSLATE_NOOP("Units", "m/s²")),
33  QT_TR_NOOP("acceleration"), acceleration)
34  STEPCORE_PROPERTY_R_D(StepCore::Vector2d, force, QT_TRANSLATE_NOOP("PropertyName", "force"), QT_TRANSLATE_NOOP("Units", "N"), QT_TR_NOOP("force"), force)
35  STEPCORE_PROPERTY_RW(double, mass, QT_TRANSLATE_NOOP("PropertyName", "mass"), QT_TRANSLATE_NOOP("Units", "kg"), QT_TR_NOOP("mass"), mass, setMass)
36  STEPCORE_PROPERTY_RWF(StepCore::Vector2d, momentum, QT_TRANSLATE_NOOP("PropertyName", "momentum"), QT_TRANSLATE_NOOP("Units", "kg m/s"), QT_TR_NOOP("momentum"),
37  StepCore::MetaProperty::DYNAMIC, momentum, setMomentum)
38  STEPCORE_PROPERTY_RWF(double, kineticEnergy, QT_TRANSLATE_NOOP("PropertyName", "kineticEnergy"), QT_TRANSLATE_NOOP("Units", "J"), QT_TR_NOOP("kinetic energy"),
39  StepCore::MetaProperty::DYNAMIC, kineticEnergy, setKineticEnergy))
40 
41 STEPCORE_META_OBJECT(ParticleErrors, QT_TRANSLATE_NOOP("ObjectClass", "ParticleErrors"), QT_TR_NOOP("Errors class for Particle"), 0, STEPCORE_SUPER_CLASS(ObjectErrors),
42  STEPCORE_PROPERTY_RW_D(StepCore::Vector2d, positionVariance, QT_TRANSLATE_NOOP("PropertyName", "positionVariance"), QT_TRANSLATE_NOOP("Units", "m"),
43  QT_TR_NOOP("position variance"), positionVariance, setPositionVariance)
44  STEPCORE_PROPERTY_RW_D(StepCore::Vector2d, velocityVariance, QT_TRANSLATE_NOOP("PropertyName", "velocityVariance"), QT_TRANSLATE_NOOP("Units", "m/s"),
45  QT_TR_NOOP("velocity variance"), velocityVariance, setVelocityVariance)
46  STEPCORE_PROPERTY_R_D(StepCore::Vector2d, accelerationVariance, QT_TRANSLATE_NOOP("PropertyName", "accelerationVariance"), STEPCORE_FROM_UTF8(QT_TRANSLATE_NOOP("Units", "m/s²")),
47  QT_TR_NOOP("acceleration variance"), accelerationVariance)
48  STEPCORE_PROPERTY_R_D(StepCore::Vector2d, forceVariance, QT_TRANSLATE_NOOP("PropertyName", "forceVariance"), QT_TRANSLATE_NOOP("Units", "N"),
49  QT_TR_NOOP("force variance"), forceVariance)
50  STEPCORE_PROPERTY_RW(double, massVariance, QT_TRANSLATE_NOOP("PropertyName", "massVariance"), QT_TRANSLATE_NOOP("Units", "kg"),
51  QT_TR_NOOP("mass variance"), massVariance, setMassVariance )
52  STEPCORE_PROPERTY_RWF(StepCore::Vector2d, momentumVariance, QT_TRANSLATE_NOOP("PropertyName", "momentumVariance"), QT_TRANSLATE_NOOP("Units", "kg m/s"),
53  QT_TR_NOOP("momentum variance"), StepCore::MetaProperty::DYNAMIC, momentumVariance, setMomentumVariance)
54  STEPCORE_PROPERTY_RWF(double, kineticEnergyVariance, QT_TRANSLATE_NOOP("PropertyName", "kineticEnergyVariance"), QT_TRANSLATE_NOOP("Units", "J"),
55  QT_TR_NOOP("kinetic energy variance"), StepCore::MetaProperty::DYNAMIC, kineticEnergyVariance, setKineticEnergyVariance))
56 
57 STEPCORE_META_OBJECT(ChargedParticle, QT_TRANSLATE_NOOP("ObjectClass", "ChargedParticle"), QT_TR_NOOP("Charged zero-size particle"), 0, STEPCORE_SUPER_CLASS(Particle),
58  STEPCORE_PROPERTY_RW(double, charge, QT_TRANSLATE_NOOP("PropertyName", "charge"), QT_TRANSLATE_NOOP("Units", "C"), QT_TR_NOOP("charge"), charge, setCharge))
59 
60 STEPCORE_META_OBJECT(ChargedParticleErrors, QT_TRANSLATE_NOOP("ObjectClass", "ChargedParticleErrors"), QT_TR_NOOP("Errors class for ChargedParticle"), 0,
61  STEPCORE_SUPER_CLASS(ParticleErrors),
62  STEPCORE_PROPERTY_RW(double, chargeVariance, QT_TRANSLATE_NOOP("PropertyName", "chargeVariance"), QT_TRANSLATE_NOOP("Units", "kg"),
63  QT_TR_NOOP("charge variance"), chargeVariance, setChargeVariance ))
64 
65 Particle* ParticleErrors::particle() const
66 {
67  return static_cast<Particle*>(owner());
68 }
69 
70 Vector2d ParticleErrors::accelerationVariance() const
71 {
72  return _forceVariance/square(particle()->mass()) +
73  _massVariance*(particle()->force()/square(particle()->mass())).cwise().square();
74 }
75 
76 Vector2d ParticleErrors::momentumVariance() const
77 {
78  return _velocityVariance * square(particle()->mass()) +
79  particle()->velocity().cwise().square() * _massVariance;
80 }
81 
82 void ParticleErrors::setMomentumVariance(const Vector2d& momentumVariance)
83 {
84  _velocityVariance = (momentumVariance - particle()->velocity().cwise().square() * _massVariance) /
85  square(particle()->mass());
86 }
87 
88 double ParticleErrors::kineticEnergyVariance() const
89 {
90  return _velocityVariance.dot(particle()->velocity().cwise().square()) * square(particle()->mass()) +
91  square(particle()->velocity().squaredNorm()/2) * _massVariance;
92 }
93 
94 void ParticleErrors::setKineticEnergyVariance(double kineticEnergyVariance)
95 {
96  _velocityVariance = (kineticEnergyVariance - square(particle()->velocity().squaredNorm()/2) * _massVariance) /
97  square(particle()->mass()) / 2 *
98  (particle()->velocity().cwise().square().cwise().inverse());
99  if(!std::isfinite(_velocityVariance[0]) || _velocityVariance[0] < 0 ||
100  !std::isfinite(_velocityVariance[1]) || _velocityVariance[1]) {
101  _velocityVariance.setZero();
102  }
103 }
104 
105 ChargedParticle* ChargedParticleErrors::chargedParticle() const
106 {
107  return static_cast<ChargedParticle*>(owner());
108 }
109 
110 Particle::Particle(Vector2d position, Vector2d velocity, double mass)
111  : _position(position), _velocity(velocity), _force(Vector2d::Zero()), _mass(mass)
112 {
113 }
114 
115 void Particle::getVariables(double* position, double* velocity,
116  double* positionVariance, double* velocityVariance)
117 {
118  Vector2d::Map(position) = _position;
119  Vector2d::Map(velocity) = _velocity;
120  if(positionVariance) {
121  ParticleErrors* pe = particleErrors();
122  Vector2d::Map(positionVariance) = pe->_positionVariance;
123  Vector2d::Map(velocityVariance) = pe->_velocityVariance;
124  }
125 }
126 
127 void Particle::setVariables(const double* position, const double* velocity,
128  const double* positionVariance, const double* velocityVariance)
129 {
130  _position = Vector2d::Map(position);
131  _velocity = Vector2d::Map(velocity);
132  _force.setZero();
133  if(positionVariance) {
134  ParticleErrors* pe = particleErrors();
135  pe->_positionVariance = Vector2d::Map(positionVariance);
136  pe->_velocityVariance = Vector2d::Map(velocityVariance);
137  pe->_forceVariance.setZero();
138  }
139 }
140 
141 void Particle::getAccelerations(double* acceleration, double* accelerationVariance)
142 {
143  acceleration[0] = _force[0] / _mass;
144  acceleration[1] = _force[1] / _mass;
145  if(accelerationVariance) {
146  ParticleErrors* pe = particleErrors();
147  accelerationVariance[0] = pe->_forceVariance[0]/square(_mass) +
148  square(_force[0]/square(_mass))*pe->_massVariance;
149  accelerationVariance[1] = pe->_forceVariance[1]/square(_mass) +
150  square(_force[1]/square(_mass))*pe->_massVariance;
151  }
152 }
153 
154 void Particle::addForce(const double* force, const double* forceVariance)
155 {
156  _force[0] += force[0];
157  _force[1] += force[1];
158  if(forceVariance) {
159  ParticleErrors* pe = particleErrors();
160  pe->_forceVariance[0] += forceVariance[0];
161  pe->_forceVariance[1] += forceVariance[1];
162  }
163 }
164 
165 void Particle::resetForce(bool resetVariance)
166 {
167  _force.setZero();
168  if(resetVariance) particleErrors()->_forceVariance.setZero();
169 }
170 
171 void Particle::getInverseMass(VectorXd* inverseMass,
172  DynSparseRowMatrix* variance, int offset)
173 {
174  inverseMass->coeffRef(offset) = ( 1/_mass);
175  inverseMass->coeffRef(offset+1) = ( 1/_mass);
176  if(variance) {
177  double v = particleErrors()->_massVariance / square(square(_mass));
178  variance->coeffRef(offset, offset) = (v);
179  variance->coeffRef(offset+1, offset+1) = (v);
180  }
181 }
182 
183 void Particle::setKineticEnergy(double kineticEnergy)
184 {
185  double v = _velocity.norm();
186  _velocity = sqrt(kineticEnergy*2/_mass) * (v>0 ? (_velocity/v).eval() : Vector2d(1,0));
187 }
188 
189 } // namespace StepCore
190 
StepCore::Particle::mass
double mass() const
Get mass of the particle.
Definition: particle.h:138
StepCore::STEPCORE_PROPERTY_RWF
setAngleVariance setAngularVelocityVariance angularAccelerationVariance torqueVariance setInertiaVariance STEPCORE_PROPERTY_RWF(StepCore::Vector2d, momentumVariance, QT_TRANSLATE_NOOP("PropertyName","momentumVariance"), QT_TRANSLATE_NOOP("Units","kg m/s"), QT_TR_NOOP("momentum variance"), StepCore::MetaProperty::DYNAMIC, momentumVariance, setMomentumVariance) STEPCORE_PROPERTY_RWF(double
types.h
Type to and from string convertion helpers.
StepCore::ParticleErrors::setMomentumVariance
void setMomentumVariance(const Vector2d &momentumVariance)
Set momentum variance (will modify velocity variance)
Definition: particle.cc:82
StepCore::ParticleErrors::_forceVariance
Vector2d _forceVariance
Definition: particle.h:95
StepCore::Particle::_velocity
Vector2d _velocity
Definition: particle.h:171
StepCore::Vector2d
Eigen::Vector2d Vector2d
Two-dimensional vector with double components.
Definition: vector.h:29
StepCore::ChargedParticle
ChargedParticle with mass and charge.
Definition: particle.h:206
StepCore::Particle::addForce
void addForce(const double *force, const double *forceVariance)
Add force and (possibly) its variance to force accomulator.
Definition: particle.cc:154
StepCore::ChargedParticleErrors::chargedParticle
ChargedParticle * chargedParticle() const
Get owner as ChargedParticle.
Definition: particle.cc:105
StepCore::STEPCORE_SUPER_CLASS
STEPCORE_SUPER_CLASS(CollisionSolver)
StepCore::Particle::resetForce
void resetForce(bool resetVariance)
Reset force accomulator and (possibly) its variance to zero.
Definition: particle.cc:165
StepCore::Particle::particleErrors
ParticleErrors * particleErrors()
Get (and possibly create) ParticleErrors object.
Definition: particle.h:164
StepCore::Particle::_mass
double _mass
Definition: particle.h:173
StepCore::STEPCORE_FROM_UTF8
setAngleVariance setAngularVelocityVariance STEPCORE_FROM_UTF8(QT_TRANSLATE_NOOP("Units","rad/s²"))
StepCore::QT_TRANSLATE_NOOP
QT_TRANSLATE_NOOP("ObjectClass","GJKCollisionSolver")
StepCore::ParticleErrors::accelerationVariance
Vector2d accelerationVariance() const
Get acceleration variance.
StepCore::ParticleErrors::particle
Particle * particle() const
Get owner as Particle.
StepCore::QT_TR_NOOP
QT_TR_NOOP("Errors class for CoulombForce")
StepCore::STEPCORE_PROPERTY_RW
STEPCORE_PROPERTY_RW(double, depth, QT_TRANSLATE_NOOP("PropertyName","depth"), QT_TRANSLATE_NOOP("Units","J"), QT_TR_NOOP("Potential depth"), depth, setDepth) STEPCORE_PROPERTY_RW(double
StepCore::Particle::force
const Vector2d & force() const
Get force that acts upon particle.
Definition: particle.h:130
StepCore::MetaProperty::DYNAMIC
Variable changes during simulation or changes of other properties.
Definition: object.h:84
StepCore::ParticleErrors::_massVariance
double _massVariance
Definition: particle.h:96
StepCore::ParticleErrors::kineticEnergyVariance
double kineticEnergyVariance() const
Get kinetic energy variance.
Definition: particle.cc:88
StepCore::Particle::getVariables
void getVariables(double *position, double *velocity, double *positionVariance, double *velocityVariance)
Copy positions, velocities and (possibly) its variances to arrays.
Definition: particle.cc:115
StepCore::Particle::Particle
Particle(Vector2d position=Vector2d::Zero(), Vector2d velocity=Vector2d::Zero(), double mass=1)
Constructs a particle.
Definition: particle.cc:110
StepCore::Particle::getAccelerations
void getAccelerations(double *acceleration, double *accelerationVariance)
Copy acceleration (forces left-multiplied by inverse mass) and (possibly) its variances to arrays...
Definition: particle.cc:141
StepCore::STEPCORE_PROPERTY_RW_D
STEPCORE_PROPERTY_RW_D(StepCore::Vector2d, positionVariance, QT_TRANSLATE_NOOP("PropertyName","positionVariance"), QT_TRANSLATE_NOOP("Units","m"), QT_TR_NOOP("position variance"), positionVariance, setPositionVariance) STEPCORE_PROPERTY_RW_D(double
StepCore::Particle::getInverseMass
void getInverseMass(VectorXd *inverseMass, DynSparseRowMatrix *variance, int offset)
Get inverse mass and (possibly) its variance matrixes.
Definition: particle.cc:171
StepCore::STEPCORE_PROPERTY_R_D
setRmin setRminVariance STEPCORE_PROPERTY_R_D(double, rectPressureVariance, QT_TRANSLATE_NOOP("PropertyName","rectPressureVariance"), QT_TRANSLATE_NOOP("Units","Pa"), QT_TR_NOOP("Variance of pressure of particles in the measureRect"), rectPressureVariance) STEPCORE_PROPERTY_R_D(double
StepCore::Particle::setKineticEnergy
void setKineticEnergy(double kineticEnergy)
Set kinetic energy of the particle (will modify only velocity)
Definition: particle.cc:183
StepCore::ParticleErrors::momentumVariance
Vector2d momentumVariance() const
Get momentum variance.
Definition: particle.cc:76
StepCore::Particle::_force
Vector2d _force
Definition: particle.h:172
particle.h
Particle and ChargedParticle classes.
StepCore::DynSparseRowMatrix
Eigen::DynamicSparseMatrix< double, Eigen::RowMajor > DynSparseRowMatrix
Definition: types.h:38
StepCore::STEPCORE_META_OBJECT
STEPCORE_META_OBJECT(CollisionSolver, QT_TRANSLATE_NOOP("ObjectClass","CollisionSolver"),"CollisionSolver", MetaObject::ABSTRACT, STEPCORE_SUPER_CLASS(Object), STEPCORE_PROPERTY_RW(double, toleranceAbs, QT_TRANSLATE_NOOP("PropertyName","toleranceAbs"), STEPCORE_UNITS_1, QT_TR_NOOP("Allowed absolute tolerance"), toleranceAbs, setToleranceAbs) STEPCORE_PROPERTY_R_D(double, localError, QT_TRANSLATE_NOOP("PropertyName","localError"), STEPCORE_UNITS_1, QT_TR_NOOP("Maximal local error during last step"), localError)) STEPCORE_META_OBJECT(GJKCollisionSolver
StepCore::ObjectErrors::owner
Item * owner() const
Get the owner of ObjectErrors.
Definition: world.h:58
StepCore::ParticleErrors::_positionVariance
Vector2d _positionVariance
Definition: particle.h:93
StepCore::Particle::velocity
const Vector2d & velocity() const
Get velocity of the particle.
Definition: particle.h:122
StepCore::Particle::_position
Vector2d _position
Definition: particle.h:170
StepCore::VectorXd
Eigen::VectorXd VectorXd
Definition: vector.h:38
StepCore::ParticleErrors::_velocityVariance
Vector2d _velocityVariance
Definition: particle.h:94
StepCore::square
T square(T v)
Definition: util.h:30
StepCore::ParticleErrors
Errors object for Particle.
Definition: particle.h:38
StepCore::Particle::setVariables
void setVariables(const double *position, const double *velocity, const double *positionVariance, const double *velocityVariance)
Set positions, velocities and (possibly) its variances using values in arrays and also reset accelera...
Definition: particle.cc:127
StepCore::ParticleErrors::setKineticEnergyVariance
void setKineticEnergyVariance(double kineticEnergyVariance)
Set kinetic energy variance (will modify velocity variance)
Definition: particle.cc:94
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:43:06 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

step/stepcore

Skip menu "step/stepcore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal