24#include "communication.hpp"
31#include "system/System.hpp"
32#include "thermostat.hpp"
36#include <boost/mpi/collectives.hpp>
50 return all_reduce(
comm_cart, m_local_force, std::plus<>());
54 return all_reduce(
comm_cart, m_outer_normal_force, std::plus<double>());
59 auto global_mindist = std::numeric_limits<double>::infinity();
61 auto const local_mindist = std::accumulate(
62 particles.begin(), particles.end(),
63 std::numeric_limits<double>::infinity(),
64 [
this, &box_geo](
double min,
Particle const &p) {
65 auto const &ia_params = get_ia_param(p.type());
66 if (is_active(ia_params)) {
69 m_shape->calculate_dist(box_geo.folded_position(p.pos()), dist, vec);
70 return std::min(min, dist);
74 boost::mpi::reduce(
comm_cart, local_mindist, global_mindist,
75 boost::mpi::minimum<double>(), 0);
76 return global_mindist;
83 auto const &ia_params = get_ia_param(p.
type());
88 m_shape->calculate_dist(folded_pos, dist, dist_vec);
89 auto const coulomb_kernel = m_system.coulomb.pair_force_kernel();
97 outer_normal_vec = -dist_vec / dist;
100 dist,
get_ptr(coulomb_kernel)) +
104 if (m_system.thermostat->thermo_switch &
THERMO_DPD) {
105 dpd_force =
dpd_pair_force(p, part_rep, *m_system.thermostat->dpd,
106 *m_system.box_geo, ia_params, dist_vec, dist,
109 m_system.thermostat->dpd->rng_increment();
112 }
else if (m_penetrable && (dist <= 0)) {
113 if ((!m_only_positive) && (dist < 0)) {
116 -dist,
get_ptr(coulomb_kernel)) +
120 if (m_system.thermostat->thermo_switch &
THERMO_DPD) {
121 dpd_force =
dpd_pair_force(p, part_rep, *m_system.thermostat->dpd,
122 *m_system.box_geo, ia_params, dist_vec,
125 m_system.thermostat->dpd->rng_increment();
140 m_local_force -= pf.f;
141 m_outer_normal_force -= outer_normal_vec * pf.f;
146void ShapeBasedConstraint::add_energy(
const Particle &p,
150 auto const &ia_params = get_ia_param(p.
type());
153 auto const coulomb_kernel = m_system.coulomb.pair_energy_kernel();
156 m_shape->calculate_dist(folded_pos, dist, vec);
160 }
else if ((dist <= 0) && m_penetrable) {
161 if (!m_only_positive && (dist < 0)) {
170 if (part_rep.type() >= 0) {
172 p.
type(), part_rep.type(), p.
mol_id(), part_rep.mol_id(), energy);
Vector implementation and trait types for boost qvm interoperability.
double total_normal_force() const
double min_dist(BoxGeometry const &box_geo, ParticleRange const &particles) const
Calculate the minimum distance between all particle pairs.
Utils::Vector3d total_force() const
Observable for the pressure and energy.
void add_non_bonded_contribution(int type1, int type2, int molid1, int molid2, Utils::Span< const double > data)
boost::mpi::communicator comm_cart
The communicator.
This file contains the defaults for ESPResSo.
const T * get_ptr(std::optional< T > const &opt)
Utils::Vector3d dpd_pair_force(DPDParameters const ¶ms, Utils::Vector3d const &v, double dist, Utils::Vector3d const &noise)
Routines to use DPD as thermostat or pair force .
double calc_non_bonded_pair_energy(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist, Coulomb::ShortRangeEnergyKernel::kernel_type const *coulomb_kernel)
Calculate non-bonded energies between a pair of particles.
This file contains the errorhandling code for severe errors, like a broken bond or illegal parameter ...
#define runtimeErrorMsg()
ParticleForce calc_central_radial_force(IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
ParticleForce calc_opposing_force(ParticleForce const &pf, Utils::Vector3d const &d)
ParticleForce calc_central_radial_charge_force(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist, Coulomb::ShortRangeForceKernel::kernel_type const *coulomb_kernel)
ParticleForce calc_non_central_force(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
static bool is_active(IA_parameters const &data)
Check if a non-bonded interaction is defined.
Various procedures concerning interactions between particles.
constexpr double INACTIVE_CUTOFF
Cutoff for deactivated interactions.
Parameters for non-bonded interactions.
double max_cut
maximal cutoff for this pair of particle types.
Force information on a particle.
Utils::Vector3d torque
torque.
Struct holding all information for one particle.
auto const & type() const
auto const & mol_id() const