30#include "collision_detection/CollisionDetection.hpp"
32#include "constraints/Constraints.hpp"
35#include "galilei/ComFixed.hpp"
47#include "system/System.hpp"
56#ifdef ESPRESSO_CALIPER
57#include <caliper/cali.h>
60#include <Cabana_Core.hpp>
73#ifdef ESPRESSO_EXTERNAL_FORCES
75#ifdef ESPRESSO_ROTATION
93#ifdef ESPRESSO_CALIPER
94 CALI_CXX_MARK_FUNCTION;
100 auto const kT = thermostat.kT;
104 bool const langevin_active =
105 thermostat.langevin &&
106 (propagation.used_propagations &
110 cell_structure.for_each_local_particle([&](
Particle &p) {
115 if (langevin_active) {
116 auto const &langevin = *thermostat.langevin;
119#ifdef ESPRESSO_ROTATION
126 cell_structure.reset_local_force();
129 cell_structure.ghosts_reset_forces();
133 if (force_cap > 0.) {
134 auto const force_cap_sq =
Utils::sqr(force_cap);
136 [&force_cap, &force_cap_sq](
Particle &p) {
137 auto const force_sq = p.
force().norm2();
138 if (force_sq > force_cap_sq) {
139 p.
force() *= force_cap / std::sqrt(force_sq);
145#ifdef ESPRESSO_DIPOLE_FIELD_TRACKING
173 auto const &elc_kernel,
auto const &coulomb_kernel,
174 auto const &dipoles_kernel,
auto const &coulomb_u_kernel) {
176 auto const &unique_particles = system.
cell_structure->get_unique_particles();
177 auto const &local_force = system.
cell_structure->get_local_force();
178#ifdef ESPRESSO_ROTATION
179 auto const &local_torque = system.
cell_structure->get_local_torque();
182 auto const &local_virial = system.
cell_structure->get_local_virial();
197#ifdef ESPRESSO_ROTATION
210 auto const &unique_particles = system.
cell_structure->get_unique_particles();
211 auto const &local_force = system.
cell_structure->get_local_force();
212#ifdef ESPRESSO_ROTATION
213 auto const &local_torque = system.
cell_structure->get_local_torque();
216 auto const &local_virial = system.
cell_structure->get_local_virial();
219 using execution_space = Kokkos::DefaultExecutionSpace;
220 int num_threads = execution_space().concurrency();
221 Kokkos::RangePolicy<execution_space> policy(std::size_t{0},
222 unique_particles.size());
223 Kokkos::parallel_for(
"reduction", policy,
225#ifdef ESPRESSO_ROTATION
228 &unique_particles, num_threads](std::size_t
const i) {
230#ifdef ESPRESSO_ROTATION
233 for (
int tid = 0; tid < num_threads; ++tid) {
234 force[0] += local_force(i, tid, 0);
235 force[1] += local_force(i, tid, 1);
236 force[2] += local_force(i, tid, 2);
237#ifdef ESPRESSO_ROTATION
238 torque[0] += local_torque(i, tid, 0);
239 torque[1] += local_torque(i, tid, 1);
240 torque[2] += local_torque(i, tid, 2);
243 unique_particles.at(i)->force() += force;
244#ifdef ESPRESSO_ROTATION
245 unique_particles.at(i)->torque() += torque;
252 for (
int tid = 0; tid < num_threads; ++tid) {
253 (*virial)[0] += local_virial(tid, 0);
254 (*virial)[1] += local_virial(tid, 1);
255 (*virial)[2] += local_virial(tid, 2);
262#ifdef ESPRESSO_CALIPER
263 CALI_CXX_MARK_FUNCTION;
267#ifdef ESPRESSO_CALIPER
268 CALI_MARK_BEGIN(
"copy_particles_to_GPU");
271#ifdef ESPRESSO_CALIPER
272 CALI_MARK_END(
"copy_particles_to_GPU");
277#ifdef ESPRESSO_COLLISION_DETECTION
278 collision_detection->clear_queue();
279 auto const collision_detection_cutoff = collision_detection->cutoff();
283 bond_breakage->clear_queue();
284 auto particles = cell_structure->local_particles();
291#ifdef ESPRESSO_DIPOLE_FIELD_TRACKING
298 auto const elc_kernel = coulomb.pair_force_elc_kernel();
299 auto const coulomb_kernel = coulomb.pair_force_kernel();
300 auto const dipoles_kernel = dipoles.pair_force_kernel();
301 auto const coulomb_u_kernel = coulomb.pair_energy_kernel();
302 auto *
const virial = get_npt_virial();
305 cell_structure->get_verlet_skin(),
306 get_interaction_range(),
309 collision_detection_cutoff};
312 get_interaction_range(), propagation->integ_switch);
313#ifdef ESPRESSO_ELECTROSTATICS
314 if (coulomb.impl->extension) {
315 update_icc_particles();
319#ifdef ESPRESSO_CALIPER
320 CALI_MARK_BEGIN(
"calc_long_range_forces");
322#ifdef ESPRESSO_ELECTROSTATICS
323 coulomb.calc_long_range_force();
325#ifdef ESPRESSO_DIPOLES
326 dipoles.calc_long_range_force();
328#ifdef ESPRESSO_CALIPER
329 CALI_MARK_END(
"calc_long_range_forces");
332#ifdef ESPRESSO_CALIPER
333 CALI_MARK_BEGIN(
"cabana_short_range");
335 auto &bs = cell_structure->bond_state();
338 bonds_kernel_data, bs.pair_list, bs.pair_ids,
get_ptr(coulomb_kernel)};
339 auto angle_bonds_kernel =
341 auto dihedral_bonds_kernel =
344 auto first_neighbor_kernel =
346 dipoles_kernel, coulomb_u_kernel);
349 dihedral_bonds_kernel, first_neighbor_kernel,
350 *cell_structure, get_interaction_range(),
351 bonded_ias->maximal_cutoff(), verlet_criterion,
352 propagation->integ_switch);
357#ifdef ESPRESSO_COLLISION_DETECTION
358 auto collision_kernel = [&collision_detection = *collision_detection](
361 collision_detection.detect_collision(p1, p2, d.dist2);
363 if (not collision_detection->is_off()) {
364 cell_structure->non_bonded_loop(collision_kernel, verlet_criterion);
368#ifdef ESPRESSO_CALIPER
369 CALI_MARK_END(
"cabana_short_range");
372 constraints->add_forces(particles, get_sim_time());
373 oif_global->calculate_forces();
376 immersed_boundaries->volume_conservation(*cell_structure);
378 if (thermostat->lb and (propagation->used_propagations &
380#ifdef ESPRESSO_CALIPER
381 CALI_MARK_BEGIN(
"lb_particle_coupling");
383 lb_couple_particles();
384#ifdef ESPRESSO_CALIPER
385 CALI_MARK_END(
"lb_particle_coupling");
391#ifdef ESPRESSO_CALIPER
392 CALI_MARK_BEGIN(
"copy_forces_from_GPU");
394 gpu->copy_forces_to_host(particles,
this_node);
396#ifdef ESPRESSO_DIPOLE_FIELD_TRACKING
397 gpu->copy_dip_fld_to_host(particles,
this_node);
400#ifdef ESPRESSO_CALIPER
401 CALI_MARK_END(
"copy_forces_from_GPU");
406#ifdef ESPRESSO_VIRTUAL_SITES_RELATIVE
407 if (propagation->used_propagations &
413#ifdef ESPRESSO_VIRTUAL_SITES_CENTER_OF_MASS
414 if (propagation->used_propagations &
421 cell_structure->ghosts_reduce_forces();
424 comfixed->apply(particles);
430 propagation->recalc_forces =
false;
Vector implementation and trait types for boost qvm interoperability.
This file contains everything related to the global cell structure / cell system.
Describes a cell structure / cell system.
void for_each_local_particle(ParticleUnaryOp &&f, bool parallel=true) const
Run a kernel on all local particles.
double maximal_cutoff() const
Calculate the maximal cutoff of all interactions.
auto get_time_step() const
Get time_step.
std::shared_ptr< BondedInteractionsMap > bonded_ias
std::shared_ptr< BondBreakage::BondBreakage > bond_breakage
void calculate_forces()
Calculate all forces.
std::shared_ptr< Propagation > propagation
std::shared_ptr< Thermostat::Thermostat > thermostat
std::shared_ptr< CellStructure > cell_structure
std::shared_ptr< BoxGeometry > box_geo
std::shared_ptr< InteractionsNonBonded > nonbonded_ias
Returns true if the particles are to be considered for short range interactions.
void vs_com_back_transfer_forces_and_torques(CellStructure &cell_structure)
int this_node
The number of this node.
constexpr double inactive_cutoff
Special cutoff value for an inactive interaction.
const T * get_ptr(std::optional< T > const &opt)
static BondsKernelData create_kokkos_bonds_kernel_data(System::System const &system)
static void reinit_dip_fld(CellStructure const &cell_structure)
static void force_capping(CellStructure &cell_structure, double force_cap)
static void init_forces_and_thermostat(System::System const &system)
Combined force initialization and Langevin noise application.
static ParticleForce external_force(Particle const &p)
External particle forces.
static ForcesKernel create_cabana_neighbor_kernel(System::System const &system, Utils::Vector3d *virial, auto const &elc_kernel, auto const &coulomb_kernel, auto const &dipoles_kernel, auto const &coulomb_u_kernel)
static void reduce_cabana_forces_and_torques(System::System const &system, Utils::Vector3d *virial)
ICC is a method that allows to take into account the influence of arbitrarily shaped dielectric inter...
Utils::Vector3d friction_thermo_langevin(LangevinThermostat const &langevin, Particle const &p, double time_step, double kT)
Langevin thermostat for particle translational velocities.
Utils::Vector3d friction_thermo_langevin_rotation(LangevinThermostat const &langevin, Particle const &p, double time_step, double kT)
Langevin thermostat for particle angular velocities.
@ TRANS_VS_CENTER_OF_MASS
@ TRANS_LB_MOMENTUM_EXCHANGE
DEVICE_QUALIFIER constexpr T sqr(T x)
Calculates the SQuaRe of x.
Various procedures concerning interactions between particles.
Exports for the NpT code.
void vs_relative_back_transfer_forces_and_torques(CellStructure &cell_structure)
This file contains all subroutines required to process rotational motion.
Utils::Vector3d convert_vector_body_to_space(const Particle &p, const Utils::Vector3d &vec)
ESPRESSO_ATTR_ALWAYS_INLINE void update_cabana_state(CellStructure &cell_structure, auto const &verlet_criterion, double const pair_cutoff, auto const integ_switch)
void cabana_short_range(auto const &pair_bonds_kernel, auto const &angle_bonds_kernel, auto const &dihedral_bonds_kernel, auto const &nonbonded_kernel, CellStructure &cell_structure, double pair_cutoff, double bond_cutoff, auto const &verlet_criterion, auto const integ_switch)
Distance vector and length handed to pair kernels.
Force information on a particle.
Utils::Vector3d torque
torque.
Struct holding all information for one particle.
auto const & dip_fld() const
auto const & swimming() const
auto const & force_and_torque() const
auto const & torque() const
auto const & ext_force() const
auto const & ext_torque() const
auto const & force() const
auto calc_director() const