Garfield 0.3
Toolkit for the detailed simulation of particle detectors based on ionization measurement in gases and semiconductors
Loading...
Searching...
No Matches
ComponentTcad3d.hh
Go to the documentation of this file.
1#ifndef G_COMPONENT_TCAD_3D_H
2#define G_COMPONENT_TCAD_3D_H
3
4#include <array>
5#include <iostream>
6#include <memory>
7
10
11namespace Garfield {
12
14
16 public:
21
29 bool GetElement(const size_t i, double& vol, double& dmin, double& dmax,
30 int& type) const;
32 bool GetNode(const size_t i, double& x, double& y, double& z) const override;
33
34 void ElectricField(const double x, const double y, const double z, double& ex,
35 double& ey, double& ez, double& v, Medium*& m,
36 int& status) override;
37 void ElectricField(const double x, const double y, const double z, double& ex,
38 double& ey, double& ez, Medium*& m, int& status) override;
39 using Component::ElectricField;
40 Medium* GetMedium(const double x, const double y, const double z) override;
41 void DelayedWeightingPotentials(const double x, const double y,
42 const double z, const std::string& label,
43 std::vector<double>& dwp) override;
44
45 bool GetBoundingBox(double& xmin, double& ymin, double& zmin, double& xmax,
46 double& ymax, double& zmax) override;
47 bool GetElementaryCell(double& xmin, double& ymin, double& zmin, double& xmax,
48 double& ymax, double& zmax) override;
49
50 private:
51 // Tetrahedral tree.
52 std::unique_ptr<TetrahedralTree> m_tree;
53
54 void Reset() override {
55 Cleanup();
56 m_ready = false;
57 }
58
59 size_t FindElement(const double x, const double y, const double z,
60 std::array<double, nMaxVertices>& w) const;
61 bool InElement(const double x, const double y, const double z,
62 const Element& element,
63 std::array<double, nMaxVertices>& w) const {
64 if (x < element.bbMin[0] || x > element.bbMax[0] || y < element.bbMin[1] ||
65 y > element.bbMax[1] || z < element.bbMin[2] || z > element.bbMax[2]) {
66 return false;
67 }
68 bool inside = false;
69 switch (element.type) {
70 case 2:
71 if (InTriangle(x, y, z, element, w)) inside = true;
72 break;
73 case 5:
74 if (InTetrahedron(x, y, z, element, w)) inside = true;
75 break;
76 default:
77 std::cerr << m_className << "::InElement:\n"
78 << " Invalid element type (" << element.type << ").\n";
79 break;
80 }
81 return inside;
82 }
83 bool InTetrahedron(const double x, const double y, const double z,
84 const Element& element,
85 std::array<double, nMaxVertices>& w) const;
86 bool InTriangle(const double x, const double y, const double z,
87 const Element& element,
88 std::array<double, nMaxVertices>& w) const;
89
90 bool Interpolate(const double x, const double y, const double z,
91 const std::vector<double>& field, double& f) override;
92 bool Interpolate(const double x, const double y, const double z,
93 const std::vector<std::array<double, 3> >& field, double& fx,
94 double& fy, double& fz) override;
95 void FillTree() override;
96};
97} // namespace Garfield
98#endif
bool GetElementaryCell(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
bool GetElement(const size_t i, double &vol, double &dmin, double &dmax, int &type) const
Retrieve the properties of an element.
void DelayedWeightingPotentials(const double x, const double y, const double z, const std::string &label, std::vector< double > &dwp) override
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, double &v, Medium *&m, int &status) override
bool InTetrahedron(const double x, const double y, const double z, const Element &element, std::array< double, nMaxVertices > &w) const
size_t FindElement(const double x, const double y, const double z, std::array< double, nMaxVertices > &w) const
bool GetNode(const size_t i, double &x, double &y, double &z) const override
Get the coordinates of a mesh node.
bool Interpolate(const double x, const double y, const double z, const std::vector< double > &field, double &f) override
bool GetBoundingBox(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
void FillTree() override
Medium * GetMedium(const double x, const double y, const double z) override
bool Interpolate(const double x, const double y, const double z, const std::vector< std::array< double, 3 > > &field, double &fx, double &fy, double &fz) override
bool InElement(const double x, const double y, const double z, const Element &element, std::array< double, nMaxVertices > &w) const
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status) override
bool InTriangle(const double x, const double y, const double z, const Element &element, std::array< double, nMaxVertices > &w) const
ComponentTcad3d()
Constructor.
std::unique_ptr< TetrahedralTree > m_tree