30#include <Kokkos_Core.hpp>
31#include <Kokkos_ScatterView.hpp>
76 auto const &iaparams = *bonded_ias.at(bond_id);
79 box_geo.get_mi_vector(aosoa.get_vector_at(aosoa.position, i),
80 aosoa.get_vector_at(aosoa.position, j));
82 if (has_breakage_specs &&
83 bond_breakage.check_and_handle_breakage(
84 aosoa.id(i), {{aosoa.id(j), std::nullopt}}, bond_id, dx.norm())) {
88 if (
auto const *iap = std::get_if<ThermalizedBond>(&iaparams)) {
89 auto const result = iap->forces(
91 aosoa.mass(i), aosoa.mass(j),
95 aosoa.get_vector_at(aosoa.velocity, i),
96 aosoa.get_vector_at(aosoa.velocity, j), aosoa.id(i), aosoa.id(j), dx);
98 auto const &forces = result.value();
100 local_force(i, 0) += std::get<0>(forces)[0];
101 local_force(i, 1) += std::get<0>(forces)[1];
102 local_force(i, 2) += std::get<0>(forces)[2];
103 local_force(j, 0) += std::get<1>(forces)[0];
104 local_force(j, 1) += std::get<1>(forces)[1];
105 local_force(j, 2) += std::get<1>(forces)[2];
107 auto partner_id = aosoa.id(j);
115#ifdef ESPRESSO_ELECTROSTATICS
123 auto const f = result.value();
124 local_force(i, 0) += f[0];
125 local_force(i, 1) += f[1];
126 local_force(i, 2) += f[2];
127 local_force(j, 0) -= f[0];
128 local_force(j, 1) -= f[1];
129 local_force(j, 2) -= f[2];
132 local_virial(0) += virial[0];
133 local_virial(1) += virial[1];
134 local_virial(2) += virial[2];
137 auto partner_id = aosoa.id(j);
166 auto const &iaparams = *bonded_ias.at(bond_id);
168 auto const pos1 = aosoa.get_vector_at(aosoa.position, i);
169 auto const pos2 = aosoa.get_vector_at(aosoa.position, j);
170 auto const pos3 = aosoa.get_vector_at(aosoa.position, k);
171 auto const vec1 = box_geo.get_mi_vector(pos2, pos1);
172 auto const vec2 = box_geo.get_mi_vector(pos3, pos1);
175 if (has_breakage_specs &&
176 bond_breakage.check_and_handle_breakage(
177 aosoa.id(i), {{aosoa.id(j), aosoa.id(k)}}, bond_id,
178 box_geo.get_mi_vector(pos2, pos3).norm())) {
181 if (std::get_if<OifGlobalForcesBond>(&iaparams)) {
188 auto const &forces = result.value();
190 local_force(i, 0) += std::get<0>(forces)[0];
191 local_force(i, 1) += std::get<0>(forces)[1];
192 local_force(i, 2) += std::get<0>(forces)[2];
193 local_force(j, 0) += std::get<1>(forces)[0];
194 local_force(j, 1) += std::get<1>(forces)[1];
195 local_force(j, 2) += std::get<1>(forces)[2];
196 local_force(k, 0) += std::get<2>(forces)[0];
197 local_force(k, 1) += std::get<2>(forces)[1];
198 local_force(k, 2) += std::get<2>(forces)[2];
200 std::array<int, 2> pids = {aosoa.id(j), aosoa.id(k)};
228 auto const &iaparams = *bonded_ias.at(bond_id);
230 auto const pos1 = aosoa.get_vector_at(aosoa.position, i);
231 auto const pos2 = aosoa.get_vector_at(aosoa.position, j);
232 auto const pos3 = aosoa.get_vector_at(aosoa.position, k);
233 auto const pos4 = aosoa.get_vector_at(aosoa.position, m);
234 auto const vel1 = aosoa.get_vector_at(aosoa.velocity, i);
235 auto const vel3 = aosoa.get_vector_at(aosoa.velocity, k);
236 auto const image1 = aosoa.get_vector_at(aosoa.image, i);
239 iaparams, box_geo, pos1, pos2, pos3, pos4, vel1, vel3, image1);
242 auto const &forces = result.value();
244 local_force(i, 0) += std::get<0>(forces)[0];
245 local_force(i, 1) += std::get<0>(forces)[1];
246 local_force(i, 2) += std::get<0>(forces)[2];
247 local_force(j, 0) += std::get<1>(forces)[0];
248 local_force(j, 1) += std::get<1>(forces)[1];
249 local_force(j, 2) += std::get<1>(forces)[2];
250 local_force(k, 0) += std::get<2>(forces)[0];
251 local_force(k, 1) += std::get<2>(forces)[1];
252 local_force(k, 2) += std::get<2>(forces)[2];
253 local_force(m, 0) += std::get<3>(forces)[0];
254 local_force(m, 1) += std::get<3>(forces)[1];
255 local_force(m, 2) += std::get<3>(forces)[2];
257 std::array<int, 3> pids = {aosoa.id(j), aosoa.id(k), aosoa.id(m)};
Vector implementation and trait types for boost qvm interoperability.
#define ESPRESSO_ATTR_ALWAYS_INLINE
void bond_broken_error(int id, std::span< const int > partner_ids)
container for bonded interactions.
Kokkos::Experimental::ScatterView< double *[3], Kokkos::LayoutRight, memory_space > ScatterForce
Kokkos::Experimental::ScatterView< double[3], Kokkos::LayoutRight, memory_space > ScatterVirial
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)
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)
auto hadamard_product(Vector< T, N > const &a, Vector< U, N > const &b)
ESPRESSO_ATTR_ALWAYS_INLINE void operator()(std::size_t idx) const
LocalBondState::AngleBondIDType bond_ids
AngleBondsKernel(BondsKernelData data_, LocalBondState::AngleBondlistType bond_list_, LocalBondState::AngleBondIDType bond_ids_)
LocalBondState::AngleBondlistType bond_list
CellStructure::AoSoA_pack const & aosoa
bool const has_breakage_specs
BondBreakage::BondBreakage & bond_breakage
CellStructure::ScatterForce local_force
BondedInteractionsMap const & bonded_ias
BoxGeometry const & box_geo
CellStructure::ScatterVirial local_virial
Solver::ShortRangeForceKernel kernel_type
DihedralBondsKernel(BondsKernelData data_, LocalBondState::DihedralBondlistType bond_list_, LocalBondState::DihedralBondIDType bond_ids_)
LocalBondState::DihedralBondIDType bond_ids
ESPRESSO_ATTR_ALWAYS_INLINE void operator()(std::size_t idx) const
LocalBondState::DihedralBondlistType bond_list
Kokkos::View< int *, Kokkos::LayoutRight, execution_space > AngleBondIDType
Kokkos::View< int *[3], Kokkos::LayoutRight, execution_space > AngleBondlistType
Kokkos::View< int *[2], Kokkos::LayoutRight, execution_space > PairBondlistType
Kokkos::View< int *, Kokkos::LayoutRight, execution_space > DihedralBondIDType
Kokkos::View< int *[4], Kokkos::LayoutRight, execution_space > DihedralBondlistType
Kokkos::View< int *, Kokkos::LayoutRight, execution_space > PairBondIDType
PairBondsKernel(BondsKernelData data_, LocalBondState::PairBondlistType bond_list_, LocalBondState::PairBondIDType bond_ids_, Coulomb::ShortRangeForceKernel::kernel_type const *coulomb_kernel_)
ESPRESSO_ATTR_ALWAYS_INLINE void operator()(std::size_t idx) const
LocalBondState::PairBondIDType bond_ids
Coulomb::ShortRangeForceKernel::kernel_type const *const coulomb_kernel
LocalBondState::PairBondlistType bond_list