30#include <Kokkos_Core.hpp>
31#include <Kokkos_ScatterView.hpp>
77 auto const &iaparams = *bonded_ias.at(bond_id);
80 box_geo.get_mi_vector(aosoa.get_vector_at(aosoa.position, i),
81 aosoa.get_vector_at(aosoa.position, j));
83 if (has_breakage_specs &&
84 bond_breakage.check_and_handle_breakage(
85 aosoa.id(i), {{aosoa.id(j), std::nullopt}}, bond_id, dx.norm())) {
89 if (
auto const *iap = std::get_if<ThermalizedBond>(&iaparams)) {
90 auto const result = iap->forces(
92 aosoa.mass(i), aosoa.mass(j),
96 aosoa.get_vector_at(aosoa.velocity, i),
97 aosoa.get_vector_at(aosoa.velocity, j), aosoa.id(i), aosoa.id(j), dx);
99 auto const &forces = result.value();
101 local_force(i, 0) += std::get<0>(forces)[0];
102 local_force(i, 1) += std::get<0>(forces)[1];
103 local_force(i, 2) += std::get<0>(forces)[2];
104 local_force(j, 0) += std::get<1>(forces)[0];
105 local_force(j, 1) += std::get<1>(forces)[1];
106 local_force(j, 2) += std::get<1>(forces)[2];
108 auto partner_id = aosoa.id(j);
116#ifdef ESPRESSO_ELECTROSTATICS
124 auto const f = result.value();
125 local_force(i, 0) += f[0];
126 local_force(i, 1) += f[1];
127 local_force(i, 2) += f[2];
128 local_force(j, 0) -= f[0];
129 local_force(j, 1) -= f[1];
130 local_force(j, 2) -= f[2];
133 local_virial(0) += virial[0];
134 local_virial(1) += virial[1];
135 local_virial(2) += virial[2];
138 auto partner_id = aosoa.id(j);
168 auto const &iaparams = *bonded_ias.at(bond_id);
170 auto const pos1 = aosoa.get_vector_at(aosoa.position, i);
171 auto const pos2 = aosoa.get_vector_at(aosoa.position, j);
172 auto const pos3 = aosoa.get_vector_at(aosoa.position, k);
173 auto const vec1 = box_geo.get_mi_vector(pos2, pos1);
174 auto const vec2 = box_geo.get_mi_vector(pos3, pos1);
177 if (has_breakage_specs &&
178 bond_breakage.check_and_handle_breakage(
179 aosoa.id(i), {{aosoa.id(j), aosoa.id(k)}}, bond_id,
180 box_geo.get_mi_vector(pos2, pos3).norm())) {
183 if (std::get_if<OifGlobalForcesBond>(&iaparams)) {
190 auto const &forces = result.value();
192 local_force(i, 0) += std::get<0>(forces)[0];
193 local_force(i, 1) += std::get<0>(forces)[1];
194 local_force(i, 2) += std::get<0>(forces)[2];
195 local_force(j, 0) += std::get<1>(forces)[0];
196 local_force(j, 1) += std::get<1>(forces)[1];
197 local_force(j, 2) += std::get<1>(forces)[2];
198 local_force(k, 0) += std::get<2>(forces)[0];
199 local_force(k, 1) += std::get<2>(forces)[1];
200 local_force(k, 2) += std::get<2>(forces)[2];
202 std::array<int, 2> pids = {aosoa.id(j), aosoa.id(k)};
231 auto const &iaparams = *bonded_ias.at(bond_id);
233 auto const pos1 = aosoa.get_vector_at(aosoa.position, i);
234 auto const pos2 = aosoa.get_vector_at(aosoa.position, j);
235 auto const pos3 = aosoa.get_vector_at(aosoa.position, k);
236 auto const pos4 = aosoa.get_vector_at(aosoa.position, m);
237 auto const vel1 = aosoa.get_vector_at(aosoa.velocity, i);
238 auto const vel3 = aosoa.get_vector_at(aosoa.velocity, k);
239 auto const image1 = aosoa.get_vector_at(aosoa.image, i);
242 iaparams, box_geo, pos1, pos2, pos3, pos4, vel1, vel3, image1);
245 auto const &forces = result.value();
247 local_force(i, 0) += std::get<0>(forces)[0];
248 local_force(i, 1) += std::get<0>(forces)[1];
249 local_force(i, 2) += std::get<0>(forces)[2];
250 local_force(j, 0) += std::get<1>(forces)[0];
251 local_force(j, 1) += std::get<1>(forces)[1];
252 local_force(j, 2) += std::get<1>(forces)[2];
253 local_force(k, 0) += std::get<2>(forces)[0];
254 local_force(k, 1) += std::get<2>(forces)[1];
255 local_force(k, 2) += std::get<2>(forces)[2];
256 local_force(m, 0) += std::get<3>(forces)[0];
257 local_force(m, 1) += std::get<3>(forces)[1];
258 local_force(m, 2) += std::get<3>(forces)[2];
260 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 > ScatterVirial
Kokkos::Experimental::ScatterView< double *[3], Kokkos::LayoutRight > ScatterForce
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 KOKKOS_INLINE_FUNCTION 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
ESPRESSO_ATTR_ALWAYS_INLINE KOKKOS_INLINE_FUNCTION void operator()(std::size_t idx) const
DihedralBondsKernel(BondsKernelData data_, LocalBondState::DihedralBondlistType bond_list_, LocalBondState::DihedralBondIDType bond_ids_)
LocalBondState::DihedralBondIDType bond_ids
LocalBondState::DihedralBondlistType bond_list
Kokkos::View< int *[4], Kokkos::LayoutRight > DihedralBondlistType
Kokkos::View< int *[2], Kokkos::LayoutRight > PairBondlistType
Kokkos::View< int *, Kokkos::LayoutRight > DihedralBondIDType
Kokkos::View< int *[3], Kokkos::LayoutRight > AngleBondlistType
Kokkos::View< int *, Kokkos::LayoutRight > PairBondIDType
Kokkos::View< int *, Kokkos::LayoutRight > AngleBondIDType
PairBondsKernel(BondsKernelData data_, LocalBondState::PairBondlistType bond_list_, LocalBondState::PairBondIDType bond_ids_, Coulomb::ShortRangeForceKernel::kernel_type const *coulomb_kernel_)
LocalBondState::PairBondIDType bond_ids
ESPRESSO_ATTR_ALWAYS_INLINE KOKKOS_INLINE_FUNCTION void operator()(std::size_t idx) const
Coulomb::ShortRangeForceKernel::kernel_type const *const coulomb_kernel
LocalBondState::PairBondlistType bond_list