ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
joule_heating.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_PHONON_JOULE_HEATING_HPP
2#define VIENNASHE_PHONON_JOULE_HEATING_HPP
3/* ============================================================================
4 Copyright (c) 2011-2022, Institute for Microelectronics,
5 Institute for Analysis and Scientific Computing,
6 TU Wien.
7
8 -----------------
9 ViennaSHE - The Vienna Spherical Harmonics Expansion Boltzmann Solver
10 -----------------
11
12 http://viennashe.sourceforge.net/
13
14 License: MIT (X11), see file LICENSE in the base directory
15=============================================================================== */
16
17#include "viennashe/forwards.h"
22
24
25namespace viennashe
26{
28 namespace hde
29 {
35 template < typename CurrentDensityAccessorType, typename ElectricFieldAccessorType>
37 {
38 joule_heating(CurrentDensityAccessorType const & j,
39 ElectricFieldAccessorType const & e )
40 : efield(e), jfield(j) { }
41
42 template < typename ElementType >
43 double operator()(ElementType const & el) const
44 {
45 std::vector<double> j = jfield(el);
46 std::vector<double> e = efield(el);
47 double val = 0.0;
48 for (std::size_t i = 0; i < e.size(); ++i)
49 {
50 val += e[i] * j[i];
51 }
52 return std::fabs(val);
53 }
54
55 private:
56 ElectricFieldAccessorType const & efield;
57 CurrentDensityAccessorType const & jfield;
58 };
59
67 template < typename CurrentDensityAccessorType,
68 typename ElectricFieldAccessorType,
69 typename CellType >
70 double apply_joule_heating(CurrentDensityAccessorType const & jfield,
71 ElectricFieldAccessorType const & efield,
72 CellType const & cell)
73 {
75 return joule_pd(cell);
76 }
77
78
80 template <typename DeviceType, typename QuantitiesListType>
82 {
83 typedef typename DeviceType::mesh_type MeshType;
84
85 public:
86 typedef typename viennagrid::result_of::cell<MeshType>::type cell_type;
87 typedef typename QuantitiesListType::unknown_quantity_type quantity_type;
88 typedef typename QuantitiesListType::unknown_she_quantity_type she_quantity_type;
89
91
92 typedef double value_type;
93
94 power_density_accessor(DeviceType const & d,
95 QuantitiesListType const & quantities,
96 viennashe::config const & conf)
97 : device_(d), conf_(conf),
98 mobility_model_n_(viennashe::models::create_constant_mobility_model(d, 0.1430)),
99 mobility_model_p_(viennashe::models::create_constant_mobility_model(d, 0.0480)),
100 Jfield_dd_n_(d, viennashe::ELECTRON_TYPE_ID, quantities.get_unknown_quantity(viennashe::quantity::potential()), quantities.get_unknown_quantity(viennashe::quantity::electron_density()), mobility_model_n_),
101 Jfield_dd_p_(d, viennashe::HOLE_TYPE_ID, quantities.get_unknown_quantity(viennashe::quantity::potential()), quantities.get_unknown_quantity(viennashe::quantity::hole_density()), mobility_model_p_),
102 Jfield_she_n_(d, conf, quantities.electron_distribution_function()),
103 Jfield_she_p_(d, conf, quantities.hole_distribution_function()),
104 Efield_(d, quantities.get_unknown_quantity(viennashe::quantity::potential())) {}
105
111 value_type operator()(cell_type const & cell) const
112 {
113 // PURE DD
116 {
117 return viennashe::hde::apply_joule_heating(Jfield_dd_n_, Efield_, cell) +
118 viennashe::hde::apply_joule_heating(Jfield_dd_p_, Efield_, cell);
119 }
120 // PURE SHE (bipolar SHE)
121 else if ( conf_.get_electron_equation() == viennashe::EQUATION_SHE &&
123 {
124 return viennashe::hde::apply_joule_heating(Jfield_she_n_, Efield_, cell) +
125 viennashe::hde::apply_joule_heating(Jfield_she_p_, Efield_, cell);
126 }
127 // SHE for electrons only
128 else if ( conf_.get_electron_equation() == viennashe::EQUATION_SHE &&
130 {
131 return viennashe::hde::apply_joule_heating(Jfield_she_n_, Efield_, cell) +
132 viennashe::hde::apply_joule_heating(Jfield_dd_p_, Efield_, cell);
133 }
134 else // SHE for holes only
135 {
136 return viennashe::hde::apply_joule_heating(Jfield_dd_n_, Efield_, cell) +
137 viennashe::hde::apply_joule_heating(Jfield_she_p_, Efield_, cell);
138 }
139
140 }
141
142 private:
143 DeviceType const & device_;
144 viennashe::config const & conf_;
145
146 mobility_type mobility_model_n_;
147 mobility_type mobility_model_p_;
148
154 };
155
156
157 } // namespace hde
158
159
160} // namespace viennashe
161
162#endif // VIENNASHE_PHONON_JOULE_HEATING_HPP
163
The main SHE configuration class. To be adjusted by the user for his/her needs.
Definition: config.hpp:124
equation_id get_electron_equation() const
Definition: config.hpp:230
equation_id get_hole_equation() const
Definition: config.hpp:238
An accessor to the current density on vertices and edges (drift diffusion only!)
Power density accessor. Used to get the power density in the assembly of the heat diffusion equation.
viennashe::models::result_of::mobility_type< DeviceType >::type mobility_type
QuantitiesListType::unknown_quantity_type quantity_type
viennagrid::result_of::cell< MeshType >::type cell_type
value_type operator()(cell_type const &cell) const
Returns the power density depending on the equations for electrons and holes (supports SHE and DD equ...
QuantitiesListType::unknown_she_quantity_type she_quantity_type
power_density_accessor(DeviceType const &d, QuantitiesListType const &quantities, viennashe::config const &conf)
The main mobility model. Contains submodels for lattice, impurity, field and surface scattering relat...
Computes the electric field from a potential.
Contains forward declarations and definition of small classes that must be defined at an early stage.
double apply_joule_heating(CurrentDensityAccessorType const &jfield, ElectricFieldAccessorType const &efield, CellType const &cell)
Auxilary function to joule_heating. Does the same as the joule_heating functor.
viennashe::models::dd::mobility< DeviceType > create_constant_mobility_model(DeviceType const &device, double mu)
Returns a mobility model, which always yields the same mobility.
Definition: mobility.hpp:61
std::string electron_distribution_function()
std::string hole_distribution_function()
std::string electron_density()
The main ViennaSHE namespace. All functionality resides inside this namespace.
Definition: accessors.hpp:40
@ HOLE_TYPE_ID
Definition: forwards.h:188
@ ELECTRON_TYPE_ID
Definition: forwards.h:187
@ EQUATION_SHE
Definition: forwards.h:118
@ EQUATION_CONTINUITY
Definition: forwards.h:117
Computes the current density (both Jn and Jp) after using a drift diffusion solution.
Provides an accessor for the current density.
Defines a generic simulator quantity for use within the solvers of ViennaSHE.
Calculates the Joule Heating (in Watt per Second)
double operator()(ElementType const &el) const
joule_heating(CurrentDensityAccessorType const &j, ElectricFieldAccessorType const &e)