|  | Garfield 0.3
    Toolkit for the detailed simulation of particle detectors based on ionization measurement in gases and semiconductors | 
Propagates avalanches with the 2d (axi-symmetric) space-charge routine from Lippmann, Riegler (2004) in uniform background fields. More...
#include <AvalancheGridSpaceCharge.hh>
| Classes | |
| struct | GridNode | 
| struct | Point | 
| Public Member Functions | |
| AvalancheGridSpaceCharge () | |
| Default constructor. | |
| AvalancheGridSpaceCharge (Sensor *sensor) | |
| Constructor. | |
| ~AvalancheGridSpaceCharge ()=default | |
| Destructor. | |
| void | Reset () | 
| Reset the charges. | |
| void | EnableDebugging (const bool option=true) | 
| Enable/disable debugging (log messages) (default off) | |
| void | EnableStickyAnode (const bool option=true) | 
| Enable sticky anode (default on) | |
| void | EnableTOF (const bool option=true) | 
| Enable to use TOF swarm parameters (default on) | |
| void | EnableDiffusion (const bool option=true) | 
| Enable diffusion (default off) | |
| void | EnableSpaceChargeEffect (const bool option=true) | 
| Enable space charge calculations (default on) | |
| void | EnableAdaptiveTimeStepping (const bool option=true) | 
| Enable adaptive time stepping (default on) | |
| void | EnableMC (const bool option=true) | 
| Enable Monte Carlo (gain/diffusion) up to a certain total number of electrons e.g. | |
| void | SetNCrit (const long NCrit=1e8) | 
| Set electron saturation value applied for each gas gap if space charge effect is turned off (default 1e8) | |
| void | SetFieldCalculation (const std::string &option="coulomb", const int nof_approx=1.) | 
| Sets the different options to calculate the space charge field coulomb: free field approximation (relaxation: fdm-relaxation methode (with a condition to stop)) mirror: symmetric 3 layer single gap rpc with metal - resistive layer - gas gap - r. | |
| void | SetK (float option=0.95) | 
| Set the streamer-inception criterion constant K in the interval (0, ∞) s.t. | |
| void | SetStopAtK (bool option=true) | 
| Stop the avalanche if K % field is reached. | |
| void | SetSensor (Sensor *sensor) | 
| Set the sensor (and determine if it includes a parallel-plate component). | |
| void | Set2dGrid (double zmin, double zmax, int zsteps, double rmax, int rsteps) | 
| void | AddElectrons (AvalancheMicroscopic *avmc) | 
| Import electron (no ions) data from AvalancheMicroscopic class to axi-symmetric grid. | |
| void | AddElectron (double x, double y, double z, double t=0, int n=1) | 
| Set n electrons onto the grid. | |
| void | AddExtraElectron (double y, int n=1) | 
| After calling AddElectron, add more electrons on the same transversal line (y-freedom). | |
| void | StartGridAvalanche (double dtime=-1) | 
| Starts the simulation with the imported electrons for a time step dt (dt = -1 until there are no electrons left in the gap). | |
| long | GetAvalancheSize () const | 
| Returns the total positive charge in the gap's. | |
| double | GetMeanDistance () | 
| Return current mean distance of the electrons on the grid. | |
| long | ReachedKPercent () const | 
| Returns if 100 * K % background charge has been reached. | |
| const std::vector< std::pair< double, long > > | GetElectronEvolution () const | 
| Returns the total electron number evolution. | |
| void | ExportGrid (const std::string &filename) | 
| Export the current grid to a txt file (electron, ions numbers and field magnitude) Take care: only where electrons are located is the space-charge field evaluated! | |
| Private Types | |
| enum class | Elliptic : std::size_t { X , K , E } | 
| Private Member Functions | |
| void | PrepareElectronsFromMicroscopicAvalanche () | 
| bool | SnapTo2dGrid (double x, double y, double z, long n=1, int gasLayer=0) | 
| void | Prepare2dMesh () | 
| bool | TransportTimeStep () | 
| void | DiffuseTimeStep (double dx, long nElectron, double nPosIon, double nNegIon, int iz, int ir, int gasGap) | 
| void | DistributeCharges (long nElectron, double nPosIon, double nNegIon, int iz, int ir, double stepZ, double stepR, int gasGap) | 
| void | GetLocalField (int iz, int ir, double &eFieldZ, double &eFieldR, const std::string &fieldOption, int gasGap) | 
| void | GetFreeChargedRing (int iz, int ir, int fz, int fr, double &eFieldZ, double &eFieldR) | 
| void | GetFreeChargedRing (double zi, double ri, double zf, double rf, double &eFieldZ, double &eFieldR) | 
| bool | AddFieldFromChargeAt (int iz, int ir, int fz, int fr, double N, double &eFieldZ, double &eFieldR) | 
| bool | AddFieldFromChargeAt (int iz, int ir, double zf, double rf, double N, double &eFieldZ, double &eFieldR) | 
| void | GetSwarmParameters (double MagEField, double &alpha, double &eta, double &drift, double &dSigmaL, double &dSigmaT, double &wv, double &wr, double &alphaPT, double &etaPT, int gasGap) | 
| void | GetGlobalCoordinates (double r, double z, double phi, double &xg, double &yg, double &zg, int gasGap) | 
| void | ImportEllipticIntegralValues (const std::string &filename) | 
| void | GetEllipticIntegrals (double x, double &K, double &E) | 
| int | GetGasGapNumber (int layerIndex) | 
| Private Attributes | |
| std::string | m_className = "AvalancheGridSpaceCharge" | 
| bool | m_bDebug = false | 
| bool | m_bDiffusion = false | 
| bool | m_bStick = true | 
| bool | m_bDriftAvalanche = false | 
| bool | m_bImportAvalanche = false | 
| bool | m_bPreparedImportAvalanche = false | 
| long | m_lNCrit = 1e8 | 
| bool | m_bSpaceCharge = true | 
| float | m_fStreamerK = 0.95 | 
| bool | m_bStopAtK = false | 
| bool | m_bFieldK = false | 
| long | m_lElectronsK | 
| bool | m_bAdaptiveTime = true | 
| bool | m_bImportElliptic = false | 
| bool | m_bUseTOF = true | 
| Flag if TOF parameters should be used, else Magboltz drift and SST spatial coefficients. | |
| bool | m_bWrAvailable = true | 
| Flag if bulk drift velocity is available to the simulation. | |
| bool | m_bRatesAvailable = true | 
| Flag if temporal rates are available to the simulation. | |
| bool | m_bMC = true | 
| int | m_iFieldApprox = 1 | 
| double | m_dMinGroups = 50 | 
| ComponentParallelPlate * | m_pp = nullptr | 
| Sensor * | m_sensor = nullptr | 
| std::vector< double > | m_zGrid | 
| Grid points of z-coordinate. | |
| int | m_zSteps = 0 | 
| Number of grid points. | |
| double | m_zStepSize = 0. | 
| std::vector< double > | m_rGrid | 
| Distance between the grid points. | |
| int | m_rSteps = 0. | 
| Number of grid points. | |
| double | m_rStepSize = 0. | 
| bool | m_isgridset = false | 
| Distance between the grid points. | |
| long | m_nTotElectron = 0 | 
| Total amount of electrons at time step. | |
| long | m_nTotPosIons = 0 | 
| total amount of charge created | |
| double | m_time = 0. | 
| Clock. | |
| double | m_time0 = 0. | 
| Initial time. | |
| double | m_dt = 0. | 
| Time step. | |
| bool | m_run = true | 
| Tracking if the charges are still in the drift gap. | |
| std::vector< std::vector< int > > | m_zGasGapBoundaries | 
| [k] -> {izLeft, ..., izRight} | |
| std::vector< std::vector< GridNode > > | m_grid | 
| grid with nodes on it | |
| std::vector< std::vector< Point > > | m_vElectrons | 
| Electrons to transfer onto grid. | |
| std::vector< std::pair< double, long > > | m_vNElectronEvolution | 
| std::vector< long > | m_vGroupSizes | 
| same values as Lippmann & Riegler | |
| std::vector< int > | m_vIndexGasGaps = {0} | 
| Which layer indices are gas layers. | |
| std::vector< std::vector< double > > | m_vCoNGasLayer {} | 
| Coordinates of center of electron number. | |
| std::vector< double > | m_vYPointInGasGap {} | 
| Example point (y-coord) in each gas gap. | |
| std::vector< double > | m_ezBkg = {0} | 
| Uniform background field in z direction, can be negative. | |
| std::vector< int > | m_vSaturatedGaps {} | 
| Which gas gaps are saturated if saturation is on. | |
| std::string | m_sFieldOption = "coulomb" | 
| Static Private Attributes | |
| static const constexpr std::size_t | elliptic_size {29981} | 
| static const std::array< std::array< double, 3 >, elliptic_size > | m_elliptic | 
Propagates avalanches with the 2d (axi-symmetric) space-charge routine from Lippmann, Riegler (2004) in uniform background fields.
Different options to calculate space-charge-fields can be chosen.
Definition at line 18 of file AvalancheGridSpaceCharge.hh.
| 
 | strongprivate | 
| Enumerator | |
|---|---|
| X | |
| K | |
| E | |
Definition at line 334 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Default constructor.
Definition at line 21 of file AvalancheGridSpaceCharge.hh.
| Garfield::AvalancheGridSpaceCharge::AvalancheGridSpaceCharge | ( | Sensor * | sensor | ) | 
Constructor.
| 
 | default | 
Destructor.
| void Garfield::AvalancheGridSpaceCharge::AddElectron | ( | double | x, | 
| double | y, | ||
| double | z, | ||
| double | t = 0, | ||
| int | n = 1 ) | 
Set n electrons onto the grid.
| void Garfield::AvalancheGridSpaceCharge::AddElectrons | ( | AvalancheMicroscopic * | avmc | ) | 
Import electron (no ions) data from AvalancheMicroscopic class to axi-symmetric grid.
| void Garfield::AvalancheGridSpaceCharge::AddExtraElectron | ( | double | y, | 
| int | n = 1 ) | 
After calling AddElectron, add more electrons on the same transversal line (y-freedom).
| 
 | private | 
| 
 | private | 
| 
 | private | 
| 
 | private | 
| 
 | inline | 
Enable adaptive time stepping (default on)
Definition at line 48 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable/disable debugging (log messages) (default off)
Definition at line 31 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable diffusion (default off)
Definition at line 40 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable Monte Carlo (gain/diffusion) up to a certain total number of electrons e.g.
(1e5) (default on) if disabled: Mean values are considered instead of the statistical processes
Definition at line 56 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable space charge calculations (default on)
Definition at line 43 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable sticky anode (default on)
Definition at line 34 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Enable to use TOF swarm parameters (default on)
Definition at line 37 of file AvalancheGridSpaceCharge.hh.
| void Garfield::AvalancheGridSpaceCharge::ExportGrid | ( | const std::string & | filename | ) | 
Export the current grid to a txt file (electron, ions numbers and field magnitude) Take care: only where electrons are located is the space-charge field evaluated!
| 
 | inline | 
Returns the total positive charge in the gap's.
Definition at line 109 of file AvalancheGridSpaceCharge.hh.
| 
 | inlinenodiscard | 
Returns the total electron number evolution.
Definition at line 124 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
| 
 | private | 
| 
 | private | 
| 
 | inlineprivate | 
Definition at line 245 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
| 
 | private | 
| double Garfield::AvalancheGridSpaceCharge::GetMeanDistance | ( | ) | 
Return current mean distance of the electrons on the grid.
| 
 | private | 
| 
 | private | 
| 
 | private | 
| 
 | private | 
| 
 | inlinenodiscard | 
Returns if 100 * K % background charge has been reached.
Definition at line 115 of file AvalancheGridSpaceCharge.hh.
| void Garfield::AvalancheGridSpaceCharge::Reset | ( | ) | 
Reset the charges.
| void Garfield::AvalancheGridSpaceCharge::Set2dGrid | ( | double | zmin, | 
| double | zmax, | ||
| int | zsteps, | ||
| double | rmax, | ||
| int | rsteps ) | 
| zmin | coordinate along direction of background field | 
| zmax | should more or less be at the end of the gap | 
| zsteps | number of steps | 
| rmax | coordinate perpendicular to background field | 
| rsteps | number of steps | 
| 
 | inline | 
Sets the different options to calculate the space charge field coulomb: free field approximation (relaxation: fdm-relaxation methode (with a condition to stop)) mirror: symmetric 3 layer single gap rpc with metal - resistive layer - gas gap - r.
l. - m.
Definition at line 67 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Set the streamer-inception criterion constant K in the interval (0, ∞) s.t.
1 = 100%
Definition at line 75 of file AvalancheGridSpaceCharge.hh.
| 
 | inline | 
Set electron saturation value applied for each gas gap if space charge effect is turned off (default 1e8)
Definition at line 60 of file AvalancheGridSpaceCharge.hh.
| void Garfield::AvalancheGridSpaceCharge::SetSensor | ( | Sensor * | sensor | ) | 
Set the sensor (and determine if it includes a parallel-plate component).
| 
 | inline | 
Stop the avalanche if K % field is reached.
Definition at line 78 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
| void Garfield::AvalancheGridSpaceCharge::StartGridAvalanche | ( | double | dtime = -1 | ) | 
Starts the simulation with the imported electrons for a time step dt (dt = -1 until there are no electrons left in the gap).
| 
 | private | 
| 
 | staticconstexprprivate | 
Definition at line 340 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 272 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 256 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 257 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 260 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 269 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 262 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 273 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 282 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 263 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Flag if temporal rates are available to the simulation.
Definition at line 280 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 265 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 258 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 268 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Flag if TOF parameters should be used, else Magboltz drift and SST spatial coefficients.
Definition at line 276 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Flag if bulk drift velocity is available to the simulation.
Definition at line 278 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 254 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 285 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Time step.
Definition at line 304 of file AvalancheGridSpaceCharge.hh.
| 
 | staticprivate | 
Definition at line 341 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Uniform background field in z direction, can be negative.
Definition at line 329 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 267 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
grid with nodes on it
Definition at line 311 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 284 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Distance between the grid points.
Keeps track if the grid has been defined.
Definition at line 298 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 270 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 264 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Total amount of electrons at time step.
Definition at line 299 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
total amount of charge created
Definition at line 300 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 287 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Distance between the grid points.
Grid points of r-coordinate.
Definition at line 294 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Number of grid points.
Definition at line 295 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 296 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Tracking if the charges are still in the drift gap.
Definition at line 306 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 288 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 333 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Clock.
Definition at line 302 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Initial time.
Definition at line 303 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Coordinates of center of electron number.
Required: y in [zmin, zmax]
Definition at line 324 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Electrons to transfer onto grid.
Definition at line 313 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
same values as Lippmann & Riegler
Definition at line 316 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Which layer indices are gas layers.
Definition at line 320 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 315 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Which gas gaps are saturated if saturation is on.
Definition at line 331 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Example point (y-coord) in each gas gap.
Definition at line 326 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
[k] -> {izLeft, ..., izRight}
Definition at line 309 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Grid points of z-coordinate.
Definition at line 290 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Number of grid points.
Definition at line 291 of file AvalancheGridSpaceCharge.hh.
| 
 | private | 
Definition at line 292 of file AvalancheGridSpaceCharge.hh.