65#ifdef ESPRESSO_EXCLUSIONS
77 p2.
mol_id(), flatten(stress));
80#ifdef ESPRESSO_ELECTROSTATICS
81 if (!obs_pressure.
coulomb.empty() and kernel_pressure !=
nullptr) {
83 auto const p_coulomb = (*kernel_pressure)(p1.
q() * p2.
q(), d, dist);
85 for (std::size_t i = 0u; i < 3u; i++) {
86 for (std::size_t j = 0u; j < 3u; j++) {
87 obs_pressure.
coulomb[i * 3u + j] += p_coulomb(i, j);
93#ifdef ESPRESSO_DIPOLES
96 fprintf(stderr,
"calculating pressure for magnetostatics which doesn't "
97 "have it implemented\n");
102inline std::optional<Utils::Matrix<double, 3, 3>>
109 std::optional<Utils::Matrix<double, 3, 3>> pressure{std::nullopt};
116inline std::optional<Utils::Matrix<double, 3, 3>>
121 if (std::holds_alternative<AngleHarmonicBond>(iaparams) or
122 std::holds_alternative<AngleCosineBond>(iaparams) or
123#ifdef ESPRESSO_TABULATED
124 std::holds_alternative<TabulatedAngleBond>(iaparams) or
126 std::holds_alternative<AngleCossquareBond>(iaparams)) {
134 std::tie(std::ignore, force2, force3) = result.value();
141 std::to_string(iaparams.index()) +
142 " in pressure calculation.";
151 std::span<Particle *> partners,
BoxGeometry const &box_geo,
159 *partners[1], box_geo);
162 std::to_string(iaparams.index()) +
163 " in pressure calculation.";
178 for (std::size_t k = 0u; k < 3u; k++)
179 for (std::size_t l = 0u; l < 3u; l++)
Vector implementation and trait types for boost qvm interoperability.
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.
int number_of_partners(Bonded_IA_Parameters const &iaparams)
Get the number of bonded partners for the specified bond.
container for bonded interactions.
ESPRESSO_ATTR_ALWAYS_INLINE 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.
std::span< double > coulomb
Contribution(s) from Coulomb interactions.
void add_non_bonded_contribution(int type1, int type2, int molid1, int molid2, std::span< const double > data)
std::span< double > kinetic_lin
Contribution from linear kinetic energy.
static auto pair_force(Utils::Vector3d const &d, Utils::Vector3d const &m1, Utils::Vector3d const &m2)
Pair force of two interacting dipoles.
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.
std::optional< Utils::Vector3d > calc_bond_pair_force(Bonded_IA_Parameters const &iaparams, Particle const &p1, Particle const &p2, Utils::Vector3d const &dx, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
Compute the bonded interaction force between particle pairs.
ParticleForce calc_non_central_force(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist)
std::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)
ESPRESSO_ATTR_ALWAYS_INLINE Utils::Vector3d calc_central_radial_force(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_non_bonded_pair_virials(Particle const &p1, Particle const &p2, Utils::Vector3d const &d, double dist, IA_parameters const &ia_params, BondedInteractionsMap const &bonded_ias, 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.
std::optional< Utils::Matrix< double, 3, 3 > > calc_bonded_pressure_tensor(Bonded_IA_Parameters const &iaparams, Particle const &p1, std::span< Particle * > partners, BoxGeometry const &box_geo, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
void add_kinetic_virials(Particle const &p1, Observable_stat &obs_pressure)
Calculate kinetic pressure (aka energy) for one particle.
std::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)
std::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)
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.
Utils::Vector3d thole_pair_force(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double dist, BondedInteractionsMap const &bonded_ias, Coulomb::ShortRangeForceKernel::kernel_type const *kernel)
Calculate Thole force.