ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
Loading...
Searching...
No Matches
forces_inline.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010-2026 The ESPResSo project
3 * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010
4 * Max-Planck-Institute for Polymer Research, Theory Group
5 *
6 * This file is part of ESPResSo.
7 *
8 * ESPResSo is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * ESPResSo is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
24/** \file
25 * Force calculation.
26 */
27
28#include <config/config.hpp>
29
30#include "BoxGeometry.hpp"
31#include "actor/visitors.hpp"
58
59#ifdef ESPRESSO_DPD
60#include "dpd.hpp"
61#endif
62
63#include "Particle.hpp"
64#include "bond_error.hpp"
65#include "errorhandling.hpp"
66#include "exclusions.hpp"
67#include "thermostat.hpp"
68
69#include <utils/Vector.hpp>
70
71#include <optional>
72#include <span>
73#include <tuple>
74#include <variant>
75
78 Utils::Vector3d const &d,
79 double const dist) {
80
81 auto const mask = ia_params.active_pair_mask;
82 static_cast<void>(mask);
83
84 auto force_factor = 0.;
85#ifdef ESPRESSO_LENNARD_JONES
87 force_factor += lj_pair_force_factor(ia_params, dist);
88#endif
89#ifdef ESPRESSO_WCA
91 force_factor += wca_pair_force_factor(ia_params, dist);
92#endif
93#ifdef ESPRESSO_LENNARD_JONES_GENERIC
95 force_factor += ljgen_pair_force_factor(ia_params, dist);
96#endif
97#ifdef ESPRESSO_SMOOTH_STEP
99 force_factor += SmSt_pair_force_factor(ia_params, dist);
100#endif
101#ifdef ESPRESSO_HERTZIAN
103 force_factor += hertzian_pair_force_factor(ia_params, dist);
104#endif
105#ifdef ESPRESSO_GAUSSIAN
107 force_factor += gaussian_pair_force_factor(ia_params, dist);
108#endif
109#ifdef ESPRESSO_BMHTF_NACL
111 force_factor += BMHTF_pair_force_factor(ia_params, dist);
112#endif
113#ifdef ESPRESSO_BUCKINGHAM
115 force_factor += buck_pair_force_factor(ia_params, dist);
116#endif
117#ifdef ESPRESSO_MORSE
119 force_factor += morse_pair_force_factor(ia_params, dist);
120#endif
121#ifdef ESPRESSO_SOFT_SPHERE
123 force_factor += soft_pair_force_factor(ia_params, dist);
124#endif
125#ifdef ESPRESSO_HAT
127 force_factor += hat_pair_force_factor(ia_params, dist);
128#endif
129#ifdef ESPRESSO_LJCOS
131 force_factor += ljcos_pair_force_factor(ia_params, dist);
132#endif
133#ifdef ESPRESSO_LJCOS2
135 force_factor += ljcos2_pair_force_factor(ia_params, dist);
136#endif
137#ifdef ESPRESSO_TABULATED
139 force_factor += tabulated_pair_force_factor(ia_params, dist);
140#endif
141 return force_factor * d;
142}
143
145 Particle const &p2,
146 IA_parameters const &ia_params,
147 Utils::Vector3d const &d,
148 double const dist) {
149
150 ParticleForce pf{};
151/* Gay-Berne */
152#ifdef ESPRESSO_GAY_BERNE
153 pf += gb_pair_force(p1.quat(), p2.quat(), ia_params, d, dist);
154#endif
155 return pf;
156}
157
158// Director-based overload for use in Cabana pressure kernel.
159// Returns only the force vector (not torque) — sufficient for the virial.
161 Utils::Vector3d const &dir2,
162 IA_parameters const &ia_params,
163 Utils::Vector3d const &d,
164 double const dist) {
165 Utils::Vector3d f{};
166#ifdef ESPRESSO_GAY_BERNE
167 f += gb_pair_force(dir1, dir2, ia_params, d, dist).f;
168#endif
169 return f;
170}
171
173 Utils::Vector3d const &d) {
174 ParticleForce out{-pf.f};
175#ifdef ESPRESSO_ROTATION
176 // if torque is a null vector, the opposing torque is a null vector too
177 // (this check guards from returning a small yet non-null opposing
178 // torque due to numerical imprecision)
179 if (pf.torque[0] != 0. || pf.torque[1] != 0. || pf.torque[2] != 0.) {
180 out.torque = -(pf.torque + vector_product(d, pf.f));
181 }
182#endif
183 return out;
184}
185
186/** Compute the bonded interaction force between particle pairs.
187 *
188 * @param[in] iaparams Bonded parameters for the interaction.
189 * @param[in] q1q2 Product of the particle charges.
190 * @param[in] dx Vector between @p p1 and @p p2.
191 * @param[in] kernel Coulomb force kernel.
192 */
194inline std::optional<Utils::Vector3d> calc_bond_pair_force(
195 Bonded_IA_Parameters const &iaparams, Utils::Vector3d const &dx,
196 double const q1q2,
198 if (auto const *iap = std::get_if<FeneBond>(&iaparams)) {
199 return iap->force(dx);
200 }
201 if (auto const *iap = std::get_if<HarmonicBond>(&iaparams)) {
202 return iap->force(dx);
203 }
204 if (auto const *iap = std::get_if<QuarticBond>(&iaparams)) {
205 return iap->force(dx);
206 }
207#ifdef ESPRESSO_ELECTROSTATICS
208 if (auto const *iap = std::get_if<BondedCoulomb>(&iaparams)) {
209 return iap->force(q1q2, dx);
210 }
211 if (auto const *iap = std::get_if<BondedCoulombSR>(&iaparams)) {
212 return iap->force(dx, *kernel);
213 }
214#endif
215#ifdef ESPRESSO_BOND_CONSTRAINT
216 if (std::get_if<RigidBond>(&iaparams)) {
217 return Utils::Vector3d{};
218 }
219#endif
220#ifdef ESPRESSO_TABULATED
221 if (auto const *iap = std::get_if<TabulatedDistanceBond>(&iaparams)) {
222 return iap->force(dx);
223 }
224#endif
225 if (std::get_if<VirtualBond>(&iaparams)) {
226 return Utils::Vector3d{};
227 }
228 throw BondUnknownTypeError();
229}
230
232inline std::optional<
233 std::tuple<Utils::Vector3d, Utils::Vector3d, Utils::Vector3d>>
235 Utils::Vector3d const &vec1,
236 Utils::Vector3d const &vec2) {
237 if (auto const *iap = std::get_if<AngleHarmonicBond>(&iaparams)) {
238 return iap->forces(vec1, vec2);
239 }
240 if (auto const *iap = std::get_if<AngleCosineBond>(&iaparams)) {
241 return iap->forces(vec1, vec2);
242 }
243 if (auto const *iap = std::get_if<AngleCossquareBond>(&iaparams)) {
244 return iap->forces(vec1, vec2);
245 }
246#ifdef ESPRESSO_TABULATED
247 if (auto const *iap = std::get_if<TabulatedAngleBond>(&iaparams)) {
248 return iap->forces(vec1, vec2);
249 }
250#endif
251 if (auto const *iap = std::get_if<IBMTriel>(&iaparams)) {
252 return iap->calc_forces(vec1, vec2);
253 }
254 throw BondUnknownTypeError();
255}
256
258inline std::optional<std::tuple<Utils::Vector3d, Utils::Vector3d,
261 Bonded_IA_Parameters const &iaparams, BoxGeometry const &box_geo,
262 Utils::Vector3d const &pos1, Utils::Vector3d const &pos2,
263 Utils::Vector3d const &pos3, Utils::Vector3d const &pos4,
264 Utils::Vector3d const &vel1, Utils::Vector3d const &vel3,
265 Utils::Vector3i const &image1) {
266 if (auto const *iap = std::get_if<OifLocalForcesBond>(&iaparams)) {
267 // note: particles in a dihedral bond are ordered as p2-p1-p3-p4
268 auto const fp2 = box_geo.unfolded_position(pos1, image1);
269 auto const fp1 = fp2 + box_geo.get_mi_vector(pos2, fp2);
270 auto const fp3 = fp2 + box_geo.get_mi_vector(pos3, fp2);
271 auto const fp4 = fp2 + box_geo.get_mi_vector(pos4, fp2);
272 return iap->calc_forces(fp2, fp1, fp3, fp4, vel1, vel3);
273 }
274 if (auto const *iap = std::get_if<IBMTribend>(&iaparams)) {
275 return iap->calc_forces(box_geo, pos1, pos2, pos3, pos4);
276 }
277 // note: particles in a dihedral bond are ordered as p2-p1-p3-p4
278 auto const v12 = box_geo.get_mi_vector(pos1, pos2);
279 auto const v23 = box_geo.get_mi_vector(pos3, pos1);
280 auto const v34 = box_geo.get_mi_vector(pos4, pos3);
281 if (auto const *iap = std::get_if<DihedralBond>(&iaparams)) {
282 return iap->forces(v12, v23, v34);
283 }
284#ifdef ESPRESSO_TABULATED
285 if (auto const *iap = std::get_if<TabulatedDihedralBond>(&iaparams)) {
286 return iap->forces(v12, v23, v34);
287 }
288#endif
289 throw BondUnknownTypeError();
290}
Vector implementation and trait types for boost qvm interoperability.
#define ESPRESSO_ATTR_ALWAYS_INLINE
Routines to calculate the Born-Meyer-Huggins-Tosi-Fumi potential between particle pairs.
double BMHTF_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate BMHTF force factor.
Data structures for bonded interactions.
std::variant< NoneBond, FeneBond, HarmonicBond, QuarticBond, BondedCoulomb, BondedCoulombSR, AngleHarmonicBond, AngleCosineBond, AngleCossquareBond, DihedralBond, TabulatedDistanceBond, TabulatedAngleBond, TabulatedDihedralBond, ThermalizedBond, RigidBond, IBMTriel, IBMVolCons, IBMTribend, OifGlobalForcesBond, OifLocalForcesBond, VirtualBond > Bonded_IA_Parameters
Variant in which to store the parameters of an individual bonded interaction.
Routines to calculate the Buckingham potential between particle pairs.
double buck_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Buckingham force factor.
auto unfolded_position(Utils::Vector3d const &pos, Utils::Vector3i const &image_box) const
Unfold particle coordinates to image box.
ESPRESSO_ATTR_ALWAYS_INLINE Utils::Vector3< T > get_mi_vector(Utils::Vector3< T > const &a, Utils::Vector3< T > const &b) const
Get the minimum-image vector between two coordinates.
Routines to calculate the Gaussian potential between particle pairs.
double gaussian_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Gaussian force factor.
__device__ void vector_product(float const *a, float const *b, float *out)
Routines to use DPD as thermostat or pair force .
This file contains the errorhandling code for severe errors, like a broken bond or illegal parameter ...
ESPRESSO_ATTR_ALWAYS_INLINE std::optional< Utils::Vector3d > calc_bond_pair_force(Bonded_IA_Parameters const &iaparams, Utils::Vector3d const &dx, double const q1q2, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
Compute the bonded interaction force between particle pairs.
ESPRESSO_ATTR_ALWAYS_INLINE std::optional< std::tuple< Utils::Vector3d, Utils::Vector3d, Utils::Vector3d, Utils::Vector3d > > calc_bonded_four_body_force(Bonded_IA_Parameters const &iaparams, BoxGeometry const &box_geo, Utils::Vector3d const &pos1, Utils::Vector3d const &pos2, Utils::Vector3d const &pos3, Utils::Vector3d const &pos4, Utils::Vector3d const &vel1, Utils::Vector3d const &vel3, Utils::Vector3i const &image1)
ParticleForce calc_opposing_force(ParticleForce const &pf, Utils::Vector3d const &d)
ParticleForce calc_non_central_force(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
ESPRESSO_ATTR_ALWAYS_INLINE Utils::Vector3d calc_central_radial_force(IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
ESPRESSO_ATTR_ALWAYS_INLINE std::optional< std::tuple< Utils::Vector3d, Utils::Vector3d, Utils::Vector3d > > calc_bonded_three_body_force(Bonded_IA_Parameters const &iaparams, Utils::Vector3d const &vec1, Utils::Vector3d const &vec2)
Routines to calculate the Gay-Berne potential between particle pairs.
ParticleForce gb_pair_force(Utils::Vector3d const &ui, Utils::Vector3d const &uj, IA_parameters const &ia_params, Utils::Vector3d const &d, double dist)
Calculate Gay-Berne force and torques.
Definition gay_berne.hpp:49
Routines to calculate the hat potential between particle pairs.
double hat_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate hat force factor.
Definition hat.hpp:37
Routines to calculate the Hertzian potential between particle pairs.
double hertzian_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Hertzian force factor.
Definition hertzian.hpp:39
Routines to calculate the Lennard-Jones potential between particle pairs.
double lj_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Lennard-Jones force factor.
Definition lj.hpp:41
Routines to calculate the Lennard-Jones with cosine tail potential between particle pairs.
double ljcos2_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Lennard-Jones cosine squared force factor.
Definition ljcos2.hpp:46
Routines to calculate the Lennard-Jones+cosine potential between particle pairs.
double ljcos_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Lennard-Jones cosine force factor.
Definition ljcos.hpp:43
Routines to calculate the generalized Lennard-Jones potential between particle pairs.
double ljgen_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Lennard-Jones force factor.
Definition ljgen.hpp:51
Routines to calculate the Morse potential between particle pairs.
double morse_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate Morse force factor.
Definition morse.hpp:41
VectorXd< 3 > Vector3d
Definition Vector.hpp:184
Various procedures concerning interactions between particles.
constexpr unsigned pair_potential_bit(PairPotential p)
Bitmask for a pair potential.
Routines to calculate the energy and/or force for particle pairs via interpolation of lookup tables.
double tabulated_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate a non-bonded pair force factor by linear interpolation from a table.
Routines to calculate the OIF global forces for a particle triple (triangle from mesh).
Routines to calculate the OIF local forces for a particle quadruple (two neighboring triangles with c...
Routines to calculate the smooth step potential between particle pairs.
double SmSt_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate smooth step force factor.
Routines to calculate the soft-sphere potential between particle pairs.
double soft_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate soft-sphere force factor.
Exception indicating that a bond type was unknown.
Solver::ShortRangeForceKernel kernel_type
Parameters for non-bonded interactions.
unsigned active_pair_mask
Bitmask of pair potentials active for this type pair.
Force information on a particle.
Definition Particle.hpp:330
Utils::Vector3d torque
torque.
Definition Particle.hpp:360
Utils::Vector3d f
force.
Definition Particle.hpp:356
Struct holding all information for one particle.
Definition Particle.hpp:435
auto const & quat() const
Definition Particle.hpp:517
Routines to calculate the Thole damping potential between particle pairs.
Routines to calculate the Weeks-Chandler-Andersen potential between particle pairs.
double wca_pair_force_factor(IA_parameters const &ia_params, double dist)
Calculate WCA force factor.
Definition wca.hpp:40