33#include <boost/archive/binary_iarchive.hpp>
34#include <boost/archive/binary_oarchive.hpp>
35#include <boost/iostreams/device/array.hpp>
36#include <boost/iostreams/device/back_inserter.hpp>
37#include <boost/iostreams/stream.hpp>
38#include <boost/serialization/vector.hpp>
53 std::size_t m_size = 0;
56 auto size()
const {
return m_size; }
63 template <
class T>
auto &
operator&(T &t) {
return *
this << t; }
83template <
class Archive>
91#ifdef ESPRESSO_ROTATION
93#ifdef ESPRESSO_ROTATIONAL_INERTIA
100#ifdef ESPRESSO_ELECTROSTATICS
103#ifdef ESPRESSO_DIPOLES
106#ifdef ESPRESSO_LB_ELECTROHYDRODYNAMICS
109#ifdef ESPRESSO_VIRTUAL_SITES_RELATIVE
112#ifdef ESPRESSO_THERMOSTAT_PER_PARTICLE
114#ifdef ESPRESSO_ROTATION
118#ifdef ESPRESSO_EXTERNAL_FORCES
121#ifdef ESPRESSO_ROTATION
125#ifdef ESPRESSO_ENGINE
132 auto pos = p.
pos() + *ghost_shift;
141#ifdef ESPRESSO_BOND_CONSTRAINT
149#ifdef ESPRESSO_ROTATION
156#ifdef ESPRESSO_ROTATION
170#ifdef ESPRESSO_ROTATION
182#ifdef ESPRESSO_BOND_CONSTRAINT
194#ifdef ESPRESSO_DIPOLE_FIELD_TRACKING
213 for (
auto &p : *cell) {
219 unsigned data_parts) {
224 return sizeof_archive.
size();
229 unsigned data_parts) {
231 return sizeof(
unsigned int) * cells.size();
233 auto const n_part = std::accumulate(
234 cells.begin(), cells.end(), std::size_t{0},
235 [](std::size_t sum,
auto part_list) { return sum + part_list->size(); });
242 unsigned data_parts) {
250 namespace io = boost::iostreams;
251 io::stream<io::back_insert_device<std::vector<char>>> os{
252 io::back_inserter(buf.
bonds())};
253 boost::archive::binary_oarchive bond_archiver{os};
256 for (
auto part_list : cells) {
258 assert(part_list->size() <= std::numeric_limits<unsigned int>::max());
259 auto np =
static_cast<unsigned int>(part_list->size());
262 for (
auto &p : *part_list) {
266 bond_archiver << p.bonds();
272 assert(archiver.bytes_written() == buf.
size());
281 for (
auto part_list : cells) {
287 for (
auto part_list : cells) {
288 for (
auto &p : *part_list) {
294 namespace io = boost::iostreams;
295 io::stream<io::array_source> bond_stream(
296 io::array_source{buf.
bonds().data(), buf.
bonds().size()});
297 boost::archive::binary_iarchive bond_archiver(bond_stream);
299 for (
auto part_list : cells) {
300 for (
auto &p : *part_list) {
301 bond_archiver >> p.bonds();
307 assert(archiver.bytes_read() == buf.
size());
313 unsigned data_parts) {
316 for (
auto &part_list : cells) {
321 part.force() += force;
323#ifdef ESPRESSO_ROTATION
327 part.torque() += torque;
334#ifdef ESPRESSO_BOND_CONSTRAINT
338 for (
auto &part_list : cells) {
342 part.rattle_params() += pr;
348#ifdef ESPRESSO_DIPOLE_FIELD_TRACKING
351 for (
auto &part_list : cells) {
355 part.dip_fld() += dip_fld;
363 unsigned data_parts) {
371 for (std::size_t i = 0; i < src.
size(); i++) {
374 auto &p1 = src.
begin()[i];
375 auto &p2 = dst.
begin()[i];
381 p2.bonds() = p1.bonds();
void fold_position(Utils::Vector3d &pos, Utils::Vector3i &image_box) const
Fold coordinates to primary simulation box in-place.
Class that stores marshalled data for ghost communications.
std::size_t size() const
Returns the number of elements in the non-bond storage.
auto & bonds()
Returns a reference to the bond storage.
void resize(std::size_t new_size)
Resizes the underlying storage s.t.
Pseudo-archive to calculate the size of the serialization buffer.
std::size_t size() const
Number of elements in the container.
void resize(std::size_t new_size)
Resize container.
Archive that deserializes from a buffer via memcpy.
Archive that serializes to a buffer via memcpy.
Ghost particles and particle exchange.
@ GHOSTTRANS_MOMENTUM
transfer ParticleMomentum
@ GHOSTTRANS_RATTLE
transfer ParticleRattle
@ GHOSTTRANS_QUAT
transfer orientation quaternion (pushed with position; runtime-conditional)
@ GHOSTTRANS_DIPFLD
transfer dipole field tracking data
@ GHOSTTRANS_PARTNUM
resize the receiver particle arrays to the size of the senders
@ GHOSTTRANS_POSITION
transfer ParticlePosition
@ GHOSTTRANS_PROPRTS
transfer ParticleProperties
@ GHOSTTRANS_FORCE
transfer ParticleForce
@ GHOSTTRANS_TORQUE
transfer torque (reduced with force; runtime-conditional)
void unpack_cells(CommBuf &buf, std::span< ParticleList *const > cells, BoxGeometry const &box_geo, unsigned data_parts)
Unpack particle data from a communication buffer into cells.
void pack_cells(CommBuf &buf, std::span< ParticleList *const > cells, Utils::Vector3d const &shift, BoxGeometry const &box_geo, unsigned data_parts)
Pack particle data from cells into a communication buffer.
void local_cell_copy(ParticleList &src, ParticleList &dst, Utils::Vector3d const &shift, BoxGeometry const &box_geo, unsigned data_parts)
Copy particle data from src to dst applying a ghost shift.
std::size_t calc_transmit_size(BoxGeometry const &box_geo, unsigned data_parts)
Calculate the per-particle transmit size for the given data parts.
void add_forces(CommBuf &buf, std::span< ParticleList *const > cells, unsigned data_parts)
Add forces (and optionally torques) from a communication buffer to particles in cells.
SerializationDirection
Whether to save the state to or load the state from the archive.
void add_dip_fld(CommBuf &buf, std::span< ParticleList *const > cells)
Add dipole fields from a communication buffer to particles.
static void serialize_and_reduce(Archive &ar, Particle &p, unsigned int data_parts, ReductionPolicy policy, SerializationDirection direction, BoxGeometry const &box_geo, Utils::Vector3d const *ghost_shift)
Serialize particle data, possibly with reduction.
ReductionPolicy
Type of reduction to carry out during serialization.
@ UPDATE
Reduction for cell-to-cell particle update.
@ MOVE
Reduction for domain-to-domain particle communication.
static void prepare_ghost_cell(ParticleList *cell, std::size_t size)
void add_rattle(CommBuf &buf, std::span< ParticleList *const > cells)
Add rattle corrections from a communication buffer to particles.
Reusable particle packing/unpacking for ghost communications.
Struct holding all information for one particle.
constexpr auto const & dip_fld() const
constexpr auto const & quat() const
constexpr auto const & pos() const
constexpr auto const & swimming() const
constexpr auto const & rattle_correction() const
constexpr auto const & rinertia() const
constexpr auto const & mass() const
constexpr auto const & dipm() const
constexpr auto const & type() const
constexpr auto const & omega() const
constexpr auto const & ext_force() const
constexpr auto const & propagation() const
constexpr auto const & ext_torque() const
constexpr auto const & rotation() const
constexpr auto const & force() const
constexpr auto const & vs_relative() const
constexpr auto const & fixed() const
constexpr auto const & gamma() const
constexpr auto const & gamma_rot() const
constexpr auto const & image_box() const
constexpr auto const & mu_E() const
constexpr auto const & id() const
constexpr auto const & mol_id() const
constexpr auto const & q() const
constexpr auto const & pos_last_time_step() const
constexpr auto const & v() const
constexpr auto const & torque() const