Garfield 0.3
Toolkit for the detailed simulation of particle detectors based on ionization measurement in gases and semiconductors
Loading...
Searching...
No Matches
Garfield::ComponentComsol Class Reference

Component for importing and interpolating Comsol field maps. More...

#include <ComponentComsol.hh>

Inheritance diagram for Garfield::ComponentComsol:
Garfield::ComponentFieldMap

Classes

struct  Range

Public Member Functions

 ComponentComsol ()
 Default constructor.
 ComponentComsol (const std::string &mesh, const std::string &mplist, const std::string &field, const std::string &unit="m")
 Constructor from file names.
 ~ComponentComsol ()
 Destructor.
void SetImportRange (const double xmin, const double xmax, const double ymin, const double ymax, const double zmin, const double zmax)
bool Initialise (const std::string &header="mesh.mphtxt", const std::string &mplist="dielectrics.dat", const std::string &field="field.txt", const std::string &unit="m")
 Import a field map.
bool SetWeightingPotential (const std::string &file, const std::string &label)
 Import the weighting potential maps.
bool SetWeightingField (const std::string &file, const std::string &label)
bool SetDynamicWeightingPotential (const std::string &file, const std::string &label)
 Import the time-dependent weighting field maps.
void SetTimeInterval (const double mint, const double maxt, const double stept)
 Set the time interval of the time-dependent weighting field.
void GetTimeInterval (std::vector< double > &delayedTimes)
 Get times of time-sliced dynamic weighting field.
void SetImportMaterial (const double epsr=1.)
 Select material that will exclusivaly be imported based on its relative permitivity.
Public Member Functions inherited from Garfield::ComponentFieldMap
 ComponentFieldMap ()=delete
 Default constructor.
 ComponentFieldMap (const std::string &name)
 Constructor.
virtual ~ComponentFieldMap ()
 Destructor.
bool Check ()
 Check element aspect ratio.
void PrintRange ()
 Show x, y, z, V and angular ranges.
void PrintMaterials ()
 List all currently defined materials.
void DriftMedium (const size_t imat)
 Flag a field map material as a drift medium.
void NotDriftMedium (const size_t imat)
 Flag a field map materials as a non-drift medium.
size_t GetNumberOfMaterials () const
 Return the number of materials in the field map.
double GetPermittivity (const size_t imat) const
 Return the relative permittivity of a field map material.
double GetConductivity (const size_t imat) const
 Return the conductivity of a field map material.
void SetMedium (const size_t imat, Medium *medium)
 Associate a field map material with a Medium object.
Medium * GetMedium (const size_t imat) const
 Return the Medium associated to a field map material.
void SetGas (Medium *medium)
 Associate all field map materials with a relative permittivity of unity to a given Medium class.
size_t GetNumberOfElements () const override
bool GetElementNodes (const size_t i, std::vector< size_t > &nodes) const override
bool GetElementRegion (const size_t i, size_t &mat, bool &drift) const override
bool GetElement (const size_t i, double &vol, double &dmin, double &dmax) const
 Return the volume and aspect ratio of a mesh element.
size_t GetNumberOfNodes () const override
bool GetNode (const size_t i, double &x, double &y, double &z) const override
double GetPotential (const size_t i) const
 Return the potential at a given node.
void EnableCheckMapIndices (const bool on=true)
void EnableDeleteBackgroundElements (const bool on=true)
 Option to eliminate mesh elements in conductors (default: on).
void EnableTetrahedralTreeForElementSearch (const bool on=true)
 Enable or disable the usage of the tetrahedral tree for searching the element in the mesh.
void EnableConvergenceWarnings (const bool on=true)
 Enable or disable warnings that the calculation of the local coordinates did not achieve the requested precision.
Medium * GetMedium (const double x, const double y, const double z) override
void ElectricField (const double x, const double y, const double z, double &ex, double &ey, double &ez, Medium *&m, int &status) 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
__DEVICE__ void WeightingField (const double x, const double y, const double z, double &wx, double &wy, double &wz, const std::string &label) override
double WeightingPotential (const double x, const double y, const double z, const std::string &label) override
double DelayedWeightingPotential (double x, double y, double z, const double t, const std::string &label) override
void DelayedWeightingPotentials (const double x, const double y, const double z, const std::string &label, std::vector< double > &dwp) override
bool IsInBoundingBox (const double x, const double y, const double z) const
bool Is3d () override
bool GetBoundingBox (double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
bool GetElementaryCell (double &xmin, double &ymin, double &zmin, double &xmax, double &ymax, double &zmax) override
std::map< std::string, std::vector< double > > GetWeightingPotentials ()
bool GetVoltageRange (double &vmin, double &vmax) override
void CopyWeightingPotential (const std::string &label, const std::string &labelSource, const double x, const double y, const double z, const double alpha, const double beta, const double gamma)
 Makes a weighting potential copy of a imported map which can be translated and rotated.
double CreateGPUTransferObject (ComponentGPU *&comp_gpu) override
 Create and initialise GPU Transfer class.

Private Member Functions

bool GetTimeInterval (const std::string &file)
bool CheckInRange (const double x, const double y, const double z) const
bool ElementInRange (const Element &element, const std::vector< Node > &nodes) const
bool LoadPotentials (const std::string &field, std::vector< double > &pot)

Private Attributes

double m_unit = 100.
bool m_timeset = false
bool m_materialSelect = false
double m_epsr = 1.
Range m_range

Static Private Attributes

static constexpr double MaxNodeDistance = 1.e-8

Additional Inherited Members

Protected Types inherited from Garfield::ComponentFieldMap
enum class  ElementType { Unknown = 0 , Serendipity = 5 , CurvedTetrahedron = 13 }
Protected Member Functions inherited from Garfield::ComponentFieldMap
void Reset () override
void Prepare ()
virtual void SetRange ()
void UpdatePeriodicity () override
void UpdatePeriodicity2d ()
void UpdatePeriodicityCommon ()
bool SetDefaultDriftMedium ()
 Find lowest epsilon, check for eps = 0, set default drift media flags.
__DEVICE__ int Field (const double x, const double y, const double z, double &fx, double &fy, double &fz, int &iel, const std::vector< double > &potentials) const
 Compute the electric/weighting field.
double Potential (const double x, const double y, const double z, const std::vector< double > &potentials) const
 Compute the electrostatic/weighting potential.
int FindElement5 (const double x, const double y, double &t1, double &t2, double &t3, double &t4, double jac[4][4], double &det) const
 Find the element for a point in curved quadratic quadrilaterals.
__DEVICE__ int FindElement13 (const double x, const double y, const double z, double &t1, double &t2, double &t3, double &t4, double jac[4][4], double &det) const
 Find the element for a point in curved quadratic tetrahedra.
int FindElementCube (const double x, const double y, const double z, double &t1, double &t2, double &t3, TMatrixD *&jac, std::vector< TMatrixD * > &dN) const
 Find the element for a point in a cube.
__DEVICE__ void MapCoordinates (double &xpos, double &ypos, double &zpos, bool &xmirrored, bool &ymirrored, bool &zmirrored, double &rcoordinate, double &rotation) const
 Move (xpos, ypos, zpos) to field map coordinates.
__DEVICE__ void UnmapFields (double &ex, double &ey, double &ez, const double xpos, const double ypos, const double zpos, const bool xmirrored, const bool ymirrored, const bool zmirrored, const double rcoordinate, const double rotation) const
 Move (ex, ey, ez) to global coordinates.
virtual double GetElementVolume (const size_t i) const
virtual void GetAspectRatio (const size_t i, double &dmin, double &dmax) const
void PrintWarning (const std::string &header)
void PrintNotReady (const std::string &header) const
void PrintCouldNotOpen (const std::string &header, const std::string &filename) const
void PrintElement (const std::string &header, const double x, const double y, const double z, const double t1, const double t2, const double t3, const double t4, const size_t i, const std::vector< double > &potential) const
void TimeInterpolation (const double t, double &f0, double &f1, int &i0, int &i1)
 Interpolation of potential between two time slices.
int Coordinates3 (const double x, const double y, double &t1, double &t2, double &t3, double &t4, double jac[4][4], double &det, const std::array< double, 8 > &xn, const std::array< double, 8 > &yn) const
 Calculate local coordinates for curved quadratic triangles.
int Coordinates4 (const double x, const double y, double &t1, double &t2, double &t3, double &t4, double &det, const std::array< double, 8 > &xn, const std::array< double, 8 > &yn) const
 Calculate local coordinates for linear quadrilaterals.
int Coordinates5 (const double x, const double y, double &t1, double &t2, double &t3, double &t4, double jac[4][4], double &det, const std::array< double, 8 > &xn, const std::array< double, 8 > &yn) const
 Calculate local coordinates for curved quadratic quadrilaterals.
__DEVICE__ void Coordinates12 (const double x, const double y, const double z, double &t1, double &t2, double &t3, double &t4, const std::array< double, 10 > &xn, const std::array< double, 10 > &yn, const std::array< double, 10 > &zn, const std::array< std::array< double, 3 >, 4 > &w) const
 Calculate local coordinates in linear tetrahedra.
__DEVICE__ int Coordinates13 (const double x, const double y, const double z, double &t1, double &t2, double &t3, double &t4, double jac[4][4], double &det, const std::array< double, 10 > &xn, const std::array< double, 10 > &yn, const std::array< double, 10 > &zn, const std::array< std::array< double, 3 >, 4 > &w) const
 Calculate local coordinates for curved quadratic tetrahedra.
int CoordinatesCube (const double x, const double y, const double z, double &t1, double &t2, double &t3, TMatrixD *&jac, std::vector< TMatrixD * > &dN, const Element &element) const
 Calculate local coordinates for a cube.
void JacobianCube (const Element &element, const double t1, const double t2, const double t3, TMatrixD *&jac, std::vector< TMatrixD * > &dN) const
 Calculate Jacobian for a cube.
void CalculateElementBoundingBoxes ()
 Calculate the bounding boxes of all elements after initialization.
bool InitializeTetrahedralTree ()
 Initialize the tetrahedral tree.
Static Protected Member Functions inherited from Garfield::ComponentFieldMap
static double ScalingFactor (std::string unit)
static double Potential3 (const std::array< double, 6 > &v, const std::array< double, 3 > &t)
 Interpolate the potential in a triangle.
static void Field3 (const std::array< double, 6 > &v, const std::array< double, 3 > &t, double jac[4][4], const double det, double &ex, double &ey)
 Interpolate the field in a triangle.
static double Potential5 (const std::array< double, 8 > &v, const std::array< double, 2 > &t)
 Interpolate the potential in a curved quadrilateral.
static void Field5 (const std::array< double, 8 > &v, const std::array< double, 2 > &t, double jac[4][4], const double det, double &ex, double &ey)
 Interpolate the field in a curved quadrilateral.
static double Potential13 (const std::array< double, 10 > &v, const std::array< double, 4 > &t)
 Interpolate the potential in a curved quadratic tetrahedron.
static __DEVICE__ void Field13 (const std::array< double, 10 > &v, const std::array< double, 4 > &t, double jac[4][4], const double det, double &ex, double &ey, double &ez)
 Interpolate the field in a curved quadratic tetrahedron.
static int ReadInteger (char *token, int def, bool &error)
static double ReadDouble (char *token, double def, bool &error)
static void Jacobian3 (const std::array< double, 8 > &xn, const std::array< double, 8 > &yn, const double u, const double v, const double w, double &det, double jac[4][4])
 Calculate Jacobian for curved quadratic triangles.
static void Jacobian5 (const std::array< double, 8 > &xn, const std::array< double, 8 > &yn, const double u, const double v, double &det, double jac[4][4])
 Calculate Jacobian for curved quadratic quadrilaterals.
static __DEVICE__ void Jacobian13 (const std::array< double, 10 > &xn, const std::array< double, 10 > &yn, const std::array< double, 10 > &zn, const double fourt0, const double fourt1, const double fourt2, const double fourt3, double &det, double jac[4][4])
 Calculate Jacobian for curved quadratic tetrahedra.
static std::array< std::array< double, 3 >, 4 > Weights12 (const std::array< double, 10 > &xn, const std::array< double, 10 > &yn, const std::array< double, 10 > &zn)
Protected Attributes inherited from Garfield::ComponentFieldMap
bool m_is3d = true
ElementType m_elementType = ElementType::CurvedTetrahedron
std::vector< Elementm_elements
std::vector< int > m_elementIndices
std::vector< bool > m_degenerate
std::vector< std::array< double, 3 > > m_bbMin
std::vector< std::array< double, 3 > > m_bbMax
std::vector< std::array< std::array< double, 3 >, 4 > > m_w12
std::vector< Nodem_nodes
std::vector< double > m_pot
std::map< std::string, std::vector< double > > m_wpot
std::map< std::string, std::vector< std::vector< double > > > m_dwpot
std::vector< Materialm_materials
std::map< std::string, WeightingFieldCopym_wfieldCopies
bool m_hasBoundingBox = false
std::array< double, 3 > m_minBoundingBox = {{0., 0., 0.}}
std::array< double, 3 > m_maxBoundingBox = {{0., 0., 0.}}
bool m_cacheElemBoundingBoxes = false
 Flag to check if bounding boxes of elements are cached.
std::array< double, 3 > m_mapmin = {{0., 0., 0.}}
std::array< double, 3 > m_mapmax = {{0., 0., 0.}}
std::array< double, 3 > m_mapamin = {{0., 0., 0.}}
std::array< double, 3 > m_mapamax = {{0., 0., 0.}}
std::array< double, 3 > m_mapna = {{0., 0., 0.}}
std::array< double, 3 > m_cells = {{0., 0., 0.}}
double m_mapvmin = 0.
double m_mapvmax = 0.
std::array< bool, 3 > m_setang
bool m_deleteBackground = true
bool m_warning = false
unsigned int m_nWarnings = 0
bool m_printConvergenceWarnings = true
bool m_checkMultipleElement = false
 Scan for multiple elements that contain a point.
bool m_useTetrahedralTree = true
std::unique_ptr< GARFIELD_CLASS_NAME(TetrahedralTree)> m_octree

Detailed Description

Component for importing and interpolating Comsol field maps.

Definition at line 9 of file ComponentComsol.hh.

Constructor & Destructor Documentation

◆ ComponentComsol() [1/2]

Garfield::ComponentComsol::ComponentComsol ( )

Default constructor.

◆ ComponentComsol() [2/2]

Garfield::ComponentComsol::ComponentComsol ( const std::string & mesh,
const std::string & mplist,
const std::string & field,
const std::string & unit = "m" )

Constructor from file names.

◆ ~ComponentComsol()

Garfield::ComponentComsol::~ComponentComsol ( )
inline

Destructor.

Definition at line 17 of file ComponentComsol.hh.

17{}

Member Function Documentation

◆ CheckInRange()

bool Garfield::ComponentComsol::CheckInRange ( const double x,
const double y,
const double z ) const
inlineprivate

Definition at line 96 of file ComponentComsol.hh.

96 {
97 if (!m_range.set) return true;
98
99 if (x < m_range.xmin || x > m_range.xmax || y < m_range.ymin ||
100 y > m_range.ymax || z < m_range.zmin || z > m_range.zmax)
101 return false;
102
103 return true;
104 }

◆ ElementInRange()

bool Garfield::ComponentComsol::ElementInRange ( const Element & element,
const std::vector< Node > & nodes ) const
inlineprivate

Definition at line 106 of file ComponentComsol.hh.

107 {
108 if (m_range.set) {
109 for (size_t i = 0; i < 10; i++) {
110 const Node &node = nodes[element.emap[i]];
111 if (!CheckInRange(node.x, node.y, node.z)) return false;
112 }
113 }
114 if (m_materialSelect && m_materials[element.matmap].eps != m_epsr)
115 return false;
116 return true;
117 }
bool CheckInRange(const double x, const double y, const double z) const
std::vector< Material > m_materials

◆ GetTimeInterval() [1/2]

bool Garfield::ComponentComsol::GetTimeInterval ( const std::string & file)
private

◆ GetTimeInterval() [2/2]

void Garfield::ComponentComsol::GetTimeInterval ( std::vector< double > & delayedTimes)
inline

Get times of time-sliced dynamic weighting field.

Definition at line 55 of file ComponentComsol.hh.

55 {
56 delayedTimes = m_wdtimes;
57 }

◆ Initialise()

bool Garfield::ComponentComsol::Initialise ( const std::string & header = "mesh.mphtxt",
const std::string & mplist = "dielectrics.dat",
const std::string & field = "field.txt",
const std::string & unit = "m" )

Import a field map.

Parameters
headername of the file containing the list of nodes
mplistname of the file containing the material properties
fieldname of the file containing the potentials at the nodes
unitlength unit

◆ LoadPotentials()

bool Garfield::ComponentComsol::LoadPotentials ( const std::string & field,
std::vector< double > & pot )
private

◆ SetDynamicWeightingPotential()

bool Garfield::ComponentComsol::SetDynamicWeightingPotential ( const std::string & file,
const std::string & label )

Import the time-dependent weighting field maps.

◆ SetImportMaterial()

void Garfield::ComponentComsol::SetImportMaterial ( const double epsr = 1.)
inline

Select material that will exclusivaly be imported based on its relative permitivity.

Definition at line 61 of file ComponentComsol.hh.

61 {
62 m_materialSelect = true;
63 m_epsr = epsr;
64 }

◆ SetImportRange()

void Garfield::ComponentComsol::SetImportRange ( const double xmin,
const double xmax,
const double ymin,
const double ymax,
const double zmin,
const double zmax )
inline

Definition at line 19 of file ComponentComsol.hh.

20 {
21 // TODO: Must happen before initialise function
22 m_range.set = true;
23 m_range.xmin = xmin;
24 m_range.ymin = ymin;
25 m_range.zmin = zmin;
26
27 m_range.xmax = xmax;
28 m_range.ymax = ymax;
29 m_range.zmax = zmax;
30 }

◆ SetTimeInterval()

void Garfield::ComponentComsol::SetTimeInterval ( const double mint,
const double maxt,
const double stept )

Set the time interval of the time-dependent weighting field.

◆ SetWeightingField()

bool Garfield::ComponentComsol::SetWeightingField ( const std::string & file,
const std::string & label )
inline

Definition at line 45 of file ComponentComsol.hh.

45 {
46 return SetWeightingPotential(file, label);
47 }
bool SetWeightingPotential(const std::string &file, const std::string &label)
Import the weighting potential maps.

◆ SetWeightingPotential()

bool Garfield::ComponentComsol::SetWeightingPotential ( const std::string & file,
const std::string & label )

Import the weighting potential maps.

Member Data Documentation

◆ m_epsr

double Garfield::ComponentComsol::m_epsr = 1.
private

Definition at line 77 of file ComponentComsol.hh.

◆ m_materialSelect

bool Garfield::ComponentComsol::m_materialSelect = false
private

Definition at line 76 of file ComponentComsol.hh.

◆ m_range

Range Garfield::ComponentComsol::m_range
private

Definition at line 94 of file ComponentComsol.hh.

◆ m_timeset

bool Garfield::ComponentComsol::m_timeset = false
private

Definition at line 73 of file ComponentComsol.hh.

◆ m_unit

double Garfield::ComponentComsol::m_unit = 100.
private

Definition at line 72 of file ComponentComsol.hh.

◆ MaxNodeDistance

double Garfield::ComponentComsol::MaxNodeDistance = 1.e-8
staticconstexprprivate

Definition at line 74 of file ComponentComsol.hh.


The documentation for this class was generated from the following file: