Garfield++ 3.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
ComponentVoxel.hh
Go to the documentation of this file.
1#ifndef G_COMPONENT_VOXEL_H
2#define G_COMPONENT_VOXEL_H
3
4#include "ComponentBase.hh"
5
6namespace Garfield {
7
8/// Component for interpolating field maps stored in a regular mesh.
9
11 public:
12 /// Constructor
14 /// Destructor
16
17 void Clear() override { Reset(); }
18
19 void ElectricField(const double x, const double y, const double z, double& ex,
20 double& ey, double& ez, double& v, Medium*& m,
21 int& status) override;
22 void ElectricField(const double x, const double y, const double z, double& ex,
23 double& ey, double& ez, Medium*& m, int& status) override;
24
25 void WeightingField(const double x, const double y, const double z,
26 double& wx, double& wy, double& wz,
27 const std::string& label) override;
28 double WeightingPotential(const double x, const double y, const double z,
29 const std::string& label) override;
30 void DelayedWeightingField(const double x, const double y, const double z,
31 const double t, double& wx, double& wy, double& wz,
32 const std::string& label) override;
33
34 void MagneticField(const double x, const double y, const double z, double& bx,
35 double& by, double& bz, int& status) override;
36
37 /// Interpolate between field values at the element centres.
38 void EnableInterpolation(const bool on = true) { m_interpolate = on; }
39
40 /// Offset coordinates in the weighting field, such that the
41 /// same numerical weighting field map can be used for electrodes at
42 /// different positions.
43 void SetWeightingFieldOffset(const double x, const double y, const double z);
44
45 Medium* GetMedium(const double x, const double y, const double z) override;
46
47 bool GetVoltageRange(double& vmin, double& vmax) override;
48 bool GetElectricFieldRange(double& exmin, double& exmax, double& eymin,
49 double& eymax, double& ezmin, double& ezmax);
50 bool GetBoundingBox(double& xmin, double& ymin, double& zmin, double& xmax,
51 double& ymax, double& zmax) override;
52
53 /** Define the grid.
54 * \param nx,ny,nz number of bins along x, y, z.
55 * \param xmin,xmax range along \f$x\f$.
56 * \param ymin,ymax range along \f$y\f$.
57 * \param zmin,zmax range along \f$z\f$.
58 */
59 void SetMesh(const unsigned int nx, const unsigned int ny,
60 const unsigned int nz, const double xmin, const double xmax,
61 const double ymin, const double ymax, const double zmin,
62 const double zmax);
63 /** Import electric field and potential values from a file.
64 * The file is supposed to contain one line for each mesh point starting with
65 * - either two or three floating point numbers,
66 * specifying the coordinates (in cm) of the element centre or
67 * - two or three integers specifying the index of the element in the mesh,
68 *
69 * followed by
70 * - two or three floating point numbers for the electric field (in V/cm),
71 * and (depending on the values of withPotential and withRegion),
72 * - a floating point number specifying the potential (in V), and
73 * - an integer specifying the "region" of the element.
74 *
75 * Format types are:
76 * - "xy", "xyz": elements are specified by the coordinates of their centres
77 * - "ij", "ijk": elements are specified by their indices
78 */
79 bool LoadElectricField(const std::string& filename, const std::string& format,
80 const bool withPotential, const bool withRegion,
81 const double scaleX = 1., const double scaleE = 1.,
82 const double scaleP = 1.);
83 /// Import (prompt) weighting field from file.
84 bool LoadWeightingField(const std::string& filename, const std::string& format,
85 const bool withPotential,
86 const double scaleX = 1., const double scaleE = 1.,
87 const double scaleP = 1.);
88 /// Import delayed weighting field from file.
89 bool LoadWeightingField(const std::string& filename, const std::string& format,
90 const double time, const bool withPotential,
91 const double scaleX = 1., const double scaleE = 1.,
92 const double scaleP = 1.);
93 /// Import magnetic field values from a file.
94 bool LoadMagneticField(const std::string& filename, const std::string& format,
95 const double scaleX = 1., const double scaleB = 1.);
96
97 /// Return the indices of the element at a given point.
98 bool GetElement(const double xi, const double yi, const double zi,
99 unsigned int& i, unsigned int& j, unsigned int& k,
100 bool& xMirrored, bool& yMirrored, bool& zMirrored) const;
101 /// Return the field for an element with given index.
102 bool GetElement(const unsigned int i, const unsigned int j,
103 const unsigned int k, double& v, double& ex, double& ey,
104 double& ez) const;
105
106 /// Set the medium in region i.
107 void SetMedium(const unsigned int i, Medium* m);
108 /// Get the medium in region i.
109 Medium* GetMedium(const unsigned int i) const;
110 /// Print all regions.
111 void PrintRegions() const;
112
113 private:
114 std::vector<Medium*> m_media;
115 struct Element {
116 double fx, fy, fz; //< Field
117 double v; //< Potential
118 };
119
120 /// Region indices.
121 std::vector<std::vector<std::vector<int> > > m_regions;
122 /// Electric field values and potentials at each mesh element.
123 std::vector<std::vector<std::vector<Element> > > m_efields;
124 /// Magnetic field values at each mesh element.
125 std::vector<std::vector<std::vector<Element> > > m_bfields;
126 /// Prompt weighting field values and potentials at each mesh element.
127 std::vector<std::vector<std::vector<Element> > > m_wfields;
128 /// Delayed weighting field values and potentials at each mesh element.
129 std::vector<std::vector<std::vector<std::vector<Element> > > > m_wdfields;
130 std::vector<double> m_wdtimes;
131
132 // Dimensions of the mesh
133 unsigned int m_nX = 0, m_nY = 0, m_nZ = 0;
134 double m_xMin = 0., m_yMin = 0., m_zMin = 0.;
135 double m_xMax = 0., m_yMax = 0., m_zMax = 0.;
136 double m_dx = 0., m_dy = 0., m_dz = 0.;
137
138 bool m_interpolate = false;
139
140 bool m_hasMesh = false;
141 bool m_hasPotential = false;
142 bool m_hasEfield = false;
143 bool m_hasBfield = false;
144 bool m_hasWfield = false;
145
146 // Offset for weighting field
147 double m_wField_xOffset = 0.;
148 double m_wField_yOffset = 0.;
149 double m_wField_zOffset = 0.;
150
151 // Voltage range
152 double m_pMin = 0., m_pMax = 0.;
153
154 /// Read data from file.
155 bool LoadData(const std::string& filename, std::string format,
156 const bool withPotential, const bool withRegion,
157 const double scaleX, const double scaleF, const double scaleP,
158 std::vector<std::vector<std::vector<Element> > >& field);
159
160 void Reset() override;
161 void UpdatePeriodicity() override;
162
163 /// Look up/interpolate the field at a given point.
164 bool GetField(const double x, const double y, const double z,
165 const std::vector<std::vector<std::vector<Element> > >& field,
166 double& fx, double& fy, double& fz, double& p, int& region);
167 /// Reduce a coordinate to the basic cell (in case of periodicity).
168 double Reduce(const double xin, const double xmin, const double xmax,
169 const bool simplePeriodic, const bool mirrorPeriodic,
170 bool& isMirrored) const;
171 /// Set the dimensions of a table according to the mesh.
172 void Initialise(std::vector<std::vector<std::vector<Element> > >& fields);
173 void InitialiseRegions();
174};
175}
176#endif
Abstract base class for components.
Component for interpolating field maps stored in a regular mesh.
ComponentVoxel()
Constructor.
void EnableInterpolation(const bool on=true)
Interpolate between field values at the element centres.
void MagneticField(const double x, const double y, const double z, double &bx, double &by, double &bz, int &status) override
void Clear() override
Reset.
void SetWeightingFieldOffset(const double x, const double y, const double z)
void PrintRegions() const
Print all regions.
bool LoadWeightingField(const std::string &filename, const std::string &format, const bool withPotential, const double scaleX=1., const double scaleE=1., const double scaleP=1.)
Import (prompt) weighting field from file.
bool GetBoundingBox(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
Get the bounding box coordinates.
bool GetElectricFieldRange(double &exmin, double &exmax, double &eymin, double &eymax, double &ezmin, double &ezmax)
void DelayedWeightingField(const double x, const double y, const double z, const double t, double &wx, double &wy, double &wz, const std::string &label) override
bool GetElement(const double xi, const double yi, const double zi, unsigned int &i, unsigned int &j, unsigned int &k, bool &xMirrored, bool &yMirrored, bool &zMirrored) const
Return the indices of the element at a given point.
bool GetVoltageRange(double &vmin, double &vmax) override
Calculate the voltage range [V].
void SetMedium(const unsigned int i, Medium *m)
Set the medium in region i.
void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string &label) override
Medium * GetMedium(const double x, const double y, const double z) override
Get the medium at a given location (x, y, z).
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, double &v, Medium *&m, int &status) override
Calculate the drift field [V/cm] and potential [V] at (x, y, z).
void SetMesh(const unsigned int nx, const unsigned int ny, const unsigned int nz, const double xmin, const double xmax, const double ymin, const double ymax, const double zmin, const double zmax)
double WeightingPotential(const double x, const double y, const double z, const std::string &label) override
bool LoadElectricField(const std::string &filename, const std::string &format, const bool withPotential, const bool withRegion, const double scaleX=1., const double scaleE=1., const double scaleP=1.)
bool LoadMagneticField(const std::string &filename, const std::string &format, const double scaleX=1., const double scaleB=1.)
Import magnetic field values from a file.
Abstract base class for media.
Definition: Medium.hh:13