29#include "constraints/Constraints.hpp"
40#include "system/System.hpp"
55 Kokkos::View<double **, Kokkos::LayoutRight, execution_space>
local;
62 if (
not m_obs_energy) {
64 m_obs_energy = std::make_shared<EnergyObservable>();
65 m_obs_energy->observable = std::make_unique<Observable_stat>(1ul, 0
ul, 0);
67 decltype(m_obs_energy->local)(
"local_energy",
n_threads, 1ul);
70 auto &local_energy = m_obs_energy->local;
72 obs_energy.reset(
static_cast<std::size_t
>(bonded_ias->get_next_key()),
73 nonbonded_ias->get_max_seen_particle_type());
75 if (long_range_interactions_sanity_checks()) {
79#if defined(ESPRESSO_CUDA) and \
80 (defined(ESPRESSO_ELECTROSTATICS) or defined(ESPRESSO_DIPOLES))
81 gpu->clear_energy_on_device();
86 auto const local_parts = cell_structure->local_particles();
93 auto const coulomb_kernel = coulomb.pair_energy_kernel();
94 auto const dipoles_kernel = dipoles.pair_energy_kernel();
96#ifdef ESPRESSO_CALIPER
103 cell_structure->get_verlet_skin(),
104 get_interaction_range(),
112 static_cast<std::size_t
>(bonded_ias->get_next_key()),
113 std::size_t(nonbonded_ias->get_max_seen_particle_type() + 1)};
115 using exec = Kokkos::DefaultHostExecutionSpace;
116 if (local_energy.extent(1) != layout.total) {
117 Kokkos::realloc(Kokkos::WithoutInitializing, local_energy,
118 exec{}.concurrency(), layout.total);
122 auto const &unique_particles = cell_structure->get_unique_particles();
123 auto const n_particles = unique_particles.size();
124 Kokkos::View<int *, Kokkos::LayoutRight, exec> mol_id(
"mol_id", n_particles);
125 for (std::size_t i = 0; i < n_particles; ++i) {
126 mol_id(i) = unique_particles[i]->mol_id();
136 cell_structure->get_unique_particles(),
139 cell_structure->get_aosoa(),
144 auto &
bs = cell_structure->bond_state();
146 layout, cell_structure->get_aosoa()};
157 propagation->integ_switch);
160 nonbonded_ias->get_max_seen_particle_type() + 1);
161#ifdef ESPRESSO_CALIPER
165#ifdef ESPRESSO_ELECTROSTATICS
167 obs_energy.coulomb[1] = coulomb.calc_energy_long_range();
170#ifdef ESPRESSO_DIPOLES
172 obs_energy.dipolar[1] = dipoles.calc_energy_long_range();
177#if defined(ESPRESSO_CUDA) and \
178 (defined(ESPRESSO_ELECTROSTATICS) or defined(ESPRESSO_DIPOLES))
179 auto const energy_host = gpu->copy_energy_to_host();
192 if (cell_structure->get_resort_particles()) {
193 cell_structure->update_ghosts_and_resort_particle(get_global_ghost_flags());
197 if (
auto const p = cell_structure->get_local_particle(pid)) {
198 auto const coulomb_kernel = coulomb.pair_energy_kernel();
201#ifdef ESPRESSO_EXCLUSIONS
205 auto const &
ia_params = nonbonded_ias->get_ia_param(p.type(),
p1.type());
208 *bonded_ias, coulomb,
nullptr);
210 cell_structure->run_on_particle_short_range_neighbors(*p, kernel);
217 if (cell_structure->get_resort_particles()) {
218 cell_structure->update_ghosts_and_resort_particle(get_global_ghost_flags());
220 Particle const *p = cell_structure->get_local_particle(pid);
223 auto const &
iaparams = *bonded_ias->at(bond_id);
226 auto const coulomb_kernel = coulomb.pair_energy_kernel();
void bond_broken_error(int id, std::span< const int > partner_ids)
Observable for the pressure and energy.
double particle_short_range_energy_contribution(int pid)
Compute the short-range energy of a particle.
std::optional< double > particle_bond_energy(int pid, int bond_id, std::vector< int > partners)
Compute the energy of a given bond which has to exist on the given particle.
Observable_stat const & calculate_energy()
Calculate the total energy.
Returns true if the particles are to be considered for short range interactions.
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
constexpr double inactive_cutoff
Special cutoff value for an inactive interaction.
const T * get_ptr(std::optional< T > const &opt)
static void reduce_cabana_energy(Kokkos::View< double **, Kokkos::LayoutRight, Kokkos::HostSpace > const &local_energy, EnergyBinLayout const &layout, Observable_stat &obs, BondedInteractionsMap const &bonded_ias, int n_types)
std::optional< double > calc_bonded_energy(Bonded_IA_Parameters const &iaparams, Particle const &p1, std::span< Particle * > partners, BoxGeometry const &box_geo, Coulomb::ShortRangeEnergyKernel::kernel_type const *kernel)
double translational_kinetic_energy(Particle const &p)
Calculate kinetic energies from translation for one particle.
double rotational_kinetic_energy(Particle const &p)
Calculate kinetic energies from rotation for one particle.
double calc_non_bonded_pair_energy(Particle const &p1, Particle const &p2, IA_parameters const &ia_params, Utils::Vector3d const &d, double const dist, BondedInteractionsMap const &bonded_ias, Coulomb::Solver const &coulomb, Coulomb::ShortRangeEnergyKernel::kernel_type const *coulomb_kernel)
Calculate non-bonded energies between a pair of particles.
bool do_nonbonded(Particle const &p1, Particle const &p2)
Determine if the non-bonded interactions between p1 and p2 should be calculated.
ESPRESSO_ATTR_ALWAYS_INLINE void kokkos_deep_copy(auto const &exec_space, auto const &view, auto const &value)
Wrapper for Kokkos::deep_copy that skips fork/join when the number of threads is 1.
Various procedures concerning interactions between particles.
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 &make_verlet_criterion, auto const integ_switch, ShortRangeVerletPairLoop const &verlet_pair_loop={})
void update_verlet_state(System::System const &system, double const collision_cut)
Exception indicating that a particle id could not be resolved.
std::unique_ptr< Observable_stat > observable
Kokkos::DefaultHostExecutionSpace execution_space
Kokkos::View< double **, Kokkos::LayoutRight, execution_space > local
Struct holding all information for one particle.
constexpr auto const & id() const
constexpr bool is_ghost() const