17 #pragma warning(disable:4503)
28#include "viennagrid/config/default_configs.hpp"
54template <
typename DeviceT>
55void generate_mos1d_mesh(DeviceT & mos_device,
68 static_cast<unsigned long>(len_gate/cs_gate + 1.0) );
73 static_cast<unsigned long>(len_oxide/cs_ox) );
78 static_cast<unsigned long>(+20e-9/0.05e-9) );
83 static_cast<unsigned long>(len_bulk/cs_bulk) );
86 gconf.
add_segment(len_gate + len_oxide + 20e-9 + len_bulk,
88 static_cast<unsigned long>(2e-9/cs_bulk + 1.0) );
91 mos_device.generate_mesh(gconf);
103template <
typename DeviceType>
109 typedef typename DeviceType::segment_type SegmentType;
112 SegmentType
const & gate = device.segment(0);
113 SegmentType
const & oxide = device.segment(1);
114 SegmentType
const & silicon = device.segment(2);
115 SegmentType
const & silicon2 = device.segment(3);
116 SegmentType
const & bulk = device.segment(4);
118 std::cout <<
"* init_device(): Setting material ..." << std::endl;
137 std::cout <<
"* init_device(): Setting doping (per cell) ..." << std::endl;
138 device.set_doping_n(
Nd, silicon);
139 device.set_doping_p(Na, silicon);
140 device.set_doping_n(
Nd, silicon2);
141 device.set_doping_p(Na, silicon2);
145 std::cout <<
"* init_device(): Setting contact potentials (per cell) ..." << std::endl;
146 device.set_contact_potential(Vg_init, gate);
147 device.set_contact_potential(0.0, bulk);
149 std::cout <<
"* init_device(): DONE!" << std::endl;
166 typedef viennagrid::line_1d_mesh MeshType;
175 std::cout <<
"* main(): Creating mesh ..." << std::endl;
178 const double len_gate = 1e-9;
179 const double cs_gate = 0.01e-9;
180 const double len_oxide = 1e-9;
181 const double cs_ox = 0.05e-9;
182 const double len_bulk = 100.e-9;
183 const double cs_bulk = 1e-9;
188 generate_mos1d_mesh(device, len_gate, cs_gate, len_oxide, cs_ox, len_bulk, cs_bulk);
201 std::cout <<
"* main(): Creating DD simulator..." << std::endl;
236 std::cout <<
"* main(): Launching simulator..." << std::endl;
258 std::cout <<
"* main(): Setting up SHE..." << std::endl;
308 std::cout <<
"* main(): Computing SHE..." << std::endl;
324 std::cout <<
"* main(): Writing SHE result..." << std::endl;
329 she_simulator.config(),
330 she_simulator.quantities().electron_distribution_function(),
336 she_simulator.config(),
337 she_simulator.quantities().hole_distribution_function(),
349 std::cout <<
"* main(): Results can now be viewed with your favorite VTK viewer (e.g. ParaView)." << std::endl;
350 std::cout <<
"* main(): Don't forget to scale the z-axis by about a factor of 1e12 when examining the distribution function." << std::endl;
351 std::cout << std::endl;
352 std::cout <<
"*********************************************************" << std::endl;
353 std::cout <<
"* ViennaSHE finished successfully *" << std::endl;
354 std::cout <<
"*********************************************************" << std::endl;
The main SHE configuration class. To be adjusted by the user for his/her needs.
double min_kinetic_energy_range(viennashe::carrier_type_id ctype) const
Returns the minimum kinetic energy range for the selected carrier.
long max_expansion_order() const
Returns the current maximum expansion order.
equation_id get_electron_equation() const
bool with_holes() const
Returns true if holes are considered in the simulation.
bool quantum_correction() const
equation_id get_hole_equation() const
nonlinear_solver_config_type & nonlinear_solver()
Returns the configuration object for the nonlinear solver.
void set_electron_equation(equation_id equ_id)
linear_solver_config_type & linear_solver()
Returns the configuration object for the linear solver.
double energy_spacing() const
Returns the uniform energy spacing of discrete energies.
void set_hole_equation(equation_id equ_id)
bool with_electrons() const
Returns true if electrons are considered in the simulation.
viennashe::she::scatter_config & scattering()
Returns the configuration object for scattering.
bool with_quantum_correction() const
Defines the physical properties of a device, e.g. doping. This is the implementation for 2d and highe...
ionized_impurity_scattering_parameters const & ionized_impurity() const
Returns the parameters for ionized impurity scattering. Const-version.
impact_ionization_scattering_parameters const & impact_ionization() const
Returns the parameters for impact ionization scattering. Const-version.
acoustic_phonon_scattering_parameters const & acoustic_phonon() const
Returns the parameters for acoustic phonon scattering. Const-version.
optical_phonon_scattering_parameters const & optical_phonon() const
Returns the parameters for optical phonon scattering. Const-version.
bool electron_electron() const
Returns true if electron-electron scattering is activated.
Class for self-consistent SHE simulations.
void set(long solver_id)
Sets a new linear solver. Provide IDs defined in.
double ilut_drop_tolerance() const
Returns the drop tolerance for the ILUT preconditioenr.
std::size_t max_iters() const
Returns the maximum number of iterative linear solver iterations.
std::size_t max_iters() const
Returns the maximum number of nonlinear solver iterations.
double damping() const
Returns the damping for the nonlinear solver.
Configuration class for the simple mesh generator.
void add_segment(double start_x, double start_y, double len_x, double len_y, unsigned long points_x, unsigned long points_y)
Convenience header, which includes all core functionality available in ViennaSHE.
void init_device(DeviceType &device, double Vg_init, double Nd, double Na)
Initalizes the MOS 1D device for testing.
void write_cell_quantity_for_gnuplot(AccessorType const &quan, DeviceType const &device, std::string filename)
Writes a quantity (on vertices) per point to a text file suitable for gnuplot.
std::string hole_density()
std::string electron_density()
std::string preamble()
Prints the ViennaSHE preamble (header). Used in all the examples as well as the standalone-applicatio...
A class referring to silicon and providing certain material parameters Note that this is the default ...
A class referring to silicon dioxide.
static const double q
Elementary charge.