Warning, file /education/step/stepcore/coulombforce.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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