49 auto obs_pressure_ptr = std::make_shared<Observable_stat>(
50 9ul,
static_cast<std::size_t
>(bonded_ias->get_next_key()),
51 nonbonded_ias->get_max_seen_particle_type());
53 if (long_range_interactions_sanity_checks()) {
54 return obs_pressure_ptr;
57 auto &obs_pressure = *obs_pressure_ptr;
61 auto const volume = box_geo->volume();
62 auto const local_parts = cell_structure->local_particles();
64 for (
auto const &p : local_parts) {
68 auto const coulomb_force_kernel = coulomb.pair_force_kernel();
69 auto const coulomb_pressure_kernel = coulomb.pair_pressure_kernel();
72 [
this, coulomb_force_kernel_ptr =
get_ptr(coulomb_force_kernel),
73 &obs_pressure](
Particle const &p1,
int bond_id,
74 std::span<Particle *> partners) {
75 auto const &iaparams = *bonded_ias->at(bond_id);
77 iaparams, p1, partners, *box_geo, coulomb_force_kernel_ptr);
79 auto const &tensor = result.value();
81 for (std::size_t k = 0u; k < 3u; k++)
82 for (std::size_t l = 0u; l < 3u; l++)
83 obs_pressure.bonded_contribution(bond_id)[k * 3u + l] +=
90 [coulomb_force_kernel_ptr =
get_ptr(coulomb_force_kernel),
91 coulomb_pressure_kernel_ptr =
get_ptr(coulomb_pressure_kernel),
this,
94 auto const &ia_params =
95 nonbonded_ias->get_ia_param(p1.
type(), p2.type());
97 *bonded_ias, coulomb_force_kernel_ptr,
98 coulomb_pressure_kernel_ptr, obs_pressure);
100 *cell_structure, maximal_cutoff(), bonded_ias->maximal_cutoff());
104 auto const coulomb_pressure = coulomb.calc_pressure_long_range(local_parts);
105 std::ranges::copy(coulomb_pressure, obs_pressure.coulomb.begin() + 9u);
112#ifdef VIRTUAL_SITES_RELATIVE
113 if (!obs_pressure.virtual_sites.empty()) {
116 obs_pressure.virtual_sites.begin());
124 obs_pressure.rescale(volume);
126 obs_pressure.mpi_reduce();
127 return obs_pressure_ptr;
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 short_range_loop(BondKernel bond_kernel, PairKernel pair_kernel, CellStructure &cell_structure, double pair_cutoff, double bond_cutoff, VerletCriterion const &verlet_criterion={})
Struct holding all information for one particle.
auto const & type() const