Garfield++ v1r0
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(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(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(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(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(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(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(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(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(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}
virtual void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status)=0
virtual Medium * GetMedium(const double &x, const double &y, const double &z)
virtual void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string label)
virtual double WeightingPotential(const double x, const double y, const double z, const std::string label)
void WeightingField(const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string label)
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)
double WeightingPotential(const double x, const double y, const double z, const std::string label)
Medium * GetMedium(const double &x, const double &y, const double &z)
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