78 auto const thread_id = omp_get_thread_num();
82 auto const &iaparams = *bonded_ias.at(bond_id);
85 box_geo.get_mi_vector(aosoa.get_vector_at(aosoa.position, i),
86 aosoa.get_vector_at(aosoa.position, j));
88 if (has_breakage_specs &&
89 bond_breakage.check_and_handle_breakage(
90 aosoa.id(i), {{aosoa.id(j), std::nullopt}}, bond_id, dx.norm())) {
94 if (
auto const *iap = std::get_if<ThermalizedBond>(&iaparams)) {
95 auto const result = iap->forces(
97 aosoa.mass(i), aosoa.mass(j),
101 aosoa.get_vector_at(aosoa.velocity, i),
102 aosoa.get_vector_at(aosoa.velocity, j), aosoa.id(i), aosoa.id(j), dx);
104 auto const &forces = result.value();
106 local_force(i, thread_id, 0) += std::get<0>(forces)[0];
107 local_force(i, thread_id, 1) += std::get<0>(forces)[1];
108 local_force(i, thread_id, 2) += std::get<0>(forces)[2];
109 local_force(j, thread_id, 0) += std::get<1>(forces)[0];
110 local_force(j, thread_id, 1) += std::get<1>(forces)[1];
111 local_force(j, thread_id, 2) += std::get<1>(forces)[2];
113 auto partner_id = aosoa.id(j);
121#ifdef ESPRESSO_ELECTROSTATICS
129 auto const f = result.value();
130 local_force(i, thread_id, 0) += f[0];
131 local_force(i, thread_id, 1) += f[1];
132 local_force(i, thread_id, 2) += f[2];
133 local_force(j, thread_id, 0) -= f[0];
134 local_force(j, thread_id, 1) -= f[1];
135 local_force(j, thread_id, 2) -= f[2];
138 local_virial(thread_id, 0) += virial[0];
139 local_virial(thread_id, 1) += virial[1];
140 local_virial(thread_id, 2) += virial[2];
143 auto partner_id = aosoa.id(j);