File indexing completed on 2024-04-21 03:51:21

0001 /*
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 /** \file coulombforce.h
0008  *  \brief CoulombForce class
0009  */
0010 
0011 #ifndef STEPCORE_COULOMBFORCE_H
0012 #define STEPCORE_COULOMBFORCE_H
0013 
0014 #include "force.h"
0015 #include "object.h"
0016 #include "objecterrors.h"
0017 #include "constants.h"
0018 
0019 namespace StepCore
0020 {
0021 
0022 class CoulombForce;
0023 
0024 /** \ingroup errors
0025  *  \brief Errors object for CoulombForce
0026  */
0027 class CoulombForceErrors: public ObjectErrors
0028 {
0029     STEPCORE_OBJECT(CoulombForceErrors)
0030 
0031 public:
0032     /** Constructs CoulombForceErrors */
0033     explicit CoulombForceErrors(Item* owner = nullptr)
0034         : ObjectErrors(owner), _coulombConstVariance(0) {}
0035 
0036     /** Get owner as CoulombForce */
0037     CoulombForce* coulombForce() const;
0038 
0039     /** Get coulombConst variance */
0040     double coulombConstVariance() const { return _coulombConstVariance; }
0041     /** Set coulombConst variance */
0042     void   setCoulombConstVariance(double coulombConstVariance) {
0043         _coulombConstVariance = coulombConstVariance; }
0044 
0045 protected:
0046     double _coulombConstVariance;
0047     friend class CoulombForce;
0048 };
0049 
0050 
0051 /** \ingroup forces
0052  *  \brief Coulomb electrostatic force.
0053  *
0054  *  The force acts between pairs of charged bodies (currently only
0055  *  ChargedParticle) and equals:
0056  *  \f[
0057  *      \overrightarrow{f} = k_C
0058  *                           \frac{q_1 q_2 \overrightarrow{r}}
0059  *                                  {|\overrightarrow{r}|^3}
0060  *  \f]
0061  *  where:\n
0062  *  \f$k_C\f$ is CoulombForce::coulombConst\n
0063  *  \f$q_1\f$ and \f$q_2\f$ is ChargedParticle::charge of the first
0064  *  and second body\n
0065  *  \f$\overrightarrow{r}\f$ is difference of Particle::position
0066  *  of the first and second body
0067  *
0068  *  \todo Add interface for charged bodies, support bodies with
0069  *        distributed charge
0070  */
0071 class CoulombForce : public Force
0072 {
0073     STEPCORE_OBJECT(CoulombForce)
0074 
0075 public:
0076     /** Constructs CoulombForce */
0077     explicit CoulombForce(double coulombConst = Constants::Coulomb);
0078 
0079     void calcForce(bool calcVariances) override;
0080 
0081     /** Get coulomb const */
0082     double coulombConst() const { return _coulombConst; }
0083     /** Set coulomb const */
0084     void   setCoulombConst(double coulombConst) { _coulombConst = coulombConst; }
0085 
0086     /** Get (and possibly create) CoulombForceErrors object */
0087     CoulombForceErrors* coulombForceErrors() {
0088         return static_cast<CoulombForceErrors*>(objectErrors()); }
0089 
0090 protected:
0091     ObjectErrors* createObjectErrors() override { return new CoulombForceErrors(this); }
0092 
0093     double _coulombConst;
0094 };
0095 
0096 } // namespace StepCore
0097 
0098 #endif
0099