Garfield++ v2r0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
ComponentUserMapBase.cc
Go to the documentation of this file.
2
3namespace Garfield
4{
5
7 m_className = "ComponentUserMapBase";
8}
9
11
12Medium* ComponentUserMapBase::GetMedium(const double x, const double y,
13 const double z){
14 double p1 = x , p2 = y , p3 = z ;
15 double u1x = 1., u2x = 0., u3x = 0.;
16 double u1y = 0., u2y = 1., u3y = 0.;
17 double u1z = 0., u2z = 0., u3z = 1.;
18 ComponentBase* pComponent = NULL;
19 MapCoordinates(p1, p2, p3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z,
20 pComponent);
21
22 if(!pComponent){
23 if(m_debug){
24 std::cerr << m_className << "::GetMedium:\n";
25 std::cerr << " ComponentBase pointer is NULL for point (" << x << ", "
26 << y << "," << z << ")\n";
27 }
28 return NULL;
29 }
30
31 if(m_debug){
32 std::cerr << m_className << "::GetMedium:\n";
33 std::cerr << " Coordinates: \n";
34 std::cerr << " Global: (" << x << ", " << y << ", " << z << ")\n";
35 std::cerr << " Local: (" << p1 << ", " << p2 << ", " << p3 << ")\n";
36 std::cerr << " Local base vectors: \n";
37 std::cerr << " u1: (" << u1x << ", " << u1y << ", " << u1z << ")\n";
38 std::cerr << " u2: (" << u2x << ", " << u2y << ", " << u2z << ")\n";
39 std::cerr << " u3: (" << u3x << ", " << u3y << ", " << u3z << ")\n";
40 }
41
42 return pComponent->GetMedium(p1, p2, p3);
43}
44
45void ComponentUserMapBase::ElectricField(const double x, const double y,
46 const double z, double& ex, double& ey,
47 double& ez, Medium*& m, int& status){
48 double v;
49 ElectricField(x, y, z, ex, ey, ez, v, m, status);
50}
51
52void ComponentUserMapBase::ElectricField(const double x, const double y,
53 const double z, double& ex, double& ey,
54 double& ez, double& v, Medium*& m,
55 int& status){
56 double p1 = x , p2 = y , p3 = z ;
57 double u1x = 1., u2x = 0., u3x = 0.;
58 double u1y = 0., u2y = 1., u3y = 0.;
59 double u1z = 0., u2z = 0., u3z = 1.;
60 double e1 = 0., e2 = 0., e3 = 0.;
61 ComponentBase* pComponent = NULL;
62
63 MapCoordinates(p1, p2, p3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z,
64 pComponent);
65
66 if(!pComponent){
67 if(m_debug){
68 std::cerr << m_className << "::ElectricField:\n";
69 std::cerr << " ComponentBase pointer is NULL for point (" << x << ", "
70 << y << "," << z << ")\n";
71 }
72 status = -6;
73 m = NULL;
74 return;
75 }
76
77 if(m_debug){
78 std::cerr << m_className << "::ElectricField:\n";
79 std::cerr << " Coordinates: \n";
80 std::cerr << " Global: (" << x << ", " << y << ", " << z << ")\n";
81 std::cerr << " Local: (" << p1 << ", " << p2 << ", " << p3 << ")\n";
82 std::cerr << " Local base vectors: \n";
83 std::cerr << " u1: (" << u1x << ", " << u1y << ", " << u1z << ")\n";
84 std::cerr << " u2: (" << u2x << ", " << u2y << ", " << u2z << ")\n";
85 std::cerr << " u3: (" << u3x << ", " << u3y << ", " << u3z << ")\n";
86 }
87
88 pComponent->ElectricField(p1, p2, p3, e1, e2, e3, v, m, status);
89 UnmapField(e1, e2, e3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z, ex, ey,
90 ez);
91}
92
93void ComponentUserMapBase::WeightingField(const double x, const double y,
94 const double z, double& wx,
95 double& wy, double& wz,
96 const std::string& label) {
97 double p1 = x , p2 = y , p3 = z ;
98 double u1x = 1., u2x = 0., u3x = 0.;
99 double u1y = 0., u2y = 1., u3y = 0.;
100 double u1z = 0., u2z = 0., u3z = 1.;
101 double w1 = 0., w2 = 0., w3 = 0.;
102 ComponentBase* pComponent = NULL;
103 std::string label_ = label;
104
105 MapCoordinates(p1, p2, p3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z,
106 pComponent, label_);
107
108 if(!pComponent){
109 if(m_debug){
110 std::cerr << m_className << "::WeightingField:\n";
111 std::cerr << " ComponentBase pointer is NULL for point (" << x << ", "
112 << y << "," << z << ")\n";
113 }
114 wx = wy = wz = 0.;
115 return;
116 }
117
118 if(m_debug){
119 std::cerr << m_className << "::WeightingField:\n";
120 std::cerr << " Coordinates: \n";
121 std::cerr << " Global: (" << x << ", " << y << ", " << z << ")\n";
122 std::cerr << " Local: (" << p1 << ", " << p2 << ", " << p3 << ")\n";
123 std::cerr << " Local base vectors: \n";
124 std::cerr << " u1: (" << u1x << ", " << u1y << ", " << u1z << ")\n";
125 std::cerr << " u2: (" << u2x << ", " << u2y << ", " << u2z << ")\n";
126 std::cerr << " u3: (" << u3x << ", " << u3y << ", " << u3z << ")\n";
127 }
128
129 pComponent->WeightingField(p1, p2, p3, w1, w2, w3, label_);
130 UnmapField(w1, w2, w3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z, wx, wy,
131 wz);
132}
133
134double ComponentUserMapBase::WeightingPotential(const double x, const double y,
135 const double z,
136 const std::string& label) {
137 double p1 = x , p2 = y , p3 = z ;
138 double u1x = 1., u2x = 0., u3x = 0.;
139 double u1y = 0., u2y = 1., u3y = 0.;
140 double u1z = 0., u2z = 0., u3z = 1.;
141 ComponentBase* pComponent = NULL;
142 std::string label_ = label;
143 MapCoordinates(p1, p2, p3, u1x, u2x, u3x, u1y, u2y, u3y, u1z, u2z, u3z,
144 pComponent, label_);
145
146 if(!pComponent){
147 if(m_debug){
148 std::cerr << m_className << "::WeightingPotential:\n";
149 std::cerr << " ComponentBase pointer is NULL for point (" << x << ", "
150 << y << "," << z << ")\n";
151 }
152 return 0.;
153 }
154
155 if(m_debug){
156 std::cerr << m_className << "::WeightingPotential:\n";
157 std::cerr << " Coordinates: \n";
158 std::cerr << " Global: (" << x << ", " << y << ", " << z << ")\n";
159 std::cerr << " Local: (" << p1 << ", " << p2 << ", " << p3 << ")\n";
160 std::cerr << " Local base vectors: \n";
161 std::cerr << " u1: (" << u1x << ", " << u1y << ", " << u1z << ")\n";
162 std::cerr << " u2: (" << u2x << ", " << u2y << ", " << u2z << ")\n";
163 std::cerr << " u3: (" << u3x << ", " << u3y << ", " << u3z << ")\n";
164 }
165
166 return pComponent->WeightingPotential(p1, p2, p3, label_);
167}
168
170 if(m_debug){
171 std::cerr << m_className << "::UpdatePeriodicity:\n";
172 std::cerr << " Periodicities should be implemented by overloading the "
173 << "MapCoordinates function.\n";
174 }
175}
176
177
178}
Abstract base class for components.
virtual void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status)=0
virtual double WeightingPotential(const double x, const double y, const double z, const std::string &label)
virtual void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string &label)
std::string m_className
Class name.
bool m_debug
Switch on/off debugging messages.
virtual Medium * GetMedium(const double x, const double y, const double z)
Get the medium at a given location (x, y, z).
Medium * GetMedium(const double x, const double y, const double z)
Get the medium at a given location (x, y, z).
void UnmapField(const double e1, const double e2, const double e3, const double u1x, const double u2x, const double u3x, const double u1y, const double u2y, const double u3y, const double u1z, const double u2z, const double u3z, double &ex, double &ey, double &ez) const
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status)
void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string &label)
void UpdatePeriodicity()
Verify periodicities.
double WeightingPotential(const double x, const double y, const double z, const std::string &label)
virtual void MapCoordinates(double &p1, double &p2, double &p3, double &u1x, double &u2x, double &u3x, double &u1y, double &u2y, double &u3y, double &u1z, double &u2z, double &u3z, ComponentBase *&pComponent)=0
Abstract base class for media.
Definition: Medium.hh:11