OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
SamplingBase.hpp
Go to the documentation of this file.
1#ifndef OPALX_SAMPLING_BASE_H
2#define OPALX_SAMPLING_BASE_H
3
4#include <memory>
5#include "Distribution.h"
6#include "Ippl.h"
8
12
13using view_type = typename ippl::detail::ViewType<Vector_t<double, 3>, 1>::view_type;
14
16protected:
17 std::shared_ptr<ParticleContainer_t> pc_m;
18 std::shared_ptr<FieldContainer_t> fc_m;
20 std::string samplingMethod_m;
24 double t0_m = 0.0;
25 std::string emissionModel_m = "NONE";
26
31
33 bool hasEmittedOnce_m = false;
34
35public:
37 std::shared_ptr<ParticleContainer_t> pc, std::shared_ptr<FieldContainer_t> fc,
38 Distribution_t* dist)
39 : pc_m(pc), fc_m(fc), opalDist_m(dist) {}
40
41 SamplingBase(std::shared_ptr<ParticleContainer_t> pc, std::shared_ptr<FieldContainer_t> fc)
42 : pc_m(pc), fc_m(fc) {}
43
44 SamplingBase(std::shared_ptr<ParticleContainer_t> pc) : pc_m(pc) {}
45
46 virtual ~SamplingBase() {}
47
49 ippl::Vector<double, 3> R0, ippl::Vector<double, 3> P0, double t0,
50 const std::string& emissionModel = "NONE") {
51 R0_m = R0;
52 P0_m = P0;
53 t0_m = t0;
54 emissionModel_m = emissionModel;
55 }
56
57 void setInitialPolarization(const ippl::Vector<double, 3>& pol) { initialPol_m = pol; }
58
63 void fillPolarization(size_t startIdx, size_t count) {
64 if (count == 0 || !pc_m->hasSpin()) {
65 return;
66 }
67 auto Polview = pc_m->Pol.getView();
68 using spin_t = typename ParticleContainer_t::spin_vector_type;
69 const auto px = static_cast<float>(initialPol_m[0]);
70 const auto py = static_cast<float>(initialPol_m[1]);
71 const auto pz = static_cast<float>(initialPol_m[2]);
72 Kokkos::parallel_for(
73 "SamplingBase::fillPolarization", count,
74 KOKKOS_LAMBDA(const size_t k) { Polview(startIdx + k) = spin_t{px, py, pz}; });
75 Kokkos::fence();
76 }
77
79
80 virtual void generateParticles(size_t& /*numberOfParticles*/, Vector_t<double, 3> /*nr*/) {}
81
82 virtual void emitParticles(double /*t*/, double /*dt*/) {}
83
86 virtual bool isEmissionDone(double t) const {
87 (void)t;
88 return hasEmittedOnce_m;
89 }
90
92 virtual double getGlobalTimeShift() const { return 0.0; }
93
95 virtual bool hasInitialReferenceMomentum() const { return false; }
96
100
102 virtual double getEmissionTimeStep() const { return 0.0; }
103
104 // testNumEmitParticles is purely made for testing and should be removed
105 virtual void testNumEmitParticles(size_t /*nsteps*/, double /*dt*/) {}
106
107 // testEmitParticles is purely made for testing and should be removed
108 virtual void testEmitParticles(size_t /*nsteps*/, double /*dt*/) {}
109
110 virtual void initDomainDecomp(double /*BoxIncr*/) {}
111
112 virtual void setWithDomainDecomp(bool /*withDomainDecomp*/) {}
113
120 size_t computeLocalEmitCount(size_t totalToSample) const;
121};
122#endif // OPALX_SAMPLING_BASE_H
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).
virtual ~SamplingBase()
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