1#ifndef G_COMPONENT_NEBEM_2D_H
2#define G_COMPONENT_NEBEM_2D_H
25 bool AddSegment(
const double x0,
const double y0,
const double x1,
26 const double y1,
const double v,
const int ndiv = -1);
34 bool AddWire(
const double x,
const double y,
const double d,
const double v,
43 bool AddRegion(
const std::vector<double>& xp,
44 const std::vector<double>& yp,
Medium* medium,
45 const unsigned int bctype = 4,
const double v = 0.,
48 const double a,
const double b,
51 void SetRangeZ(
const double zmin,
const double zmax);
62 m_randomCollocation = on;
70 std::vector<double>& xv, std::vector<double>& yv,
71 Medium*& medium,
unsigned int& bctype,
double& v);
75 bool GetSegment(
const unsigned int i,
double& x0,
double& y0,
76 double& x1,
double& x2,
double& v)
const;
80 bool GetWire(
const unsigned int i,
double& x,
double& y,
double& d,
81 double& v,
double& q)
const;
85 bool GetElement(
const unsigned int i,
double& x0,
double& y0,
86 double& x1,
double& y1,
double& q)
const;
88 Medium*
GetMedium(
const double x,
const double y,
const double z)
override;
90 void ElectricField(
const double x,
const double y,
const double z,
double& ex,
91 double& ey,
double& ez,
Medium*& m,
int& status)
override;
92 void ElectricField(
const double x,
const double y,
const double z,
double& ex,
93 double& ey,
double& ez,
double& v,
Medium*& m,
94 int& status)
override;
99 double& xmax,
double& ymax,
double& zmax)
override;
101 double& xmax,
double& ymax,
double& zmax)
override;
103 bool CrossedWire(
const double x0,
const double y0,
const double z0,
104 const double x1,
const double y1,
const double z1,
105 double& xc,
double& yc,
double& zc,
const bool centre,
106 double& rc)
override;
107 bool InTrapRadius(
const double q0,
const double x0,
const double y0,
108 const double z0,
double& xw,
double& yx,
109 double& rw)
override;
112 static const double InvEpsilon0;
113 static const double InvTwoPiEpsilon0;
116 unsigned int m_nDivisions = 5;
117 unsigned int m_nCollocationPoints = 1;
118 bool m_autoSize =
false;
119 bool m_randomCollocation =
false;
120 unsigned int m_nMaxIterations = 3;
123 Medium* m_medium =
nullptr;
125 bool m_useRangeZ =
false;
138 std::vector<double> xv;
139 std::vector<double> yv;
141 std::pair<BC, double> bc;
146 std::vector<Region> m_regions;
149 std::array<double, 2> x0;
150 std::array<double, 2> x1;
153 std::pair<BC, double> bc;
157 std::vector<Segment> m_segments;
167 std::vector<Wire> m_wires;
175 std::pair<BC, double> bc;
179 std::vector<Element> m_elements;
187 std::vector<SpaceCharge> m_spaceCharge;
190 void EliminateOverlaps(std::vector<Segment>& segments);
192 bool Discretise(
const Segment& segment, std::vector<Element>& elements,
193 const double lambda,
const unsigned int ndiv);
195 bool ComputeInfluenceMatrix(std::vector<std::vector<double> >& infmat)
const;
196 bool InvertMatrix(std::vector<std::vector<double> >& influenceMatrix,
197 std::vector<std::vector<double> >& inverseMatrix)
const;
198 bool LUDecomposition(std::vector<std::vector<double> >& mat,
199 std::vector<int>& index)
const;
200 void LUSubstitution(
const std::vector<std::vector<double> >& mat,
201 const std::vector<int>& index,
202 std::vector<double>& col)
const;
204 bool Solve(
const std::vector<std::vector<double> >& inverseMatrix,
205 const std::vector<double>& bc);
206 bool CheckConvergence(
const double tol, std::vector<bool>& ok);
207 void SplitElement(Element& oldElement, std::vector<Element>& elements);
210 double LinePotential(
const double a,
const double x,
const double y)
const;
212 double WirePotential(
const double r0,
const double x,
const double y)
const;
214 void LineField(
const double a,
const double x,
const double y,
double& ex,
217 void WireField(
const double r0,
const double x,
const double y,
double& ex,
221 double BoxPotential(
const double a,
const double b,
222 const double x,
const double y,
const double v0)
const;
224 void BoxField(
const double a,
const double b,
225 const double x,
const double y,
226 double& ex,
double& ey)
const;
228 void Reset()
override;
229 void UpdatePeriodicity()
override;
231 void ToLocal(
const double xIn,
const double yIn,
232 const double cphi,
const double sphi,
233 double& xOut,
double& yOut)
const;
235 void ToGlobal(
const double xIn,
const double yIn,
236 const double cphi,
const double sphi,
237 double& xOut,
double& yOut)
const;
240 int Field(
const double x,
const double y,
const double z,
double& ex,
241 double& ey,
double& ez,
double& v, Medium*& m,
const bool opt);
unsigned int GetNumberOfSegments() const
Return the number of conducting straight-line segments.
void SetNumberOfDivisions(const unsigned int ndiv)
Set the default number of elements per segment.
bool AddSegment(const double x0, const double y0, const double x1, const double y1, const double v, const int ndiv=-1)
void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status) override
bool GetVoltageRange(double &vmin, double &vmax) override
Calculate the voltage range [V].
bool GetSegment(const unsigned int i, double &x0, double &y0, double &x1, double &x2, double &v) const
Return the coordinates and voltage of a given straight-line segment.
bool GetBoundingBox(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
Get the bounding box coordinates.
void EnableRandomCollocation(const bool on=true)
void SetRangeZ(const double zmin, const double zmax)
Set the extent of the drift region along z.
void EnableAutoResizing(const bool on=true)
void SetNumberOfCollocationPoints(const unsigned int ncoll)
unsigned int GetNumberOfRegions() const
Return the number of regions.
unsigned int GetNumberOfElements() const
Return the number of boundary elements.
bool Initialise()
Discretise the geometry and compute the solution.
bool InTrapRadius(const double q0, const double x0, const double y0, const double z0, double &xw, double &yx, double &rw) override
bool GetRegion(const unsigned int i, std::vector< double > &xv, std::vector< double > &yv, Medium *&medium, unsigned int &bctype, double &v)
Return the properties of a given region.
void SetMedium(Medium *medium)
Set the "background" medium.
Medium * GetMedium(const double x, const double y, const double z) override
Get the medium at a given location (x, y, z).
void AddChargeDistribution(const double x, const double y, const double a, const double b, const double rho)
bool GetWire(const unsigned int i, double &x, double &y, double &d, double &v, double &q) const
Return the coordinates, diameter, potential and charge of a given wire.
~ComponentNeBem2d()
Destructor.
bool AddWire(const double x, const double y, const double d, const double v, const int ntrap=5)
ComponentNeBem2d()
Constructor.
void SetMaxNumberOfIterations(const unsigned int niter)
bool CrossedWire(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, double &xc, double &yc, double &zc, const bool centre, double &rc) override
unsigned int GetNumberOfWires() const
Return the number of wires.
bool AddRegion(const std::vector< double > &xp, const std::vector< double > &yp, Medium *medium, const unsigned int bctype=4, const double v=0., const int ndiv=-1)
bool GetElementaryCell(double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
Get the coordinates of the elementary cell.
bool GetElement(const unsigned int i, double &x0, double &y0, double &x1, double &y1, double &q) const
Return the coordinates and charge of a given boundary element.
virtual void ElectricField(const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status)=0
Component()=delete
Default constructor.
Abstract base class for media.