1#ifndef OPALX_SAMPLING_BASE_H
2#define OPALX_SAMPLING_BASE_H
17 std::shared_ptr<ParticleContainer_t>
pc_m;
18 std::shared_ptr<FieldContainer_t>
fc_m;
37 std::shared_ptr<ParticleContainer_t> pc, std::shared_ptr<FieldContainer_t> fc,
41 SamplingBase(std::shared_ptr<ParticleContainer_t> pc, std::shared_ptr<FieldContainer_t> fc)
49 ippl::Vector<double, 3> R0, ippl::Vector<double, 3> P0,
double t0,
50 const std::string& emissionModel =
"NONE") {
64 if (count == 0 || !
pc_m->hasSpin()) {
67 auto Polview =
pc_m->Pol.getView();
73 "SamplingBase::fillPolarization", count,
74 KOKKOS_LAMBDA(
const size_t k) { Polview(startIdx + k) = spin_t{px, py, pz}; });
ippl::Vector< T, Dim > Vector_t
typename ippl::detail::ViewType< ippl::Vector< double, Dim >, 1 >::view_type view_type
typename ippl::detail::ViewType< Vector_t< double, 3 >, 1 >::view_type view_type
Container for all per-particle (and per-simulation) fields tracked during OPALX tracking.
ippl::Vector< float, 3 > spin_vector_type
void setInitialPolarization(const ippl::Vector< double, 3 > &pol)
virtual void emitParticles(double, double)
virtual void testEmitParticles(size_t, double)
Vector_t< double, 3 > P0_m
virtual void testNumEmitParticles(size_t, double)
void setEmissionOffsets(ippl::Vector< double, 3 > R0, ippl::Vector< double, 3 > P0, double t0, const std::string &emissionModel="NONE")
virtual double getGlobalTimeShift() const
Optional tracker time shift needed before the first emitted particles are born.
Vector_t< double, 3 > R0_m
Emission source offset: position R0, momentum P0, start time t0 (applied in sample step).
bool hasEmittedOnce_m
For one-shot emitters (e.g. Gaussian at delayed t0): guard to avoid double sampling.
std::shared_ptr< FieldContainer_t > fc_m
virtual void setWithDomainDecomp(bool)
Vector_t< double, 3 > getEmissionR0() const
SamplingBase(std::shared_ptr< ParticleContainer_t > pc, std::shared_ptr< FieldContainer_t > fc, Distribution_t *dist)
size_t computeLocalEmitCount(size_t totalToSample) const
Computes the number of particles this rank should emit so that the global total equals totalToSample ...
std::string emissionModel_m
std::string samplingMethod_m
virtual bool isEmissionDone(double t) const
Whether this sampler has finished all emission (no more particles will be created).
virtual double getEmissionTimeStep() const
Optional OPAL-like tracker time step while this sampler is still emitting.
virtual void generateParticles(size_t &, Vector_t< double, 3 >)
virtual Vector_t< double, 3 > getInitialReferenceMomentum() const
Distribution_t * opalDist_m
virtual void initDomainDecomp(double)
SamplingBase(std::shared_ptr< ParticleContainer_t > pc)
void fillPolarization(size_t startIdx, size_t count)
virtual bool hasInitialReferenceMomentum() const
Optional initial reference momentum in the source-local frame.
SamplingBase(std::shared_ptr< ParticleContainer_t > pc, std::shared_ptr< FieldContainer_t > fc)
Vector_t< double, 3 > initialPol_m
std::shared_ptr< ParticleContainer_t > pc_m