OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
BeamStrippingPhysics.hh
Go to the documentation of this file.
1 #ifndef BEAMSTRIPPINGPHYSICS_HH
2 #define BEAMSTRIPPINGPHYSICS_HH
3 
4 // ------------------------------------------------------------------------
5 //
6 // Class: BeamStrippingPhysics
7 // Defines the beam stripping physics models
8 //
9 // ------------------------------------------------------------------------
10 // Class category: ParticleMatterInteraction
11 // ------------------------------------------------------------------------
12 // $Date: 2018/11 $
13 // $Author: PedroCalvo$
14 //-------------------------------------------------------------------------
15 
16 #include "AbsBeamline/Component.h"
18 #include "Algorithms/Vektor.h"
20 
21 #include <gsl/gsl_math.h>
22 #include <gsl/gsl_rng.h>
23 
24 template <class T, unsigned Dim>
25 
26 class PartBunchBase;
27 class LossDataSink;
28 class Inform;
29 class Cyclotron;
30 class BeamStripping;
31 
33 
34 public:
35 
36  BeamStrippingPhysics(const std::string &name, ElementBase *element);
38 
39  void setCyclotron(Cyclotron* cycl) { cycl_m = cycl; };
40 
41  void apply(PartBunchBase<double, 3> *bunch,
42  const std::pair<Vector_t, double> &boundingSphere,
43  size_t numParticlesInSimulation = 0);
44 
45  virtual const std::string getType() const;
46  void print(Inform& msg);
47  bool stillActive();
49 
50  inline double getTime() {return T_m;}
51  std::string getName() {return element_ref_m->getName();}
53  unsigned getRediffused() {return rediffusedStat_m;}
54  unsigned int getNumEntered() {return bunchToMatStat_m;}
55  inline void doPhysics(PartBunchBase<double, 3> *bunch);
56 
57 private:
58 
59  void crossSection(const Vector_t &R, double Eng);
60 
61  double csAnalyticFunctionNakai(double Eng, double Eth, int &i);
62 
63  double csAnalyticFunctionTabata(double Eng, double Eth,
64  double a1, double a2, double a3, double a4, double a5, double a6);
65 
66  double csChebyshevFitting(double Eng, double Emin, double Emax);
67 
68  bool gasStripping(double &deltas);
69 
70  bool lorentzStripping(double &gamma, double &E);
71 
72  void secondaryParticles(PartBunchBase<double, 3> *bunch, size_t &i, bool pdead_LS);
73  void transformToProton(PartBunchBase<double, 3> *bunch, size_t &i);
74  void transformToHydrogen(PartBunchBase<double, 3> *bunch, size_t &i);
75  void transformToHminus(PartBunchBase<double, 3> *bunch, size_t &i);
76  void transformToH3plus(PartBunchBase<double, 3> *bunch, size_t &i);
77 
79  const double deltat,
80  bool includeFluctuations = true) const { return false;}
81 
85 
86  gsl_rng * r_m;
87 
88  double T_m;
89  double dT_m;
90 
91  double mass_m;
92  double charge_m;
93 
94  std::string gas_m;
95  double pressure_m;
96 
97  std::unique_ptr<LossDataSink> lossDs_m;
98 
99  double NCS_a;
100  double NCS_b;
101  double NCS_c;
102  double NCS_total;
103 
108 
109  static const double csCoefSingle_Hminus[3][9];
110  static const double csCoefDouble_Hminus[3][9];
111  static const double csCoefSingle_Hplus[3][9];
112  static const double csCoefDouble_Hplus[3][9];
113  static const double csCoefSingleLoss_H[3][9];
114  static const double csCoefSingleCapt_H[3][9];
115 
116  static const double csCoefHminusProduction_H_Tabata[13];
117  static const double csCoefProtonProduction_H_Tabata[9];
118  static const double csCoefProtonProduction_H2plus_Tabata[11];
119  static const double csCoefH3plusProduction_H2plus_Tabata[7];
120 
121  static const double csCoefSingle_Hminus_Chebyshev[11];
122  static const double csCoefDouble_Hminus_Chebyshev[11];
123  static const double csCoefSingle_Hplus_Chebyshev[11];
124  static const double csCoefDouble_Hplus_Chebyshev[11];
126 
127  static double a_m[9];
128  static double b_m[3][9];
129 };
130 
131 #endif //BEAMSTRIPPINGPHYSICS_HH
Interface for basic beam line object.
Definition: ElementBase.h:128
std::unique_ptr< LossDataSink > lossDs_m
Definition: TSVMeta.h:24
static const double csCoefDouble_Hminus[3][9]
static const double csCoefSingle_Hplus_Chebyshev[11]
void crossSection(const Vector_t &R, double Eng)
void apply(PartBunchBase< double, 3 > *bunch, const std::pair< Vector_t, double > &boundingSphere, size_t numParticlesInSimulation=0)
Interface for a Cyclotron.
Definition: Cyclotron.h:91
static const double csCoefSingleCapt_H[3][9]
static const double csCoefDouble_Hplus_Chebyshev[11]
static const double csCoefSingle_Hminus[3][9]
virtual const std::string getType() const
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
void setCyclotron(Cyclotron *cycl)
bool stillAlive(PartBunchBase< double, 3 > *bunch)
void secondaryParticles(PartBunchBase< double, 3 > *bunch, size_t &i, bool pdead_LS)
static const double csCoefSingle_Hplus[3][9]
static const double csCoefProtonProduction_H2plus_Tabata[11]
static const double csCoefH3plusProduction_H2plus_Tabata[7]
double csAnalyticFunctionNakai(double Eng, double Eth, int &i)
Class: DataSink.
Definition: OpalData.h:29
bool lorentzStripping(double &gamma, double &E)
static const double csCoefSingleLoss_H[3][9]
ElementBase::ElementType bstpshape_m
static const double csCoefDouble_Hminus_Chebyshev[11]
void transformToHminus(PartBunchBase< double, 3 > *bunch, size_t &i)
void doPhysics(PartBunchBase< double, 3 > *bunch)
static const double csCoefDouble_Hplus[3][9]
void transformToH3plus(PartBunchBase< double, 3 > *bunch, size_t &i)
void transformToProton(PartBunchBase< double, 3 > *bunch, size_t &i)
bool gasStripping(double &deltas)
static const double csCoefProtonProduction_H_Tabata[9]
const std::string name
bool computeEnergyLoss(Vector_t &P, const double deltat, bool includeFluctuations=true) const
static const double csCoefHminusProduction_H_Tabata[13]
BeamStrippingPhysics(const std::string &name, ElementBase *element)
double csChebyshevFitting(double Eng, double Emin, double Emax)
static const double csCoefHydrogenProduction_H2plus_Chebyshev[11]
Definition: Inform.h:41
static double b_m[3][9]
static const double csCoefSingle_Hminus_Chebyshev[11]
void transformToHydrogen(PartBunchBase< double, 3 > *bunch, size_t &i)
double csAnalyticFunctionTabata(double Eng, double Eth, double a1, double a2, double a3, double a4, double a5, double a6)