41#include <boost/optional.hpp>
42#include <boost/variant.hpp>
74 p2.
mol_id(), flatten(stress));
78 if (!obs_pressure.
coulomb.
empty() and kernel_pressure !=
nullptr) {
80 auto const p_coulomb = (*kernel_pressure)(p1.
q() * p2.
q(), d, dist);
82 for (
int i = 0; i < 3; i++) {
83 for (
int j = 0; j < 3; j++) {
84 obs_pressure.
coulomb[i * 3 + j] += p_coulomb(i, j);
93 fprintf(stderr,
"calculating pressure for magnetostatics which doesn't "
94 "have it implemented\n");
99inline boost::optional<Utils::Matrix<double, 3, 3>>
107 auto const &
force = result.get();
115inline boost::optional<Utils::Matrix<double, 3, 3>>
120 if ((boost::get<AngleHarmonicBond>(&iaparams) !=
nullptr) ||
121 (boost::get<AngleCosineBond>(&iaparams) !=
nullptr) ||
123 (boost::get<TabulatedAngleBond>(&iaparams) !=
nullptr) ||
125 (boost::get<AngleCossquareBond>(&iaparams) !=
nullptr)) {
133 std::tie(std::ignore, force2, force3) = result.get();
140 std::to_string(iaparams.which()) +
141 " in pressure calculation.";
158 *partners[1], box_geo);
161 std::to_string(iaparams.which()) +
162 " in pressure calculation.";
177 for (
int k = 0; k < 3; k++)
178 for (
int l = 0; l < 3; l++)
179 obs_pressure.
kinetic[k * 3 + l] += p1.
v()[k] * p1.
v()[l] * p1.
mass();
Vector implementation and trait types for boost qvm interoperability.
Data structures for bonded interactions.
int number_of_partners(Bonded_IA_Parameters const &iaparams)
Return the number of bonded partners for the specified bond.
boost::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.
Utils::Vector< T, 3 > get_mi_vector(const Utils::Vector< T, 3 > &a, const Utils::Vector< T, 3 > &b) const
Get the minimum-image vector between two coordinates.
Observable for the pressure and energy.
Utils::Span< double > kinetic
Contribution from linear and angular kinetic energy (accumulated).
void add_non_bonded_contribution(int type1, int type2, int molid1, int molid2, Utils::Span< const double > data)
Utils::Span< double > coulomb
Contribution(s) from Coulomb interactions.
A stripped-down version of std::span from C++17.
DEVICE_QUALIFIER constexpr bool empty() const
This file contains the defaults for ESPResSo.
This file contains the errorhandling code for severe errors, like a broken bond or illegal parameter ...
#define runtimeWarningMsg()
bool do_nonbonded(Particle const &p1, Particle const &p2)
Determine if the non-bonded interactions between p1 and p2 should be calculated.
boost::optional< std::tuple< Utils::Vector3d, Utils::Vector3d, Utils::Vector3d > > calc_bonded_three_body_force(Bonded_IA_Parameters const &iaparams, BoxGeometry const &box_geo, Particle const &p1, Particle const &p2, Particle const &p3)
ParticleForce calc_central_radial_force(IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
boost::optional< Utils::Vector3d > calc_bond_pair_force(Particle const &p1, Particle const &p2, Bonded_IA_Parameters const &iaparams, Utils::Vector3d const &dx, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
Compute the bonded interaction force between particle pairs.
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)
Solver const & get_dipoles()
Matrix< T, N, M > tensor_product(const Vector< T, N > &x, const Vector< T, M > &y)
Various procedures concerning interactions between particles.
void add_kinetic_virials(Particle const &p1, Observable_stat &obs_pressure)
Calculate kinetic pressure (aka energy) for one particle.
boost::optional< Utils::Matrix< double, 3, 3 > > calc_bonded_virial_pressure_tensor(Bonded_IA_Parameters const &iaparams, Particle const &p1, Particle const &p2, BoxGeometry const &box_geo, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
boost::optional< Utils::Matrix< double, 3, 3 > > calc_bonded_three_body_pressure_tensor(Bonded_IA_Parameters const &iaparams, Particle const &p1, Particle const &p2, Particle const &p3, BoxGeometry const &box_geo)
void add_non_bonded_pair_virials(Particle const &p1, Particle const &p2, Utils::Vector3d const &d, double dist, IA_parameters const &ia_params, Coulomb::ShortRangeForceKernel::kernel_type const *kernel_forces, Coulomb::ShortRangePressureKernel::kernel_type const *kernel_pressure, Observable_stat &obs_pressure)
Calculate non-bonded energies between a pair of particles.
boost::optional< Utils::Matrix< double, 3, 3 > > calc_bonded_pressure_tensor(Bonded_IA_Parameters const &iaparams, Particle const &p1, Utils::Span< Particle * > partners, BoxGeometry const &box_geo, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
Solver::ShortRangeForceKernel kernel_type
Solver::ShortRangePressureKernel kernel_type
Parameters for non-bonded interactions.
Struct holding all information for one particle.
auto const & mass() const
auto const & type() const
auto const & mol_id() const
Matrix representation with static size.