3#if defined(__GPUCOMPILE__) || !defined(G_COMPONENT_H)
5#if !defined(__GPUCOMPILE__) && !defined(G_COMPONENT_H)
24#if !defined(__GPUCOMPILE__)
31class GARFIELD_CLASS_NAME(Component) {
46 virtual void SetGeometry(
Geometry* geo);
51 virtual Medium* GetMedium(
const double x,
const double y,
const double z);
70 virtual void ElectricField(
const double x,
const double y,
const double z,
71 double& ex,
double& ey,
double& ez, Medium*& m,
74 virtual void ElectricField(
const double x,
const double y,
const double z,
75 double& ex,
double& ey,
double& ez,
double& v,
76 Medium*& m,
int& status) = 0;
78 __device__ void ElectricField(
const cuda_t xin,
const cuda_t yin,
79 const cuda_t zin, cuda_t& ex, cuda_t& ey,
80 cuda_t& ez, MediumGPU*& m,
int& status);
85 std::array<double, 3> ElectricField(
const double x,
const double y,
88 virtual double ElectricPotential(
const double x,
const double y,
91 virtual bool GetVoltageRange(
double& vmin,
double& vmax) = 0;
98 virtual void WeightingField(
const double x,
const double y,
const double z,
99 double& wx,
double& wy,
double& wz,
100 const std::string& label);
106 virtual double WeightingPotential(
const double x,
const double y,
107 const double z,
const std::string& label);
112 virtual const std::vector<double>& DelayedSignalTimes(
113 const std::string& ) {
123 virtual void DelayedWeightingField(
const double x,
const double y,
124 const double z,
const double t,
double& wx,
125 double& wy,
double& wz,
126 const std::string& label);
134 virtual double DelayedWeightingPotential(
const double x,
const double y,
135 const double z,
const double t,
136 const std::string& label);
141 virtual void DelayedWeightingPotentials(
const double x,
const double y,
143 const std::string& label,
144 std::vector<double>& dwp);
151 virtual void MagneticField(
const double x,
const double y,
const double z,
152 double& bx,
double& by,
double& bz,
int& status);
154 void SetMagneticField(
const double bx,
const double by,
const double bz);
157 virtual bool IsReady() {
return m_ready; }
159 virtual bool Is3d() {
return true; }
162 virtual bool GetBoundingBox(
double& xmin,
double& ymin,
double& zmin,
163 double& xmax,
double& ymax,
double& zmax);
166 virtual bool GetElementaryCell(
double& xmin,
double& ymin,
double& zmin,
167 double& xmax,
double& ymax,
double& zmax);
176 virtual size_t GetNumberOfElements()
const {
return 0; }
178 virtual bool GetElementNodes(
const size_t ,
179 std::vector<size_t>& )
const {
184 virtual bool GetElementRegion(
const size_t ,
size_t& ,
189 virtual size_t GetNumberOfNodes()
const {
return 0; }
191 virtual bool GetNode(
const size_t i,
double& x,
double& y,
double& z)
const;
200 double IntegrateFluxCircle(
const double xc,
const double yc,
const double r,
201 const unsigned int nI = 50);
209 double IntegrateFluxSphere(
const double xc,
const double yc,
const double zc,
210 const double r,
const unsigned int nI = 20);
220 double IntegrateFluxParallelogram(
221 const double x0,
const double y0,
const double z0,
const double dx1,
222 const double dy1,
const double dz1,
const double dx2,
const double dy2,
223 const double dz2,
const unsigned int nU = 20,
const unsigned int nV = 20);
227 double IntegrateWeightingFluxParallelogram(
228 const std::string& label,
const double x0,
const double y0,
229 const double z0,
const double dx1,
const double dy1,
const double dz1,
230 const double dx2,
const double dy2,
const double dz2,
231 const unsigned int nU = 20,
const unsigned int nV = 20);
242 double IntegrateFluxLine(
const double x0,
const double y0,
const double z0,
243 const double x1,
const double y1,
const double z1,
244 const double xp,
const double yp,
const double zp,
245 const unsigned int nI,
const int isign = 0);
256 virtual bool CrossedWire(
const double x0,
const double y0,
const double z0,
257 const double x1,
const double y1,
const double z1,
258 double& xc,
double& yc,
double& zc,
259 const bool centre,
double& rc);
266 virtual bool InTrapRadius(
const double q0,
const double x0,
const double y0,
267 const double z0,
double& xw,
double& yw,
271 virtual bool CrossedPlane(
const double x0,
const double y0,
const double z0,
272 const double x1,
const double y1,
const double z1,
273 double& xc,
double& yc,
double& zc);
276 void EnablePeriodicityX(
const bool on =
true) {
281 void EnablePeriodicityY(
const bool on =
true) {
286 void EnablePeriodicityZ(
const bool on =
true) {
291 void IsPeriodic(
bool& perx,
bool& pery,
bool& perz) {
292 perx = m_periodic[0];
293 pery = m_periodic[1];
294 perz = m_periodic[2];
298 void EnableMirrorPeriodicityX(
const bool on =
true) {
299 m_mirrorPeriodic[0] = on;
303 void EnableMirrorPeriodicityY(
const bool on =
true) {
304 m_mirrorPeriodic[1] = on;
308 void EnableMirrorPeriodicityZ(
const bool on =
true) {
309 m_mirrorPeriodic[2] = on;
313 void IsMirrorPeriodic(
bool& perx,
bool& pery,
bool& perz) {
314 perx = m_mirrorPeriodic[0];
315 pery = m_mirrorPeriodic[1];
316 perz = m_mirrorPeriodic[2];
320 void EnableAxialPeriodicityX(
const bool on =
true) {
321 m_axiallyPeriodic[0] = on;
325 void EnableAxialPeriodicityY(
const bool on =
true) {
326 m_axiallyPeriodic[1] = on;
330 void EnableAxialPeriodicityZ(
const bool on =
true) {
331 m_axiallyPeriodic[2] = on;
335 void IsAxiallyPeriodic(
bool& perx,
bool& pery,
bool& perz) {
336 perx = m_axiallyPeriodic[0];
337 pery = m_axiallyPeriodic[1];
338 perz = m_axiallyPeriodic[2];
342 void EnableRotationSymmetryX(
const bool on =
true) {
343 m_rotationSymmetric[0] = on;
347 void EnableRotationSymmetryY(
const bool on =
true) {
348 m_rotationSymmetric[1] = on;
352 void EnableRotationSymmetryZ(
const bool on =
true) {
353 m_rotationSymmetric[2] = on;
357 void IsRotationSymmetric(
bool& rotx,
bool& roty,
bool& rotz) {
358 rotx = m_rotationSymmetric[0];
359 roty = m_rotationSymmetric[1];
360 rotz = m_rotationSymmetric[2];
364 void EnableTriangleSymmetricXY(
const bool on =
true,
365 const bool oct = 2) {
366 m_triangleSymmetric[0] = on;
367 m_triangleSymmetricOct = oct;
368 m_mirrorPeriodic[0] = on;
369 m_mirrorPeriodic[1] = on;
372 void EnableTriangleSymmetricXZ(
const bool on =
true,
373 const bool oct = 2) {
374 m_triangleSymmetric[1] = on;
375 m_triangleSymmetricOct = oct;
376 m_mirrorPeriodic[0] = on;
377 m_mirrorPeriodic[2] = on;
380 void EnableTriangleSymmetricYZ(
const bool on =
true,
381 const bool oct = 2) {
382 m_triangleSymmetric[2] = on;
383 m_triangleSymmetricOct = oct;
384 m_mirrorPeriodic[1] = on;
385 m_mirrorPeriodic[2] = on;
389 void EnableDebugging(
const bool on =
true) { m_debug = on; }
391 void DisableDebugging() { m_debug =
false; }
394 virtual bool HasMagneticField()
const;
397 virtual bool HasTownsendMap()
const {
return false; }
399 virtual bool HasAttachmentMap()
const {
return false; }
401 virtual bool HasMobilityMap()
const {
return false; }
403 virtual bool HasVelocityMap()
const {
return false; }
406 virtual bool ElectronAttachment(
const double ,
const double ,
407 const double ,
double& eta) {
412 virtual bool HoleAttachment(
const double ,
const double ,
413 const double ,
double& eta) {
419 virtual bool ElectronMobility(
const double ,
const double ,
420 const double ,
double& mu) {
425 virtual bool HoleMobility(
const double ,
const double ,
426 const double ,
double& mu) {
432 virtual bool ElectronTownsend(
const double ,
const double ,
433 const double ,
double& alpha) {
438 virtual bool HoleTownsend(
const double ,
const double ,
439 const double ,
double& alpha) {
444 virtual bool ElectronVelocity(
const double ,
const double ,
445 const double ,
double& vx,
double& vy,
451 virtual bool HoleVelocity(
const double ,
const double ,
452 const double ,
double& vx,
double& vy,
458 virtual double StepSizeHint() {
return -1.; }
461 virtual double CreateGPUTransferObject(ComponentGPU*& comp_gpu);
465 std::string m_className =
"Component";
471 std::array<double, 3> m_b0 = {{0., 0., 0.}};
474 bool m_ready =
false;
478 bool m_periodic[3] = {
false,
false,
false};
480 bool m_mirrorPeriodic[3] = {
false,
false,
false};
482 bool m_axiallyPeriodic[3] = {
false,
false,
false};
484 bool m_rotationSymmetric[3] = {
false,
false,
false};
486 bool m_triangleSymmetric[3] = {
false,
false,
false};
488 int m_triangleSymmetricOct = 0;
490 const int m_triangleOctRules[4] = {1, 4, 5, 8};
491 bool m_outsideCone =
false;
494 bool m_debug =
false;
497 std::array<bool, 3> m_periodic = {{
false,
false,
false}};
499 std::array<bool, 3> m_mirrorPeriodic = {{
false,
false,
false}};
501 std::array<bool, 3> m_axiallyPeriodic = {{
false,
false,
false}};
503 std::array<bool, 3> m_rotationSymmetric = {{
false,
false,
false}};
505 std::array<bool, 3> m_triangleSymmetric = {{
false,
false,
false}};
507 int m_triangleSymmetricOct = 0;
509 const std::array<int, 4> m_triangleOctRules = {1, 4, 5, 8};
510 bool m_outsideCone =
false;
513#ifndef __GPUCOMPILE__
515 std::vector<double> m_wdtimes;
518 virtual void Reset() = 0;
520 virtual void UpdatePeriodicity() = 0;
523 double IntegrateFluxParallelogram(
const double x0,
const double y0,
524 const double z0,
const double dx1,
525 const double dy1,
const double dz1,
526 const double dx2,
const double dy2,
527 const double dz2,
const unsigned int nU,
528 const unsigned int nV,
const bool wfield,
529 const std::string& label);
544 friend class Component;
547 enum class ComponentType {
555 ComponentType m_ComponentType{ComponentType::Component};