1#ifndef OPALX_IMAGE_CHARGE_SCATTER_CONTROLLER_H
2#define OPALX_IMAGE_CHARGE_SCATTER_CONTROLLER_H
4#include "Interpolation/CIC.h"
25template <
typename T,
unsigned Dim>
27 static_assert(
Dim == 3,
"ImageChargeScatterController currently supports Dim == 3 only.");
32 ippl::ParticleSpatialLayout<T, Dim>,
33 Kokkos::DefaultExecutionSpace::memory_space>::particle_position_type;
168 std::shared_ptr<ParticleCtr_t> pc,
PositionAttr_t& positions)
const;
179 std::shared_ptr<ParticleCtr_t> pc,
PositionAttr_t& positions)
const;
190 const Hash_t& hash)
const;
204 const Hash_t& hash)
const;
225 std::shared_ptr<ParticleCtr_t> pc,
const BinPolicy_t& policy,
const Hash_t& hash)
const;
232#include "PartBunch/ImageChargeScatterController.tpp"
Defines a structure to hold particles in energy bins and their associated data.
ippl::Field< double, Dim, ViewArgs... > Field_t
Orchestrates primary and image-charge scatter deposition.
Kokkos::RangePolicy<> BinPolicy_t
void scatterScaledDtSubset(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho, const BinPolicy_t &policy, const Hash_t &hash) const
Scatter a hashed particle subset using the standard dt*Q workflow.
void scatterImageOnly(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho) const
Scatter only the image (mirrored) charges for all local particles.
double getZPlane() const
Returns the mirror plane position in z.
void configure(bool enabled, double zPlane)
Update runtime settings.
ImageChargeScatterController()=default
Construct disabled controller at zPlane=0.
typename ippl::ParticleBase< ippl::ParticleSpatialLayout< T, Dim >, Kokkos::DefaultExecutionSpace::memory_space >::particle_position_type PositionAttr_t
typename ParticleBinning::AdaptBinsBase< ParticleCtr_t >::hash_type Hash_t
void accumulateScalarHaloHostStaged(RhoField_t &rho) const
Accumulate scalar field halo contributions through host-staged MPI buffers.
void scatterPrimaryAndImage(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho, const BinPolicy_t &policy, const Hash_t &hash) const
Scatter a bin-restricted particle subset with optional image pass.
bool isEnabled() const
Returns whether image-charge scatter is enabled.
void applyMirrorTransformSubset(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, const BinPolicy_t &policy, const Hash_t &hash) const
Apply z-mirror and charge sign flip for a hashed particle subset.
Field_t< Dim > RhoField_t
void flipChargeSignSubset(std::shared_ptr< ParticleCtr_t > pc, const BinPolicy_t &policy, const Hash_t &hash) const
Flip charge sign for a hashed particle subset.
void restoreMirrorTransformAll(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions) const
Restore z-mirror and charge sign flip for all local particles.
ImageChargeScatterController(bool enabled, double zPlane)
Construct controller with explicit image-charge settings.
void scatterPrimaryOnly(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho) const
Scatter only the primary (real) charges for all local particles.
void scatterImageOnly(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho, const BinPolicy_t &policy, const Hash_t &hash) const
Scatter only the image (mirrored) charges for a bin-restricted subset.
void scatterScaledDtAll(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho) const
Scatter all local particles using the standard dt*Q workflow.
void restoreMirrorTransformSubset(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, const BinPolicy_t &policy, const Hash_t &hash) const
Restore z-mirror and charge sign flip for a hashed particle subset.
void scatterPrimaryOnly(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho, const BinPolicy_t &policy, const Hash_t &hash) const
Scatter only the primary (real) charges for a bin-restricted subset.
void applyMirrorTransformAll(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions) const
Apply z-mirror and charge sign flip for all local particles.
void scatterPrimaryAndImage(std::shared_ptr< ParticleCtr_t > pc, PositionAttr_t &positions, RhoField_t &rho) const
Scatter all local particles with optional image pass.
void flipChargeSignAll(std::shared_ptr< ParticleCtr_t > pc) const
Flip charge sign for all local particles.
ippl::detail::hash_type< Kokkos::DefaultExecutionSpace::memory_space > hash_type
Container for all per-particle (and per-simulation) fields tracked during OPALX tracking.