Molecular Dynamics Simulation  1.0
HarmonicForce.cpp
Go to the documentation of this file.
1 #include "HarmonicForce.h"
2 
3 #include "particles/Particle.h"
4 #include "utils/ArrayUtils.h"
5 
6 HarmonicForce::HarmonicForce(const std::variant<SimulationParams::DirectSumType, SimulationParams::LinkedCellsType>& container_data) {
7  if (std::holds_alternative<SimulationParams::DirectSumType>(container_data)) {
8  is_finite_container = false;
9  } else {
10  is_finite_container = true;
11  domain_size = std::get<SimulationParams::LinkedCellsType>(container_data).domain_size;
12  }
13 }
14 
15 std::array<double, 3UL> HarmonicForce::calculateForce(Particle& p) const {
16  auto total_harmonic_force = std::array<double, 3UL>{0, 0, 0};
17 
18  for (auto& [ptr_diff, l_0, k] : p.getConnectedParticles()) {
19  Particle* connected_particle = &p + ptr_diff;
20  auto displacement = connected_particle->getX() - p.getX();
21 
22  if (is_finite_container) {
23  for (size_t i = 0; i < displacement.size(); i++) {
24  if (std::abs(displacement[i]) > domain_size[i] * 0.5) {
25  bool is_positive = displacement[i] > 0;
26  if (is_positive) {
27  displacement[i] -= domain_size[i];
28  } else {
29  displacement[i] += domain_size[i];
30  }
31  }
32  }
33  }
34 
35  const double dist = ArrayUtils::L2Norm(displacement);
36 
37  const auto f_harmonic = (k * (dist - l_0) / dist) * displacement;
38 
39  total_harmonic_force = total_harmonic_force + f_harmonic;
40  }
41 
42  return total_harmonic_force;
43 }
44 
45 HarmonicForce::operator std::string() const { return "HarmonicForce"; }
std::array< double, 3 > domain_size
Definition: HarmonicForce.h:14
HarmonicForce(const std::variant< SimulationParams::DirectSumType, SimulationParams::LinkedCellsType > &container_data)
Constructor for the GlobalDownwardsGravity class.
bool is_finite_container
Definition: HarmonicForce.h:13
std::array< double, 3UL > calculateForce(Particle &p) const override
Calculates the harmonic force on a particle supplied by all its connected neighbors.
Class to represent a particle.
Definition: Particle.h:26
const std::array< double, 3 > & getX() const
Gets the position of the particle.
Definition: Particle.h:157
const std::vector< std::tuple< long, double, double > > & getConnectedParticles() const
Gets the list of connected particles.
Definition: Particle.h:207
auto L2Norm(const Container &c)
Definition: ArrayUtils.h:174